summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2022-10-13 08:52:44 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-10-13 08:52:44 +0000
commit04c7b42da8ec98e8c9e4fe8ca880a1e31e405c51 (patch)
treed930a967684e9fe5001cb9bfeeec81c4bf6ae718
parentca754b8d7d32abe6b6417bcad73d9588b76662d7 (diff)
parentf2a17101d6bf14c1aaf30c53736e7712403fe3aa (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.mk2
-rw-r--r--libhwc2.1/Android.mk6
-rw-r--r--libhwc2.1/libdevice/BrightnessController.cpp65
-rw-r--r--libhwc2.1/libdevice/BrightnessController.h8
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h2
-rw-r--r--libhwc2.1/libhwcService/ExynosHWCService.cpp13
-rw-r--r--libhwc2.1/libhwcService/ExynosHWCService.h2
-rw-r--r--libhwc2.1/libhwcService/IExynosHWC.cpp20
-rw-r--r--libhwc2.1/libhwcService/IExynosHWC.h1
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp9
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h3
-rw-r--r--libhwc2.1/pixel-display-default.xml2
-rw-r--r--libhwc2.1/pixel-display-secondary.xml2
-rw-r--r--libhwc2.1/pixel-display.cpp17
-rw-r--r--libhwc2.1/pixel-display.h2
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,