diff options
author | Xin Li <delphij@google.com> | 2023-01-11 22:47:13 -0800 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2023-01-11 22:47:13 -0800 |
commit | fb858a6df66297bdf4941d499ab5aa804db6e3c5 (patch) | |
tree | 715f8003dff1e0347a9b8513c4f3d3026ad33366 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | ddb3c1e0f33a6ba6bab926508928a275850b8582 (diff) | |
parent | ede1a22256730beec229a0e0e95c37189a91bd38 (diff) |
Merge tm-qpr-dev-plus-aosp-without-vendor@9467136
Bug: 264720040
Merged-In: I2317d9376802ca403ca0f46a11ae70aecef68e86
Change-Id: I2b6b887ed97aa61b09cce6748d7d1f0f5d4f7ab2
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 1984d7b..994027a 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -832,23 +832,41 @@ int32_t ExynosDisplayDrmInterface::chosePreferredConfig() if (err != HWC2_ERROR_NONE || !num_configs) return err; - hwc2_config_t config; - int32_t bootConfig; - err = mExynosDisplay->getPreferredDisplayConfigInternal(&bootConfig); - if (err == HWC2_ERROR_NONE && property_get_bool("sys.boot_completed", false) == true) { - config = static_cast<hwc2_config_t>(bootConfig); + int32_t config = -1; + char modeStr[PROPERTY_VALUE_MAX] = "\0"; + int32_t width = 0, height = 0, fps = 0; + if (property_get("vendor.display.preferred_mode", modeStr, "") > 0 && + sscanf(modeStr, "%dx%d@%d", &width, &height, &fps) == 3) { + err = mExynosDisplay->lookupDisplayConfigs(width, height, fps, &config); } else { - config = mDrmConnector->get_preferred_mode_id(); + err = HWC2_ERROR_BAD_CONFIG; } - ALOGI("Preferred mode id: %d, state: %d", config, mDrmConnector->state()); - if ((err = setActiveConfig(config)) < 0) { - ALOGE("failed to set default config, err %d", err); - return err; + const int32_t drmPreferredConfig = mDrmConnector->get_preferred_mode_id(); + if (err != HWC2_ERROR_NONE) { + config = drmPreferredConfig; + } + ALOGI("Preferred mode id: %d(%s), state: %d", config, modeStr, mDrmConnector->state()); + + auto &configs = mExynosDisplay->mDisplayConfigs; + if (config != drmPreferredConfig && + (configs[config].width != configs[drmPreferredConfig].width || + configs[config].height != configs[drmPreferredConfig].height)) { + // HWC cannot send a resolution change commit here until 1st frame update because of + // some panels requirement. Therefore, it calls setActiveConfigWithConstraints() help + // set mDesiredModeState correctly, and then trigger modeset in the 1s frame update. + if ((err = setActiveConfigWithConstraints(config)) < 0) { + ALOGE("failed to setActiveConfigWithConstraints(), err %d", err); + return err; + } + } else { + if ((err = setActiveConfig(config)) < 0) { + ALOGE("failed to set default config, err %d", err); + return err; + } } - mExynosDisplay->updateInternalDisplayConfigVariables(config); - return err; + return mExynosDisplay->updateInternalDisplayConfigVariables(config); } int32_t ExynosDisplayDrmInterface::getDisplayConfigs( |