summaryrefslogtreecommitdiff
path: root/sdm/libs/hwc2/hwc_layers.cpp
diff options
context:
space:
mode:
authorBaldev Sahu <bsahu@codeaurora.org>2019-03-01 19:46:38 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2020-03-09 03:11:29 -0700
commit0eb1083e584b0bc8f8fb2e5174435c36a48efa07 (patch)
tree792d2352a45a193aa8b380d49a0a36c1a69350dd /sdm/libs/hwc2/hwc_layers.cpp
parent54d3a6453a8eb64d2e83e383f62686952de50298 (diff)
hwc2: Add support for HDR10PLUS
- Add support HDR10PLUS hdr capability. - Add support for SetLayerPerFrameMetadataBlobs from composer 2.3. - Populate the dynamic metadata from the new composer API into the layer structure and set validate if the data changes. - Prioritize PerFrameMetadata/Blob over ColorMetaData. Change-Id: Idd9b6f4f104d1584cce31a4cb7022e11eb2751ad CRs-Fixed: 2545757 Signed-off-by: Karthi Kandasamy <kartka@codeaurora.org>
Diffstat (limited to 'sdm/libs/hwc2/hwc_layers.cpp')
-rw-r--r--sdm/libs/hwc2/hwc_layers.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index d8c8c4eb..8bbd97ed 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -551,6 +551,8 @@ HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) {
HWC2::Error HWCLayer::SetLayerPerFrameMetadata(uint32_t num_elements,
const PerFrameMetadataKey *keys,
const float *metadata) {
+ auto old_mastering_display = layer_->input_buffer.color_metadata.masteringDisplayInfo;
+ auto old_content_light = layer_->input_buffer.color_metadata.contentLightLevel;
auto &mastering_display = layer_->input_buffer.color_metadata.masteringDisplayInfo;
auto &content_light = layer_->input_buffer.color_metadata.contentLightLevel;
for (uint32_t i = 0; i < num_elements; i++) {
@@ -593,6 +595,51 @@ HWC2::Error HWCLayer::SetLayerPerFrameMetadata(uint32_t num_elements,
case PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL:
content_light.minPicAverageLightLevel = UINT32(metadata[i] * 10000);
break;
+ default:
+ break;
+ }
+ }
+ if ((!SameConfig(&old_mastering_display, &mastering_display, UINT32(sizeof(MasteringDisplay)))) ||
+ (!SameConfig(&old_content_light, &content_light, UINT32(sizeof(ContentLightLevel))))) {
+ per_frame_hdr_metadata_ = true;
+ layer_->update_mask.set(kMetadataUpdate);
+ geometry_changes_ |= kDataspace;
+ }
+ return HWC2::Error::None;
+}
+
+HWC2::Error HWCLayer::SetLayerPerFrameMetadataBlobs(uint32_t num_elements,
+ const PerFrameMetadataKey *keys,
+ const uint32_t *sizes,
+ const uint8_t* metadata) {
+ if (!keys || !sizes || !metadata) {
+ DLOGE("metadata or sizes or keys is null");
+ return HWC2::Error::BadParameter;
+ }
+
+ ColorMetaData &color_metadata = layer_->input_buffer.color_metadata;
+ for (uint32_t i = 0; i < num_elements; i++) {
+ switch (keys[i]) {
+ case PerFrameMetadataKey::HDR10_PLUS_SEI:
+ if (sizes[i] > HDR_DYNAMIC_META_DATA_SZ) {
+ DLOGE("Size of HDR10_PLUS_SEI = %d", sizes[i]);
+ return HWC2::Error::BadParameter;
+ }
+ per_frame_hdr_metadata_ = false;
+ // if dynamic metadata changes, store and set needs validate
+ if (!SameConfig(static_cast<const uint8_t*>(color_metadata.dynamicMetaDataPayload),
+ metadata, sizes[i])) {
+ geometry_changes_ |= kDataspace;
+ color_metadata.dynamicMetaDataValid = true;
+ color_metadata.dynamicMetaDataLen = sizes[i];
+ std::memcpy(color_metadata.dynamicMetaDataPayload, metadata, sizes[i]);
+ per_frame_hdr_metadata_ = true;
+ layer_->update_mask.set(kMetadataUpdate);
+ }
+ break;
+ default:
+ DLOGW("Invalid key = %d", keys[i]);
+ return HWC2::Error::BadParameter;
}
}
return HWC2::Error::None;
@@ -882,6 +929,11 @@ bool HWCLayer::IsDataSpaceSupported() {
}
void HWCLayer::ValidateAndSetCSC(const private_handle_t *handle) {
+ if (per_frame_hdr_metadata_) {
+ // Since client has set PerFrameMetadata, dataspace will be valid
+ // so we can skip reading from ColorMetaData.
+ return;
+ }
LayerBuffer *layer_buffer = &layer_->input_buffer;
bool use_color_metadata = true;
ColorMetaData csc = {};
@@ -920,6 +972,9 @@ void HWCLayer::ValidateAndSetCSC(const private_handle_t *handle) {
(layer_buffer->color_metadata.range != old_meta_data.range)) {
layer_->update_mask.set(kMetadataUpdate);
}
+ DLOGV_IF(kTagClient, "Dynamic Metadata valid = %d size = %d",
+ layer_buffer->color_metadata.dynamicMetaDataValid,
+ layer_buffer->color_metadata.dynamicMetaDataLen);
if (layer_buffer->color_metadata.dynamicMetaDataValid &&
!SameConfig(layer_buffer->color_metadata.dynamicMetaDataPayload,
old_meta_data.dynamicMetaDataPayload, HDR_DYNAMIC_META_DATA_SZ)) {