diff options
author | linpeter <linpeter@google.com> | 2021-01-04 12:09:57 +0800 |
---|---|---|
committer | linpeter <linpeter@google.com> | 2021-01-13 19:16:49 +0800 |
commit | 638de7cc9fb05dd0687eb080fa01b39a8d2738b3 (patch) | |
tree | bb44cc97c89a052b8f350f21ed9fbdb6f176983c /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | 39e56be41ba14ae520a44936106eefc105faa1ae (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.cpp | 82 |
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 |