[client] limit overlay swaps to minimum render rate

Treat every completed swap as satisfying the interactive overlay
refresh requirement. Only force a JIT overlay render after the 60 Hz
deadline, and rearm the timer-based deadline after frame-driven swaps.

This prevents interactive overlays from adding redundant swaps when
incoming frames already keep the client at or above the required rate.
This commit is contained in:
Geoffrey McRae
2026-08-03 23:50:31 +10:00
parent adf3101a1a
commit 9025653a24

View File

@@ -608,11 +608,14 @@ static int renderThread(void * unused)
const uint64_t pending =
atomic_load_explicit(&g_state.pendingCount, memory_order_acquire);
const bool overlayRender = app_overlayNeedsRender() &&
(!g_state.lastRenderTimeValid ||
nanotime() - g_state.lastRenderTime >= g_state.overlayFrameTime);
if (!lgResetEvent(g_state.frameEvent)
&& !forceRender
&& !pending
&& !app_overlayNeedsRender())
&& !overlayRender)
{
if (g_state.ds->skipFrame)
g_state.ds->skipFrame();
@@ -625,18 +628,7 @@ static int renderThread(void * unused)
else if (g_params.fpsMin != 0)
{
app_handleRenderEvent(microtime());
float ups = atomic_load_explicit(&g_state.ups, memory_order_relaxed);
if (unlikely(
!lgWaitEventAbs(g_state.frameEvent, &time) ||
ups > g_params.fpsMin))
{
/* only update the time if we woke up early */
clock_gettime(CLOCK_MONOTONIC, &time);
tsAdd(&time, app_isOverlayMode() ?
g_state.overlayFrameTime : g_state.frameTime);
}
lgWaitEventAbs(g_state.frameEvent, &time);
}
frameTimingPublishReady();
@@ -708,6 +700,14 @@ static int renderThread(void * unused)
g_state.lastRenderTime = t;
atomic_fetch_add_explicit(&g_state.renderCount, 1, memory_order_relaxed);
if (!g_state.jitRender && g_params.fpsMin != 0)
{
/* A frame-driven swap also satisfies the minimum render rate. */
clock_gettime(CLOCK_MONOTONIC, &time);
tsAdd(&time, app_isOverlayMode() ?
g_state.overlayFrameTime : g_state.frameTime);
}
if (likely(g_state.lastRenderTimeValid))
{
const float fdelta = (float)delta / 1e6f;