diff options
author | Chris Lu <luchris@google.com> | 2023-01-07 14:25:26 +0800 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-01-18 02:09:04 +0000 |
commit | cc34d7b7db7f195146585594ac3d00336e7f0262 (patch) | |
tree | 1ecd2b42f87a114064cbd1219060829cb325b0eb | |
parent | 2c23521fa914fa7d184c848e0b2c48b47996f8a5 (diff) | |
download | common-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.cpp | 14 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 8 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 26 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h | 4 |
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; |