diff options
author | Long Ling <longling@google.com> | 2021-05-12 15:49:04 -0700 |
---|---|---|
committer | Long Ling <longling@google.com> | 2021-05-12 16:14:37 -0700 |
commit | b432911c6031bdf308cea77f389921d0365ec60c (patch) | |
tree | 9f1a0afe3198e9e0129a21351f74feaae778f711 /libhwc2.1/libdisplayinterface | |
parent | 3474c2d9fc51d521db1cd00710fcb8ad726636cf (diff) | |
download | gs101-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.cpp | 18 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h | 15 |
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 { |