From b36ec0a2f31fd8e8d0838cdf04c2fdaede95c3ff Mon Sep 17 00:00:00 2001 From: Gil Date: Thu, 11 Aug 2022 19:37:00 +0800 Subject: gs101 : set mPendingAtcOff as false when enable Lbe set mPendingAtcOff as false when Lbe enabling Bug: 240535525 Test: Lbe stress test and self test Change-Id: I420e0de001bed5d39f58f55e7d3cadabd49028e9 --- libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp index aed0e5d..7852ebd 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp @@ -996,6 +996,7 @@ int32_t ExynosPrimaryDisplayModule::setAtcMode(std::string mode_name) { ALOGE("Fail to set atc enable = %d", enable); return -EPERM; } + mPendingAtcOff = false; } mCurrentAtcModeName = enable ? mode_name : "NULL"; -- cgit v1.2.3 From 6302071b770fcee20deee86525a46f12e0eca4e1 Mon Sep 17 00:00:00 2001 From: susi_su Date: Mon, 1 Aug 2022 20:56:07 +0800 Subject: libhw2.1: change mIDLHistogram to shared_ptr change mIDLHistogram to shared_ptr to avoid memory error when destructing ExynosDisplayDrmInterfaceModule add lock when dealing with roi, weights, thresholds to avoid race between set and use of these data bug: b/240292495 test: tested by a histogram client program locally Change-Id: I08e60dfc787b046d922ba1abc17745695b5034a7 --- include/histogram/HistogramInfo.h | 17 +++++++++++++++-- .../ExynosDisplayDrmInterfaceModule.cpp | 6 ++++-- .../ExynosDisplayDrmInterfaceModule.h | 14 +++----------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/include/histogram/HistogramInfo.h b/include/histogram/HistogramInfo.h index 532136b..34eada3 100644 --- a/include/histogram/HistogramInfo.h +++ b/include/histogram/HistogramInfo.h @@ -18,12 +18,16 @@ #define HISTOGRAMINFO_H_ #include #include + +#include + using HistogramPos = ::aidl::com::google::hardware::pixel::display::HistogramPos; class HistogramInfo { public: enum class HistogramType { HISTOGRAM_SAMPLING = 0, HISTOGRAM_HIDL, HISTOGRAM_TYPE_NUM }; void setHistogramROI(uint16_t x, uint16_t y, uint16_t h, uint16_t v) { + std::unique_lock lk(mSetHistInfoMutex); mHistogramROI.start_x = x; mHistogramROI.start_y = y; mHistogramROI.hsize = h; @@ -32,14 +36,22 @@ public: const struct histogram_roi& getHistogramROI() { return mHistogramROI; } void setHistogramWeights(uint16_t r, uint16_t g, uint16_t b) { + std::unique_lock lk(mSetHistInfoMutex); mHistogramWeights.weight_r = r; mHistogramWeights.weight_g = g; mHistogramWeights.weight_b = b; }; const struct histogram_weights& getHistogramWeights() { return mHistogramWeights; } - void setHistogramThreshold(uint32_t t) { mHistogramThreshold = t; } - uint32_t getHistogramThreshold() { return mHistogramThreshold; } + void setHistogramThreshold(uint32_t t) { + std::unique_lock lk(mSetHistInfoMutex); + mHistogramThreshold = t; + } + + uint32_t getHistogramThreshold() { + std::unique_lock lk(mSetHistInfoMutex); + return mHistogramThreshold; + } HistogramType getHistogramType() { return mHistogramType; } @@ -47,6 +59,7 @@ public: virtual ~HistogramInfo() {} virtual void setHistogramPos(HistogramPos pos) = 0; virtual void callbackHistogram(char16_t* bin) = 0; + std::mutex mSetHistInfoMutex; private: HistogramType mHistogramType = HistogramType::HISTOGRAM_TYPE_NUM; diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp index 2969eea..71807d9 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp @@ -797,6 +797,7 @@ const std::string ExynosDisplayDrmInterfaceModule::GetPanelInfo(const std::strin int32_t ExynosDisplayDrmInterfaceModule::createHistoRoiBlob(uint32_t &blobId) { struct histogram_roi histo_roi; + std::unique_lock lk((mHistogramInfo->mSetHistInfoMutex)); histo_roi.start_x = mHistogramInfo->getHistogramROI().start_x; histo_roi.start_y = mHistogramInfo->getHistogramROI().start_y; histo_roi.hsize = mHistogramInfo->getHistogramROI().hsize; @@ -814,6 +815,7 @@ int32_t ExynosDisplayDrmInterfaceModule::createHistoRoiBlob(uint32_t &blobId) { int32_t ExynosDisplayDrmInterfaceModule::createHistoWeightsBlob(uint32_t &blobId) { struct histogram_weights histo_weights; + std::unique_lock lk((mHistogramInfo->mSetHistInfoMutex)); histo_weights.weight_r = mHistogramInfo->getHistogramWeights().weight_r; histo_weights.weight_g = mHistogramInfo->getHistogramWeights().weight_g; histo_weights.weight_b = mHistogramInfo->getHistogramWeights().weight_b; @@ -864,7 +866,7 @@ int32_t ExynosDisplayDrmInterfaceModule::setDisplayHistoBlob( int32_t ExynosDisplayDrmInterfaceModule::setDisplayHistogramSetting( ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq) { - if ((mHistogramInfoRegistered == false) || (isPrimary() == false)) return NO_ERROR; + if ((isHistogramInfoRegistered() == false) || (isPrimary() == false)) return NO_ERROR; int ret = NO_ERROR; @@ -894,7 +896,7 @@ int32_t ExynosDisplayDrmInterfaceModule::setDisplayHistogramSetting( } int32_t ExynosDisplayDrmInterfaceModule::setHistogramControl(hidl_histogram_control_t control) { - if ((mHistogramInfoRegistered == false) || (isPrimary() == false)) return NO_ERROR; + if ((isHistogramInfoRegistered() == false) || (isPrimary() == false)) return NO_ERROR; int ret = NO_ERROR; uint32_t crtc_id = mDrmCrtc->id(); diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h index f783c5f..b730879 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h @@ -78,17 +78,10 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface { virtual int32_t setDisplayHistogramSetting( ExynosDisplayDrmInterface::DrmModeAtomicReq &drmReq); - virtual void registerHistogramInfo(IDLHistogram *info) { - if (info) - mHistogramInfo.reset(info); - else - mHistogramInfo.reset(); - - if (mHistogramInfo.get()) - mHistogramInfoRegistered = true; - else - mHistogramInfoRegistered = false; + virtual void registerHistogramInfo(const std::shared_ptr &info) { + mHistogramInfo = info; } + bool isHistogramInfoRegistered() { return mHistogramInfo != nullptr; } int32_t setHistogramControl(hidl_histogram_control_t enabled); virtual int32_t setHistogramData(void *bin); @@ -185,7 +178,6 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface { HistoBlobs mOldHistoBlobs; std::shared_ptr mHistogramInfo; - bool mHistogramInfoRegistered = false; private: const std::string GetPanelInfo(const std::string &sysfs_rel, char delim); -- cgit v1.2.3