mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-04 06:12:04 +00:00
[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:
@@ -606,13 +606,16 @@ static int renderThread(void * unused)
|
|||||||
const bool forceRender = g_state.ds->waitFrame();
|
const bool forceRender = g_state.ds->waitFrame();
|
||||||
app_handleRenderEvent(microtime());
|
app_handleRenderEvent(microtime());
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user