diff options
author | Leo Chen <yinchiuan@google.com> | 2023-05-18 13:56:32 +0000 |
---|---|---|
committer | Leo Chen <yinchiuan@google.com> | 2023-06-06 03:07:01 +0000 |
commit | 89878201653dd12756ab8e570dfc61c47190a355 (patch) | |
tree | eab128211dc474623fa81fb7181cced2383d47e6 | |
parent | a5f01d4ae93a775f1eb60f41884c826715bc2bb1 (diff) |
libhwc2.1: Skip redundant onRefresh in histogramSample
DPU driver maintains always-on histogram engine state with up to
date histogram data. Therefore we don't have explicitly to trigger
onRefresh in case histogram configuration does not change.
Test: aidl_hist_client 500 500 1000 1999 340 340 344 POST 1000000
Bug: 261376040
Change-Id: I44824ee836adb66aeb214c371a11ed350d13b069
Signed-off-by: Leo Chen <yinchiuan@google.com>
-rw-r--r-- | libhwc2.1/histogram_mediator.cpp | 2 | ||||
-rw-r--r-- | libhwc2.1/histogram_mediator.h | 28 | ||||
-rw-r--r-- | libhwc2.1/pixel-display.cpp | 29 |
3 files changed, 53 insertions, 6 deletions
diff --git a/libhwc2.1/histogram_mediator.cpp b/libhwc2.1/histogram_mediator.cpp index d1fba54..f23feec 100644 --- a/libhwc2.1/histogram_mediator.cpp +++ b/libhwc2.1/histogram_mediator.cpp @@ -60,7 +60,7 @@ histogram::HistogramErrorCode histogram::HistogramMediator::requestHist() { std::unique_lock<std::mutex> lk(mIDLHistogram->mDataCollectingMutex); if (moduleDisplayInterface->setHistogramControl( hidl_histogram_control_t::HISTOGRAM_CONTROL_REQUEST) != NO_ERROR) { - return histogram::HistogramErrorCode::ENABLE_HIST_ERROR; + return histogram::HistogramErrorCode::ENABLE_HIST_ERROR; } mIDLHistogram->mHistReq_pending = true; } diff --git a/libhwc2.1/histogram_mediator.h b/libhwc2.1/histogram_mediator.h index fa81e0b..54d28c9 100644 --- a/libhwc2.1/histogram_mediator.h +++ b/libhwc2.1/histogram_mediator.h @@ -73,10 +73,38 @@ public: bool mHistReq_pending = false; std::mutex mDataCollectingMutex; // for data collecting operations }; + + struct HistogramConfig { + RoiRect mRoi; + Weight mWeights; + HistogramPos mPos; + + HistogramConfig() {} + + HistogramConfig(const RoiRect &roi, const Weight &weights, const HistogramPos &pos) { + mRoi = roi; + mWeights = weights; + mPos = pos; + } + + bool operator!=(const HistogramConfig &rhs) { + return mRoi != rhs.mRoi || mWeights != rhs.mWeights || mPos != rhs.mPos; + } + + HistogramConfig &operator=(const HistogramConfig &rhs) { + mRoi = rhs.mRoi; + mWeights = rhs.mWeights; + mPos = rhs.mPos; + return *this; + } + }; + uint32_t getFrameCount(); void setSampleFrameCounter(int32_t id) { mSampledFrameCounter = id; } uint32_t getSampleFrameCounter() { return mSampledFrameCounter; } bool histRequested() { return mIDLHistogram->mHistReq_pending; } + std::mutex mConfigMutex; + HistogramConfig mConfig GUARDED_BY(mConfigMutex); private: int calculateThreshold(const RoiRect &roi); diff --git a/libhwc2.1/pixel-display.cpp b/libhwc2.1/pixel-display.cpp index fec7309..366945a 100644 --- a/libhwc2.1/pixel-display.cpp +++ b/libhwc2.1/pixel-display.cpp @@ -201,17 +201,36 @@ ndk::ScopedAStatus Display::setRefreshRateThrottle(int delayMs, int *_aidl_retur bool Display::runMediator(const RoiRect &roi, const Weight &weight, const HistogramPos &pos, std::vector<char16_t> *histogrambuffer) { - if (mMediator.setRoiWeightThreshold(roi, weight, pos) != HistogramErrorCode::NONE) { - ALOGE("histogram error, SET_ROI_WEIGHT_THRESHOLD ERROR\n"); - return false; + bool isConfigChanged; + histogram::HistogramMediator::HistogramConfig pendingConfig(roi, weight, pos); + + { + std::unique_lock<std::mutex> lk(mMediator.mConfigMutex); + isConfigChanged = mMediator.mConfig != pendingConfig; + + if (isConfigChanged && + mMediator.setRoiWeightThreshold(roi, weight, pos) != HistogramErrorCode::NONE) { + ALOGE("histogram error, SET_ROI_WEIGHT_THRESHOLD ERROR\n"); + return false; + } + + mMediator.mConfig = pendingConfig; } + if (!mMediator.histRequested() && mMediator.requestHist() == HistogramErrorCode::ENABLE_HIST_ERROR) { ALOGE("histogram error, ENABLE_HIST ERROR\n"); } - if (mMediator.getFrameCount() != mMediator.getSampleFrameCounter()) { - mDisplay->mDevice->onRefresh(mDisplay->mDisplayId); // DRM not busy & sampled frame changed + + /* + * DPU driver maintains always-on histogram engine state with up to date histogram data. + * Therefore we don't have explicitly to trigger onRefresh in case histogram configuration + * does not change. + */ + if (isConfigChanged) { + mDisplay->mDevice->onRefresh(mDisplay->mDisplayId); } + if (mMediator.collectRoiLuma(histogrambuffer) != HistogramErrorCode::NONE) { ALOGE("histogram error, COLLECT_ROI_LUMA ERROR\n"); return false; |