summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
authorlinpeter <linpeter@google.com>2021-01-04 12:09:57 +0800
committerlinpeter <linpeter@google.com>2021-01-13 19:16:49 +0800
commit638de7cc9fb05dd0687eb080fa01b39a8d2738b3 (patch)
treebb44cc97c89a052b8f350f21ed9fbdb6f176983c /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
parent39e56be41ba14ae520a44936106eefc105faa1ae (diff)
libhwc2.1: add brightness property
Get the brightness property and setup the brightness table. Bug:143292983 Bug:143293693 test: check the brightness level and config Change-Id: Idb9cf4ae678940e65876225b4db9dd2066c2d34f
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp82
1 files changed, 76 insertions, 6 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index b74e773..a974e34 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -16,12 +16,16 @@
#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
-#include <sys/types.h>
#include "ExynosDisplayDrmInterface.h"
-#include "ExynosHWCDebug.h"
+
+#include <drm.h>
#include <drm/drm_fourcc.h>
+#include <sys/types.h>
#include <xf86drm.h>
-#include <drm.h>
+
+#include <algorithm>
+
+#include "ExynosHWCDebug.h"
using namespace std::chrono_literals;
@@ -1740,7 +1744,50 @@ int32_t ExynosDisplayDrmInterface::getDisplayIdentificationData(
}
void ExynosDisplayDrmInterface::getBrightnessInterfaceSupport() {
- // TODO: get supported and brightness capabilitiy
+ if (mDrmConnector->brightness_cap().id() == 0) {
+ ALOGD("the brightness_cap is not supported");
+ return;
+ }
+
+ const auto [ret, blobId] = mDrmConnector->brightness_cap().value();
+ if (ret) {
+ ALOGE("Fail to get brightness_cap (ret = %d)", ret);
+ return;
+ }
+
+ if (blobId == 0) {
+ ALOGE("the brightness_cap is supported but blob is not valid");
+ return;
+ }
+
+ drmModePropertyBlobPtr blob = drmModeGetPropertyBlob(mDrmDevice->fd(), blobId);
+ if (blob == nullptr) {
+ ALOGE("Fail to get brightness_cap blob");
+ return;
+ }
+
+ const struct brightness_capability *cap =
+ reinterpret_cast<struct brightness_capability *>(blob->data);
+
+ mBrightnessHdrRatio =
+ static_cast<float>(cap->hbm.nits.max) / static_cast<float>(cap->normal.nits.max);
+ ALOGI("mBrightnessHdrRatio = %f", mBrightnessHdrRatio);
+
+ if (cap->hbm.level.min == cap->hbm.level.max)
+ mPanelHbmType = PanelHbmType::ONE_STEP;
+ else
+ mPanelHbmType = PanelHbmType::CONTINUOUS;
+ ALOGI("mPanelHbmType = %d", mPanelHbmType);
+
+ mBrightnessHbmMax = static_cast<float>(cap->hbm.percentage.max) / 100.0f;
+ ALOGI("mBrightnessHbmMax = %f", mBrightnessHbmMax);
+
+ mBrightnessTable[BrightnessRange::NORMAL] = BrightnessTable(cap->normal);
+ mBrightnessTable[BrightnessRange::HBM] = BrightnessTable(cap->hbm);
+
+ drmModeFreePropertyBlob(blob);
+
+ mBrightntessIntfSupported = true;
mBrightnessState.reset();
mBrightnessHbmOn = false;
mBrightnessDimmingOn = true;
@@ -1771,13 +1818,36 @@ void ExynosDisplayDrmInterface::setupBrightnessConfig() {
mBrightnessDimmingOn = (!mBrightnessState.instant_hbm && !brightness_state.instant_hbm);
if (brightness_state.peak_hbm) {
- mScaledBrightness = 1.0;
+ mScaledBrightness = mBrightnessHbmMax;
} else if (brightness_state.boost_brightness) {
- mScaledBrightness = mBrightnessHdrRatio * mExynosDisplay->getBrightnessValue();
+ mScaledBrightness =
+ min(mBrightnessHdrRatio * mExynosDisplay->getBrightnessValue(), mBrightnessHbmMax);
} else {
mScaledBrightness = mExynosDisplay->getBrightnessValue();
}
+ uint32_t range;
+ for (range = 0; range < BrightnessRange::MAX; range++) {
+ if (mScaledBrightness <= mBrightnessTable[range].mBriEnd) {
+ mBrightnessLevel = static_cast<uint32_t>(
+ (mScaledBrightness - mBrightnessTable[range].mBriStart) /
+ (mBrightnessTable[range].mBriEnd - mBrightnessTable[range].mBriStart) *
+ (mBrightnessTable[range].mBklEnd - mBrightnessTable[range].mBklStart) +
+ mBrightnessTable[range].mBklStart);
+ break;
+ }
+ }
+
+ if (mPanelHbmType == PanelHbmType::ONE_STEP && mScaledBrightness == mBrightnessHbmMax) {
+ mBrightnessHbmOn = true;
+ } else if (mPanelHbmType == PanelHbmType::CONTINUOUS && range == BrightnessRange::HBM) {
+ mBrightnessHbmOn = true;
+ } else {
+ mBrightnessHbmOn = false;
+ }
+ ALOGI("level=%d, DimmingOn=%d, HbmOn=%d", mBrightnessLevel, mBrightnessDimmingOn,
+ mBrightnessHbmOn);
+
mBrightnessState = brightness_state;
// TODO:mapping and setup mBrightnessLevel and mBrightnessHbmOn