SurfaceFlinger: set the refresh rate on overlay when calling to hwc
Change the refresh rate value on the overlay right after we set
the new refresh rate to hwc, instead of when we intend to change the
refresh rate. The latter may cause the display to freeze due to
a race condition where we intend to switch the refresh rate
and then abort (due to a infrequent layer update for example).
Bug: 183902142
Test: Swipe app to see app drawer and wait for the refresh rate to change
Change-Id: Id78efb96571b978d8adaabcff9aa30c32fe67786
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 881ee5b..202af28 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1034,10 +1034,6 @@
updatePhaseConfiguration(refreshRate.getFps());
mScheduler->setModeChangePending(true);
}
-
- if (mRefreshRateOverlay) {
- mRefreshRateOverlay->changeRefreshRate(refreshRate.getFps());
- }
}
status_t SurfaceFlinger::setActiveMode(const sp<IBinder>& displayToken, int modeId) {
@@ -1195,6 +1191,10 @@
}
mScheduler->onNewVsyncPeriodChangeTimeline(outTimeline);
+ if (mRefreshRateOverlay) {
+ mRefreshRateOverlay->changeRefreshRate(desiredMode->getFps());
+ }
+
// Scheduler will submit an empty frame to HWC if needed.
mSetActiveModePending = true;
}