summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSafayat Ullah <safayat@google.com>2023-09-28 17:19:50 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-09-28 17:19:50 +0000
commit877f99c5ef568c8fadc408b37e993e0575c668be (patch)
tree7bb2d8d4d5bed0b0f638d5e08e0b4ab0df308f9d
parent8160a15e5e8627ac05812f1a4b85877589d3c059 (diff)
parent6edac375f4fd6ecb6afa523aa4e2804849b89a25 (diff)
downloadcommon-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.h1
-rw-r--r--libhwc2.1/libdevice/BrightnessController.cpp29
-rw-r--r--libhwc2.1/libdevice/BrightnessController.h12
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp17
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h3
-rw-r--r--libhwc2.1/libhwcService/ExynosHWCService.cpp12
-rw-r--r--libhwc2.1/libhwcService/ExynosHWCService.h1
-rw-r--r--libhwc2.1/libhwcService/IExynosHWC.cpp22
-rw-r--r--libhwc2.1/libhwcService/IExynosHWC.h1
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;