diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-09 15:41:59 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-09 15:41:59 +0000 |
commit | 1c490dbadb2a3abd4ffb96fda874e3f5cba647bd (patch) | |
tree | 75d231fc860f9ee34ff424d512110267547df67c | |
parent | ee2a27d1c8f034eb127d99b0ddfc700d2c46700f (diff) | |
parent | 7324e6459d55ca5714a0e31ae2b85d508387db93 (diff) | |
download | common-android13-frc-media-swcodec-release.tar.gz |
Snap for 8702497 from 7324e6459d55ca5714a0e31ae2b85d508387db93 to tm-frc-media-swcodec-releaset_frc_swc_330443040t_frc_swc_330443010android13-frc-media-swcodec-release
Change-Id: I301396b46dd5ef622be0ed878b8c10444b2c954e
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 23 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 12 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 9 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 16 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h | 2 |
5 files changed, 51 insertions, 11 deletions
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp index 47db503..78f65f2 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.cpp +++ b/libhwc2.1/libdevice/ExynosDisplay.cpp @@ -4081,7 +4081,8 @@ int32_t ExynosDisplay::setActiveConfigWithConstraints(hwc2_config_t config, mXres, mYres, mVsyncPeriod, mXdpi, mYdpi); if (mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_REQUESTED) { - DISPLAY_LOGI("%s, previous request config is processing", __func__); + DISPLAY_LOGI("%s, previous request config is processing (mDesiredConfig: %d)", __func__, + mDesiredConfig); } /* Config would be requested on present time */ mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_PENDING; @@ -4188,8 +4189,7 @@ int32_t ExynosDisplay::updateInternalDisplayConfigVariables( getDisplayAttribute(mActiveConfig, HWC2_ATTRIBUTE_DPI_Y, (int32_t*)&mYdpi); mHdrFullScrenAreaThreshold = mXres * mYres * kHdrFullScreen; if (updateVsync) { - mVsyncPeriod = getDisplayVsyncPeriodFromConfig(mActiveConfig); - updateBtsVsyncPeriod(mVsyncPeriod, true); + resetConfigRequestStateLocked(config); } return NO_ERROR; @@ -4213,11 +4213,12 @@ void ExynosDisplay::updateRefreshRateHint() { } /* This function must be called within a mDisplayMutex protection */ -int32_t ExynosDisplay::resetConfigRequestStateLocked() { - mVsyncPeriod = getDisplayVsyncPeriodFromConfig(mActiveConfig); +int32_t ExynosDisplay::resetConfigRequestStateLocked(hwc2_config_t config) { + ATRACE_CALL(); + + mVsyncPeriod = getDisplayVsyncPeriodFromConfig(config); updateBtsVsyncPeriod(mVsyncPeriod, true); - DISPLAY_LOGD(eDebugDisplayConfig, "Update mVsyncPeriod %d by mActiveConfig(%d)", mVsyncPeriod, - mActiveConfig); + DISPLAY_LOGD(eDebugDisplayConfig, "Update mVsyncPeriod %d by config(%d)", mVsyncPeriod, config); updateRefreshRateHint(); @@ -4235,8 +4236,11 @@ int32_t ExynosDisplay::resetConfigRequestStateLocked() { int32_t ExynosDisplay::updateConfigRequestAppliedTime() { - if (mConfigRequestState != hwc_request_state_t::SET_CONFIG_STATE_REQUESTED) + if (mConfigRequestState != hwc_request_state_t::SET_CONFIG_STATE_REQUESTED) { + DISPLAY_LOGI("%s: mConfigRequestState (%d) is not REQUESTED", __func__, + mConfigRequestState); return NO_ERROR; + } /* * config change was requested but @@ -4311,7 +4315,8 @@ int32_t ExynosDisplay::doDisplayConfigPostProcess(ExynosDevice *dev) needSetActiveConfig = true; ATRACE_INT("Pending ActiveConfig", 0); } else { - DISPLAY_LOGD(eDebugDisplayConfig, "setActiveConfig still pending"); + DISPLAY_LOGD(eDebugDisplayConfig, "setActiveConfig still pending (mDesiredConfig %d)", + mDesiredConfig); ATRACE_INT("Pending ActiveConfig", mDesiredConfig); } diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index 5638c08..e31a692 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1101,7 +1101,7 @@ class ExynosDisplay { bool needNotChangeConfig(hwc2_config_t config); int32_t updateInternalDisplayConfigVariables( hwc2_config_t config, bool updateVsync = true); - int32_t resetConfigRequestStateLocked(); + int32_t resetConfigRequestStateLocked(hwc2_config_t config); int32_t updateConfigRequestAppliedTime(); int32_t updateVsyncAppliedTimeLine(int64_t actualChangeTime); int32_t getDisplayVsyncPeriodInternal( @@ -1243,6 +1243,13 @@ class ExynosDisplay { // is the hint session both enabled and supported bool usePowerHintSession(); + void setMinDisplayVsyncPeriod(uint32_t period) { mMinDisplayVsyncPeriod = period; } + + bool isCurrentPeakRefreshRate(void) { + return ((mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_NONE) && + (mVsyncPeriod == mMinDisplayVsyncPeriod)); + } + private: bool skipStaticLayerChanged(ExynosCompositionInfo& compositionInfo); @@ -1257,6 +1264,9 @@ class ExynosDisplay { static constexpr float kHdrFullScreen = 0.5; uint32_t mHdrFullScrenAreaThreshold; + // vsync period of peak refresh rate + uint32_t mMinDisplayVsyncPeriod; + /* Display hint to notify power hal */ class PowerHalHintWorker : public Worker { public: diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 7ee98a7..82286a1 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -696,7 +696,7 @@ void ExynosDisplayDrmInterface::Callback( if (configApplied) { if (mVsyncCallback.getDesiredVsyncPeriod()) { - mExynosDisplay->resetConfigRequestStateLocked(); + mExynosDisplay->resetConfigRequestStateLocked(mActiveModeState.mode.id()); mDrmConnector->set_active_mode(mActiveModeState.mode); mVsyncCallback.resetDesiredVsyncPeriod(); } @@ -879,6 +879,7 @@ int32_t ExynosDisplayDrmInterface::getDisplayConfigs( /* key: (width<<32 | height) */ std::map<uint64_t, uint32_t> groupIds; uint32_t groupId = 0; + uint32_t min_vsync_period = UINT_MAX; for (const DrmMode &mode : mDrmConnector->modes()) { displayConfigs_t configs; @@ -899,11 +900,14 @@ int32_t ExynosDisplayDrmInterface::getDisplayConfigs( configs.Xdpi = mm_width ? (mode.h_display() * kUmPerInch) / mm_width : -1; // Dots per 1000 inches configs.Ydpi = mm_height ? (mode.v_display() * kUmPerInch) / mm_height : -1; + // find min vsync period + if (configs.vsyncPeriod <= min_vsync_period) min_vsync_period = configs.vsyncPeriod; mExynosDisplay->mDisplayConfigs.insert(std::make_pair(mode.id(), configs)); ALOGD("config group(%d), w(%d), h(%d), vsync(%d), xdpi(%d), ydpi(%d)", configs.groupId, configs.width, configs.height, configs.vsyncPeriod, configs.Xdpi, configs.Ydpi); } + mExynosDisplay->setMinDisplayVsyncPeriod(min_vsync_period); } uint32_t num_modes = static_cast<uint32_t>(mDrmConnector->modes().size()); @@ -1064,6 +1068,9 @@ int32_t ExynosDisplayDrmInterface::setActiveConfigWithConstraints( if ((mActiveModeState.blob_id != 0) && (mActiveModeState.mode.id() == config)) { ALOGD("%s:: same mode %d", __func__, config); + /* trigger resetConfigRequestStateLocked() */ + mVsyncCallback.setDesiredVsyncPeriod(nsecsPerSec / mActiveModeState.mode.v_refresh()); + mDrmVSyncWorker.VSyncControl(true); return HWC2_ERROR_NONE; } diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp index d20a313..633b1d7 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp @@ -495,6 +495,22 @@ int32_t ExynosPrimaryDisplay::SetCurrentPanelGammaSource(const DisplayType type, int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) { ATRACE_CALL(); + 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; + } + usleep(mVsyncPeriod / 1000 + 1); + } else { + ALOGI_IF(i, "waited %d vsync to reach peak refresh rate", i); + break; + } + } + } + requestLhbm(enabled); ALOGI("setLhbmState =%d", enabled); diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h index e544749..c4d79ea 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h @@ -103,6 +103,8 @@ class ExynosPrimaryDisplay : public ExynosDisplay { bool mLhbmOn; bool mLhbmChanged; int32_t mFramesToReachLhbmPeakBrightness; + // wait num of vsync periods for peak refresh rate + static constexpr uint32_t kLhbmWaitForPeakRefreshRate = 10; std::mutex lhbm_mutex_; std::condition_variable lhbm_cond_; |