diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 115 |
1 files changed, 7 insertions, 108 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index fe5b159051..6910a57edc 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1227,10 +1227,8 @@ status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& displayToken, return NO_ERROR; } -void SurfaceFlinger::setDesiredMode(display::DisplayModeRequest&& desiredMode) { - const auto mode = desiredMode.mode; - const auto displayId = mode.modePtr->getPhysicalDisplayId(); - +void SurfaceFlinger::setDesiredMode(display::DisplayModeRequest&& request, bool force) { + const auto displayId = request.mode.modePtr->getPhysicalDisplayId(); ATRACE_NAME(ftl::Concat(__func__, ' ', displayId.value).c_str()); const auto display = getDisplayDeviceLocked(displayId); @@ -1239,9 +1237,10 @@ void SurfaceFlinger::setDesiredMode(display::DisplayModeRequest&& desiredMode) { return; } - const bool emitEvent = desiredMode.emitEvent; + const auto mode = request.mode; + const bool emitEvent = request.emitEvent; - switch (display->setDesiredMode(std::move(desiredMode))) { + switch (display->setDesiredMode(std::move(request), force)) { case DisplayDevice::DesiredModeAction::InitiateDisplayModeSwitch: // DisplayDevice::setDesiredMode updated the render rate, so inform Scheduler. mScheduler->setRenderRate(displayId, @@ -1427,8 +1426,7 @@ void SurfaceFlinger::initiateDisplayModeChanges() { to_string(displayModePtrOpt->get()->getVsyncRate()).c_str(), to_string(display->getId()).c_str()); - if ((!FlagManager::getInstance().connected_display() || !desiredModeOpt->force) && - display->getActiveMode() == desiredModeOpt->mode) { + if (display->getActiveMode() == desiredModeOpt->mode) { applyActiveMode(display); continue; } @@ -3294,88 +3292,14 @@ std::pair<DisplayModes, DisplayModePtr> SurfaceFlinger::loadDisplayModes( std::vector<HWComposer::HWCDisplayMode> hwcModes; std::optional<hal::HWDisplayId> activeModeHwcId; - const bool isExternalDisplay = FlagManager::getInstance().connected_display() && - getHwComposer().getDisplayConnectionType(displayId) == - ui::DisplayConnectionType::External; - int attempt = 0; constexpr int kMaxAttempts = 3; do { hwcModes = getHwComposer().getModes(displayId, scheduler::RefreshRateSelector::kMinSupportedFrameRate .getPeriodNsecs()); - activeModeHwcId = getHwComposer().getActiveMode(displayId); - if (isExternalDisplay) { - constexpr nsecs_t k59HzVsyncPeriod = 16949153; - constexpr nsecs_t k60HzVsyncPeriod = 16666667; - - // DM sets the initial mode for an external display to 1080p@60, but - // this comes after SF creates its own state (including the - // DisplayDevice). For now, pick the same mode in order to avoid - // inconsistent state and unnecessary mode switching. - // TODO (b/318534874): Let DM decide the initial mode. - // - // Try to find 1920x1080 @ 60 Hz - if (const auto iter = std::find_if(hwcModes.begin(), hwcModes.end(), - [](const auto& mode) { - return mode.width == 1920 && - mode.height == 1080 && - mode.vsyncPeriod == k60HzVsyncPeriod; - }); - iter != hwcModes.end()) { - activeModeHwcId = iter->hwcId; - break; - } - - // Try to find 1920x1080 @ 59-60 Hz - if (const auto iter = std::find_if(hwcModes.begin(), hwcModes.end(), - [](const auto& mode) { - return mode.width == 1920 && - mode.height == 1080 && - mode.vsyncPeriod >= k60HzVsyncPeriod && - mode.vsyncPeriod <= k59HzVsyncPeriod; - }); - iter != hwcModes.end()) { - activeModeHwcId = iter->hwcId; - break; - } - - // The display does not support 1080p@60, and this is the last attempt to pick a display - // mode. Prefer 60 Hz if available, with the closest resolution to 1080p. - if (attempt + 1 == kMaxAttempts) { - std::vector<HWComposer::HWCDisplayMode> hwcModeOpts; - - for (const auto& mode : hwcModes) { - if (mode.width <= 1920 && mode.height <= 1080 && - mode.vsyncPeriod >= k60HzVsyncPeriod && - mode.vsyncPeriod <= k59HzVsyncPeriod) { - hwcModeOpts.push_back(mode); - } - } - - if (const auto iter = std::max_element(hwcModeOpts.begin(), hwcModeOpts.end(), - [](const auto& a, const auto& b) { - const auto aSize = a.width * a.height; - const auto bSize = b.width * b.height; - if (aSize < bSize) - return true; - else if (aSize == bSize) - return a.vsyncPeriod > b.vsyncPeriod; - else - return false; - }); - iter != hwcModeOpts.end()) { - activeModeHwcId = iter->hwcId; - break; - } - - // hwcModeOpts was empty, use hwcModes[0] as the last resort - activeModeHwcId = hwcModes[0].hwcId; - } - } - const auto isActiveMode = [activeModeHwcId](const HWComposer::HWCDisplayMode& mode) { return mode.hwcId == activeModeHwcId; }; @@ -3435,10 +3359,6 @@ std::pair<DisplayModes, DisplayModePtr> SurfaceFlinger::loadDisplayModes( return pair.second->getHwcId() == activeModeHwcId; })->second; - if (isExternalDisplay) { - ALOGI("External display %s initial mode: {%s}", to_string(displayId).c_str(), - to_string(*activeMode).c_str()); - } return {modes, activeMode}; } @@ -3745,27 +3665,6 @@ void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken, } mDisplays.try_emplace(displayToken, std::move(display)); - - // For an external display, loadDisplayModes already selected the same mode - // as DM, but SF still needs to be updated to match. - // TODO (b/318534874): Let DM decide the initial mode. - if (const auto& physical = state.physical; - mScheduler && physical && FlagManager::getInstance().connected_display()) { - const bool isInternalDisplay = mPhysicalDisplays.get(physical->id) - .transform(&PhysicalDisplay::isInternal) - .value_or(false); - - if (!isInternalDisplay) { - auto activeModePtr = physical->activeMode; - const auto fps = activeModePtr->getPeakFps(); - - setDesiredMode( - {.mode = scheduler::FrameRateMode{fps, - ftl::as_non_null(std::move(activeModePtr))}, - .emitEvent = false, - .force = true}); - } - } } void SurfaceFlinger::processDisplayRemoved(const wp<IBinder>& displayToken) { @@ -8434,7 +8333,7 @@ status_t SurfaceFlinger::applyRefreshRateSelectorPolicy( return INVALID_OPERATION; } - setDesiredMode({std::move(preferredMode), .emitEvent = true, .force = force}); + setDesiredMode({std::move(preferredMode), .emitEvent = true}, force); // Update the frameRateOverride list as the display render rate might have changed if (mScheduler->updateFrameRateOverrides(scheduler::GlobalSignals{}, preferredFps)) { |