From 1047e5eff4f92231530d28e6be82b6c24da5d4f1 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Wed, 30 Jun 2021 14:55:42 -0700 Subject: SF: Update RefreshRateOverlay before SF applies transactions The current implementation of RefreshRateOverlay changes it's buffer to reflect the upcoming refresh rate after SF applies transaction. This is causing SF to see a layer update and reset the idle timer, entering a live loop of refresh rate switches. Instead, we update the RefreshRateOverlay when the refresh rate change is done and before SF applies transactions for the next frame. Bug: 192204776 Test: Enable RefreshRateOverlay on a device with idle timer enabled Change-Id: Ie904d6f37b7a02126d52a6267246afaf33982eff --- services/surfaceflinger/SurfaceFlinger.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 9c04fbf804..8df0852a3e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1189,6 +1189,10 @@ void SurfaceFlinger::setActiveModeInternal() { updatePhaseConfiguration(refreshRate); ATRACE_INT("ActiveConfigFPS", refreshRate.getValue()); + if (mRefreshRateOverlay) { + mRefreshRateOverlay->changeRefreshRate(upcomingMode->getFps()); + } + if (mUpcomingActiveMode.event != Scheduler::ModeEvent::None) { const nsecs_t vsyncPeriod = refreshRate.getPeriodNsecs(); const auto physicalId = display->getPhysicalId(); @@ -1271,9 +1275,6 @@ void SurfaceFlinger::performSetActiveMode() { } mScheduler->onNewVsyncPeriodChangeTimeline(outTimeline); - if (mRefreshRateOverlay) { - mRefreshRateOverlay->changeRefreshRate(desiredMode->getFps()); - } // Scheduler will submit an empty frame to HWC if needed. mSetActiveModePending = true; -- cgit v1.2.3-59-g8ed1b