Merge "sdm: hwc2: Handle setColorTransform"
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index dd6bfc0..84a137c 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -58,16 +58,14 @@
hw_intf_->GetDisplayAttributes(active_index, &display_attributes_);
fb_config_ = display_attributes_;
- HWMixerAttributes mixer_attributes;
- error = hw_intf_->GetMixerAttributes(&mixer_attributes);
+ error = hw_intf_->GetMixerAttributes(&mixer_attributes_);
if (error != kErrorNone) {
return error;
}
- mixer_attributes_ = mixer_attributes;
// Override x_pixels and y_pixels of frame buffer with mixer width and height
- fb_config_.x_pixels = mixer_attributes.width;
- fb_config_.y_pixels = mixer_attributes.height;
+ fb_config_.x_pixels = mixer_attributes_.width;
+ fb_config_.y_pixels = mixer_attributes_.height;
HWScaleLutInfo lut_info = {};
error = comp_manager_->GetScaleLutConfig(&lut_info);
@@ -80,7 +78,7 @@
}
error = comp_manager_->RegisterDisplay(display_type_, display_attributes_, hw_panel_info_,
- mixer_attributes, fb_config_, &display_comp_ctx_);
+ mixer_attributes_, fb_config_, &display_comp_ctx_);
if (error != kErrorNone) {
goto CleanupOnError;
}
diff --git a/sdm/libs/core/display_virtual.cpp b/sdm/libs/core/display_virtual.cpp
index cafb986..a2e5009 100644
--- a/sdm/libs/core/display_virtual.cpp
+++ b/sdm/libs/core/display_virtual.cpp
@@ -113,25 +113,55 @@
}
DisplayError DisplayVirtual::SetActiveConfigLocked(DisplayConfigVariableInfo *variable_info) {
+ DisplayError error = kErrorNone;
+
if (!variable_info) {
return kErrorParameters;
}
- display_attributes_.x_pixels = variable_info->x_pixels;
- display_attributes_.y_pixels = variable_info->y_pixels;
- display_attributes_.fps = variable_info->fps;
-
+ HWDisplayAttributes display_attributes;
HWMixerAttributes mixer_attributes;
- mixer_attributes.width = variable_info->x_pixels;;
- mixer_attributes.height = variable_info->y_pixels;
+ DisplayConfigVariableInfo fb_config = *variable_info;
+
+ display_attributes.x_pixels = variable_info->x_pixels;
+ display_attributes.y_pixels = variable_info->y_pixels;
+ display_attributes.fps = variable_info->fps;
+
+ if (display_attributes == display_attributes_) {
+ return kErrorNone;
+ }
+
+ error = hw_intf_->SetDisplayAttributes(display_attributes);
+ if (error != kErrorNone) {
+ return error;
+ }
+
+ error = hw_intf_->GetMixerAttributes(&mixer_attributes);
+ if (error != kErrorNone) {
+ return error;
+ }
+
+ // Override x_pixels and y_pixels of frame buffer with mixer width and height
+ fb_config.x_pixels = mixer_attributes.width;
+ fb_config.y_pixels = mixer_attributes.height;
+
// if display is already connected, unregister display from composition manager and register
// the display with new configuration.
if (display_comp_ctx_) {
comp_manager_->UnregisterDisplay(display_comp_ctx_);
}
- return comp_manager_->RegisterDisplay(display_type_, display_attributes_, hw_panel_info_,
- mixer_attributes, fb_config_, &display_comp_ctx_);
+ error = comp_manager_->RegisterDisplay(display_type_, display_attributes, hw_panel_info_,
+ mixer_attributes, fb_config, &display_comp_ctx_);
+ if (error != kErrorNone) {
+ return error;
+ }
+
+ display_attributes_ = display_attributes;
+ mixer_attributes_ = mixer_attributes;
+ fb_config_ = fb_config;
+
+ return kErrorNone;
}
DisplayError DisplayVirtual::SetVSyncState(bool enable) {
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index 6cdda2b..3092740 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -124,6 +124,10 @@
return kErrorNone;
}
+DisplayError HWDevice::SetDisplayAttributes(const HWDisplayAttributes &display_attributes) {
+ return kErrorNotSupported;
+}
+
DisplayError HWDevice::GetConfigIndex(uint32_t mode, uint32_t *index) {
return kErrorNone;
}
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index 9f77f8f..033e2bc 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -59,6 +59,7 @@
HWDisplayAttributes *display_attributes);
virtual DisplayError GetHWPanelInfo(HWPanelInfo *panel_info);
virtual DisplayError SetDisplayAttributes(uint32_t index);
+ virtual DisplayError SetDisplayAttributes(const HWDisplayAttributes &display_attributes);
virtual DisplayError GetConfigIndex(uint32_t mode, uint32_t *index);
virtual DisplayError PowerOn();
virtual DisplayError PowerOff();
diff --git a/sdm/libs/core/fb/hw_virtual.cpp b/sdm/libs/core/fb/hw_virtual.cpp
index 662c458..d297efa 100644
--- a/sdm/libs/core/fb/hw_virtual.cpp
+++ b/sdm/libs/core/fb/hw_virtual.cpp
@@ -74,5 +74,32 @@
return HWDevice::Validate(hw_layers);
}
+DisplayError HWVirtual::GetMixerAttributes(HWMixerAttributes *mixer_attributes) {
+ if (!mixer_attributes) {
+ return kErrorParameters;
+ }
+
+ mixer_attributes->width = display_attributes_.x_pixels;
+ mixer_attributes->height = display_attributes_.y_pixels;
+ mixer_attributes_.split_left = display_attributes_.is_device_split ?
+ (display_attributes_.x_pixels / 2) : mixer_attributes_.width;
+
+ return kErrorNone;
+}
+
+DisplayError HWVirtual::SetDisplayAttributes(const HWDisplayAttributes &display_attributes) {
+ if (display_attributes.x_pixels == 0 || display_attributes.y_pixels == 0) {
+ return kErrorParameters;
+ }
+
+ display_attributes_ = display_attributes;
+
+ if (display_attributes_.x_pixels > hw_resource_.max_mixer_width) {
+ display_attributes_.is_device_split = true;
+ }
+
+ return kErrorNone;
+}
+
} // namespace sdm
diff --git a/sdm/libs/core/fb/hw_virtual.h b/sdm/libs/core/fb/hw_virtual.h
index 5ecec34..c083127 100644
--- a/sdm/libs/core/fb/hw_virtual.h
+++ b/sdm/libs/core/fb/hw_virtual.h
@@ -38,9 +38,8 @@
virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes) {
return kErrorNotSupported;
}
- virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes) {
- return kErrorNotSupported;
- }
+ virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
+ virtual DisplayError SetDisplayAttributes(const HWDisplayAttributes &display_attributes);
protected:
HWVirtual(BufferSyncHandler *buffer_sync_handler, HWInfoInterface *hw_info_intf);
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index 0ff5126..56a1513 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -70,6 +70,7 @@
HWDisplayAttributes *display_attributes) = 0;
virtual DisplayError GetHWPanelInfo(HWPanelInfo *panel_info) = 0;
virtual DisplayError SetDisplayAttributes(uint32_t index) = 0;
+ virtual DisplayError SetDisplayAttributes(const HWDisplayAttributes &display_attributes) = 0;
virtual DisplayError GetConfigIndex(uint32_t mode, uint32_t *index) = 0;
virtual DisplayError PowerOn() = 0;
virtual DisplayError PowerOff() = 0;
diff --git a/sdm/libs/hwc/hwc_display_virtual.cpp b/sdm/libs/hwc/hwc_display_virtual.cpp
index 1363839..25cd6fc 100644
--- a/sdm/libs/hwc/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc/hwc_display_virtual.cpp
@@ -171,6 +171,8 @@
return status;
}
+ CommitOutputBufferParams(content_list);
+
status = HWCDisplay::CommitLayerStack(content_list);
if (status) {
return status;
@@ -259,14 +261,9 @@
}
int HWCDisplayVirtual::SetOutputBuffer(hwc_display_contents_1_t *content_list) {
- int status = 0;
-
const private_handle_t *output_handle =
static_cast<const private_handle_t *>(content_list->outbuf);
- // Fill output buffer parameters (width, height, format, plane information, fence)
- output_buffer_->acquire_fence_fd = content_list->outbufAcquireFenceFd;
-
if (output_handle) {
int output_handle_format = output_handle->format;
@@ -293,16 +290,26 @@
if (output_handle->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER) {
output_buffer_->flags.secure = 1;
}
+ }
+ layer_stack_.output_buffer = output_buffer_;
+
+ return 0;
+}
+
+void HWCDisplayVirtual::CommitOutputBufferParams(hwc_display_contents_1_t *content_list) {
+ const private_handle_t *output_handle =
+ static_cast<const private_handle_t *>(content_list->outbuf);
+
+ // Fill output buffer parameters (width, height, format, plane information, fence)
+ output_buffer_->acquire_fence_fd = content_list->outbufAcquireFenceFd;
+
+ if (output_handle) {
// ToDo: Need to extend for non-RGB formats
output_buffer_->planes[0].fd = output_handle->fd;
output_buffer_->planes[0].offset = output_handle->offset;
output_buffer_->planes[0].stride = UINT32(output_handle->width);
}
-
- layer_stack_.output_buffer = output_buffer_;
-
- return status;
}
void HWCDisplayVirtual::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type) {
diff --git a/sdm/libs/hwc/hwc_display_virtual.h b/sdm/libs/hwc/hwc_display_virtual.h
index c383809..77e16d5 100644
--- a/sdm/libs/hwc/hwc_display_virtual.h
+++ b/sdm/libs/hwc/hwc_display_virtual.h
@@ -44,11 +44,11 @@
virtual int Commit(hwc_display_contents_1_t *content_list);
virtual void SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type);
- int SetOutputSliceFromMetadata(hwc_display_contents_1_t *content_list);
-
private:
HWCDisplayVirtual(CoreInterface *core_intf, hwc_procs_t const **hwc_procs);
int SetOutputBuffer(hwc_display_contents_1_t *content_list);
+ int SetOutputSliceFromMetadata(hwc_display_contents_1_t *content_list);
+ void CommitOutputBufferParams(hwc_display_contents_1_t *content_list);
bool dump_output_layer_ = false;
LayerBuffer *output_buffer_ = NULL;