diff options
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 24 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 4 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 17 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 15 |
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() { |