summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYichi Chen <yichichen@google.com>2020-03-05 21:50:06 +0800
committerYichi Chen <yichichen@google.com>2020-03-16 04:44:20 +0000
commit9117ee5fde4d3033bf591d3b6dae642240aa9c21 (patch)
tree30e0e81ec959e498c19f10fb744c1535b5fdb3b3
parentebf8040e3931696d1bb371cc1b61679a62b888fb (diff)
downloadandroid_hardware_qcom_sdm845_display-9117ee5fde4d3033bf591d3b6dae642240aa9c21.tar.gz
android_hardware_qcom_sdm845_display-9117ee5fde4d3033bf591d3b6dae642240aa9c21.tar.bz2
android_hardware_qcom_sdm845_display-9117ee5fde4d3033bf591d3b6dae642240aa9c21.zip
sdm: Add support of SetLayerColorTransform with GL composition fallback
On legacy devices where per layer color transform is not supported, the call of SetLayerColorTransform cannot fallback to GL composition correctly because the error handling of the call in setPerFrameData cannot receive the unsupported error immediately. The patch implemented SetLayerColorTransform to trigger GL composition fallback. Bug: 140917834 Test: PTS with SetLayerColorTransform Change-Id: Ib41eb18d3c141714dbf6276b59b33f6d4d04f8a1
-rw-r--r--sdm/include/utils/constants.h6
-rw-r--r--sdm/libs/hwc2/hwc_display.cpp4
-rw-r--r--sdm/libs/hwc2/hwc_layers.cpp6
-rw-r--r--sdm/libs/hwc2/hwc_layers.h3
-rw-r--r--sdm/libs/hwc2/hwc_session.cpp8
5 files changed, 27 insertions, 0 deletions
diff --git a/sdm/include/utils/constants.h b/sdm/include/utils/constants.h
index 5efe3571..608b192d 100644
--- a/sdm/include/utils/constants.h
+++ b/sdm/include/utils/constants.h
@@ -75,6 +75,12 @@ namespace sdm {
const int kPageSize = 4096;
const uint32_t kGridSize = 129; // size used for non-linear transformation before Tone-mapping
const uint32_t kLutDim = 17; // Dim of the 3d LUT for tone-mapping.
+ constexpr int kColorTransformMatrixSize = 16;
+ constexpr float kIdentityMatrix[kColorTransformMatrixSize] = { 1.0, 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0 };
+
typedef void * Handle;
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 45effc06..18923b03 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -707,6 +707,10 @@ void HWCDisplay::BuildLayerStack() {
layer->flags.skip = true;
}
+ if (hwc_layer->IsColorTransformSet()) {
+ layer->flags.skip = true;
+ }
+
// set default composition as GPU for SDM
layer->composition = kCompositionGPU;
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 9b08308c..eff1f80f 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -536,6 +536,12 @@ HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) {
return HWC2::Error::None;
}
+HWC2::Error HWCLayer::SetLayerColorTransform(const float *matrix) {
+ color_transform_matrix_set_ =
+ (std::memcmp(matrix, kIdentityMatrix, sizeof(kIdentityMatrix)) != 0);
+ return HWC2::Error::None;
+}
+
HWC2::Error HWCLayer::SetLayerPerFrameMetadata(uint32_t num_elements,
const PerFrameMetadataKey *keys,
const float *metadata) {
diff --git a/sdm/libs/hwc2/hwc_layers.h b/sdm/libs/hwc2/hwc_layers.h
index a24f5a44..ce3bd1f3 100644
--- a/sdm/libs/hwc2/hwc_layers.h
+++ b/sdm/libs/hwc2/hwc_layers.h
@@ -91,6 +91,7 @@ class HWCLayer {
HWC2::Error SetLayerPerFrameMetadata(uint32_t num_elements, const PerFrameMetadataKey *keys,
const float *metadata);
HWC2::Error SetLayerZOrder(uint32_t z);
+ HWC2::Error SetLayerColorTransform(const float *matrix);
void SetComposition(const LayerComposition &sdm_composition);
HWC2::Composition GetClientRequestedCompositionType() { return client_requested_; }
void UpdateClientCompositionType(HWC2::Composition type) { client_requested_ = type; }
@@ -112,6 +113,7 @@ class HWCLayer {
bool IsNonIntegralSourceCrop() { return non_integral_source_crop_; }
bool HasMetaDataRefreshRate() { return has_metadata_refresh_rate_; }
void SetPartialUpdate(bool enabled) { partial_update_enabled_ = enabled; }
+ bool IsColorTransformSet() const { return color_transform_matrix_set_; }
private:
Layer *layer_ = nullptr;
@@ -131,6 +133,7 @@ class HWCLayer {
bool has_metadata_refresh_rate_ = false;
bool partial_update_enabled_ = false;
bool surface_updated_ = true;
+ bool color_transform_matrix_set_ = false;
// Composition requested by client(SF)
HWC2::Composition client_requested_ = HWC2::Composition::Device;
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 259c2049..b35beb3b 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -850,6 +850,12 @@ static int32_t SetLayerZOrder(hwc2_device_t *device, hwc2_display_t display, hwc
return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::SetLayerZOrder, layer, z);
}
+static int32_t SetLayerColorTransform(hwc2_device_t *device, hwc2_display_t display,
+ hwc2_layer_t layer, const float *matrix) {
+ return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerColorTransform,
+ matrix);
+}
+
int32_t HWCSession::SetOutputBuffer(hwc2_device_t *device, hwc2_display_t display,
buffer_handle_t buffer, int32_t releaseFence) {
if (!device) {
@@ -1112,6 +1118,8 @@ hwc2_function_pointer_t HWCSession::GetFunction(struct hwc2_device *device,
return AsFP<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(SetLayerVisibleRegion);
case HWC2::FunctionDescriptor::SetLayerZOrder:
return AsFP<HWC2_PFN_SET_LAYER_Z_ORDER>(SetLayerZOrder);
+ case HWC2::FunctionDescriptor::SetLayerColorTransform:
+ return AsFP<HWC2_PFN_SET_LAYER_COLOR_TRANSFORM>(SetLayerColorTransform);
case HWC2::FunctionDescriptor::SetOutputBuffer:
return AsFP<HWC2_PFN_SET_OUTPUT_BUFFER>(SetOutputBuffer);
case HWC2::FunctionDescriptor::SetPowerMode: