summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Huang <kenbshuang@google.com>2022-05-31 14:47:48 +0800
committerKen Huang <kenbshuang@google.com>2022-06-07 12:37:37 +0000
commit5ed4a469b334a8287ba8fa1b845c465d7dc07cdc (patch)
tree4810142c84106124c3bf723ebdadb545308f8ac9
parent0876d4aae686b49c28ec84efe087296abe696533 (diff)
downloadcommon-5ed4a469b334a8287ba8fa1b845c465d7dc07cdc.tar.gz
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
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp23
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h2
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp5
3 files changed, 19 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..4696a96 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(
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;
}