glthread: reduce dereferences of the next batch

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4758>
This commit is contained in:
Marek Olšák
2020-03-27 06:06:31 -04:00
committed by Marge Bot
parent fc4b78f4cc
commit b6b1ab8d54
3 changed files with 9 additions and 4 deletions

View File

@@ -102,6 +102,7 @@ _mesa_glthread_init(struct gl_context *ctx)
glthread->batches[i].ctx = ctx; glthread->batches[i].ctx = ctx;
util_queue_fence_init(&glthread->batches[i].fence); util_queue_fence_init(&glthread->batches[i].fence);
} }
glthread->next_batch = &glthread->batches[glthread->next];
glthread->enabled = true; glthread->enabled = true;
glthread->stats.queue = &glthread->queue; glthread->stats.queue = &glthread->queue;
@@ -176,7 +177,7 @@ _mesa_glthread_flush_batch(struct gl_context *ctx)
if (!glthread->enabled) if (!glthread->enabled)
return; return;
struct glthread_batch *next = &glthread->batches[glthread->next]; struct glthread_batch *next = glthread->next_batch;
if (!next->used) if (!next->used)
return; return;
@@ -197,6 +198,7 @@ _mesa_glthread_flush_batch(struct gl_context *ctx)
glthread_unmarshal_batch, NULL, 0); glthread_unmarshal_batch, NULL, 0);
glthread->last = glthread->next; glthread->last = glthread->next;
glthread->next = (glthread->next + 1) % MARSHAL_MAX_BATCHES; glthread->next = (glthread->next + 1) % MARSHAL_MAX_BATCHES;
glthread->next_batch = &glthread->batches[glthread->next];
} }
/** /**
@@ -221,7 +223,7 @@ _mesa_glthread_finish(struct gl_context *ctx)
return; return;
struct glthread_batch *last = &glthread->batches[glthread->last]; struct glthread_batch *last = &glthread->batches[glthread->last];
struct glthread_batch *next = &glthread->batches[glthread->next]; struct glthread_batch *next = glthread->next_batch;
bool synced = false; bool synced = false;
if (!util_queue_fence_is_signalled(&last->fence)) { if (!util_queue_fence_is_signalled(&last->fence)) {

View File

@@ -94,6 +94,9 @@ struct glthread_state
/** The ring of batches in memory. */ /** The ring of batches in memory. */
struct glthread_batch batches[MARSHAL_MAX_BATCHES]; struct glthread_batch batches[MARSHAL_MAX_BATCHES];
/** Pointer to the batch currently being filled. */
struct glthread_batch *next_batch;
/** Index of the last submitted batch. */ /** Index of the last submitted batch. */
unsigned last; unsigned last;

View File

@@ -57,12 +57,12 @@ _mesa_glthread_allocate_command(struct gl_context *ctx,
int size) int size)
{ {
struct glthread_state *glthread = &ctx->GLThread; struct glthread_state *glthread = &ctx->GLThread;
struct glthread_batch *next = &glthread->batches[glthread->next]; struct glthread_batch *next = glthread->next_batch;
struct marshal_cmd_base *cmd_base; struct marshal_cmd_base *cmd_base;
if (unlikely(next->used + size > MARSHAL_MAX_CMD_SIZE)) { if (unlikely(next->used + size > MARSHAL_MAX_CMD_SIZE)) {
_mesa_glthread_flush_batch(ctx); _mesa_glthread_flush_batch(ctx);
next = &glthread->batches[glthread->next]; next = glthread->next_batch;
} }
const int aligned_size = align(size, 8); const int aligned_size = align(size, 8);