summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp24
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h4
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp17
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp15
4 files changed, 40 insertions, 20 deletions
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp
index 4be73da..bc17c2e 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.cpp
+++ b/libhwc2.1/libdevice/ExynosDisplay.cpp
@@ -6058,3 +6058,27 @@ bool ExynosDisplay::isMixedComposition() {
}
return false;
}
+
+int ExynosDisplay::lookupDisplayConfigs(const int32_t &width,
+ const int32_t &height,
+ const int32_t &fps,
+ int32_t *outConfig) {
+ if (!fps)
+ return HWC2_ERROR_BAD_CONFIG;
+
+ constexpr auto nsecsPerSec = std::chrono::nanoseconds(1s).count();
+ constexpr auto nsecsPerMs = std::chrono::nanoseconds(1ms).count();
+
+ const auto vsyncPeriod = nsecsPerSec / fps;
+
+ for (auto const& [config, mode] : mDisplayConfigs) {
+ long delta = abs(vsyncPeriod - mode.vsyncPeriod);
+ if ((width == mode.width) && (height == mode.height) && (delta < nsecsPerMs)) {
+ ALOGD("%s: found display config for mode: %dx%d@%d=%d",
+ __func__, width, height, fps, config);
+ *outConfig = config;
+ return HWC2_ERROR_NONE;
+ }
+ }
+ return HWC2_ERROR_BAD_CONFIG;
+}
diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h
index a7a07de..12ad1f1 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.h
+++ b/libhwc2.1/libdevice/ExynosDisplay.h
@@ -1279,6 +1279,10 @@ class ExynosDisplay {
// check if there are any dimmed layers
bool isMixedComposition();
bool isPriorFrameMixedCompostion() { return mPriorFrameMixedComposition; }
+ int lookupDisplayConfigs(const int32_t& width,
+ const int32_t& height,
+ const int32_t& fps,
+ int32_t* outConfig);
private:
bool skipStaticLayerChanged(ExynosCompositionInfo& compositionInfo);
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index 45f5043..8b13742 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -833,15 +833,20 @@ 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 {
+ err = HWC2_ERROR_BAD_CONFIG;
+ }
+
+ if (err != HWC2_ERROR_NONE) {
config = mDrmConnector->get_preferred_mode_id();
}
- ALOGI("Preferred mode id: %d, state: %d", config, mDrmConnector->state());
+ ALOGI("Preferred mode id: %d(%s), state: %d", config, modeStr, mDrmConnector->state());
if ((err = setActiveConfig(config)) < 0) {
ALOGE("failed to set default config, err %d", err);
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index 0827f95..c841899 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -38,7 +38,6 @@ extern struct exynos_hwc_control exynosHWCControl;
using namespace SOC_VERSION;
constexpr auto nsecsPerSec = std::chrono::nanoseconds(1s).count();
-constexpr auto nsecsPerMs = std::chrono::nanoseconds(1ms).count();
static const std::map<const DisplayType, const std::string> panelSysfsPath =
{{DisplayType::DISPLAY_PRIMARY, "/sys/devices/platform/exynos-drm/primary-panel/"},
@@ -259,19 +258,7 @@ int32_t ExynosPrimaryDisplay::getPreferredDisplayConfigInternal(int32_t *outConf
return HWC2_ERROR_BAD_CONFIG;
}
- const auto vsyncPeriod = nsecsPerSec / fps;
-
- for (auto const& [config, mode] : mDisplayConfigs) {
- long delta = abs(vsyncPeriod - mode.vsyncPeriod);
- if ((width == mode.width) && (height == mode.height) &&
- (delta < nsecsPerMs)) {
- ALOGD("%s: found preferred display config for mode: %s=%d",
- __func__, modeStr, config);
- *outConfig = config;
- return HWC2_ERROR_NONE;
- }
- }
- return HWC2_ERROR_BAD_CONFIG;
+ return lookupDisplayConfigs(width, height, fps, outConfig);
}
int32_t ExynosPrimaryDisplay::setPowerOn() {