diff options
-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; |