drm_hwcomposer: Set HDR metadata on the connector
Implement a function to set HDR metadata on the connector. Support HDR10
and HLG, which are common HDR types.
Change-Id: Id3dbe8eea2ee6b8ba700af23845a43e2070dd14e
Signed-off-by: Sasha McIntosh <sashamcintosh@google.com>
diff --git a/drm/DrmAtomicStateManager.cpp b/drm/DrmAtomicStateManager.cpp
index 9a8769a..9ce9a93 100644
--- a/drm/DrmAtomicStateManager.cpp
+++ b/drm/DrmAtomicStateManager.cpp
@@ -150,6 +150,21 @@
return -EINVAL;
}
+ if (args.hdr_metadata && connector->GetHdrOutputMetadataProperty()) {
+ auto blob = drm->RegisterUserPropertyBlob(args.hdr_metadata.get(),
+ sizeof(hdr_output_metadata));
+ new_frame_state.hdr_metadata_blob = std::move(blob);
+ if (!new_frame_state.hdr_metadata_blob) {
+ ALOGE("Failed to create %s blob",
+ connector->GetHdrOutputMetadataProperty().GetName().c_str());
+ return -EINVAL;
+ }
+
+ if (!connector->GetHdrOutputMetadataProperty()
+ .AtomicSet(*pset, *new_frame_state.hdr_metadata_blob))
+ return -EINVAL;
+ }
+
auto unused_planes = new_frame_state.used_planes;
if (args.composition) {
diff --git a/drm/DrmAtomicStateManager.h b/drm/DrmAtomicStateManager.h
index 8d22b99..4af04d1 100644
--- a/drm/DrmAtomicStateManager.h
+++ b/drm/DrmAtomicStateManager.h
@@ -40,6 +40,7 @@
std::shared_ptr<drm_color_ctm> color_matrix;
std::optional<Colorspace> colorspace;
std::optional<int32_t> content_type;
+ std::shared_ptr<hdr_output_metadata> hdr_metadata;
std::shared_ptr<DrmFbIdHandle> writeback_fb;
SharedFd writeback_release_fence;
@@ -84,6 +85,7 @@
DrmModeUserPropertyBlobUnique mode_blob;
DrmModeUserPropertyBlobUnique ctm_blob;
+ DrmModeUserPropertyBlobUnique hdr_metadata_blob;
int release_fence_pt_index{};
diff --git a/drm/DrmConnector.cpp b/drm/DrmConnector.cpp
index 6be4067..37e1be4 100644
--- a/drm/DrmConnector.cpp
+++ b/drm/DrmConnector.cpp
@@ -143,6 +143,9 @@
GetOptionalConnectorProperty("content type", &content_type_property_);
+ GetOptionalConnectorProperty("HDR_OUTPUT_METADATA",
+ &hdr_output_metadata_property_);
+
if (GetOptionalConnectorProperty("panel orientation", &panel_orientation_)) {
panel_orientation_
.AddEnumToMapReverse("Normal",
diff --git a/drm/DrmConnector.h b/drm/DrmConnector.h
index fc17206..c22d059 100644
--- a/drm/DrmConnector.h
+++ b/drm/DrmConnector.h
@@ -115,6 +115,10 @@
return content_type_property_;
}
+ auto &GetHdrOutputMetadataProperty() const {
+ return hdr_output_metadata_property_;
+ }
+
auto &GetWritebackFbIdProperty() const {
return writeback_fb_id_;
}
@@ -169,6 +173,7 @@
DrmProperty edid_property_;
DrmProperty colorspace_property_;
DrmProperty content_type_property_;
+ DrmProperty hdr_output_metadata_property_;
DrmProperty link_status_property_;
DrmProperty writeback_pixel_formats_;