summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdevice/BrightnessController.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libhwc2.1/libdevice/BrightnessController.cpp')
-rw-r--r--libhwc2.1/libdevice/BrightnessController.cpp65
1 files changed, 49 insertions, 16 deletions
diff --git a/libhwc2.1/libdevice/BrightnessController.cpp b/libhwc2.1/libdevice/BrightnessController.cpp
index a18c499..e8872dc 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()) {
@@ -609,6 +630,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) {
@@ -644,7 +674,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;
}
}
@@ -827,9 +860,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), "