summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
authorWilliam Tai <williamtai@google.com>2021-09-01 05:58:01 +0800
committerWilliam Tai <williamtai@google.com>2021-09-22 17:17:19 +0800
commite3770ba8cfdb8c6e0a21790ece0474f8a77a2ecc (patch)
treef98f2253a6bdbdde685fd1b42dfcc96f8135c114 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
parenta798d533715b3ceca42b42cf44e42f472813cd32 (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.cpp28
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;
}