Merge "hwc2: Enforce to update color mode when panel reset" into display.lnx.5.1
diff --git a/include/display_properties.h b/include/display_properties.h
index b595090..8b0ab16 100644
--- a/include/display_properties.h
+++ b/include/display_properties.h
@@ -120,6 +120,7 @@
#define PLUGGABLE_BASEID_AND_SIZE_PROP DISPLAY_PROP("pluggable_baseid_and_size")
#define VIRTUAL_BASEID_AND_SIZE_PROP DISPLAY_PROP("virtual_baseid_and_size")
#define ENABLE_QDCM_DIAG DISPLAY_PROP("enable_qdcm_diag")
+#define QDCM_DISABLE_FACTORY_MODE_PROP DISPLAY_PROP("qdcm.disable_factory_mode")
#define ZERO_SWAP_INTERVAL "vendor.debug.egl.swapinterval"
#define ENABLE_OPTIMIZE_REFRESH DISPLAY_PROP("enable_optimize_refresh")
diff --git a/sdm/include/private/resource_interface.h b/sdm/include/private/resource_interface.h
index fa4efb6..03a797b 100644
--- a/sdm/include/private/resource_interface.h
+++ b/sdm/include/private/resource_interface.h
@@ -37,6 +37,7 @@
kCmdGetDefaultClk,
kCmdDisableRotatorOneFrame,
kCmdSetDisplayState,
+ kCmdUpdateSyncHandle,
kCmdMax,
};
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index c886097..fa15c9f 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -550,7 +550,7 @@
return kErrorNone;
}
-bool CompManager::SetDisplayState(Handle display_ctx, DisplayState state) {
+bool CompManager::SetDisplayState(Handle display_ctx, DisplayState state, int sync_handle) {
DisplayCompositionContext *display_comp_ctx =
reinterpret_cast<DisplayCompositionContext *>(display_ctx);
@@ -588,6 +588,8 @@
bool inactive = (state == kStateOff) || (state == kStateDozeSuspend);
UpdateStrategyConstraints(display_comp_ctx->is_primary_panel, inactive);
+ resource_intf_->Perform(ResourceInterface::kCmdUpdateSyncHandle,
+ display_comp_ctx->display_resource_ctx, sync_handle);
return true;
}
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index 8a7434d..30b100f 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -71,7 +71,7 @@
void ControlPartialUpdate(Handle display_ctx, bool enable);
DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90);
DisplayError ValidateAndSetCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y);
- bool SetDisplayState(Handle display_ctx, DisplayState state);
+ bool SetDisplayState(Handle display_ctx, DisplayState state, int sync_handle);
DisplayError SetMaxBandwidthMode(HWBwModes mode);
DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info);
DisplayError SetDetailEnhancerData(Handle display_ctx, const DisplayDetailEnhancerData &de_data);
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 0745d9b..d6a257b 100755
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -578,7 +578,7 @@
if (error == kErrorNone) {
active_ = active;
state_ = state;
- comp_manager_->SetDisplayState(display_comp_ctx_, state);
+ comp_manager_->SetDisplayState(display_comp_ctx_, state, *release_fence);
}
return error;
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 517b06d..2211e07 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -261,7 +261,9 @@
class FrameBufferObject : public LayerBufferObject {
public:
- explicit FrameBufferObject(uint32_t fb_id) : fb_id_(fb_id) {
+ explicit FrameBufferObject(uint32_t fb_id, LayerBufferFormat format,
+ uint32_t width, uint32_t height)
+ :fb_id_(fb_id), format_(format), width_(width), height_(height) {
}
~FrameBufferObject() {
@@ -273,9 +275,15 @@
}
}
uint32_t GetFbId() { return fb_id_; }
+ bool IsEqual(LayerBufferFormat format, uint32_t width, uint32_t height) {
+ return (format == format_ && width == width_ && height == height_);
+ }
private:
uint32_t fb_id_;
+ LayerBufferFormat format_;
+ uint32_t width_;
+ uint32_t height_;
};
HWDeviceDRM::Registry::Registry(BufferAllocator *buffer_allocator) :
@@ -351,9 +359,16 @@
// In legacy path, clear fb_id map in each frame.
layer->buffer_map->buffer_map.clear();
} else {
- if (layer->buffer_map->buffer_map.find(handle_id) != layer->buffer_map->buffer_map.end()) {
- // Found fb_id for given handle_id key
- return;
+ auto it = layer->buffer_map->buffer_map.find(handle_id);
+ if (it != layer->buffer_map->buffer_map.end()) {
+ FrameBufferObject *fb_obj = static_cast<FrameBufferObject*>(it->second.get());
+ if (fb_obj->IsEqual(buffer->format, buffer->width, buffer->height)) {
+ // Found fb_id for given handle_id key
+ return;
+ } else {
+ // Erase from fb_id map if format or size have been modified
+ layer->buffer_map->buffer_map.erase(it);
+ }
}
if (layer->buffer_map->buffer_map.size() >= fbid_cache_limit_) {
@@ -365,7 +380,8 @@
uint32_t fb_id = 0;
if (CreateFbId(buffer, &fb_id) >= 0) {
// Create and cache the fb_id in map
- layer->buffer_map->buffer_map[handle_id] = std::make_shared<FrameBufferObject>(fb_id);
+ layer->buffer_map->buffer_map[handle_id] = std::make_shared<FrameBufferObject>(fb_id,
+ buffer->format, buffer->width, buffer->height);
}
}
@@ -379,8 +395,14 @@
// In legacy path, clear output buffer map in each frame.
output_buffer_map_.clear();
} else {
- if (output_buffer_map_.find(handle_id) != output_buffer_map_.end()) {
- return;
+ auto it = output_buffer_map_.find(handle_id);
+ if (it != output_buffer_map_.end()) {
+ FrameBufferObject *fb_obj = static_cast<FrameBufferObject*>(it->second.get());
+ if (fb_obj->IsEqual(output_buffer->format, output_buffer->width, output_buffer->height)) {
+ return;
+ } else {
+ output_buffer_map_.erase(it);
+ }
}
if (output_buffer_map_.size() >= UI_FBID_LIMIT) {
@@ -391,7 +413,8 @@
uint32_t fb_id = 0;
if (CreateFbId(output_buffer, &fb_id) >= 0) {
- output_buffer_map_[handle_id] = std::make_shared<FrameBufferObject>(fb_id);
+ output_buffer_map_[handle_id] = std::make_shared<FrameBufferObject>(fb_id,
+ output_buffer->format, output_buffer->width, output_buffer->height);
}
}
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 700ed79..4e00714 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -1227,8 +1227,7 @@
validated_ = false;
break;
}
- case kThermalEvent:
- case kIdlePowerCollapse: {
+ case kThermalEvent: {
SEQUENCE_WAIT_SCOPE_LOCK(HWCSession::locker_[id_]);
validated_ = false;
} break;
@@ -1242,6 +1241,8 @@
id_);
}
} break;
+ case kIdlePowerCollapse:
+ break;
default:
DLOGW("Unknown event: %d", event);
break;
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 68f6838..f8d79ab 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -416,6 +416,9 @@
if (dataspace_ != dataspace) {
geometry_changes_ |= kDataspace;
dataspace_ = dataspace;
+ if (layer_->input_buffer.buffer_id) {
+ ValidateAndSetCSC(reinterpret_cast<private_handle_t *>(layer_->input_buffer.buffer_id));
+ }
}
return HWC2::Error::None;
}
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 2c9c311..0037461 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -1056,6 +1056,9 @@
hwc_session->Refresh(display);
// Trigger one more refresh for PP features to take effect.
hwc_session->pending_refresh_.set(UINT32(display));
+ } else {
+ // Reset the pending refresh bit
+ hwc_session->pending_refresh_.reset(UINT32(display));
}
return HWC2_ERROR_NONE;
@@ -3167,17 +3170,14 @@
}
HWCSession *hwc_session = static_cast<HWCSession *>(device);
- hwc2_display_t external_display_index =
- (hwc2_display_t)hwc_session->GetDisplayIndex(qdutils::DISPLAY_EXTERNAL);
- hwc2_display_t virtual_display_index =
- (hwc2_display_t)hwc_session->GetDisplayIndex(qdutils::DISPLAY_VIRTUAL);
- if ((external_display_index == -1) || (virtual_display_index == -1)) {
+ int external_display_index = hwc_session->GetDisplayIndex(qdutils::DISPLAY_EXTERNAL);
+ if ((external_display_index >=0) && (hwc_session->hwc_display_[external_display_index])) {
return HWC2_ERROR_UNSUPPORTED;
}
- if (hwc_session->hwc_display_[external_display_index] ||
- hwc_session->hwc_display_[virtual_display_index]) {
+ int virtual_display_index = hwc_session->GetDisplayIndex(qdutils::DISPLAY_VIRTUAL);
+ if ((virtual_display_index >=0) && (hwc_session->hwc_display_[virtual_display_index])) {
return HWC2_ERROR_UNSUPPORTED;
}
diff --git a/sdm/libs/hwc2/hwc_session_services.cpp b/sdm/libs/hwc2/hwc_session_services.cpp
index eb8887b..a3f5228 100644
--- a/sdm/libs/hwc2/hwc_session_services.cpp
+++ b/sdm/libs/hwc2/hwc_session_services.cpp
@@ -766,7 +766,7 @@
int32_t error = -EINVAL;
vendor_prop_name += prop_name.c_str();
- if (HWCDebugHandler::Get()->GetProperty(vendor_prop_name.c_str(), value) != kErrorNone) {
+ if (HWCDebugHandler::Get()->GetProperty(vendor_prop_name.c_str(), value) == kErrorNone) {
result = value;
error = 0;
}