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) {