summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinpeter <linpeter@google.com>2022-07-13 19:24:18 +0800
committerPeter Lin <linpeter@google.com>2022-09-13 02:44:14 +0000
commitf2bc1d104373c51181535d9a6fdc67221666b48d (patch)
tree187d32a73cb66658e7bed20c798598d40f8e8982
parent336703efd77b54e0eec3d09356cd4313dc99e0cf (diff)
libhwc2.1: allow the first power mode
The first state from SF can be ON or OFF. Changing mPowerModeState as optional allows the first power mode. Bug: 237745199 test: check display power state during booting Change-Id: I7c60a8a0b13fca643dec0877d4263067043c2353
-rw-r--r--libhwc2.1/histogram_mediator.cpp5
-rw-r--r--libhwc2.1/libdevice/ExynosDevice.cpp19
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp6
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h2
-rw-r--r--libhwc2.1/libexternaldisplay/ExynosExternalDisplay.cpp6
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp13
-rw-r--r--libhwc2.1/libresource/ExynosResourceManager.cpp3
7 files changed, 33 insertions, 21 deletions
diff --git a/libhwc2.1/histogram_mediator.cpp b/libhwc2.1/histogram_mediator.cpp
index 0ce310d..c917783 100644
--- a/libhwc2.1/histogram_mediator.cpp
+++ b/libhwc2.1/histogram_mediator.cpp
@@ -30,8 +30,9 @@ uint32_t histogram::HistogramMediator::getFrameCount() {
}
bool histogram::HistogramMediator::isDisplayPowerOff() {
- if ((mDisplay->mPowerModeState == HWC2_POWER_MODE_OFF) ||
- (mDisplay->mPowerModeState == HWC2_POWER_MODE_DOZE)) {
+ if (!mDisplay->mPowerModeState.has_value() ||
+ ((mDisplay->mPowerModeState.value() == HWC2_POWER_MODE_OFF) ||
+ (mDisplay->mPowerModeState.value() == HWC2_POWER_MODE_DOZE))) {
return true;
}
return false;
diff --git a/libhwc2.1/libdevice/ExynosDevice.cpp b/libhwc2.1/libdevice/ExynosDevice.cpp
index cd3dcd4..ebaf5f8 100644
--- a/libhwc2.1/libdevice/ExynosDevice.cpp
+++ b/libhwc2.1/libdevice/ExynosDevice.cpp
@@ -231,7 +231,8 @@ bool ExynosDevice::isFirstValidate()
{
for (uint32_t i = 0; i < mDisplays.size(); i++) {
if ((mDisplays[i]->mType != HWC_DISPLAY_VIRTUAL) &&
- (mDisplays[i]->mPowerModeState == (hwc2_power_mode_t)HWC_POWER_MODE_OFF))
+ (!mDisplays[i]->mPowerModeState.has_value() ||
+ (mDisplays[i]->mPowerModeState.value() == (hwc2_power_mode_t)HWC_POWER_MODE_OFF)))
continue;
if ((mDisplays[i]->mPlugState == true) &&
((mDisplays[i]->mRenderingState != RENDERING_STATE_NONE) &&
@@ -248,7 +249,8 @@ bool ExynosDevice::isLastValidate(ExynosDisplay *display)
if (mDisplays[i] == display)
continue;
if ((mDisplays[i]->mType != HWC_DISPLAY_VIRTUAL) &&
- (mDisplays[i]->mPowerModeState == (hwc2_power_mode_t)HWC_POWER_MODE_OFF))
+ (!mDisplays[i]->mPowerModeState.has_value() ||
+ (mDisplays[i]->mPowerModeState.value() == (hwc2_power_mode_t)HWC_POWER_MODE_OFF)))
continue;
if ((mDisplays[i]->mPlugState == true) &&
(mDisplays[i]->mRenderingState != RENDERING_STATE_VALIDATED) &&
@@ -883,14 +885,17 @@ void ExynosDevice::compareVsyncPeriod() {
mVsyncDisplayId = getDisplayId(HWC_DISPLAY_PRIMARY, 0);
if ((external_display == nullptr) ||
- (external_display->mPowerModeState == HWC2_POWER_MODE_OFF)) {
+ (!external_display->mPowerModeState.has_value() ||
+ (external_display->mPowerModeState.value() == HWC2_POWER_MODE_OFF))) {
return;
- } else if (primary_display->mPowerModeState == HWC2_POWER_MODE_OFF) {
+ } else if (!primary_display->mPowerModeState.has_value() ||
+ (primary_display->mPowerModeState.value() == HWC2_POWER_MODE_OFF)) {
mVsyncDisplayId = getDisplayId(HWC_DISPLAY_EXTERNAL, 0);
return;
- } else if (((primary_display->mPowerModeState == HWC2_POWER_MODE_DOZE) ||
- (primary_display->mPowerModeState == HWC2_POWER_MODE_DOZE_SUSPEND)) &&
- (external_display->mVsyncPeriod >= DOZE_VSYNC_PERIOD)) { /*30fps*/
+ } else if (primary_display->mPowerModeState.has_value() &&
+ ((primary_display->mPowerModeState.value() == HWC2_POWER_MODE_DOZE) ||
+ (primary_display->mPowerModeState.value() == HWC2_POWER_MODE_DOZE_SUSPEND)) &&
+ (external_display->mVsyncPeriod >= DOZE_VSYNC_PERIOD)) { /*30fps*/
mVsyncDisplayId = getDisplayId(HWC_DISPLAY_EXTERNAL, 0);
return;
} else if (primary_display->mVsyncPeriod <= external_display->mVsyncPeriod) {
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp
index ff8802f..8210782 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.cpp
+++ b/libhwc2.1/libdevice/ExynosDisplay.cpp
@@ -1002,7 +1002,8 @@ ExynosDisplay::ExynosDisplay(uint32_t index, ExynosDevice *device)
mDisplayConfigs.clear();
- mPowerModeState = HWC2_POWER_MODE_OFF;
+ mPowerModeState = std::nullopt;
+
mVsyncState = HWC2_VSYNC_DISABLE;
/* TODO : Exception handling here */
@@ -4216,7 +4217,8 @@ uint32_t ExynosDisplay::getBtsRefreshRate() const {
void ExynosDisplay::updateRefreshRateHint() {
if (mVsyncPeriod) {
- mPowerHalHint.signalRefreshRate(mPowerModeState, mVsyncPeriod);
+ mPowerHalHint.signalRefreshRate(mPowerModeState.value_or(HWC2_POWER_MODE_OFF),
+ mVsyncPeriod);
}
}
diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h
index 4d6edbb..2f36894 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.h
+++ b/libhwc2.1/libdevice/ExynosDisplay.h
@@ -393,7 +393,7 @@ class ExynosDisplay {
/** State variables */
bool mPlugState;
- hwc2_power_mode_t mPowerModeState;
+ std::optional<hwc2_power_mode_t> mPowerModeState;
hwc2_vsync_t mVsyncState;
bool mHasSingleBuffer;
bool mPauseDisplay = false;
diff --git a/libhwc2.1/libexternaldisplay/ExynosExternalDisplay.cpp b/libhwc2.1/libexternaldisplay/ExynosExternalDisplay.cpp
index 39c2e79..d932f68 100644
--- a/libhwc2.1/libexternaldisplay/ExynosExternalDisplay.cpp
+++ b/libhwc2.1/libexternaldisplay/ExynosExternalDisplay.cpp
@@ -102,7 +102,8 @@ void ExynosExternalDisplay::closeExternalDisplay()
setVsyncEnabledInternal(HWC2_VSYNC_DISABLE);
- if (mPowerModeState != (hwc2_power_mode_t)HWC_POWER_MODE_OFF) {
+ if (mPowerModeState.has_value() &&
+ (*mPowerModeState != (hwc2_power_mode_t)HWC_POWER_MODE_OFF)) {
if (mDisplayInterface->setPowerMode(HWC_POWER_MODE_OFF) < 0) {
DISPLAY_LOGE("%s: set powermode ioctl failed errno : %d", __func__, errno);
return;
@@ -276,7 +277,8 @@ int32_t ExynosExternalDisplay::canSkipValidate() {
return SKIP_ERR_DISP_NOT_CONNECTED;
if ((mSkipStartFrame > (SKIP_EXTERNAL_FRAME - 1)) && (mEnabled == false) &&
- (mPowerModeState == (hwc2_power_mode_t)HWC_POWER_MODE_NORMAL))
+ (mPowerModeState.has_value() &&
+ (*mPowerModeState == (hwc2_power_mode_t)HWC_POWER_MODE_NORMAL)))
return SKIP_ERR_DISP_NOT_POWER_ON;
if (checkRotate() || (mIsSkipFrame) ||
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index bad418f..9f2e97e 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -163,7 +163,7 @@ int ExynosPrimaryDisplay::getDDIScalerMode(int width, int height) {
}
int32_t ExynosPrimaryDisplay::doDisplayConfigInternal(hwc2_config_t config) {
- if (mPowerModeState != HWC2_POWER_MODE_ON) {
+ if (!mPowerModeState.has_value() || (*mPowerModeState != HWC2_POWER_MODE_ON)) {
mPendActiveConfig = config;
mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_NONE;
DISPLAY_LOGI("%s:: Pending desired Config: %d", __func__, config);
@@ -188,7 +188,7 @@ int32_t ExynosPrimaryDisplay::setActiveConfigInternal(hwc2_config_t config, bool
ALOGI("%s:: Same display config is set", __func__);
return HWC2_ERROR_NONE;
}
- if (mPowerModeState != HWC2_POWER_MODE_ON) {
+ if (!mPowerModeState.has_value() || (*mPowerModeState != HWC2_POWER_MODE_ON)) {
mPendActiveConfig = config;
return HWC2_ERROR_NONE;
}
@@ -279,7 +279,7 @@ int32_t ExynosPrimaryDisplay::setPowerOn() {
updateAppliedActiveConfig(0, 0);
int ret = applyPendingConfig();
- if (mPowerModeState == HWC2_POWER_MODE_OFF) {
+ if (!mPowerModeState.has_value() || (*mPowerModeState == HWC2_POWER_MODE_OFF)) {
// check the dynamic recomposition thread by following display
mDevice->checkDynamicRecompositionThread();
if (ret) {
@@ -329,7 +329,8 @@ int32_t ExynosPrimaryDisplay::setPowerDoze(hwc2_power_mode_t mode) {
return HWC2_ERROR_UNSUPPORTED;
}
- if ((mPowerModeState == HWC2_POWER_MODE_OFF) || (mPowerModeState == HWC2_POWER_MODE_ON)) {
+ if (mPowerModeState.has_value() &&
+ ((*mPowerModeState == HWC2_POWER_MODE_OFF) || (*mPowerModeState == HWC2_POWER_MODE_ON))) {
if (mDisplayInterface->setLowPowerMode()) {
ALOGI("Not support LP mode.");
return HWC2_ERROR_UNSUPPORTED;
@@ -354,7 +355,7 @@ int32_t ExynosPrimaryDisplay::setPowerMode(int32_t mode) {
mPauseDisplay = false;
}
- if (mode == static_cast<int32_t>(mPowerModeState)) {
+ if (mPowerModeState.has_value() && (mode == static_cast<int32_t>(mPowerModeState.value()))) {
ALOGI("Skip power mode transition due to the same power state.");
return HWC2_ERROR_NONE;
}
@@ -568,7 +569,7 @@ int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) {
}
mLhbmOn = enabled;
- if (mPowerModeState == HWC2_POWER_MODE_OFF && mLhbmOn) {
+ if (!mPowerModeState.has_value() || (*mPowerModeState == HWC2_POWER_MODE_OFF && mLhbmOn)) {
mLhbmOn = false;
ALOGE("%s power off during request lhbm on", __func__);
return -EINVAL;
diff --git a/libhwc2.1/libresource/ExynosResourceManager.cpp b/libhwc2.1/libresource/ExynosResourceManager.cpp
index bbb1791..85bcaa4 100644
--- a/libhwc2.1/libresource/ExynosResourceManager.cpp
+++ b/libhwc2.1/libresource/ExynosResourceManager.cpp
@@ -1946,7 +1946,8 @@ int32_t ExynosResourceManager::preAssignResources()
if (display->mDisplayControl.forceReserveMPP ||
(display->mPlugState &&
((display->mType != HWC_DISPLAY_PRIMARY) ||
- (display->mPowerModeState != HWC2_POWER_MODE_OFF)))) {
+ (display->mPowerModeState.has_value() &&
+ (display->mPowerModeState.value() != HWC2_POWER_MODE_OFF))))) {
HDEBUGLOGD(eDebugResourceManager, "\t\treserve to display %d", display->mDisplayId);
mOtfMPPs[i]->reserveMPP(display->mDisplayId);
break;