composer: Read ColorMetaData from gralloc hnd when it's valid

- Read CSC, mastering display info, light levels, cRI and hdr10+
  dynamic metadata from gralloc metadata when it's valid.
- This handles use-cases where some clients use native window API
  and some use setMetadata to set gralloc metadata.
- MAX_FRAME_AVERAGE_LIGHT_LEVEL is in cd/m^2 no need to * 10000

Change-Id: Ib2bec4a493eb0c1225c5404fbbef424e4c0f8b6a
Crs-fixed: 2608417
diff --git a/composer/hwc_layers.cpp b/composer/hwc_layers.cpp
index 718d80d..f934040 100644
--- a/composer/hwc_layers.cpp
+++ b/composer/hwc_layers.cpp
@@ -618,7 +618,7 @@
         content_light.maxContentLightLevel = UINT32(metadata[i]);
         break;
       case PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL:
-        content_light.minPicAverageLightLevel = UINT32(metadata[i] * 10000);
+        content_light.minPicAverageLightLevel = UINT32(metadata[i]);
         break;
       default:
        break;
@@ -658,9 +658,6 @@
           std::memcpy(color_metadata.dynamicMetaDataPayload, metadata, sizes[i]);
           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]);
@@ -955,9 +952,7 @@
      use_color_metadata = true;
   }
 
-  // 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_) {
+  if (use_color_metadata) {
     ColorMetaData new_metadata = layer_buffer->color_metadata;
     if (sdm::SetCSC(handle, &new_metadata) == kErrorNone) {
       // If dataspace is KNOWN, overwrite the gralloc metadata CSC using the previously derived CSC
@@ -970,19 +965,50 @@
       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_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, "Layer id =%lld Dynamic Metadata valid = %d size = %d", id_,
-               new_metadata.dynamicMetaDataValid,
+      if (layer_buffer->color_metadata.matrixCoefficients != new_metadata.matrixCoefficients) {
+        layer_buffer->color_metadata.matrixCoefficients = new_metadata.matrixCoefficients;
+        layer_->update_mask.set(kMetadataUpdate);
+      }
+      DLOGV_IF(kTagClient, "Layer id = %lld ColorVolEnabled = %d ContentLightLevelEnabled = %d "
+               "cRIEnabled = %d Dynamic Metadata valid = %d size = %d", id_,
+               new_metadata.masteringDisplayInfo.colorVolumeSEIEnabled,
+               new_metadata.contentLightLevel.lightLevelSEIEnabled,
+               new_metadata.cRI.criEnabled, new_metadata.dynamicMetaDataValid,
                new_metadata.dynamicMetaDataLen);
+      // Read color metadata from gralloc handle if it's enabled by clients, this will override the
+      // values set using the Composer API's(SetLayerPerFrameMetaData)
+      if (new_metadata.masteringDisplayInfo.colorVolumeSEIEnabled &&
+          !SameConfig(&new_metadata.masteringDisplayInfo,
+          &layer_buffer->color_metadata.masteringDisplayInfo, UINT32(sizeof(MasteringDisplay)))) {
+        layer_buffer->color_metadata.masteringDisplayInfo = new_metadata.masteringDisplayInfo;
+        layer_->update_mask.set(kMetadataUpdate);
+      }
+      if (new_metadata.contentLightLevel.lightLevelSEIEnabled &&
+          !SameConfig(&new_metadata.contentLightLevel,
+          &layer_buffer->color_metadata.contentLightLevel, UINT32(sizeof(ContentLightLevel)))) {
+        layer_buffer->color_metadata.contentLightLevel = new_metadata.contentLightLevel;
+        layer_->update_mask.set(kMetadataUpdate);
+      }
+      if (new_metadata.cRI.criEnabled &&
+          !SameConfig(&new_metadata.cRI, &layer_buffer->color_metadata.cRI,
+          UINT32(sizeof(ColorRemappingInfo)))) {
+        layer_buffer->color_metadata.cRI = new_metadata.cRI;
+        layer_->update_mask.set(kMetadataUpdate);
+      }
       if (new_metadata.dynamicMetaDataValid &&
           !SameConfig(layer_buffer->color_metadata.dynamicMetaDataPayload,
           new_metadata.dynamicMetaDataPayload, HDR_DYNAMIC_META_DATA_SZ)) {
+          layer_buffer->color_metadata.dynamicMetaDataValid = true;
+          layer_buffer->color_metadata.dynamicMetaDataLen = new_metadata.dynamicMetaDataLen;
+          std::memcpy(layer_buffer->color_metadata.dynamicMetaDataPayload,
+                      new_metadata.dynamicMetaDataPayload, new_metadata.dynamicMetaDataLen);
         layer_->update_mask.set(kMetadataUpdate);
       }
-      if (layer_->update_mask.test(kMetadataUpdate)) {
-        layer_buffer->color_metadata = new_metadata;
-      }
     } else {
       dataspace_supported_ = false;
       return;
diff --git a/composer/hwc_layers.h b/composer/hwc_layers.h
index 90cd55a..63bad30 100644
--- a/composer/hwc_layers.h
+++ b/composer/hwc_layers.h
@@ -154,7 +154,6 @@
   bool color_transform_matrix_set_ = false;
   bool buffer_flipped_ = false;
   bool secure_ = false;
-  bool per_frame_hdr_metadata_blob_ = false;  // used to track if perframe metadata blob is set
 
   // Composition requested by client(SF)
   HWC2::Composition client_requested_ = HWC2::Composition::Device;