Merge "hwc2: Avoid querying HDR capability for every getHDRCapability call"
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 8243496..1c1ea99 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -341,6 +341,9 @@
   for (auto &map_info : map_info_virtual_) {
     map_info.client_id = base_id++;
   }
+
+  // resize HDR supported map to total number of displays.
+  is_hdr_display_.resize(UINT32(base_id));
 }
 
 int HWCSession::GetDisplayIndex(int dpy) {
@@ -1279,6 +1282,7 @@
           return HWC2::Error::NoResources;
         }
 
+        is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display);
         DLOGI("Created virtual display id:% " PRIu64 " with res: %dx%d", client_id, width, height);
 
         *out_display_id = client_id;
@@ -2423,6 +2427,7 @@
     }
 
     if (!status) {
+      is_hdr_display_[UINT32(client_id)] = HasHDRSupport(*hwc_display);
       DLOGI("Primary display created.");
       map_info_primary_.disp_type = info.display_type;
       map_info_primary_.sdm_id = info.display_id;
@@ -2482,6 +2487,7 @@
           DLOGE("Builtin display creation failed.");
           break;
         }
+        is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display_[client_id]);
         DLOGI("Builtin display created: sdm id = %d, client id = %d", info.display_id, client_id);
         map_info.disp_type = info.display_type;
         map_info.sdm_id = info.display_id;
@@ -2631,6 +2637,7 @@
           break;
         }
 
+        is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display);
         DLOGI("Created pluggable display successfully: sdm id = %d, client id = %d",
               info.display_id, client_id);
       }
@@ -2677,6 +2684,21 @@
   return status;
 }
 
+bool HWCSession::HasHDRSupport(HWCDisplay *hwc_display) {
+  // query number of hdr types
+  uint32_t out_num_types = 0;
+  float out_max_luminance = 0.0f;
+  float out_max_average_luminance = 0.0f;
+  float out_min_luminance = 0.0f;
+  if (hwc_display->GetHdrCapabilities(&out_num_types, nullptr, &out_max_luminance,
+                                      &out_max_average_luminance, &out_min_luminance)
+                                      != HWC2::Error::None) {
+    return false;
+  }
+
+  return (out_num_types > 0);
+}
+
 int HWCSession::HandleDisconnectedDisplays(HWDisplaysInfo *hw_displays_info) {
   // Destroy pluggable displays which were connected earlier but got disconnected now.
   for (auto &map_info : map_info_pluggable_) {
@@ -2734,6 +2756,7 @@
     DLOGI("Destroy display %d-%d, client id = %d", map_info->sdm_id, map_info->disp_type,
          client_id);
 
+    is_hdr_display_[UINT32(client_id)] = false;
     if (!map_info->test_pattern) {
       HWCDisplayPluggable::Destroy(hwc_display);
     } else {
@@ -2755,6 +2778,7 @@
   }
   DLOGI("Destroy display %d-%d, client id = %d", map_info->sdm_id, map_info->disp_type,
         client_id);
+  is_hdr_display_[UINT32(client_id)] = false;
   switch (map_info->disp_type) {
     case kBuiltIn:
       HWCDisplayBuiltIn::Destroy(hwc_display);
diff --git a/sdm/libs/hwc2/hwc_session.h b/sdm/libs/hwc2/hwc_session.h
index d6c6e0c..1d546cc 100644
--- a/sdm/libs/hwc2/hwc_session.h
+++ b/sdm/libs/hwc2/hwc_session.h
@@ -283,6 +283,7 @@
   int32_t MinHdcpEncryptionLevelChanged(int disp_id, uint32_t min_enc_level);
   int32_t IsWbUbwcSupported(int *value);
   int32_t SetDynamicDSIClock(int64_t disp_id, uint32_t bitrate);
+  bool HasHDRSupport(HWCDisplay *hwc_display);
 
   // service methods
   void StartServices();
@@ -408,6 +409,7 @@
   std::vector<DisplayMapInfo> map_info_builtin_;    // Builtin displays excluding primary
   std::vector<DisplayMapInfo> map_info_pluggable_;  // Pluggable displays excluding primary
   std::vector<DisplayMapInfo> map_info_virtual_;    // Virtual displays
+  std::vector<bool> is_hdr_display_;    // info on HDR supported
   bool reset_panel_ = false;
   bool client_connected_ = false;
   bool new_bw_mode_ = false;
diff --git a/sdm/libs/hwc2/hwc_session_services.cpp b/sdm/libs/hwc2/hwc_session_services.cpp
index a1eec83..2a8d631 100644
--- a/sdm/libs/hwc2/hwc_session_services.cpp
+++ b/sdm/libs/hwc2/hwc_session_services.cpp
@@ -675,25 +675,11 @@
 }
 
 Return<bool> HWCSession::isHDRSupported(uint32_t disp_id) {
-  SCOPE_LOCK(locker_[disp_id]);
-  HWCDisplay *hwc_display = hwc_display_[disp_id];
-  if (!hwc_display) {
-    DLOGW("Display = %d is not connected.", disp_id);
+  if (disp_id < 0 || disp_id >= HWCCallbacks::kNumDisplays) {
+    DLOGE("Not valid display");
     return false;
   }
-
-  // query number of hdr types
-  uint32_t out_num_types = 0;
-  float out_max_luminance = 0.0f;
-  float out_max_average_luminance = 0.0f;
-  float out_min_luminance = 0.0f;
-  if (hwc_display->GetHdrCapabilities(&out_num_types, nullptr, &out_max_luminance,
-                                      &out_max_average_luminance, &out_min_luminance)
-                                      != HWC2::Error::None) {
-    return false;
-  }
-
-  return (out_num_types > 0);
+  return static_cast<bool>(is_hdr_display_[disp_id]);
 }
 
 Return<bool> HWCSession::isWCGSupported(uint32_t disp_id) {