summaryrefslogtreecommitdiff
path: root/sdm/libs/hwc2/hwc_layers.cpp
diff options
context:
space:
mode:
authorArun Kumar K.R <akumarkr@codeaurora.org>2019-12-12 11:01:53 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2020-03-25 23:38:53 -0700
commit36739aa28d1a55ea73f66ad32895436dcf1e4c75 (patch)
treee5bf394073146479714cf150dc0f1b1b6bccbd37 /sdm/libs/hwc2/hwc_layers.cpp
parent76229cc49e41b3b84d7f66615812bb81af1bf640 (diff)
hwc2: Fix reading HDR10+ from gralloc metadata
- One variable per_frame_hdr_metadata_ was used to track whether to read or avoid from gralloc color metadatas. This variable was set from both SetLayerPerFrameMetadata and SetLayerPerFrameMetadataBlobs. - Since SF calls only SetLayerPerFrameMetadata (w/o support for HDR10+ thru FW), it avoided reading HDR10+ data from gralloc metadata and hence HDR10+ dynamic metadata was not updatedi. - HDR10+ blob data from FW API has higher priority over gralloc metadata, once the FW API sets HDR10+ avoid reading it from gralloc metadata as Video HAL doesn't set both. - Composer must read color metadata from gralloc metadata unless SF sets all PerFrameMetaDataBlobs for HDR10+. Change-Id: I3e288f2947778cad5f95264dd4926ed596d24b96 Crs-fixed: 2581361
Diffstat (limited to 'sdm/libs/hwc2/hwc_layers.cpp')
-rw-r--r--sdm/libs/hwc2/hwc_layers.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index a8c1926e..aed84b18 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -601,7 +601,6 @@ HWC2::Error HWCLayer::SetLayerPerFrameMetadata(uint32_t num_elements,
}
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;
}
@@ -625,7 +624,6 @@ HWC2::Error HWCLayer::SetLayerPerFrameMetadataBlobs(uint32_t num_elements,
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])) {
@@ -633,9 +631,11 @@ HWC2::Error HWCLayer::SetLayerPerFrameMetadataBlobs(uint32_t num_elements,
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);
}
+ // once blob data is set by FW, we should not read from gralloc metadata as video HAL
+ // is setting thru gralloc metadata OR native window API (TODO(user): Revisit).
+ per_frame_hdr_metadata_blob_ = true;
break;
default:
DLOGW("Invalid key = %d", keys[i]);
@@ -963,7 +963,9 @@ void HWCLayer::ValidateAndSetCSC(const private_handle_t *handle) {
use_color_metadata = true;
}
- if (use_color_metadata && !per_frame_hdr_metadata_) {
+ // Since client has set PerFrameMetadatablobs its dataspace and hdr10+ data will be updated
+ // so we can skip reading from ColorMetaData.
+ if (use_color_metadata && !per_frame_hdr_metadata_blob_) {
ColorMetaData new_metadata = {};
if (sdm::SetCSC(handle, &new_metadata) == kErrorNone) {
// If dataspace is KNOWN, overwrite the gralloc metadata CSC using the previously derived CSC
@@ -978,6 +980,9 @@ void HWCLayer::ValidateAndSetCSC(const private_handle_t *handle) {
(layer_buffer->color_metadata.range != new_metadata.range)) {
layer_->update_mask.set(kMetadataUpdate);
}
+ DLOGV_IF(kTagClient, "Layer id =%lld Dynamic Metadata valid = %d size = %d", id_,
+ new_metadata.dynamicMetaDataValid,
+ new_metadata.dynamicMetaDataLen);
if (new_metadata.dynamicMetaDataValid &&
!SameConfig(layer_buffer->color_metadata.dynamicMetaDataPayload,
new_metadata.dynamicMetaDataPayload, HDR_DYNAMIC_META_DATA_SZ)) {