[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 = const uint64_t pending =
atomic_load_explicit(&g_state.pendingCount, memory_order_acquire); 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) if (!lgResetEvent(g_state.frameEvent)
&& !forceRender && !forceRender
&& !pending && !pending
&& !app_overlayNeedsRender()) && !overlayRender)
{ {
if (g_state.ds->skipFrame) if (g_state.ds->skipFrame)
g_state.ds->skipFrame(); g_state.ds->skipFrame();
@@ -625,18 +628,7 @@ static int renderThread(void * unused)
else if (g_params.fpsMin != 0) else if (g_params.fpsMin != 0)
{ {
app_handleRenderEvent(microtime()); app_handleRenderEvent(microtime());
lgWaitEventAbs(g_state.frameEvent, &time);
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);
}
} }
frameTimingPublishReady(); frameTimingPublishReady();
@@ -708,6 +700,14 @@ static int renderThread(void * unused)
g_state.lastRenderTime = t; g_state.lastRenderTime = t;
atomic_fetch_add_explicit(&g_state.renderCount, 1, memory_order_relaxed); 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)) if (likely(g_state.lastRenderTimeValid))
{ {
const float fdelta = (float)delta / 1e6f; const float fdelta = (float)delta / 1e6f;