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
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index c43f3ac..a8c1926 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 @@
     }
   }
 
-  // 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;