From 5facfb12bea41da2546468b7a1680a606a01e0a6 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Wed, 22 Apr 2020 15:18:31 -0700 Subject: SurfaceFlinger: expected present time directly from VSyncReactor When SurfaceFlinger calculates what is the vsync time, it does that by asking VSyncReactor what is next anticipated vsync from the wake up time. To handle negative offsets (when SF wakes up more than a vsync period before a vsync event) SF adds a vsync period to that anticipated vsync. This creates a race condition where the offset used at the time of invalidate may be different than the offset used by VSyncReactor calculated at the time of the requestNextVsync(). To fix that, we plumb the first calculated vsync time to SurfaceFlinger. Bug: 154303002 Test: Run app transitions and collect systrace Change-Id: I3f2670c7b0ecb52a85fb07df6d360694b51d5d66 --- services/surfaceflinger/RegionSamplingThread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'services/surfaceflinger/RegionSamplingThread.cpp') diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index 68cd84f661..9d293b7887 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -130,7 +130,7 @@ private: mVsyncListening = false; } - void onDispSyncEvent(nsecs_t /* when */) final { + void onDispSyncEvent(nsecs_t /*when*/, nsecs_t /*expectedVSyncTimestamp*/) final { std::unique_lock lock(mMutex); if (mPhaseIntervalSetting == Phase::ZERO) { -- cgit v1.2.3-59-g8ed1b