sdm: Don't block draw-cycle thread during SetDisplayBrightness
Driver makes sure that Panel commands are serialized to any frame
update on Panel. SetDisplayBrightness API doesn't need to acquire
locker_ lock which blocks draw-cycle thread and causes frame drops.
Define brightness_lock_ to serialize Set and Get Panel brightness
CRs-Fixed: 2446089
Change-Id: I963f1b3ddcd4765ddff805a373f70cdd550fa993
diff --git a/sdm/libs/core/display_builtin.cpp b/sdm/libs/core/display_builtin.cpp
index 0e3ff35..25af21e 100644
--- a/sdm/libs/core/display_builtin.cpp
+++ b/sdm/libs/core/display_builtin.cpp
@@ -347,7 +347,7 @@
}
DisplayError DisplayBuiltIn::SetPanelBrightness(float brightness) {
- lock_guard<recursive_mutex> obj(recursive_mutex_);
+ lock_guard<recursive_mutex> obj(brightness_lock_);
if (brightness != -1.0f && !(0.0f <= brightness && brightness <= 1.0f)) {
DLOGE("Bad brightness value = %f", brightness);
@@ -496,7 +496,7 @@
}
DisplayError DisplayBuiltIn::GetPanelBrightness(float *brightness) {
- lock_guard<recursive_mutex> obj(recursive_mutex_);
+ lock_guard<recursive_mutex> obj(brightness_lock_);
DisplayError err = kErrorNone;
int level = 0;
diff --git a/sdm/libs/core/display_builtin.h b/sdm/libs/core/display_builtin.h
index fde57e1..a6a272e 100644
--- a/sdm/libs/core/display_builtin.h
+++ b/sdm/libs/core/display_builtin.h
@@ -158,6 +158,7 @@
int previous_retire_fence_ = -1;
DeferFpsConfig deferred_config_ = {};
float level_remainder_ = 0.0f;
+ recursive_mutex brightness_lock_;
};
} // namespace sdm
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index d1653ee..87ded3a 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -3328,7 +3328,22 @@
int32_t HWCSession::SetDisplayBrightness(hwc2_device_t *device, hwc2_display_t display,
float brightness) {
- return CallDisplayFunction(device, display, &HWCDisplay::SetPanelBrightness, brightness);
+ if (!device) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (display >= HWCCallbacks::kNumDisplays) {
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ HWCSession *hwc_session = static_cast<HWCSession *>(device);
+ HWCDisplay *hwc_display = hwc_session->hwc_display_[display];
+
+ if (!hwc_display) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ return INT32(hwc_display->SetPanelBrightness(brightness));
}
android::status_t HWCSession::SetQSyncMode(const android::Parcel *input_parcel) {