diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-07-11 19:38:05 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-07-11 19:38:05 +0000 |
commit | e8dc530335d12f577e1b9f0bba36302d8684443d (patch) | |
tree | e87f38c8d7785fce4dfd24b9989b231c904b7ea3 | |
parent | 7d3924720b28644a044d0ff67a0a620f3d8beccc (diff) | |
parent | 60d1378c756c072ad2364f2c055220d97ba7c3fb (diff) | |
download | common-android13-mainline-go-neuralnetworks-release.tar.gz |
Snap for 8817865 from 60d1378c756c072ad2364f2c055220d97ba7c3fb to mainline-go-neuralnetworks-releaseaml_go_neu_330912000android13-mainline-go-neuralnetworks-release
Change-Id: I6c65ed4f5f1c6e586720982b46f422ad6a485f24
-rw-r--r-- | libhwc2.1/libdevice/BrightnessController.h | 8 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 1 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 10 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 61 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h | 7 |
5 files changed, 44 insertions, 43 deletions
diff --git a/libhwc2.1/libdevice/BrightnessController.h b/libhwc2.1/libdevice/BrightnessController.h index 3a7fa85..2e4d304 100644 --- a/libhwc2.1/libdevice/BrightnessController.h +++ b/libhwc2.1/libdevice/BrightnessController.h @@ -111,6 +111,8 @@ public: std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex); return mLhbm.get(); } + int checkSysfsStatus(const char *file, const std::string &expectedValue, + const nsecs_t timeoutNs); uint32_t getBrightnessLevel() { std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex); @@ -176,19 +178,17 @@ public: NONE, }; + static constexpr const char *kLocalHbmModeFileNode = + "/sys/class/backlight/panel%d-backlight/local_hbm_mode"; private: // Worst case for panel with brightness range 2 nits to 1000 nits. static constexpr float kGhbmMinDimRatio = 0.002; static constexpr int32_t kHbmDimmingTimeUs = 5000000; - static constexpr const char *kLocalHbmModeFileNode = - "/sys/class/backlight/panel%d-backlight/local_hbm_mode"; static constexpr const char *kGlobalHbmModeFileNode = "/sys/class/backlight/panel%d-backlight/hbm_mode"; int queryBrightness(float brightness, bool* ghbm = nullptr, uint32_t* level = nullptr, float *nits = nullptr); - int checkSysfsStatus(const char *file, const std::string &expectedValue, - const nsecs_t timeoutNs); void initBrightnessTable(const DrmDevice& device, const DrmConnector& connector); void initBrightnessSysfs(); void initDimmingUsage(); diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index e31a692..6c7eded 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1188,7 +1188,6 @@ class ExynosDisplay { virtual int32_t setLhbmState(bool __unused enabled) { return NO_ERROR; } virtual bool getLhbmState() { return false; }; - virtual void notifyLhbmState(bool __unused enabled) {} virtual void setEarlyWakeupDisplay() {} virtual void setExpectedPresentTime(uint64_t __unused timestamp) {} virtual uint64_t getPendingExpectedPresentTime() { return 0; } diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 82286a1..2e5e4e1 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -803,9 +803,6 @@ int32_t ExynosDisplayDrmInterface::setPowerMode(int32_t mode) HWC_LOGE(mExynosDisplay, "setPower mode ret (%d)", ret); } - if (mode == HWC_POWER_MODE_OFF) { - mExynosDisplay->notifyLhbmState(false); - } return ret; } @@ -1850,13 +1847,6 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() mDrmVSyncWorker.VSyncControl(true); } - if (mipi_sync_type & - (1 << mMipiSyncEnums[toUnderlying(HalMipiSyncType::HAL_MIPI_CMD_SYNC_LHBM)])) { - // Notify that lhbm request is handled. - // still need one more vblank to complete - mExynosDisplay->notifyLhbmState(mExynosDisplay->mBrightnessController->isLhbmOn()); - } - return NO_ERROR; } diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp index 633b1d7..099ad73 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp @@ -313,6 +313,9 @@ int32_t ExynosPrimaryDisplay::setPowerOff() { closeFencesForSkipFrame(RENDERING_STATE_VALIDATED); mRenderingState = RENDERING_STATE_NONE; + // in the case user turns off screen when LHBM is on + // TODO: b/236433238 considering a lock for mLhbmOn state + mLhbmOn = false; return HWC2_ERROR_NONE; } @@ -494,6 +497,9 @@ int32_t ExynosPrimaryDisplay::SetCurrentPanelGammaSource(const DisplayType type, } int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) { + // NOTE: mLhbmOn could be set to false at any time by setPowerOff in another + // thread. Make sure no side effect if that happens. Or add lock if we have + // to when new code is added. ATRACE_CALL(); if (enabled) { ATRACE_NAME("wait for peak refresh rate"); @@ -512,39 +518,50 @@ int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) { } requestLhbm(enabled); + constexpr uint32_t kSysfsCheckTimeoutMs = 500; ALOGI("setLhbmState =%d", enabled); + bool succeed = mBrightnessController->checkSysfsStatus( + BrightnessController::kLocalHbmModeFileNode, + std::to_string(enabled ? 1 : 0), + ms2ns(kSysfsCheckTimeoutMs)); + if (!succeed) { + ALOGE("failed to update lhbm mode"); + return -ENODEV; + } + + { + // lhbm takes effect at next vblank + ATRACE_NAME("lhbm_wait_apply"); + if (mDisplayInterface->waitVBlank()) { + ALOGE("%s failed to wait vblank", __func__); + return -ENODEV; + } + } - std::unique_lock<std::mutex> lk(lhbm_mutex_); - mLhbmChanged = false; - - if (!lhbm_cond_.wait_for(lk, std::chrono::milliseconds(1000), - [this] { return mLhbmChanged; })) { - ALOGI("setLhbmState =%d timeout !", enabled); - return TIMED_OUT; - } else { - if (enabled) { - mDisplayInterface->waitVBlank(); - ATRACE_NAME("frames to reach LHBM peak brightness"); - for (int32_t i = mFramesToReachLhbmPeakBrightness; i > 0; i--) { - mDevice->onRefresh(); - mDisplayInterface->waitVBlank(); + if (enabled) { + for (int32_t i = mFramesToReachLhbmPeakBrightness; i > 0; i--) { + ATRACE_NAME("lhbm_wait_peak_brightness"); + mDevice->onRefresh(); + if (mDisplayInterface->waitVBlank()) { + ALOGE("%s failed to wait vblank, %d", __func__, i); + return -ENODEV; } } - return NO_ERROR; } + + mLhbmOn = enabled; + if (mPowerModeState == HWC2_POWER_MODE_OFF && mLhbmOn) { + mLhbmOn = false; + ALOGE("%s power off during request lhbm on", __func__); + return -EINVAL; + } + return NO_ERROR; } bool ExynosPrimaryDisplay::getLhbmState() { return mLhbmOn; } -void ExynosPrimaryDisplay::notifyLhbmState(bool enabled) { - std::lock_guard<std::mutex> lk(lhbm_mutex_); - mLhbmChanged = true; - lhbm_cond_.notify_one(); - mLhbmOn = enabled; -} - void ExynosPrimaryDisplay::setEarlyWakeupDisplay() { if (mEarlyWakeupDispFd) { writeFileNode(mEarlyWakeupDispFd, 1); diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h index c4d79ea..2aa0325 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h @@ -36,7 +36,6 @@ class ExynosPrimaryDisplay : public ExynosDisplay { virtual int32_t setLhbmState(bool enabled); virtual bool getLhbmState(); - virtual void notifyLhbmState(bool enabled); virtual void setEarlyWakeupDisplay(); virtual void setExpectedPresentTime(uint64_t timestamp); virtual uint64_t getPendingExpectedPresentTime(); @@ -100,15 +99,11 @@ class ExynosPrimaryDisplay : public ExynosDisplay { // LHBM FILE* mLhbmFd; - bool mLhbmOn; - bool mLhbmChanged; + std::atomic<bool> mLhbmOn; int32_t mFramesToReachLhbmPeakBrightness; // wait num of vsync periods for peak refresh rate static constexpr uint32_t kLhbmWaitForPeakRefreshRate = 10; - std::mutex lhbm_mutex_; - std::condition_variable lhbm_cond_; - FILE* mEarlyWakeupDispFd; static constexpr const char* kWakeupDispFilePath = "/sys/devices/platform/1c300000.drmdecon/early_wakeup"; |