summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface
diff options
context:
space:
mode:
authorLong Ling <longling@google.com>2020-11-24 19:19:16 -0800
committerLong Ling <longling@google.com>2020-11-25 13:41:41 -0800
commite30a2c2ddd2ea5d1ff70a5941428495a815cd56c (patch)
treeb5edb163a2267b268b3d0610f20cc3769f2d004f /libhwc2.1/libdisplayinterface
parent2051c83dbba22f3a5ffe3f99d7576b4494519012 (diff)
downloadgs101-e30a2c2ddd2ea5d1ff70a5941428495a815cd56c.tar.gz
libhwc2.1 force layer color update if assigned plane changes
If a layer's assigned plane has changed, force to update the DPP's color settings. Bug: 174193808 Change-Id: Ie29f7865afec795de4a4196739946ccd6af15aa6
Diffstat (limited to 'libhwc2.1/libdisplayinterface')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp16
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h3
2 files changed, 11 insertions, 8 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
index 3e7416c..a5fc8b5 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
@@ -548,10 +548,11 @@ int32_t ExynosDisplayDrmInterfaceModule::setPlaneColorBlob(
const StageDataType &stage,
const IDisplayColorGS101::IDpp &dpp,
const uint32_t dppIndex,
- ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq)
+ ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq,
+ bool forceUpdate)
{
/* dirty bit is valid only if enable is true */
- if (!prop.id() || (stage.enable && !stage.dirty))
+ if (!prop.id() || (stage.enable && !stage.dirty && !forceUpdate))
return NO_ERROR;
if (dppIndex >= mOldDppBlobs.size()) {
@@ -587,7 +588,7 @@ int32_t ExynosDisplayDrmInterfaceModule::setPlaneColorBlob(
}
/* Skip setting when previous and current setting is same with 0 */
- if ((blobId == 0) && (oldDppBlobs.getBlob(type) == 0))
+ if ((blobId == 0) && (oldDppBlobs.getBlob(type) == 0) && !forceUpdate)
return ret;
if ((ret = drmReq.atomicAddProperty(plane->id(), prop, blobId)) < 0) {
@@ -654,32 +655,33 @@ int32_t ExynosDisplayDrmInterfaceModule::setPlaneColorSetting(
const IDisplayColorGS101::IDpp &dpp = display->getDppForLayer(layer);
const uint32_t dppIndex = static_cast<uint32_t>(display->getDppIndexForLayer(layer));
+ bool planeChanged = display->checkAndSaveLayerPlaneId(layer, plane->id());
int ret = 0;
if ((ret = setPlaneColorBlob(plane, plane->eotf_lut_property(),
static_cast<uint32_t>(DppBlobs::EOTF),
- dpp.EotfLut(), dpp, dppIndex, drmReq) != NO_ERROR)) {
+ dpp.EotfLut(), dpp, dppIndex, drmReq, planeChanged) != NO_ERROR)) {
HWC_LOGE(mExynosDisplay, "%s: dpp[%d] set oetf blob fail",
__func__, dppIndex);
return ret;
}
if ((ret = setPlaneColorBlob(plane, plane->gammut_matrix_property(),
static_cast<uint32_t>(DppBlobs::GM),
- dpp.Gm(), dpp, dppIndex, drmReq) != NO_ERROR)) {
+ dpp.Gm(), dpp, dppIndex, drmReq, planeChanged) != NO_ERROR)) {
HWC_LOGE(mExynosDisplay, "%s: dpp[%d] set GM blob fail",
__func__, dppIndex);
return ret;
}
if ((ret = setPlaneColorBlob(plane, plane->tone_mapping_property(),
static_cast<uint32_t>(DppBlobs::DTM),
- dpp.Dtm(), dpp, dppIndex, drmReq) != NO_ERROR)) {
+ dpp.Dtm(), dpp, dppIndex, drmReq, planeChanged) != NO_ERROR)) {
HWC_LOGE(mExynosDisplay, "%s: dpp[%d] set DTM blob fail",
__func__, dppIndex);
return ret;
}
if ((ret = setPlaneColorBlob(plane, plane->oetf_lut_property(),
static_cast<uint32_t>(DppBlobs::OETF),
- dpp.OetfLut(), dpp, dppIndex, drmReq) != NO_ERROR)) {
+ dpp.OetfLut(), dpp, dppIndex, drmReq, planeChanged) != NO_ERROR)) {
HWC_LOGE(mExynosDisplay, "%s: dpp[%d] set OETF blob fail",
__func__, dppIndex);
return ret;
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
index 03660d9..2d050cd 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
@@ -120,7 +120,8 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface {
const StageDataType &stage,
const IDisplayColorGS101::IDpp &dpp,
const uint32_t dppIndex,
- ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq);
+ ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq,
+ bool forceUpdate);
void parseBpcEnums(const DrmProperty& property);
DqeBlobs mOldDqeBlobs;
std::vector<DppBlobs> mOldDppBlobs;