drm_hwcomposer: Add support for color transform matrix
1. Add and wire-up CRTC CTM property support.
2. Add custom Android property to select behavior for cases
where DRM can't handle color transform matrix.
The "vendor.hwc.drm.ctm" property can be set to:
- DRM_OR_GPU (default) - Use GPU if CTM is not supported by DRM.
- DRM_OR_IGNORE - Ignore CTM if DRM doesn't support it.
The last option is useful for Android 13 and later where default
color transformation matrix is not an identity matrix.
At the moment I do not have any devices with CTM support, therefore
I can test only DRM_OR_IGNORE option.
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
diff --git a/hwc2_device/HwcDisplay.h b/hwc2_device/HwcDisplay.h
index 6cac60f..653aa4a 100644
--- a/hwc2_device/HwcDisplay.h
+++ b/hwc2_device/HwcDisplay.h
@@ -159,9 +159,7 @@
return *pipeline_;
}
- android_color_transform_t &color_transform_hint() {
- return color_transform_hint_;
- }
+ bool CtmByGpu();
Stats &total_stats() {
return total_stats_;
@@ -194,8 +192,6 @@
std::atomic_int flattenning_state_{ClientFlattenningState::NotRequired};
- constexpr static size_t MATRIX_SIZE = 16;
-
HwcDisplayConfigs configs_;
DrmHwcTwo *const hwc2_;
@@ -224,8 +220,10 @@
std::map<hwc2_layer_t, HwcLayer> layers_;
HwcLayer client_layer_;
int32_t color_mode_{};
- std::array<float, MATRIX_SIZE> color_transform_matrix_{};
- android_color_transform_t color_transform_hint_;
+ static constexpr int kCtmRows = 3;
+ static constexpr int kCtmCols = 3;
+ std::shared_ptr<drm_color_ctm> color_matrix_;
+ android_color_transform_t color_transform_hint_{};
std::shared_ptr<DrmKmsPlan> current_plan_;
@@ -234,6 +232,8 @@
Stats prev_stats_;
std::string DumpDelta(HwcDisplay::Stats delta);
+ void SetColorMarixToIdentity();
+
HWC2::Error Init();
HWC2::Error SetActiveConfigInternal(uint32_t config, int64_t change_time);