summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface
diff options
context:
space:
mode:
authorLong Ling <longling@google.com>2021-05-12 15:49:04 -0700
committerLong Ling <longling@google.com>2021-05-12 16:14:37 -0700
commitb432911c6031bdf308cea77f389921d0365ec60c (patch)
tree9f1a0afe3198e9e0129a21351f74feaae778f711 /libhwc2.1/libdisplayinterface
parent3474c2d9fc51d521db1cd00710fcb8ad726636cf (diff)
downloadgs101-b432911c6031bdf308cea77f389921d0365ec60c.tar.gz
libhwc2.1: track dpp old blobs by plane id
Track dpp old blobs by plane id instead of dpp index. blobs are plane data and should be grouped by plane id not by dpp index which is used to retrive layer color data. For example frame 1 has 4 layer color data and frame 2 has 3 layer color data. The old blobs tracked by dpp index 3 (the 4th layer) won't be accessed by the second frame. However, the plane assigned to dpp index 3 at frame 1 could be assigned to dpp index 2 frame 2. One issue is the plane's blob can't be cleared. Bug: 187517905 Test: play hdr video and no white flash at screen rotation. Change-Id: I3f20b22b5b884cb7f9b60d0817b39add100fd06a
Diffstat (limited to 'libhwc2.1/libdisplayinterface')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp18
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h15
2 files changed, 16 insertions, 17 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
index e90eaa5..4e1973c 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
@@ -86,8 +86,7 @@ int32_t ExynosDisplayDrmInterfaceModule::initDrmDevice(DrmDevice *drmDevice)
return ret;
}
- size_t dppSize = display->getNumOfDpp();
- resizeOldDppBlobs(dppSize);
+ initOldDppBlobs(drmDevice);
if (mDrmCrtc->force_bpc_property().id())
parseBpcEnums(mDrmCrtc->force_bpc_property());
return ret;
@@ -571,11 +570,17 @@ int32_t ExynosDisplayDrmInterfaceModule::setPlaneColorBlob(
if (!prop.id() || (stage.enable && !stage.dirty && !forceUpdate))
return NO_ERROR;
- if (dppIndex >= mOldDppBlobs.size()) {
- HWC_LOGE(mExynosDisplay, "%s: invalid dpp index(%d)", __func__, dppIndex);
+ uint32_t ix = 0;
+ for (;ix < mOldDppBlobs.size(); ix++) {
+ if (mOldDppBlobs[ix].planeId == plane->id()) {
+ break;
+ }
+ }
+ if (ix >= mOldDppBlobs.size()) {
+ HWC_LOGE(mExynosDisplay, "%s: could not find plane %d", __func__, plane->id());
return -EINVAL;
}
- DppBlobs &oldDppBlobs = mOldDppBlobs[dppIndex];
+ DppBlobs &oldDppBlobs = mOldDppBlobs[ix];
int32_t ret = 0;
uint32_t blobId = 0;
@@ -674,9 +679,6 @@ int32_t ExynosDisplayDrmInterfaceModule::setPlaneColorSetting(
}
}
- size_t dppSize = display->getNumOfDpp();
- resizeOldDppBlobs(dppSize);
-
const IDisplayColorGS101::IDpp &dpp = display->getDppForLayer(mppSource);
const uint32_t dppIndex = static_cast<uint32_t>(display->getDppIndexForLayer(mppSource));
bool planeChanged = display->checkAndSaveLayerPlaneId(mppSource, plane->id());
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
index 39fb753..aa35ef1 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
@@ -101,9 +101,10 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface {
OETF,
DPP_BLOB_NUM // number of DPP blobs
};
- void init(DrmDevice *drmDevice) {
+ DppBlobs(DrmDevice *drmDevice, uint32_t pid) : planeId(pid) {
SaveBlob::init(drmDevice, DPP_BLOB_NUM);
};
+ uint32_t planeId;
};
template<typename StageDataType>
int32_t setDisplayColorBlob(
@@ -125,14 +126,10 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface {
void parseBpcEnums(const DrmProperty& property);
DqeBlobs mOldDqeBlobs;
std::vector<DppBlobs> mOldDppBlobs;
- void resizeOldDppBlobs(uint32_t size) {
- size_t prevSize = mOldDppBlobs.size();
- if (prevSize == size)
- return;
- mOldDppBlobs.resize(size);
- for (uint32_t i = prevSize; i < size; i++) {
- mOldDppBlobs[i].init(mDrmDevice);
- }
+ void initOldDppBlobs(DrmDevice *drmDevice) {
+ auto const &planes = drmDevice->planes();
+ for (uint32_t ix = 0; ix < planes.size(); ++ix)
+ mOldDppBlobs.emplace_back(mDrmDevice, planes[ix]->id());
};
bool mColorSettingChanged = false;
enum Bpc_Type {