diff options
author | Ken Huang <kenbshuang@google.com> | 2022-05-31 14:47:48 +0800 |
---|---|---|
committer | Ken Huang <kenbshuang@google.com> | 2022-06-07 12:37:37 +0000 |
commit | 5ed4a469b334a8287ba8fa1b845c465d7dc07cdc (patch) | |
tree | 4810142c84106124c3bf723ebdadb545308f8ac9 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | 0876d4aae686b49c28ec84efe087296abe696533 (diff) |
libhwc2.1: correct config state and vsync period
If there is a pending config in AOD mode or change to same config
rapidly, the config state will be REQUESTED. It should reset to NONE
in those cases. Besides, vsync callback may get incorrect mVsyncPeriod
if it refers to mActiveConfig while quickly switching fps. To avoid it,
refer to mActiveModeState to update mVsyncPeriod.
Bug: 232044740
Test: Suspend/resume, AoD, quickly fps switch
Change-Id: Ifc8989256a9b6f6633abc2d4d74124874493c6c0
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 7ee98a7..847c0d4 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(); } @@ -1064,6 +1064,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; } |