drm_hwcomposer: Add getter/setter for Colorspace
Optionally, get the Colorspace drm property and populate an enum mapping
for the property types. Add implementation to HwcDisplay::SetColorMode
to set this property and map between HAL_COLOR_MODE types to Colorspace
formats.
Change-Id: Id532e94207c1b1a2623b7d77db239735df18b30f
Signed-off-by: Sasha McIntosh <sashamcintosh@google.com>
diff --git a/drm/DrmAtomicStateManager.cpp b/drm/DrmAtomicStateManager.cpp
index 32cc68e..bb26189 100644
--- a/drm/DrmAtomicStateManager.cpp
+++ b/drm/DrmAtomicStateManager.cpp
@@ -139,6 +139,12 @@
return -EINVAL;
}
+ if (args.colorspace && connector->GetColorspaceProperty()) {
+ if (!connector->GetColorspaceProperty()
+ .AtomicSet(*pset, connector->GetColorspacePropertyValue(*args.colorspace)))
+ return -EINVAL;
+ }
+
if (args.content_type && connector->GetContentTypeProperty()) {
if (!connector->GetContentTypeProperty().AtomicSet(*pset, *args.content_type))
return -EINVAL;
diff --git a/drm/DrmAtomicStateManager.h b/drm/DrmAtomicStateManager.h
index d1af6e0..c8736f2 100644
--- a/drm/DrmAtomicStateManager.h
+++ b/drm/DrmAtomicStateManager.h
@@ -21,6 +21,7 @@
#include <memory>
#include <optional>
+#include "compositor/ColorInfo.h"
#include "compositor/DrmKmsPlan.h"
#include "compositor/LayerData.h"
#include "drm/DrmPlane.h"
@@ -36,6 +37,7 @@
std::optional<bool> active;
std::shared_ptr<DrmKmsPlan> composition;
std::shared_ptr<drm_color_ctm> color_matrix;
+ std::optional<Colorspace> colorspace;
std::optional<int32_t> content_type;
std::shared_ptr<DrmFbIdHandle> writeback_fb;
diff --git a/drm/DrmConnector.cpp b/drm/DrmConnector.cpp
index 4ae8bef..8b92407 100644
--- a/drm/DrmConnector.cpp
+++ b/drm/DrmConnector.cpp
@@ -96,6 +96,42 @@
return false;
}
+ if (GetConnectorProperty("Colorspace", &colorspace_property_,
+ /*is_optional=*/true)) {
+ colorspace_property_.AddEnumToMap("Default", Colorspace::kDefault,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("SMPTE_170M_YCC", Colorspace::kSmpte170MYcc,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("BT709_YCC", Colorspace::kBt709Ycc,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("XVYCC_601", Colorspace::kXvycc601,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("XVYCC_709", Colorspace::kXvycc709,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("SYCC_601", Colorspace::kSycc601,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("opYCC_601", Colorspace::kOpycc601,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("opRGB", Colorspace::kOprgb,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("BT2020_CYCC", Colorspace::kBt2020Cycc,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("BT2020_RGB", Colorspace::kBt2020Rgb,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("BT2020_YCC", Colorspace::kBt2020Ycc,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("DCI-P3_RGB_D65", Colorspace::kDciP3RgbD65,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("DCI-P3_RGB_Theater", Colorspace::kDciP3RgbTheater,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("RGB_WIDE_FIXED", Colorspace::kRgbWideFixed,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("RGB_WIDE_FLOAT", Colorspace::kRgbWideFloat,
+ colorspace_enum_map_);
+ colorspace_property_.AddEnumToMap("BT601_YCC", Colorspace::kBt601Ycc,
+ colorspace_enum_map_);
+ }
+
GetConnectorProperty("content type", &content_type_property_,
/*is_optional=*/true);
diff --git a/drm/DrmConnector.h b/drm/DrmConnector.h
index 6140e6c..8063fd8 100644
--- a/drm/DrmConnector.h
+++ b/drm/DrmConnector.h
@@ -27,6 +27,8 @@
#include "DrmProperty.h"
#include "DrmUnique.h"
+#include "compositor/ColorInfo.h"
+
namespace android {
class DrmDevice;
@@ -94,6 +96,14 @@
return edid_property_;
}
+ auto &GetColorspaceProperty() const {
+ return colorspace_property_;
+ }
+
+ auto GetColorspacePropertyValue(Colorspace c) {
+ return colorspace_enum_map_[c];
+ }
+
auto &GetContentTypeProperty() const {
return content_type_property_;
}
@@ -138,10 +148,13 @@
DrmProperty dpms_property_;
DrmProperty crtc_id_property_;
DrmProperty edid_property_;
+ DrmProperty colorspace_property_;
DrmProperty content_type_property_;
DrmProperty writeback_pixel_formats_;
DrmProperty writeback_fb_id_;
DrmProperty writeback_out_fence_;
+
+ std::map<Colorspace, uint64_t> colorspace_enum_map_;
};
} // namespace android