diff options
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 86ce1c5..27d541b 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; @@ -1838,6 +1863,11 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() (plane->id() != static_cast<ExynosPrimaryDisplay *>(mExynosDisplay)->mRcdId)) continue; + /* If this plane is not supported by the CRTC binded with ExynosDisplay, + * it should be disabled by this ExynosDisplay */ + if (!plane->GetCrtcSupported(*mDrmCrtc)) + continue; + if ((ret = drmReq.atomicAddProperty(plane->id(), plane->crtc_property(), 0)) < 0) return ret; @@ -1970,6 +2000,21 @@ int32_t ExynosDisplayDrmInterface::clearDisplayMode(DrmModeAtomicReq &drmReq) return NO_ERROR; } +int32_t ExynosDisplayDrmInterface::triggerClearDisplayPlanes() +{ + ATRACE_CALL(); + DrmModeAtomicReq drmReq(this); + + clearDisplayPlanes(drmReq); + int ret = NO_ERROR; + if ((ret = drmReq.commit(0, true))) { + HWC_LOGE(mExynosDisplay, "%s:: Failed to commit pset ret=(%d)\n", + __func__, ret); + return ret; + } + return ret; +} + int32_t ExynosDisplayDrmInterface::clearDisplayPlanes(DrmModeAtomicReq &drmReq) { int ret = NO_ERROR; @@ -1983,6 +2028,11 @@ int32_t ExynosDisplayDrmInterface::clearDisplayPlanes(DrmModeAtomicReq &drmReq) (exynosMPP->mReservedDisplay != (int32_t)mExynosDisplay->mDisplayId)) continue; + /* If this plane is not supported by the CRTC binded with ExynosDisplay, + * it should not be disabled by this ExynosDisplay */ + if (!plane->GetCrtcSupported(*mDrmCrtc)) + continue; + if ((ret = drmReq.atomicAddProperty(plane->id(), plane->crtc_property(), 0)) < 0) { break; |