diff options
| author | 2023-11-15 18:41:35 -0800 | |
|---|---|---|
| committer | 2023-11-21 15:22:34 -0800 | |
| commit | c585dbac703f85d2febc9b7f31dd797bc2b04d81 (patch) | |
| tree | 5f0bb60ce1e08b48e1f10985493586976b28a099 /services/surfaceflinger/SurfaceFlinger.cpp | |
| parent | 43881b0fa27a23422041337c89d95098a2d4b618 (diff) | |
SF: pass DisplayMode to VsyncTracker
This will be used later to get the peak refresh rate from the predictor
for sub-frame jank recover in VRR case.
Bug: 296635687
Test: presubmit
Change-Id: I1e108223b6ae4872bb48a38e4af743da565749cd
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c15e74f107..2e70b22ee1 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1202,7 +1202,7 @@ void SurfaceFlinger::setDesiredMode(display::DisplayModeRequest&& request, bool // Start receiving vsync samples now, so that we can detect a period // switch. mScheduler->resyncToHardwareVsync(displayId, true /* allowToEnable */, - mode.modePtr->getVsyncRate()); + mode.modePtr.get()); // As we called to set period, we will call to onRefreshRateChangeCompleted once // VsyncController model is locked. @@ -1332,10 +1332,9 @@ void SurfaceFlinger::applyActiveMode(const sp<DisplayDevice>& display) { const auto desiredModeOpt = display->getDesiredMode(); const auto& modeOpt = desiredModeOpt->modeOpt; const auto displayId = modeOpt->modePtr->getPhysicalDisplayId(); - const auto vsyncRate = modeOpt->modePtr->getVsyncRate(); const auto renderFps = modeOpt->fps; dropModeRequest(display); - mScheduler->resyncToHardwareVsync(displayId, true /* allowToEnable */, vsyncRate); + mScheduler->resyncToHardwareVsync(displayId, true /* allowToEnable */, modeOpt->modePtr.get()); mScheduler->setRenderRate(displayId, renderFps); if (displayId == mActiveDisplayId) { @@ -4035,15 +4034,23 @@ void SurfaceFlinger::onChoreographerAttached() { } } -void SurfaceFlinger::onVsyncGenerated(PhysicalDisplayId displayId, TimePoint expectedPresentTime, - const scheduler::DisplayModeData& displayModeData, - Period vsyncPeriod) { - const auto status = - getHwComposer() - .notifyExpectedPresentIfRequired(displayId, vsyncPeriod, expectedPresentTime, - displayModeData.renderRate, - displayModeData - .notifyExpectedPresentTimeoutOpt); +void SurfaceFlinger::onVsyncGenerated(TimePoint expectedPresentTime, + ftl::NonNull<DisplayModePtr> modePtr, Fps renderRate) { + const auto vsyncPeriod = modePtr->getVsyncRate().getPeriod(); + const auto timeout = [&]() -> std::optional<Period> { + const auto vrrConfig = modePtr->getVrrConfig(); + if (!vrrConfig) return std::nullopt; + + const auto notifyExpectedPresentConfig = + modePtr->getVrrConfig()->notifyExpectedPresentConfig; + if (!notifyExpectedPresentConfig) return std::nullopt; + return Period::fromNs(notifyExpectedPresentConfig->notifyExpectedPresentTimeoutNs); + }(); + + const auto displayId = modePtr->getPhysicalDisplayId(); + const auto status = getHwComposer().notifyExpectedPresentIfRequired(displayId, vsyncPeriod, + expectedPresentTime, + renderRate, timeout); if (status != NO_ERROR) { ALOGE("%s failed to notifyExpectedPresentHint for display %" PRId64, __func__, displayId.value); @@ -5765,7 +5772,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, hal: display->setPowerMode(mode); - const auto refreshRate = display->refreshRateSelector().getActiveMode().modePtr->getVsyncRate(); + const auto activeMode = display->refreshRateSelector().getActiveMode().modePtr; if (!currentModeOpt || *currentModeOpt == hal::PowerMode::OFF) { // Turn on the display @@ -5802,7 +5809,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, hal: mScheduler->enableSyntheticVsync(false); constexpr bool kAllowToEnable = true; - mScheduler->resyncToHardwareVsync(displayId, kAllowToEnable, refreshRate); + mScheduler->resyncToHardwareVsync(displayId, kAllowToEnable, activeMode.get()); } mVisibleRegionsDirty = true; @@ -5844,7 +5851,8 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, hal: mVisibleRegionsDirty = true; scheduleRepaint(); mScheduler->enableSyntheticVsync(false); - mScheduler->resyncToHardwareVsync(displayId, true /* allowToEnable */, refreshRate); + mScheduler->resyncToHardwareVsync(displayId, true /* allowToEnable */, + activeMode.get()); } } else if (mode == hal::PowerMode::DOZE_SUSPEND) { // Leave display going to doze |