diff options
Diffstat (limited to 'src/mesa/main')
-rw-r--r-- | src/mesa/main/dd.h | 4 | ||||
-rw-r--r-- | src/mesa/main/glthread.c | 21 | ||||
-rw-r--r-- | src/mesa/main/glthread.h | 3 |
3 files changed, 25 insertions, 3 deletions
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 84ed57f2df0..8e382e1e9a4 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -50,6 +50,7 @@ struct gl_shader_program; struct gl_texture_image; struct gl_texture_object; struct gl_memory_info; +struct util_queue_monitoring; /* GL_ARB_vertex_buffer_object */ /* Modifies GL_MAP_UNSYNCHRONIZED_BIT to allow driver to fail (return @@ -1039,7 +1040,8 @@ struct dd_function_table { * * Mesa will only call this function if GL multithreading is enabled. */ - void (*SetBackgroundContext)(struct gl_context *ctx); + void (*SetBackgroundContext)(struct gl_context *ctx, + struct util_queue_monitoring *queue_info); /** * \name GL_ARB_sparse_buffer interface diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c index d467298b639..c71c03778aa 100644 --- a/src/mesa/main/glthread.c +++ b/src/mesa/main/glthread.c @@ -36,6 +36,7 @@ #include "main/glthread.h" #include "main/marshal.h" #include "main/marshal_generated.h" +#include "util/u_atomic.h" #include "util/u_thread.h" @@ -60,7 +61,7 @@ glthread_thread_initialization(void *job, int thread_index) { struct gl_context *ctx = (struct gl_context*)job; - ctx->Driver.SetBackgroundContext(ctx); + ctx->Driver.SetBackgroundContext(ctx, &ctx->GLThread->stats); _glapi_set_context(ctx); } @@ -90,6 +91,7 @@ _mesa_glthread_init(struct gl_context *ctx) util_queue_fence_init(&glthread->batches[i].fence); } + glthread->stats.queue = &glthread->queue; ctx->CurrentClientDispatch = ctx->MarshalExec; ctx->GLThread = glthread; @@ -159,6 +161,8 @@ _mesa_glthread_flush_batch(struct gl_context *ctx) return; } + p_atomic_add(&glthread->stats.num_offloaded_items, next->used); + util_queue_add_job(&glthread->queue, next, &next->fence, glthread_unmarshal_batch, NULL); glthread->last = glthread->next; @@ -188,16 +192,29 @@ _mesa_glthread_finish(struct gl_context *ctx) struct glthread_batch *last = &glthread->batches[glthread->last]; struct glthread_batch *next = &glthread->batches[glthread->next]; + bool synced = false; - if (!util_queue_fence_is_signalled(&last->fence)) + if (!util_queue_fence_is_signalled(&last->fence)) { util_queue_fence_wait(&last->fence); + synced = true; + } if (next->used) { + p_atomic_add(&glthread->stats.num_direct_items, next->used); + /* Since glthread_unmarshal_batch changes the dispatch to direct, * restore it after it's done. */ struct _glapi_table *dispatch = _glapi_get_dispatch(); glthread_unmarshal_batch(next, 0); _glapi_set_dispatch(dispatch); + + /* It's not a sync because we don't enqueue partial batches, but + * it would be a sync if we did. So count it anyway. + */ + synced = true; } + + if (synced) + p_atomic_inc(&glthread->stats.num_syncs); } diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h index 5b938fdeef9..36692fe5704 100644 --- a/src/mesa/main/glthread.h +++ b/src/mesa/main/glthread.h @@ -65,6 +65,9 @@ struct glthread_state /** Multithreaded queue. */ struct util_queue queue; + /** This is sent to the driver for framebuffer overlay / HUD. */ + struct util_queue_monitoring stats; + /** The ring of batches in memory. */ struct glthread_batch batches[MARSHAL_MAX_BATCHES]; |