diff options
| author | 2021-06-30 14:55:42 -0700 | |
|---|---|---|
| committer | 2021-06-30 22:28:20 +0000 | |
| commit | 1047e5eff4f92231530d28e6be82b6c24da5d4f1 (patch) | |
| tree | 51ef017855f110d45eceb96b6820cc39a4a90b5e | |
| parent | e89521f7c24f04045b2bbf6cb73857e17381ff9e (diff) | |
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
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 7 |
1 files 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; |