diff options
author | Baldev Sahu <bsahu@codeaurora.org> | 2019-03-01 19:46:38 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-03-09 03:11:29 -0700 |
commit | 0eb1083e584b0bc8f8fb2e5174435c36a48efa07 (patch) | |
tree | 792d2352a45a193aa8b380d49a0a36c1a69350dd /sdm/libs/hwc2/hwc_layers.cpp | |
parent | 54d3a6453a8eb64d2e83e383f62686952de50298 (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.cpp | 55 |
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)) { |