SF: DispSync should sync to activeConfig period
HWC@2.4 has the getDisplayVSyncPeriod method added, which was
being queried around rate-change events, and the returned value
was sent to the DispSync system as the period to synchronize to.
Some devices will have irregular vsync intervals coming out of certain
power-saving states, and the HWC was reporting an irregular vsync
period, relative to the activeConfig's period. This could manifest as
transient de-synchronization in DispSync (currently used code), and
in the VSyncReactor system (switched off) a bad rate would be adopted.
Fixes: 147734678
Test: uibench with VSyncReactor system
Test: uibench with DispSync system
Change-Id: Ia98b3f09893004b4420487385e0d1653dcfd2d8d
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 1796476..ed222a6 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -875,7 +875,7 @@
repaintEverythingForHWC();
// Start receiving vsync samples now, so that we can detect a period
// switch.
- mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());
+ mScheduler->resyncToHardwareVsync(true, refreshRate.vsyncPeriod);
// As we called to set period, we will call to onRefreshRateChangeCompleted once
// DispSync model is locked.
mVSyncModulator->onRefreshRateChangeInitiated();
@@ -952,9 +952,9 @@
mDesiredActiveConfig.event = Scheduler::ConfigEvent::None;
mDesiredActiveConfigChanged = false;
- mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());
- auto refreshRate =
+ auto const refreshRate =
mRefreshRateConfigs->getRefreshRateFromConfigId(mDesiredActiveConfig.configId);
+ mScheduler->resyncToHardwareVsync(true, refreshRate.vsyncPeriod);
mPhaseConfiguration->setRefreshRateFps(refreshRate.fps);
mVSyncModulator->setPhaseOffsets(mPhaseConfiguration->getCurrentOffsets());
}