summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <luchris@google.com>2023-01-07 14:25:26 +0800
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-01-18 02:09:04 +0000
commitcc34d7b7db7f195146585594ac3d00336e7f0262 (patch)
tree1ecd2b42f87a114064cbd1219060829cb325b0eb
parent2c23521fa914fa7d184c848e0b2c48b47996f8a5 (diff)
downloadcommon-cc34d7b7db7f195146585594ac3d00336e7f0262.tar.gz
libhwc2.1: avoid redundant wait while enabling LHBM
We may have extra wait for the peak refresh while enabling LHBM if smooth display is disabled. Use condition wait instead of vblank so that we can continue enabling LHBM after receiving the peak notification. Bug: 263821118 Bug: 264719811 Test: capture trace Change-Id: Ie96aa21f1e0353578bb34c0655297700766ec5ed Merged-In: Ie96aa21f1e0353578bb34c0655297700766ec5ed (cherry picked from commit 376a8b2db4b871d224c21b6f3da475b0336bd7cf) Merged-In: Ie96aa21f1e0353578bb34c0655297700766ec5ed
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp14
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h8
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp26
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h4
4 files changed, 28 insertions, 24 deletions
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp
index 354d75c..2ccab48 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.cpp
+++ b/libhwc2.1/libdevice/ExynosDisplay.cpp
@@ -1000,7 +1000,7 @@ ExynosDisplay::ExynosDisplay(uint32_t index, ExynosDevice *device)
mSkipFrame(false),
mVsyncPeriodChangeConstraints{systemTime(SYSTEM_TIME_MONOTONIC), 0},
mVsyncAppliedTimeLine{false, 0, systemTime(SYSTEM_TIME_MONOTONIC)},
- mConfigRequestState(hwc_request_state_t::SET_CONFIG_STATE_NONE),
+ mConfigRequestState(hwc_request_state_t::SET_CONFIG_STATE_DONE),
mPowerHalHint(getDisplayId(mDisplayId, mIndex)) {
mDisplayControl.enableCompositionCrop = true;
mDisplayControl.enableExynosCompositionOptimization = true;
@@ -4247,10 +4247,18 @@ int32_t ExynosDisplay::resetConfigRequestStateLocked(hwc2_config_t config) {
DISPLAY_LOGI("%s: mConfigRequestState (%d) is not REQUESTED", __func__,
mConfigRequestState);
} else {
- DISPLAY_LOGD(eDebugDisplayInterfaceConfig, "%s: Change mConfigRequestState (%d) to NONE",
+ DISPLAY_LOGD(eDebugDisplayInterfaceConfig, "%s: Change mConfigRequestState (%d) to DONE",
__func__, mConfigRequestState);
- mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_NONE;
+ mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_DONE;
updateAppliedActiveConfig(mActiveConfig, systemTime(SYSTEM_TIME_MONOTONIC));
+
+ std::lock_guard<std::mutex> lock(mPeakRefreshRateMutex);
+ bool isPeakRefreshRate = isCurrentPeakRefreshRate();
+ ATRACE_INT("isPeakRefreshRate", isPeakRefreshRate);
+ if (isPeakRefreshRate && mNotifyPeakRefreshRate) {
+ mPeakRefreshRateCondition.notify_one();
+ mNotifyPeakRefreshRate = false;
+ }
}
return NO_ERROR;
}
diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h
index ad7977b..8a47866 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.h
+++ b/libhwc2.1/libdevice/ExynosDisplay.h
@@ -141,7 +141,7 @@ enum class PanelGammaSource {
};
enum class hwc_request_state_t {
- SET_CONFIG_STATE_NONE = 0,
+ SET_CONFIG_STATE_DONE = 0,
SET_CONFIG_STATE_PENDING,
SET_CONFIG_STATE_REQUESTED,
};
@@ -534,6 +534,10 @@ class ExynosDisplay {
hwc2_config_t mActiveConfig = UINT_MAX;
+ bool mNotifyPeakRefreshRate = false;
+ std::mutex mPeakRefreshRateMutex;
+ std::condition_variable mPeakRefreshRateCondition;
+
void initDisplay();
int getId();
@@ -1255,7 +1259,7 @@ class ExynosDisplay {
void setMinDisplayVsyncPeriod(uint32_t period) { mMinDisplayVsyncPeriod = period; }
bool isCurrentPeakRefreshRate(void) {
- return ((mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_NONE) &&
+ return ((mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_DONE) &&
(mVsyncPeriod == mMinDisplayVsyncPeriod));
}
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index 8320553..6398f11 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -164,7 +164,7 @@ int ExynosPrimaryDisplay::getDDIScalerMode(int width, int height) {
int32_t ExynosPrimaryDisplay::doDisplayConfigInternal(hwc2_config_t config) {
if (!mPowerModeState.has_value() || (*mPowerModeState != HWC2_POWER_MODE_ON)) {
mPendActiveConfig = config;
- mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_NONE;
+ mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_DONE;
DISPLAY_LOGI("%s:: Pending desired Config: %d", __func__, config);
return NO_ERROR;
}
@@ -533,22 +533,14 @@ int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) {
if (enabled) {
ATRACE_NAME("wait for peak refresh rate");
- for (int32_t i = 0; i <= kLhbmWaitForPeakRefreshRate; i++) {
- if (!isCurrentPeakRefreshRate()) {
- if (i == kLhbmWaitForPeakRefreshRate) {
- ALOGW("setLhbmState(on) wait for peak refresh rate timeout !");
- return TIMED_OUT;
- }
-
- ATRACE_NAME("wait for one vblank");
- if (mDisplayInterface->waitVBlank()) {
- ALOGE("%s failed to wait vblank for peak refresh rate, %d", __func__, i);
- return -ENODEV;
- }
- } else {
- ALOGI_IF(i, "waited %d vblank to reach peak refresh rate", i);
- break;
- }
+ std::unique_lock<std::mutex> lock(mPeakRefreshRateMutex);
+ mNotifyPeakRefreshRate = true;
+ if (!mPeakRefreshRateCondition.wait_for(lock,
+ std::chrono::milliseconds(
+ kLhbmWaitForPeakRefreshRateMs),
+ [this]() { return isCurrentPeakRefreshRate(); })) {
+ ALOGW("setLhbmState(on) wait for peak refresh rate timeout !");
+ return TIMED_OUT;
}
}
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
index d9ec1ca..e66bb2a 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
@@ -118,8 +118,8 @@ class ExynosPrimaryDisplay : public ExynosDisplay {
FILE* mLhbmFd;
std::atomic<bool> mLhbmOn;
int32_t mFramesToReachLhbmPeakBrightness;
- // wait num of vsync periods for peak refresh rate
- static constexpr uint32_t kLhbmWaitForPeakRefreshRate = 10;
+ // timeout value of waiting for peak refresh rate
+ static constexpr uint32_t kLhbmWaitForPeakRefreshRateMs = 200;
static constexpr uint32_t kLhbmRefreshRateThrottleMs = 1000;
FILE* mEarlyWakeupDispFd;