summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2023-03-13 23:11:15 -0700
committerXin Li <delphij@google.com>2023-03-13 23:11:15 -0700
commit66fe0ec5c547eb18923671ca97da13ee86659838 (patch)
tree715f8003dff1e0347a9b8513c4f3d3026ad33366 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
parentdbe2bc2f135b9293b4cec47f9737ee1d3d4cdfc1 (diff)
parentfb858a6df66297bdf4941d499ab5aa804db6e3c5 (diff)
Merge Android 13 QPR2
Bug: 273316506 Merged-In: I2317d9376802ca403ca0f46a11ae70aecef68e86 Change-Id: I696977814bce03f5db22a47498aeb71831568c3c
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp42
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(