diff options
author | linpeter <linpeter@google.com> | 2022-07-13 19:24:18 +0800 |
---|---|---|
committer | Peter Lin <linpeter@google.com> | 2022-09-13 02:44:14 +0000 |
commit | f2bc1d104373c51181535d9a6fdc67221666b48d (patch) | |
tree | 187d32a73cb66658e7bed20c798598d40f8e8982 | |
parent | 336703efd77b54e0eec3d09356cd4313dc99e0cf (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.cpp | 5 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDevice.cpp | 19 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 6 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 2 | ||||
-rw-r--r-- | libhwc2.1/libexternaldisplay/ExynosExternalDisplay.cpp | 6 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 13 | ||||
-rw-r--r-- | libhwc2.1/libresource/ExynosResourceManager.cpp | 3 |
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; |