Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccf4b47e authored by Ady Abraham's avatar Ady Abraham
Browse files

SurfaceFlinger: previousFrameFence needs to check the current time

previousFrameFence returns the fence associated with the previous vsync.
In case that SF wake up was delayed due to a previous frame, up to the
point that the wake up occurs after the vsync, SF needs to check fence
N-1 and not N-2 since frame N-1 was targeting the vsync prior to SF
wake up.

Bug: 187886038
Test: run bouncy ball and simulate the first frame missed
Change-Id: I176c6641dd42132fcfd75a79898a5d2bd8da9c90
parent b45e7709
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -1709,10 +1709,10 @@ void SurfaceFlinger::setVsyncEnabled(bool enabled) {
}

SurfaceFlinger::FenceWithFenceTime SurfaceFlinger::previousFrameFence() {
    // We are storing the last 2 present fences. If sf's phase offset is to be
    // woken up before the actual vsync but targeting the next vsync, we need to check
    // fence N-2
    return mVsyncModulator->getVsyncConfig().sfOffset > 0 ? mPreviousPresentFences[0]
    const auto now = systemTime();
    const auto vsyncPeriod = mScheduler->getDisplayStatInfo(now).vsyncPeriod;
    const bool expectedPresentTimeIsTheNextVsync = mExpectedPresentTime - now <= vsyncPeriod;
    return expectedPresentTimeIsTheNextVsync ? mPreviousPresentFences[0]
                                             : mPreviousPresentFences[1];
}