diff options
author | William Tai <williamtai@google.com> | 2021-09-01 05:58:01 +0800 |
---|---|---|
committer | William Tai <williamtai@google.com> | 2021-09-22 17:17:19 +0800 |
commit | e3770ba8cfdb8c6e0a21790ece0474f8a77a2ecc (patch) | |
tree | f98f2253a6bdbdde685fd1b42dfcc96f8135c114 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | a798d533715b3ceca42b42cf44e42f472813cd32 (diff) |
libhwc2.1: update panel brightness when brightness level dirty set
Update brightness level 0 in power off mode and clear dirty. Update
panel brightness when dirty is set and clear dirty after brightness
updated. Allow HBM and brightness update via drm prop only when GHBM
UDFPS compensation occurs.
Bug: 197479033
Change-Id: I9f3e7cde16ea3c5395881d2e69d65dc035b34087
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index b3db3fc..4ae927d 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -738,6 +738,8 @@ int32_t ExynosDisplayDrmInterface::setPowerMode(int32_t mode) if (mode == HWC_POWER_MODE_OFF) { mBrightnessState.reset(); mBrightnessCtrl.reset(); + mBrightnessLevel.store(0); + mBrightnessLevel.clear_dirty(); mExynosDisplay->requestEnhancedHbm(false); mExynosDisplay->requestLhbm(false); mExynosDisplay->notifyLhbmState(mBrightnessCtrl.LhbmOn.get()); @@ -1640,7 +1642,7 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() : brightnessState_t::MIPI_SYNC_LHBM_OFF; } - if (mBrightnessCtrl.LhbmOn.is_dirty() || mBrightnessLevel.is_dirty()) { + if (mBrightnessCtrl.LhbmOn.is_dirty()) { auto dbv = mBrightnessLevel.get(); if (mBrightnessCtrl.LhbmOn.get()) { uint32_t dbv_adj = 0; @@ -1660,12 +1662,17 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() mDrmConnector->brightness_level(), dbv)) < 0) { HWC_LOGE(mExynosDisplay, "%s: Fail to set brightness_level property", __func__); } - mBrightnessLevel.clear_dirty(); mBrightnessCtrl.LhbmOn.clear_dirty(); } - // only allow to set hbm on for mipi sync when dim SDR transition - if (mBrightnessCtrl.HbmMode.is_dirty() && mBrightnessState.dimSdrTransition()) { + /** + * TODO(b/200332096): + * + * Need to consider hbm sync between sysfs and drm commit later. + * + */ + if (mBrightnessCtrl.HbmMode.is_dirty() && mBrightnessState.dimSdrTransition() && + mBrightnessState.instant_hbm) { uint64_t hbmEnum = 0; std::tie(hbmEnum, ret) = halToDrmEnum(mBrightnessCtrl.HbmMode.get(), mHbmModeEnums); if (ret < 0) { @@ -1679,6 +1686,15 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() } mBrightnessCtrl.HbmMode.clear_dirty(); + if (mBrightnessLevel.is_dirty()) { + if ((ret = drmReq.atomicAddProperty(mDrmConnector->id(), + mDrmConnector->brightness_level(), + mBrightnessLevel.get())) < 0) { + HWC_LOGE(mExynosDisplay, "%s: Fail to set brightness_level property", __func__); + } + mBrightnessLevel.clear_dirty(); + } + // sync mipi command and frame when sdr dimming on/off if (!mipi_sync) { mipi_sync = true; @@ -2409,8 +2425,10 @@ int32_t ExynosDisplayDrmInterface::updateBrightness(bool syncFrame) { } } - if (mExynosDisplay->mBrightnessFd) + if (mExynosDisplay->mBrightnessFd && mBrightnessLevel.is_dirty()) { writeFileNode(mExynosDisplay->mBrightnessFd, mBrightnessLevel.get()); + mBrightnessLevel.clear_dirty(); + } return HWC2_ERROR_NONE; } |