diff options
author | Safayat Ullah <safayat@google.com> | 2023-09-28 17:19:50 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-09-28 17:19:50 +0000 |
commit | 877f99c5ef568c8fadc408b37e993e0575c668be (patch) | |
tree | 7bb2d8d4d5bed0b0f638d5e08e0b4ab0df308f9d | |
parent | 8160a15e5e8627ac05812f1a4b85877589d3c059 (diff) | |
parent | 6edac375f4fd6ecb6afa523aa4e2804849b89a25 (diff) | |
download | common-877f99c5ef568c8fadc408b37e993e0575c668be.tar.gz |
libhwc2.1: add command to set brightness to specific dbv value am: 6edac375f4
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/google/graphics/common/+/24692190
Change-Id: I4ff9189f1231d2fe622855b7d9d3e5a2dac2ed8e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | include/displaycolor/displaycolor.h | 1 | ||||
-rw-r--r-- | libhwc2.1/libdevice/BrightnessController.cpp | 29 | ||||
-rw-r--r-- | libhwc2.1/libdevice/BrightnessController.h | 12 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 17 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 3 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/ExynosHWCService.cpp | 12 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/ExynosHWCService.h | 1 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/IExynosHWC.cpp | 22 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/IExynosHWC.h | 1 |
9 files changed, 98 insertions, 0 deletions
diff --git a/include/displaycolor/displaycolor.h b/include/displaycolor/displaycolor.h index 808740d..8cef849 100644 --- a/include/displaycolor/displaycolor.h +++ b/include/displaycolor/displaycolor.h @@ -142,6 +142,7 @@ class IBrightnessTable { virtual std::optional<uint32_t> NitsToDbv(BrightnessMode bm, float nits) const = 0; virtual std::optional<float> DbvToNits(BrightnessMode bm, uint32_t dbv) const = 0; virtual std::optional<float> NitsToBrightness(float nits) const = 0; + virtual std::optional<float> DbvToBrightness(uint32_t dbv) const = 0; }; /** diff --git a/libhwc2.1/libdevice/BrightnessController.cpp b/libhwc2.1/libdevice/BrightnessController.cpp index 97d00be..2f9327e 100644 --- a/libhwc2.1/libdevice/BrightnessController.cpp +++ b/libhwc2.1/libdevice/BrightnessController.cpp @@ -64,6 +64,21 @@ std::optional<float> BrightnessController::LinearBrightnessTable::NitsToBrightne return brightness; } +std::optional<float> BrightnessController::LinearBrightnessTable::DbvToBrightness( + uint32_t dbv) const { + BrightnessMode bm = getBrightnessModeForDbv(dbv); + if (bm == BrightnessMode::BM_INVALID) { + return std::nullopt; + } + + std::optional<float> nits = DbvToNits(bm, dbv); + if (nits == std::nullopt) { + return std::nullopt; + } + + return NitsToBrightness(nits.value()); +} + std::optional<float> BrightnessController::LinearBrightnessTable::BrightnessToNits( float brightness, BrightnessMode& bm) const { bm = GetBrightnessMode(brightness); @@ -439,6 +454,20 @@ int BrightnessController::setBrightnessNits(float nits, const nsecs_t vsyncNs) { return processDisplayBrightness(brightness.value(), vsyncNs); } +int BrightnessController::setBrightnessDbv(uint32_t dbv, const nsecs_t vsyncNs) { + ALOGI("%s set brightness to %u dbv", __func__, dbv); + + std::optional<float> brightness = + mBrightnessTable ? mBrightnessTable->DbvToBrightness(dbv) : std::nullopt; + + if (brightness == std::nullopt) { + ALOGI("%s could not find brightness for %d dbv", __func__, dbv); + return -EINVAL; + } + + return processDisplayBrightness(brightness.value(), vsyncNs); +} + // In HWC3, brightness change could be applied via drm commit or sysfs path. // If a brightness change command does not come with a frame update, this // function wil be called to apply the brghtness change via sysfs path. diff --git a/libhwc2.1/libdevice/BrightnessController.h b/libhwc2.1/libdevice/BrightnessController.h index 1cba7ac..63747f6 100644 --- a/libhwc2.1/libdevice/BrightnessController.h +++ b/libhwc2.1/libdevice/BrightnessController.h @@ -71,6 +71,7 @@ public: int processDisplayBrightness(float bl, const nsecs_t vsyncNs, bool waitPresent = false); int ignoreBrightnessUpdateRequests(bool ignore); int setBrightnessNits(float nits, const nsecs_t vsyncNs); + int setBrightnessDbv(uint32_t dbv, const nsecs_t vsyncNs); int processLocalHbm(bool on); int processDimBrightness(bool on); int processOperationRate(int32_t hz); @@ -264,6 +265,7 @@ private: } std::optional<float> BrightnessToNits(float brightness, BrightnessMode& bm) const override; std::optional<float> NitsToBrightness(float nits) const override; + std::optional<float> DbvToBrightness(uint32_t dbv) const override; std::optional<uint32_t> NitsToDbv(BrightnessMode bm, float nits) const override; std::optional<float> DbvToNits(BrightnessMode bm, uint32_t dbv) const override; @@ -289,6 +291,16 @@ private: return BrightnessMode::BM_INVALID; } + BrightnessMode getBrightnessModeForDbv(uint32_t dbv) const { + for (const auto& [mode, range] : mBrightnessRanges) { + if (dbv >= range.dbv_min && dbv <= range.dbv_max) { + return mode; + } + } + // return BM_INVALID if there is no matching range + return BrightnessMode::BM_INVALID; + } + private: static void setBrightnessRangeFromAttribute(const struct brightness_attribute& attr, displaycolor::DisplayBrightnessRange& range) { diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp index 2be6156..a69c4b9 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.cpp +++ b/libhwc2.1/libdevice/ExynosDisplay.cpp @@ -4058,6 +4058,23 @@ int32_t ExynosDisplay::setBrightnessNits(const float nits) return HWC2_ERROR_UNSUPPORTED; } +int32_t ExynosDisplay::setBrightnessDbv(const uint32_t dbv) { + if (mBrightnessController) { + int32_t ret = mBrightnessController->setBrightnessDbv(dbv, mVsyncPeriod); + + if (ret == NO_ERROR) { + setMinIdleRefreshRate(0, VrrThrottleRequester::BRIGHTNESS); + if (mOperationRateManager) { + mOperationRateManager->onBrightness(mBrightnessController->getBrightnessLevel()); + } + } + + return ret; + } + + return HWC2_ERROR_UNSUPPORTED; +} + int32_t ExynosDisplay::getDisplayConnectionType(uint32_t* outType) { if (mType == HWC_DISPLAY_PRIMARY) diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index 5862eb1..51286ad 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1274,6 +1274,9 @@ class ExynosDisplay { /* set brightness to specific nits value */ virtual int32_t setBrightnessNits(const float nits); + /* set brightness by dbv value */ + virtual int32_t setBrightnessDbv(const uint32_t dbv); + protected: virtual bool getHDRException(ExynosLayer *layer); virtual int32_t getActiveConfigInternal(hwc2_config_t* outConfig); diff --git a/libhwc2.1/libhwcService/ExynosHWCService.cpp b/libhwc2.1/libhwcService/ExynosHWCService.cpp index 79f414d..4ae010a 100644 --- a/libhwc2.1/libhwcService/ExynosHWCService.cpp +++ b/libhwc2.1/libhwcService/ExynosHWCService.cpp @@ -431,6 +431,18 @@ int32_t ExynosHWCService::setDisplayBrightnessNits(const int32_t display_id, con return -EINVAL; } +int32_t ExynosHWCService::setDisplayBrightnessDbv(int32_t display_id, uint32_t dbv) { + auto display = mHWCCtx->device->getDisplay(display_id); + + if (display != nullptr) { + return display->setBrightnessDbv(dbv); + } else { + ALOGE("ExynosHWCService::%s() invalid display id: %d\n", __func__, display_id); + } + + return -EINVAL; +} + int32_t ExynosHWCService::setDisplayLhbm(int32_t display_id, uint32_t on) { if (on > 1) return -EINVAL; diff --git a/libhwc2.1/libhwcService/ExynosHWCService.h b/libhwc2.1/libhwcService/ExynosHWCService.h index 460d12e..b443ca4 100644 --- a/libhwc2.1/libhwcService/ExynosHWCService.h +++ b/libhwc2.1/libhwcService/ExynosHWCService.h @@ -72,6 +72,7 @@ public: virtual int32_t setDisplayBrightness(int32_t display_id, float brightness); virtual int32_t ignoreDisplayBrightnessUpdateRequests(int32_t displayId, bool ignore); virtual int32_t setDisplayBrightnessNits(const int32_t display_id, const float nits); + virtual int32_t setDisplayBrightnessDbv(const int32_t display_id, const uint32_t dbv); virtual int32_t setDisplayLhbm(int32_t display_id, uint32_t on); virtual int32_t setMinIdleRefreshRate(uint32_t display_id, int32_t fps); diff --git a/libhwc2.1/libhwcService/IExynosHWC.cpp b/libhwc2.1/libhwcService/IExynosHWC.cpp index bf08d85..d09a3f6 100644 --- a/libhwc2.1/libhwcService/IExynosHWC.cpp +++ b/libhwc2.1/libhwcService/IExynosHWC.cpp @@ -68,6 +68,7 @@ enum { TRIGGER_REFRESH_RATE_INDICATOR_UPDATE = 1011, IGNORE_DISPLAY_BRIGHTNESS_UPDATE_REQUESTS = 1012, SET_DISPLAY_BRIGHTNESS_NITS = 1013, + SET_DISPLAY_BRIGHTNESS_DBV = 1014, }; class BpExynosHWCService : public BpInterface<IExynosHWCService> { @@ -422,6 +423,18 @@ public: return result; } + virtual int32_t setDisplayBrightnessDbv(int32_t displayId, uint32_t dbv) { + Parcel data, reply; + data.writeInterfaceToken(IExynosHWCService::getInterfaceDescriptor()); + data.writeInt32(displayId); + data.writeUint32(dbv); + int result = remote()->transact(SET_DISPLAY_BRIGHTNESS_DBV, data, &reply); + if (result) { + ALOGE("SET_DISPLAY_BRIGHTNESS_DBV transact error(%d)", result); + } + return result; + } + virtual int32_t setDisplayLhbm(int32_t display_id, uint32_t on) { Parcel data, reply; data.writeInterfaceToken(IExynosHWCService::getInterfaceDescriptor()); @@ -795,6 +808,15 @@ status_t BnExynosHWCService::onTransact( return NO_ERROR; } break; + case SET_DISPLAY_BRIGHTNESS_DBV: { + CHECK_INTERFACE(IExynosHWCService, data, reply); + int32_t displayId = data.readInt32(); + uint32_t dbv = data.readUint32(); + int32_t error = setDisplayBrightnessDbv(displayId, dbv); + 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 71a4677..a454c4a 100644 --- a/libhwc2.1/libhwcService/IExynosHWC.h +++ b/libhwc2.1/libhwcService/IExynosHWC.h @@ -70,6 +70,7 @@ public: virtual int32_t setDisplayBrightness(int32_t display_id, float brightness) = 0; virtual int32_t ignoreDisplayBrightnessUpdateRequests(int32_t displayId, bool ignore) = 0; virtual int32_t setDisplayBrightnessNits(int32_t displayId, float nits) = 0; + virtual int32_t setDisplayBrightnessDbv(int32_t displayId, uint32_t dbv) = 0; virtual int32_t setDisplayLhbm(int32_t display_id, uint32_t on) = 0; virtual int32_t setMinIdleRefreshRate(uint32_t display_id, int32_t refresh_rate) = 0; virtual int32_t setRefreshRateThrottle(uint32_t display_id, int32_t throttle) = 0; |