diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-01-18 02:09:34 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-01-18 02:09:34 +0000 |
commit | ee3797c0bd15c419ffcbaba1ee9c5e29e80701b4 (patch) | |
tree | 1ecd2b42f87a114064cbd1219060829cb325b0eb | |
parent | 2c23521fa914fa7d184c848e0b2c48b47996f8a5 (diff) | |
parent | cc34d7b7db7f195146585594ac3d00336e7f0262 (diff) | |
download | common-android13-d4-s1-release.tar.gz |
Merge cherrypicks of ['ag/20919387'] into tm-d4-release.android-13.0.0_r48android-13.0.0_r47android-13.0.0_r46android13-d4-s2-releaseandroid13-d4-s1-releaseandroid13-d4-release
Change-Id: Ief811b4bd9a59602d9ffcd181a2d5f6af82d80b9
-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; |