diff options
author | Shiyong Li <shiyongli@google.com> | 2023-04-07 21:14:16 +0000 |
---|---|---|
committer | Shiyong Li <shiyongli@google.com> | 2023-04-25 18:19:30 +0000 |
commit | 88780476976e4194bbaa581a5713b69d8d963a1e (patch) | |
tree | d498590e90af5f42ae961147c4366400fd2cdb2a /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | 8582373b324ca932f4e583aa5caf742123e629f0 (diff) |
libhwc2.1: actively set lhbm desired refresh rate during lhbm period
- set lhbm desired refresh rate at enabling lhbm and restore SF desired
one at disabling if needed.
- always notify SF with it's desired Vsync if SF's refresh rate !=
lhbm's
Bug: 250979028
Test: udfps auth with SmoothDisplay=on/off, check perfetto trace
Signed-off-by: Shiyong Li <shiyongli@google.com>
Change-Id: If011dbf12c1f979a50988cc375e74c7f53617d68
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 6a2be7d..375153b 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -747,6 +747,30 @@ void ExynosDisplayDrmInterface::Callback( if (!mExynosDisplay->mPlugState || !mVsyncCallback.getVSyncEnabled()) { return; } + + // Refresh rate during enabling LHBM might be different from the one SF expects. + // HWC just reports the SF expected Vsync to make UI smoothness consistent even if + // HWC runs at different refresh rate temporarily. + if (!mExynosDisplay->isConfigSettingEnabled()) { + int64_t pendingPeriodNs = + mExynosDisplay->getVsyncPeriod(mExynosDisplay->mPendingConfig); + int64_t activePeriodNs = mExynosDisplay->getVsyncPeriod(mExynosDisplay->mActiveConfig); + if (pendingPeriodNs && mExynosDisplay->mLastVsyncTimestamp) { + if (activePeriodNs > pendingPeriodNs) { + DISPLAY_DRM_LOGW("wrong vsync period: %" PRId64 "us (active), %" PRId64 + "us (pending)", + activePeriodNs / 1000, pendingPeriodNs / 1000); + } else if (activePeriodNs != pendingPeriodNs) { + int64_t deltaNs = timestamp - mExynosDisplay->mLastVsyncTimestamp; + if (deltaNs < (pendingPeriodNs - ms2ns(2))) { + DISPLAY_DRM_LOGI("skip mismatching Vsync callback, delta=%" PRId64 "us", + deltaNs / 1000); + return; + } + } + } + } + mExynosDisplay->mLastVsyncTimestamp = timestamp; } ExynosDevice *exynosDevice = mExynosDisplay->mDevice; @@ -1152,6 +1176,7 @@ int32_t ExynosDisplayDrmInterface::setActiveConfigWithConstraints( if (mExynosDisplay->mOperationRateManager) { mExynosDisplay->mOperationRateManager->onConfig(config); } + DISPLAY_DRM_LOGI("%s: config(%d)", __func__, config); } else { ALOGD("%s:: same desired mode %d", __func__, config); } @@ -1243,9 +1268,9 @@ int32_t ExynosDisplayDrmInterface::setActiveConfig(hwc2_config_t config) { mExynosDisplay->updateAppliedActiveConfig(config, systemTime(SYSTEM_TIME_MONOTONIC)); if (!setActiveDrmMode(*mode)) { - ALOGI("%s:: %s config(%d)", __func__, mExynosDisplay->mDisplayName.string(), config); + DISPLAY_DRM_LOGI("%s: config(%d)", __func__, config); } else { - ALOGE("%s:: %s config(%d) failed", __func__, mExynosDisplay->mDisplayName.string(), config); + DISPLAY_DRM_LOGE("%s: config(%d) failed", __func__, config); } return 0; |