diff options
author | HyunKyung Kim <hk310.kim@samsung.com> | 2020-12-23 15:50:00 +0900 |
---|---|---|
committer | Long Ling <longling@google.com> | 2021-06-21 10:46:38 -0700 |
commit | 6ac7fed9a52c4e4ba67ab5a2adc5dcce04af43ab (patch) | |
tree | 71d65f83f8e5567f748621102c8cb5197c8e7df4 | |
parent | 20cf479ad1c0abb81878df3c0768717fce1643f8 (diff) | |
download | gs101-6ac7fed9a52c4e4ba67ab5a2adc5dcce04af43ab.tar.gz |
libhwc2.1: Force display color setting after readback
Display color setting could be skipped when
readback was requested in the common code.
This patch forces to set display color setting in the
first frame after the frame that skipped display color setting.
Bug: 175422660
Signed-off-by: HyunKyung Kim <hk310.kim@samsung.com>
Change-Id: I68f8d2da4204ba595124c3c75d491a6a18322c11
4 files changed, 25 insertions, 6 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp index 4e1973c..b68f448 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp @@ -419,7 +419,9 @@ int32_t ExynosDisplayDrmInterfaceModule::setDisplayColorBlob( ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq) { /* dirty bit is valid only if enable is true */ - if (!prop.id() || (stage.enable && !stage.dirty)) + if (!prop.id()) + return NO_ERROR; + if (!mForceDisplayColorSetting && stage.enable && !stage.dirty) return NO_ERROR; int32_t ret = 0; @@ -478,8 +480,9 @@ int32_t ExynosDisplayDrmInterfaceModule::setDisplayColorBlob( int32_t ExynosDisplayDrmInterfaceModule::setDisplayColorSetting( ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq) { - if ((mColorSettingChanged == false) || - (isPrimary() == false)) + if (isPrimary() == false) + return NO_ERROR; + if (!mForceDisplayColorSetting && !mColorSettingChanged) return NO_ERROR; ExynosPrimaryDisplayModule* display = diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h index aa35ef1..36efc8c 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h @@ -35,8 +35,10 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface { ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq, const std::unique_ptr<DrmPlane> &plane, const exynos_win_config_data &config); - void setColorSettingChanged(bool changed) { - mColorSettingChanged = changed; }; + void setColorSettingChanged(bool changed, bool forceDisplay = false) { + mColorSettingChanged = changed; + mForceDisplayColorSetting = forceDisplay; + }; void destroyOldBlobs(std::vector<uint32_t> &oldBlobs); int32_t createCgcBlobFromIDqe(const IDisplayColorGS101::IDqe &dqe, @@ -132,6 +134,7 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface { mOldDppBlobs.emplace_back(mDrmDevice, planes[ix]->id()); }; bool mColorSettingChanged = false; + bool mForceDisplayColorSetting = false; enum Bpc_Type { BPC_UNSPECIFIED = 0, BPC_8, diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp index 0a4a6d0..4d75ebc 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp @@ -357,12 +357,24 @@ int ExynosPrimaryDisplayModule::deliverWinConfigData() ExynosDisplayDrmInterfaceModule *moduleDisplayInterface = (ExynosDisplayDrmInterfaceModule*)(mDisplayInterface.get()); + bool forceDisplayColorSetting = false; + if (!mDisplaySceneInfo.displaySettingDelivered) + forceDisplayColorSetting = true; + moduleDisplayInterface->setColorSettingChanged( - mDisplaySceneInfo.needDisplayColorSetting()); + mDisplaySceneInfo.needDisplayColorSetting(), + forceDisplayColorSetting); ret = ExynosDisplay::deliverWinConfigData(); checkAtcAnimation(); + + if (mDpuData.enable_readback && + !mDpuData.readback_info.requested_from_service) + mDisplaySceneInfo.displaySettingDelivered = false; + else + mDisplaySceneInfo.displaySettingDelivered = true; + return ret; } diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h index 2e47355..dc4ccc4 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h @@ -127,6 +127,7 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { uint32_t planeId; }; bool colorSettingChanged = false; + bool displaySettingDelivered = false; DisplayScene displayScene; /* |