diff options
author | Baldev Sahu <bsahu@codeaurora.org> | 2019-11-05 14:59:03 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-03-25 23:37:27 -0700 |
commit | 76229cc49e41b3b84d7f66615812bb81af1bf640 (patch) | |
tree | 26c08ca4f433498d3e3143c93f54877070c2417d /sdm/libs/hwc2/hwc_layers.cpp | |
parent | e21c4336a29e8cbfb6cb3fbb4952cc8b63b70581 (diff) |
hwc2: Handle reading color metadata
- Read HDR static metadata and HDR10plus datas from color metadata, and
dataspace from SF.
- If dataspace is UNKNOWN, get dataspace from gralloc metadata.
Change-Id: Ice9200fd042264d76b99b5dd2d583a705bb20009
CRs-Fixed: 2523925
Diffstat (limited to 'sdm/libs/hwc2/hwc_layers.cpp')
-rw-r--r-- | sdm/libs/hwc2/hwc_layers.cpp | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp index c43f3ac1..a8c1926e 100644 --- a/sdm/libs/hwc2/hwc_layers.cpp +++ b/sdm/libs/hwc2/hwc_layers.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. * Not a Contribution. * * Copyright 2015 The Android Open Source Project @@ -957,31 +957,35 @@ void HWCLayer::ValidateAndSetCSC(const private_handle_t *handle) { } } - // Only Video module populates the Color Metadata in handle. - if (layer_buffer->flags.video && IsBT2020(layer_buffer->color_metadata.colorPrimaries)) { + if (IsBT2020(layer_buffer->color_metadata.colorPrimaries)) { // android_dataspace_t doesnt support mastering display and light levels // so retrieve it from metadata for BT2020(HDR) use_color_metadata = true; } - // Since client has set PerFrameMetadata, dataspace will be valid - // so we can skip reading from ColorMetaData. if (use_color_metadata && !per_frame_hdr_metadata_) { - ColorMetaData old_meta_data = layer_buffer->color_metadata; - if (sdm::SetCSC(handle, &layer_buffer->color_metadata) == kErrorNone) { - if ((layer_buffer->color_metadata.colorPrimaries != old_meta_data.colorPrimaries) || - (layer_buffer->color_metadata.transfer != old_meta_data.transfer) || - (layer_buffer->color_metadata.range != old_meta_data.range)) { + ColorMetaData new_metadata = {}; + if (sdm::SetCSC(handle, &new_metadata) == kErrorNone) { + // If dataspace is KNOWN, overwrite the gralloc metadata CSC using the previously derived CSC + // from dataspace. + if (dataspace_ != HAL_DATASPACE_UNKNOWN) { + new_metadata.colorPrimaries = layer_buffer->color_metadata.colorPrimaries; + new_metadata.transfer = layer_buffer->color_metadata.transfer; + new_metadata.range = layer_buffer->color_metadata.range; + } + if ((layer_buffer->color_metadata.colorPrimaries != new_metadata.colorPrimaries) || + (layer_buffer->color_metadata.transfer != new_metadata.transfer) || + (layer_buffer->color_metadata.range != new_metadata.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 && + if (new_metadata.dynamicMetaDataValid && !SameConfig(layer_buffer->color_metadata.dynamicMetaDataPayload, - old_meta_data.dynamicMetaDataPayload, HDR_DYNAMIC_META_DATA_SZ)) { + new_metadata.dynamicMetaDataPayload, HDR_DYNAMIC_META_DATA_SZ)) { layer_->update_mask.set(kMetadataUpdate); } + if (layer_->update_mask.test(kMetadataUpdate)) { + layer_buffer->color_metadata = new_metadata; + } } else { dataspace_supported_ = false; return; |