summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ady Abraham <adyabr@google.com> 2021-06-30 14:55:42 -0700
committer Ady Abraham <adyabr@google.com> 2021-06-30 22:28:20 +0000
commit1047e5eff4f92231530d28e6be82b6c24da5d4f1 (patch)
tree51ef017855f110d45eceb96b6820cc39a4a90b5e
parente89521f7c24f04045b2bbf6cb73857e17381ff9e (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.cpp7
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;