summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
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 147ac70..184dbe7 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -745,6 +745,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());
@@ -1650,7 +1652,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;
@@ -1670,12 +1672,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) {
@@ -1689,6 +1696,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;
@@ -2423,8 +2439,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;
}