[client] render: bind invalidation to queue batches

This commit is contained in:
Geoffrey McRae
2026-08-12 04:18:12 +10:00
parent 9c0caca3fa
commit 81be5a388a
3 changed files with 20 additions and 15 deletions

View File

@@ -985,7 +985,7 @@ static int renderThread(void * unused)
LG_LOCK(g_state.lgrLock); LG_LOCK(g_state.lgrLock);
renderQueue_process(); const bool queueFull = renderQueue_process();
if (g_state.videoGeometryDirty) if (g_state.videoGeometryDirty)
{ {
@@ -1009,7 +1009,7 @@ static int renderThread(void * unused)
const bool windowInvalid = const bool windowInvalid =
atomic_exchange(&g_state.invalidateWindow, false); atomic_exchange(&g_state.invalidateWindow, false);
const bool overlayFull = app_overlayNeedsFullRender(); const bool overlayFull = app_overlayNeedsFullRender();
const bool invalidate = windowInvalid || overlayFull; const bool invalidate = queueFull || windowInvalid || overlayFull;
const uint64_t prepareTime = nanotime() - prepareStart; const uint64_t prepareTime = nanotime() - prepareStart;
if (unlikely(invalidate)) if (unlikely(invalidate))

View File

@@ -439,22 +439,24 @@ static bool queueSwSurfaceUpdate(RenderQueueSource source,
return queueCommand(cmd, RENDER_QUEUE_INVALIDATE_PARTIAL); return queueCommand(cmd, RENDER_QUEUE_INVALIDATE_PARTIAL);
} }
static void wakeQueue(RenderQueueInvalidate invalidate, bool wake) static void wakeQueue(bool wake)
{ {
if (wake) if (wake)
app_invalidateWindow(invalidate == RENDER_QUEUE_INVALIDATE_FULL); app_invalidateWindow(false);
} }
static void enqueueCommand(RenderCommand * cmd, static void enqueueCommand(RenderCommand * cmd,
RenderQueueInvalidate invalidate) RenderQueueInvalidate invalidate)
{ {
wakeQueue(invalidate, queueCommand(cmd, invalidate)); wakeQueue(queueCommand(cmd, invalidate));
} }
static RenderCommand * detachCommands(void) static RenderCommand * detachCommands(RenderQueueInvalidate * invalidate)
{ {
LG_LOCK(l_renderQueueLock); LG_LOCK(l_renderQueueLock);
RenderCommand * head = l_renderQueueHead; RenderCommand * head = l_renderQueueHead;
if (invalidate)
*invalidate = l_renderQueueInvalidate;
l_renderQueueHead = NULL; l_renderQueueHead = NULL;
l_renderQueueTail = NULL; l_renderQueueTail = NULL;
l_renderQueueInvalidate = RENDER_QUEUE_INVALIDATE_NONE; l_renderQueueInvalidate = RENDER_QUEUE_INVALIDATE_NONE;
@@ -598,7 +600,7 @@ void renderQueue_free(void)
void renderQueue_clear(void) void renderQueue_clear(void)
{ {
RenderCommand * cmd = detachCommands(); RenderCommand * cmd = detachCommands(NULL);
while(cmd) while(cmd)
{ {
RenderCommand * next = cmd->next; RenderCommand * next = cmd->next;
@@ -795,7 +797,7 @@ static uint64_t enqueueTransition(RenderCommand * cmd,
if (publishedSerial) if (publishedSerial)
atomic_store_explicit(publishedSerial, serial, memory_order_release); atomic_store_explicit(publishedSerial, serial, memory_order_release);
LG_UNLOCK(l_transitionLock); LG_UNLOCK(l_transitionLock);
wakeQueue(RENDER_QUEUE_INVALIDATE_FULL, wake); wakeQueue(wake);
return serial; return serial;
} }
@@ -913,7 +915,7 @@ void renderQueue_sourceSwSurfaceDrawFill(RenderQueueSource source,
swSurfaceDamageAdd(surface, &damage); swSurfaceDamageAdd(surface, &damage);
const bool wake = queueSwSurfaceUpdate(source, surface); const bool wake = queueSwSurfaceUpdate(source, surface);
LG_UNLOCK(surface->lock); LG_UNLOCK(surface->lock);
wakeQueue(RENDER_QUEUE_INVALIDATE_PARTIAL, wake); wakeQueue(wake);
} }
void renderQueue_sourceSwSurfaceDrawBitmap(RenderQueueSource source, void renderQueue_sourceSwSurfaceDrawBitmap(RenderQueueSource source,
@@ -989,7 +991,7 @@ void renderQueue_sourceSwSurfaceDrawBitmap(RenderQueueSource source,
swSurfaceDamageAdd(surface, &damage); swSurfaceDamageAdd(surface, &damage);
const bool wake = queueSwSurfaceUpdate(source, surface); const bool wake = queueSwSurfaceUpdate(source, surface);
LG_UNLOCK(surface->lock); LG_UNLOCK(surface->lock);
wakeQueue(RENDER_QUEUE_INVALIDATE_PARTIAL, wake); wakeQueue(wake);
} }
void renderQueue_sourceSurfaceFormat(RenderQueueSource source, void renderQueue_sourceSurfaceFormat(RenderQueueSource source,
@@ -1303,9 +1305,10 @@ static void rejectSourceTransition(const RenderCommand * cmd)
cmd->source, cmd->transitionSerial); cmd->source, cmd->transitionSerial);
} }
void renderQueue_process(void) bool renderQueue_process(void)
{ {
RenderCommand * cmd = detachCommands(); RenderQueueInvalidate invalidate;
RenderCommand * cmd = detachCommands(&invalidate);
while(cmd) while(cmd)
{ {
RenderCommand * next = cmd->next; RenderCommand * next = cmd->next;
@@ -1324,7 +1327,7 @@ void renderQueue_process(void)
if (transition) if (transition)
LG_UNLOCK(l_transitionLock); LG_UNLOCK(l_transitionLock);
freeCommand(cmd); freeCommand(cmd);
wakeQueue(RENDER_QUEUE_INVALIDATE_PARTIAL, wake); wakeQueue(wake);
cmd = next; cmd = next;
continue; continue;
} }
@@ -1477,9 +1480,11 @@ void renderQueue_process(void)
if (transition) if (transition)
LG_UNLOCK(l_transitionLock); LG_UNLOCK(l_transitionLock);
freeCommand(cmd); freeCommand(cmd);
wakeQueue(RENDER_QUEUE_INVALIDATE_PARTIAL, wake); wakeQueue(wake);
cmd = next; cmd = next;
} }
return invalidate == RENDER_QUEUE_INVALIDATE_FULL;
} }
void renderQueue_presented(void) void renderQueue_presented(void)

View File

@@ -42,7 +42,7 @@ typedef void (*RenderQueueSourceRejectFn)(void * opaque,
void renderQueue_init(void); void renderQueue_init(void);
void renderQueue_free(void); void renderQueue_free(void);
void renderQueue_clear(void); void renderQueue_clear(void);
void renderQueue_process(void); bool renderQueue_process(void);
void renderQueue_presented(void); void renderQueue_presented(void);
void renderQueue_setSourceFns(RenderQueueSourcePrepareFn prepare, void renderQueue_setSourceFns(RenderQueueSourcePrepareFn prepare,