diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-10-13 08:52:44 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-10-13 08:52:44 +0000 |
commit | 04c7b42da8ec98e8c9e4fe8ca880a1e31e405c51 (patch) | |
tree | d930a967684e9fe5001cb9bfeeec81c4bf6ae718 | |
parent | ca754b8d7d32abe6b6417bcad73d9588b76662d7 (diff) | |
parent | f2a17101d6bf14c1aaf30c53736e7712403fe3aa (diff) |
Merge "hwc: dim brightness support" into tm-qpr-dev am: e5a1c3940d am: f2a17101d6
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/google/graphics/common/+/19967518
Change-Id: I25d0a500d3a5546c86bf1f90e32dac51eba8e955
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | hwc3/Android.mk | 2 | ||||
-rw-r--r-- | libhwc2.1/Android.mk | 6 | ||||
-rw-r--r-- | libhwc2.1/libdevice/BrightnessController.cpp | 65 | ||||
-rw-r--r-- | libhwc2.1/libdevice/BrightnessController.h | 8 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 2 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/ExynosHWCService.cpp | 13 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/ExynosHWCService.h | 2 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/IExynosHWC.cpp | 20 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/IExynosHWC.h | 1 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 9 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h | 3 | ||||
-rw-r--r-- | libhwc2.1/pixel-display-default.xml | 2 | ||||
-rw-r--r-- | libhwc2.1/pixel-display-secondary.xml | 2 | ||||
-rw-r--r-- | libhwc2.1/pixel-display.cpp | 17 | ||||
-rw-r--r-- | libhwc2.1/pixel-display.h | 2 |
15 files changed, 132 insertions, 22 deletions
diff --git a/hwc3/Android.mk b/hwc3/Android.mk index dff9b73..909f5d1 100644 --- a/hwc3/Android.mk +++ b/hwc3/Android.mk @@ -35,7 +35,7 @@ LOCAL_SHARED_LIBRARIES := android.hardware.graphics.composer3-V1-ndk \ android.hardware.graphics.composer@2.1-resources \ android.hardware.graphics.composer@2.2-resources \ android.hardware.graphics.composer@2.4 \ - com.google.hardware.pixel.display-V6-ndk \ + com.google.hardware.pixel.display-V7-ndk \ libbase \ libbinder \ libbinder_ndk \ diff --git a/libhwc2.1/Android.mk b/libhwc2.1/Android.mk index 5c47445..b4c54fe 100644 --- a/libhwc2.1/Android.mk +++ b/libhwc2.1/Android.mk @@ -68,7 +68,7 @@ LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware \ android.hardware.power-V2-ndk pixel-power-ext-V1-ndk LOCAL_SHARED_LIBRARIES += android.hardware.graphics.composer3-V1-ndk \ - com.google.hardware.pixel.display-V6-ndk \ + com.google.hardware.pixel.display-V7-ndk \ libbinder_ndk \ libbase \ libpng \ @@ -161,7 +161,7 @@ LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libbinder libexynosdisplay l android.hardware.graphics.allocator@2.0 \ android.hardware.graphics.mapper@2.0 -LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V6-ndk \ +LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V7-ndk \ libbinder_ndk \ libbase @@ -223,7 +223,7 @@ LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libexynosdisplay libacryl \ libui LOCAL_SHARED_LIBRARIES += android.hardware.graphics.composer3-V1-ndk \ - com.google.hardware.pixel.display-V6-ndk \ + com.google.hardware.pixel.display-V7-ndk \ libbinder_ndk \ libbase diff --git a/libhwc2.1/libdevice/BrightnessController.cpp b/libhwc2.1/libdevice/BrightnessController.cpp index 9c49146..f8c4cb4 100644 --- a/libhwc2.1/libdevice/BrightnessController.cpp +++ b/libhwc2.1/libdevice/BrightnessController.cpp @@ -34,6 +34,7 @@ BrightnessController::BrightnessController(int32_t panelIndex, std::function<voi mLhbm(false), mSdrDim(false), mPrevSdrDim(false), + mDimBrightnessReq(false), mFrameRefresh(refresh), mHdrLayerState(HdrLayerState::kHdrNone), mUpdateDcLhbm(updateDcLhbm) { @@ -153,6 +154,21 @@ void BrightnessController::initBrightnessTable(const DrmDevice& drmDevice, mBrightnessIntfSupported = true; drmModeFreePropertyBlob(blob); + + String8 nodeName; + nodeName.appendFormat(kDimBrightnessFileNode, mPanelIndex); + + std::ifstream ifsDimBrightness(nodeName.string()); + if (ifsDimBrightness.fail()) { + ALOGW("%s fail to open %s", __func__, nodeName.string()); + } else { + ifsDimBrightness >> mDimBrightness; + ifsDimBrightness.close(); + if (mDimBrightness >= mBrightnessTable[toUnderlying(BrightnessRange::NORMAL)].mBklStart) + mDimBrightness = 0; + } + mDbmSupported = !!mDimBrightness; + ALOGI("%s mDimBrightness=%d, mDbmSupported=%d", __func__, mDimBrightness, mDbmSupported); } int BrightnessController::processEnhancedHbm(bool on) { @@ -202,20 +218,14 @@ int BrightnessController::processDisplayBrightness(float brightness, const nsecs // check if it will go drm path for below cases. // case 1: hbm state will change // case 2: for hwc3, brightness command could apply at next present if possible - if (mGhbmSupported || waitPresent) { + if (queryBrightness(brightness, &ghbm, &level) == NO_ERROR) { // ghbm on/off always go drm path - if (mGhbmSupported) { - if (queryBrightness(brightness, &ghbm, &level)) { - ALOGE("%s failed to convert brightness %f", __func__, brightness); - return -EINVAL; - } - // check if this will cause a hbm transition - if ((mGhbm.get() != HbmMode::OFF) != ghbm) { - // this brightness change will go drm path - updateStates(); - mFrameRefresh(); // force next frame to update brightness - return NO_ERROR; - } + // check if this will cause a hbm transition + if (mGhbmSupported && (mGhbm.get() != HbmMode::OFF) != ghbm) { + // this brightness change will go drm path + updateStates(); + mFrameRefresh(); // force next frame to update brightness + return NO_ERROR; } // there will be a Present to apply this brightness change if (waitPresent) { @@ -327,6 +337,16 @@ int BrightnessController::processInstantHbm(bool on) { return NO_ERROR; } +int BrightnessController::processDimBrightness(bool on) { + std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex); + mDimBrightnessReq.store(on); + if (mDimBrightnessReq.is_dirty()) { + updateStates(); + ALOGI("%s request = %d", __func__, mDimBrightnessReq.get()); + } + return NO_ERROR; +} + float BrightnessController::getSdrDimRatioForInstantHbm() { if (!mBrightnessIntfSupported || !mGhbmSupported) { return 1.0f; @@ -594,6 +614,7 @@ int BrightnessController::updateStates() { mInstantHbmReq.clear_dirty(); mSdrDim.clear_dirty(); mPrevSdrDim.clear_dirty(); + mDimBrightnessReq.clear_dirty(); if (mBrightnessLevel.is_dirty() || mDimming.is_dirty() || mGhbm.is_dirty() || mLhbm.is_dirty()) { @@ -608,6 +629,15 @@ int BrightnessController::queryBrightness(float brightness, bool *ghbm, uint32_t return HWC2_ERROR_UNSUPPORTED; } + if (mBrightnessTable[toUnderlying(BrightnessRange::NORMAL)].mBklStart == 0 && + mBrightnessTable[toUnderlying(BrightnessRange::NORMAL)].mBklEnd == 0 && + mBrightnessTable[toUnderlying(BrightnessRange::NORMAL)].mBriStart == 0 && + mBrightnessTable[toUnderlying(BrightnessRange::NORMAL)].mBriEnd == 0 && + mBrightnessTable[toUnderlying(BrightnessRange::NORMAL)].mNitsStart == 0 && + mBrightnessTable[toUnderlying(BrightnessRange::NORMAL)].mNitsEnd == 0) { + return HWC2_ERROR_UNSUPPORTED; + } + if (brightness < 0) { // screen off if (ghbm) { @@ -643,7 +673,10 @@ int BrightnessController::queryBrightness(float brightness, bool *ghbm, uint32_t *nits = norm * nSpan + mBrightnessTable[i].mNitsStart; } } - + if ((i == toUnderlying(BrightnessRange::NORMAL)) && mDbmSupported && + (mDimBrightnessReq.get() == true) && (*level == mBrightnessTable[i].mBklStart)) { + *level = mDimBrightness; + } return NO_ERROR; } } @@ -834,9 +867,9 @@ void BrightnessController::dump(String8& result) { "lhbm supported %d, ghbm supported %d\n", mBrightnessOfs.is_open(), mMaxBrightness, mBrightnessIntfSupported, mLhbmSupported, mGhbmSupported); result.appendFormat("\trequests: enhance hbm %d, lhbm %d, " - "brightness %f, instant hbm %d\n", + "brightness %f, instant hbm %d, DimBrightness %d\n", mEnhanceHbmReq.get(), mLhbmReq.get(), mBrightnessFloatReq.get(), - mInstantHbmReq.get()); + mInstantHbmReq.get(), mDimBrightnessReq.get()); result.appendFormat("\tstates: brighntess level %d, ghbm %d, dimming %d, lhbm %d", mBrightnessLevel.get(), mGhbm.get(), mDimming.get(), mLhbm.get()); result.appendFormat("\thdr layer state %d, unchecked lhbm request %d(%d), " diff --git a/libhwc2.1/libdevice/BrightnessController.h b/libhwc2.1/libdevice/BrightnessController.h index 9b087fd..f349b68 100644 --- a/libhwc2.1/libdevice/BrightnessController.h +++ b/libhwc2.1/libdevice/BrightnessController.h @@ -65,6 +65,8 @@ public: int processEnhancedHbm(bool on); int processDisplayBrightness(float bl, const nsecs_t vsyncNs, bool waitPresent = false); int processLocalHbm(bool on); + int processDimBrightness(bool on); + bool isDbmSupported() { return mDbmSupported; } int applyPendingChangeViaSysfs(const nsecs_t vsyncNs); bool validateLayerBrightness(float brightness); @@ -199,6 +201,9 @@ public: static constexpr const char *kLocalHbmModeFileNode = "/sys/class/backlight/panel%d-backlight/local_hbm_mode"; + static constexpr const char* kDimBrightnessFileNode = + "/sys/class/backlight/panel%d-backlight/dim_brightness"; + private: // sync brightness change for mixed composition when there is more than 50% luminance change. // The percentage is calculated as: @@ -234,6 +239,7 @@ private: bool mLhbmSupported = false; bool mGhbmSupported = false; + bool mDbmSupported = false; bool mBrightnessIntfSupported = false; BrightnessTable mBrightnessTable[toUnderlying(BrightnessRange::MAX)]; @@ -254,6 +260,7 @@ private: CtrlValue<bool> mLhbm GUARDED_BY(mBrightnessMutex); CtrlValue<bool> mSdrDim GUARDED_BY(mBrightnessMutex); CtrlValue<bool> mPrevSdrDim GUARDED_BY(mBrightnessMutex); + CtrlValue<bool> mDimBrightnessReq GUARDED_BY(mBrightnessMutex); // Indicating if the last LHBM on has changed the brightness level bool mLhbmBrightnessAdj = false; @@ -285,6 +292,7 @@ private: std::ofstream mBrightnessOfs; uint32_t mMaxBrightness = 0; // read from sysfs std::ofstream mCabcModeOfs; + uint32_t mDimBrightness = 0; // Note IRC or dimming is not in consideration for now. float mDisplayWhitePointNits = 0; diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index 7656bea..a7a07de 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1226,6 +1226,8 @@ class ExynosDisplay { virtual PanelCalibrationStatus getPanelCalibrationStatus() { return PanelCalibrationStatus::UNCALIBRATED; } + virtual bool isDbmSupported() { return false; } + virtual int32_t setDbmState(bool __unused enabled) { return NO_ERROR; } /* getDisplayPreAssignBit support mIndex up to 1. It supports only dual LCD and 2 external displays */ diff --git a/libhwc2.1/libhwcService/ExynosHWCService.cpp b/libhwc2.1/libhwcService/ExynosHWCService.cpp index 5413f41..aac4916 100644 --- a/libhwc2.1/libhwcService/ExynosHWCService.cpp +++ b/libhwc2.1/libhwcService/ExynosHWCService.cpp @@ -502,4 +502,17 @@ int32_t ExynosHWCService::triggerDisplayIdleEnter(uint32_t displayIndex, return NO_ERROR; } +int32_t ExynosHWCService::setDisplayDbm(int32_t display_id, uint32_t on) { + if (on > 1) return -EINVAL; + + auto display = mHWCCtx->device->getDisplay(display_id); + + if (display == nullptr) return -EINVAL; + + ALOGD("ExynosHWCService::%s() display(%u) on=%d", __func__, display_id, on); + display->setDbmState(!!on); + mHWCCtx->device->onRefresh(); + return NO_ERROR; +} + } //namespace android diff --git a/libhwc2.1/libhwcService/ExynosHWCService.h b/libhwc2.1/libhwcService/ExynosHWCService.h index f4224fb..586e335 100644 --- a/libhwc2.1/libhwcService/ExynosHWCService.h +++ b/libhwc2.1/libhwcService/ExynosHWCService.h @@ -78,6 +78,8 @@ public: virtual int32_t setMinIdleRefreshRate(uint32_t display_id, int32_t fps); virtual int32_t setRefreshRateThrottle(uint32_t display_id, int32_t delayMs); + virtual int32_t setDisplayDbm(int32_t display_id, uint32_t on); + int32_t setDisplayRCDLayerEnabled(uint32_t displayIndex, bool enable) override; int32_t triggerDisplayIdleEnter(uint32_t displayIndex, uint32_t idleTeRefreshRate) override; diff --git a/libhwc2.1/libhwcService/IExynosHWC.cpp b/libhwc2.1/libhwcService/IExynosHWC.cpp index 181fdf2..9833e64 100644 --- a/libhwc2.1/libhwcService/IExynosHWC.cpp +++ b/libhwc2.1/libhwcService/IExynosHWC.cpp @@ -66,6 +66,7 @@ enum { SET_REFRESH_RATE_THROTTLE = 1006, SET_DISPLAY_RCDLAYER_ENABLED = 1007, TRIGGER_DISPLAY_IDLE_ENTER = 1008, + SET_DISPLAY_DBM = 1009, }; class BpExynosHWCService : public BpInterface<IExynosHWCService> { @@ -459,6 +460,16 @@ public: ALOGE_IF(result != NO_ERROR, "TRIGGER_DISPLAY_IDLE_ENTER transact error(%d)", result); return result; } + + virtual int32_t setDisplayDbm(int32_t display_id, uint32_t on) { + Parcel data, reply; + data.writeInterfaceToken(IExynosHWCService::getInterfaceDescriptor()); + data.writeInt32(display_id); + data.writeInt32(on); + int result = remote()->transact(SET_DISPLAY_DBM, data, &reply); + if (result) ALOGE("SET_DISPLAY_DBM transact error(%d)", result); + return result; + } }; IMPLEMENT_META_INTERFACE(ExynosHWCService, "android.hal.ExynosHWCService"); @@ -741,6 +752,15 @@ status_t BnExynosHWCService::onTransact( return triggerDisplayIdleEnter(displayIndex, idleTeRefreshRate); } break; + case SET_DISPLAY_DBM: { + CHECK_INTERFACE(IExynosHWCService, data, reply); + int32_t display_id = data.readInt32(); + uint32_t on = data.readInt32(); + int32_t error = setDisplayDbm(display_id, on); + reply->writeInt32(error); + return NO_ERROR; + } break; + default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/libhwc2.1/libhwcService/IExynosHWC.h b/libhwc2.1/libhwcService/IExynosHWC.h index debf6fb..640ca7d 100644 --- a/libhwc2.1/libhwcService/IExynosHWC.h +++ b/libhwc2.1/libhwcService/IExynosHWC.h @@ -76,6 +76,7 @@ public: virtual int32_t setRefreshRateThrottle(uint32_t display_id, int32_t throttle) = 0; virtual int32_t setDisplayRCDLayerEnabled(uint32_t displayIndex, bool enable) = 0; virtual int32_t triggerDisplayIdleEnter(uint32_t displayIndex, uint32_t idleTeRefreshRate) = 0; + virtual int32_t setDisplayDbm(int32_t display_id, uint32_t on) = 0; }; /* Native Interface */ diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp index fb0a446..504f065 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp @@ -971,3 +971,12 @@ void ExynosPrimaryDisplay::checkBtsReassignResource(const uint32_t vsyncPeriod, } } } + +bool ExynosPrimaryDisplay::isDbmSupported() { + return mBrightnessController->isDbmSupported(); +} + +int32_t ExynosPrimaryDisplay::setDbmState(bool enabled) { + mBrightnessController->processDimBrightness(enabled); + return NO_ERROR; +} diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h index bd9cda7..d9ec1ca 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h @@ -52,6 +52,9 @@ class ExynosPrimaryDisplay : public ExynosDisplay { virtual int setMinIdleRefreshRate(const int fps) override; virtual int setRefreshRateThrottleNanos(const int64_t delayNs, const VrrThrottleRequester requester) override; + virtual bool isDbmSupported() override; + virtual int32_t setDbmState(bool enabled) override; + virtual void dump(String8& result) override; virtual void updateAppliedActiveConfig(const hwc2_config_t newConfig, const int64_t ts) override; diff --git a/libhwc2.1/pixel-display-default.xml b/libhwc2.1/pixel-display-default.xml index fc10d6a..86c1b03 100644 --- a/libhwc2.1/pixel-display-default.xml +++ b/libhwc2.1/pixel-display-default.xml @@ -1,7 +1,7 @@ <manifest version="1.0" type="device"> <hal format="aidl"> <name>com.google.hardware.pixel.display</name> - <version>6</version> + <version>7</version> <fqname>IDisplay/default</fqname> </hal> </manifest> diff --git a/libhwc2.1/pixel-display-secondary.xml b/libhwc2.1/pixel-display-secondary.xml index f8bd77b..515bc21 100644 --- a/libhwc2.1/pixel-display-secondary.xml +++ b/libhwc2.1/pixel-display-secondary.xml @@ -1,7 +1,7 @@ <manifest version="1.0" type="device"> <hal format="aidl"> <name>com.google.hardware.pixel.display</name> - <version>6</version> + <version>7</version> <fqname>IDisplay/secondary</fqname> </hal> </manifest> diff --git a/libhwc2.1/pixel-display.cpp b/libhwc2.1/pixel-display.cpp index d12e328..c95c239 100644 --- a/libhwc2.1/pixel-display.cpp +++ b/libhwc2.1/pixel-display.cpp @@ -260,6 +260,23 @@ ndk::ScopedAStatus Display::getPanelCalibrationStatus(PanelCalibrationStatus *_a } return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); } + +ndk::ScopedAStatus Display::isDbmSupported(bool *_aidl_return) { + if (!mDisplay) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } + *_aidl_return = mDisplay->isDbmSupported(); + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Display::setDbmState(bool enabled) { + if (!mDisplay) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } + mDisplay->setDbmState(enabled); + return ndk::ScopedAStatus::ok(); +} + } // namespace display } // namespace pixel } // namespace hardware diff --git a/libhwc2.1/pixel-display.h b/libhwc2.1/pixel-display.h index 0fd0a5b..b1696d5 100644 --- a/libhwc2.1/pixel-display.h +++ b/libhwc2.1/pixel-display.h @@ -59,6 +59,8 @@ public: Priority pri, std::vector<char16_t> *histogrambuffer, HistogramErrorCode *_aidl_return) override; ndk::ScopedAStatus getPanelCalibrationStatus(PanelCalibrationStatus *_aidl_return) override; + ndk::ScopedAStatus isDbmSupported(bool *_aidl_return) override; + ndk::ScopedAStatus setDbmState(bool enabled) override; private: bool runMediator(const RoiRect roi, const Weight weight, const HistogramPos pos, |