From 40fba97cea9eb44342990a03ed71bb2c543ebb87 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sun, 13 Feb 2022 09:36:28 +0000 Subject: [PATCH] vblankmanager: Fix targeting framerates less than current with FPS limiter --- src/vblankmanager.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vblankmanager.cpp b/src/vblankmanager.cpp index 6828bed..9637713 100644 --- a/src/vblankmanager.cpp +++ b/src/vblankmanager.cpp @@ -294,9 +294,14 @@ void fpslimitThreadRun( void ) sleepyTime -= int64_t(rollingMaxDrawTime); sleepyTime -= int64_t(g_uVblankDrawBufferRedZoneNS); - vblank = g_lastVblank; - while ( vblank < t1 ) - vblank += vblankInterval; + uint64_t currentVBlank = g_lastVblank.load(); + uint64_t lastTargetVBlank = vblank ? vblank : currentVBlank; + + vblank = currentVBlank; + // We could have finished our frame on the previous vblank if we were targeting 30 fps + // so account for that here by making sure we are always ahead of our last target vblank. + while ( vblank <= std::max( lastTargetVBlank, t1 ) ) + vblank += targetInterval; targetPoint = int64_t(vblank) + sleepyTime; } else