diff options
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 88 |
1 files changed, 47 insertions, 41 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 1ac22e8..4500e6a 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -1073,7 +1073,7 @@ int32_t ExynosDisplayDrmInterface::setActiveConfigWithConstraints( return HWC2_ERROR_NONE; } - if (mDesiredModeState.needs_modeset) { + if (mDesiredModeState.needsModeSet()) { ALOGD("Previous mode change request is not applied"); } @@ -1087,34 +1087,38 @@ int32_t ExynosDisplayDrmInterface::setActiveConfigWithConstraints( return HWC2_ERROR_BAD_CONFIG; } } - if (test) { - if ((ret = setDisplayMode(drmReq, modeBlob? modeBlob : mDesiredModeState.blob_id)) < 0) { - HWC_LOGE(mExynosDisplay, "%s: Fail to apply display mode", - __func__); - return ret; - } - ret = drmReq.commit(DRM_MODE_ATOMIC_TEST_ONLY, true); - if (ret) { - drmReq.addOldBlob(modeBlob); - HWC_LOGE(mExynosDisplay, "%s:: Failed to commit pset ret=%d in applyDisplayMode()\n", - __func__, ret); - return ret; - } - } else { - mDesiredModeState.needs_modeset = true; - } + const auto isResSwitch = + (mActiveModeState.blob_id != 0) && mActiveModeState.isFullModeSwitch(*mode); - if (modeBlob != 0) { + if (!test) { mDesiredModeState.setMode(*mode, modeBlob, drmReq); + } else { + if (!isResSwitch) { + ret = setDisplayMode(drmReq, modeBlob ? modeBlob : mDesiredModeState.blob_id); + if (ret < 0) { + HWC_LOGE(mExynosDisplay, "%s: Fail to apply display mode", __func__); + return ret; + } + ret = drmReq.commit(DRM_MODE_ATOMIC_TEST_ONLY, true); + if (ret) { + drmReq.addOldBlob(modeBlob); + HWC_LOGE(mExynosDisplay, + "%s:: Failed to commit pset ret=%d in applyDisplayMode()\n", __func__, + ret); + return ret; + } + } + + if (modeBlob) { + mDrmDevice->DestroyPropertyBlob(modeBlob); + } } return HWC2_ERROR_NONE; } int32_t ExynosDisplayDrmInterface::setActiveDrmMode(DrmMode const &mode) { /* Don't skip when power was off */ - if (!(mExynosDisplay->mSkipFrame) && - (mActiveModeState.blob_id != 0) && - (mActiveModeState.mode.id() == mode.id()) && - (mActiveModeState.needs_modeset == false)) { + if (!(mExynosDisplay->mSkipFrame) && (mActiveModeState.blob_id != 0) && + (mActiveModeState.mode.id() == mode.id()) && !mActiveModeState.needsModeSet()) { ALOGD("%s:: same mode %d", __func__, mode.id()); return HWC2_ERROR_NONE; } @@ -1135,13 +1139,6 @@ int32_t ExynosDisplayDrmInterface::setActiveDrmMode(DrmMode const &mode) { if ((mActiveModeState.blob_id != 0) && ((mode.h_display() != mActiveModeState.mode.h_display()) || (mode.v_display() != mActiveModeState.mode.v_display()))) { - ret = clearDisplayPlanes(drmReq); - if (ret != HWC2_ERROR_NONE) { - HWC_LOGE(mExynosDisplay, "%s: Failed to clear planes due to resolution change", - __func__); - } else { - ALOGD("%s: switching display resolution, clearing planes", __func__); - } reconfig = true; } @@ -1161,7 +1158,7 @@ int32_t ExynosDisplayDrmInterface::setActiveDrmMode(DrmMode const &mode) { mDrmConnector->set_active_mode(mode); mActiveModeState.setMode(mode, modeBlob, drmReq); - mActiveModeState.needs_modeset = false; + mActiveModeState.clearPendingModeState(); if (reconfig) { mDrmConnector->ResetLpMode(); @@ -1605,10 +1602,14 @@ int32_t ExynosDisplayDrmInterface::updateColorSettings(DrmModeAtomicReq &drmReq, } auto &plane = mDrmDevice->planes().at(channelId); - if ((ret = setPlaneColorSetting(drmReq, plane, config)) != 0) { + uint32_t solidColor = config.color; + if ((ret = setPlaneColorSetting(drmReq, plane, config, solidColor)) != 0) { HWC_LOGE(mExynosDisplay, "Failed to set plane color setting, config[%zu]", i); return ret; } + if (config.state == config.WIN_STATE_COLOR && solidColor != config.color) { + config.color = solidColor; + } } } @@ -1653,7 +1654,7 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() } uint64_t mipi_sync_type = 0; - if (mDesiredModeState.needs_modeset) { + if (mDesiredModeState.needsModeSet()) { if (mExynosDisplay->checkRrCompensationEnabled()) { mipi_sync_type |= 1 << mMipiSyncEnums[toUnderlying(HalMipiSyncType::HAL_MIPI_CMD_SYNC_REFRESH_RATE)]; @@ -1693,6 +1694,13 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() return ret; } + // Update of color settings could change layer's solid color. So it should + // be called before use of layer's solid color. + if ((ret = updateColorSettings(drmReq, dqeEnable)) != 0) { + HWC_LOGE(mExynosDisplay, "failed to update color settings (%d)", ret); + return ret; + } + for (size_t i = 0; i < mExynosDisplay->mDpuData.configs.size(); i++) { exynos_win_config_data& config = mExynosDisplay->mDpuData.configs[i]; if ((config.state == config.WIN_STATE_BUFFER) || @@ -1782,7 +1790,7 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() } uint32_t flags = DRM_MODE_ATOMIC_NONBLOCK; - if (needModesetForReadback) + if (needModesetForReadback || !mDesiredModeState.isSeamless()) flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; /* For Histogram */ @@ -1791,11 +1799,6 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() return ret; } - if ((ret = updateColorSettings(drmReq, dqeEnable)) != 0) { - HWC_LOGE(mExynosDisplay, "failed to update color settings (%d)", ret); - return ret; - } - if (mDrmConnector->mipi_sync().id() && (mipi_sync_type != 0)) { ATRACE_NAME("mipi_sync"); // mark this commit if ((ret = drmReq.atomicAddProperty(mDrmConnector->id(), @@ -1841,8 +1844,12 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() } } - if (mDesiredModeState.needs_modeset) { + if (mDesiredModeState.needsModeSet()) { mDesiredModeState.apply(mActiveModeState, drmReq); + if (!mActiveModeState.isSeamless()) { + mDrmConnector->ResetLpMode(); + getLowPowerDrmModeModeInfo(); + } mVsyncCallback.setDesiredVsyncPeriod( nsecsPerSec/mActiveModeState.mode.v_refresh()); /* Enable vsync to check vsync period */ @@ -1941,8 +1948,7 @@ int32_t ExynosDisplayDrmInterface::clearDisplay(bool needModeClear) return ret; } - if (needModeClear) - mActiveModeState.needs_modeset = true; + if (needModeClear) mActiveModeState.forceModeSet(); return NO_ERROR; } |