summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyunKyung Kim <hk310.kim@samsung.com>2020-12-23 15:50:00 +0900
committerLong Ling <longling@google.com>2021-06-21 10:46:38 -0700
commit6ac7fed9a52c4e4ba67ab5a2adc5dcce04af43ab (patch)
tree71d65f83f8e5567f748621102c8cb5197c8e7df4
parent20cf479ad1c0abb81878df3c0768717fce1643f8 (diff)
downloadgs101-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
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp9
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h7
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp14
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h1
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;
/*