From d1513edaa00b476f87c4dd397c3746f17f19196a Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Wed, 21 Jun 2017 13:53:23 +0200 Subject: mesa/glthread: switch to u_queue and redesign the batch management This mirrors exactly how u_threaded_context works. If you understand this, you also understand u_threaded_context. Reviewed-by: Timothy Arceri --- src/mesa/main/glthread.h | 88 +++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 58 deletions(-) (limited to 'src/mesa/main/glthread.h') diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h index 07bed380cbf..5b938fdeef9 100644 --- a/src/mesa/main/glthread.h +++ b/src/mesa/main/glthread.h @@ -29,55 +29,50 @@ /* Command size is a number of bytes stored in a short. */ #define MARSHAL_MAX_CMD_SIZE 65535 +/* The number of batch slots in memory. + * + * One batch is being executed, one batch is being filled, the rest are + * waiting batches. There must be at least 1 slot for a waiting batch, + * so the minimum number of batches is 3. + */ +#define MARSHAL_MAX_BATCHES 4 + #include #include #include +#include "util/u_queue.h" enum marshal_dispatch_cmd_id; -struct glthread_state +/** A single batch of commands queued up for execution. */ +struct glthread_batch { - /** The worker thread that asynchronously processes our GL commands. */ - pthread_t thread; + /** Batch fence for waiting for the execution to finish. */ + struct util_queue_fence fence; - /** - * Mutex used for synchronizing between the main thread and the worker - * thread. - */ - pthread_mutex_t mutex; + /** The worker thread will access the context with this. */ + struct gl_context *ctx; - /** Condvar used for waking the worker thread. */ - pthread_cond_t new_work; - - /** Condvar used for waking the main thread. */ - pthread_cond_t work_done; + /** Amount of data used by batch commands, in bytes. */ + size_t used; - /** Used to tell the worker thread to quit */ - bool shutdown; + /** Data contained in the command buffer. */ + uint8_t buffer[MARSHAL_MAX_CMD_SIZE]; +}; - /** Indicates that the worker thread is currently processing a batch */ - bool busy; +struct glthread_state +{ + /** Multithreaded queue. */ + struct util_queue queue; - /** - * Singly-linked list of command batches that are awaiting execution by - * a thread pool task. NULL if empty. - */ - struct glthread_batch *batch_queue; + /** The ring of batches in memory. */ + struct glthread_batch batches[MARSHAL_MAX_BATCHES]; - /** - * Tail pointer for appending batches to the end of batch_queue. If the - * queue is empty, this points to batch_queue. - */ - struct glthread_batch **batch_queue_tail; + /** Index of the last submitted batch. */ + unsigned last; - /** - * Batch containing commands that are being prepared for insertion into - * batch_queue. NULL if there are no such commands. - * - * Since this is only used by the main thread, it doesn't need the mutex to - * be accessed. - */ - struct glthread_batch *batch; + /** Index of the batch being filled and about to be submitted. */ + unsigned next; /** * Tracks on the main thread side whether the current vertex array binding @@ -92,29 +87,6 @@ struct glthread_state bool element_array_is_vbo; }; -/** - * A single batch of commands queued up for later execution by a thread pool - * task. - */ -struct glthread_batch -{ - /** - * Next batch of commands to execute after this batch, or NULL if this is - * the last set of commands queued. Protected by ctx->Marshal.Mutex. - */ - struct glthread_batch *next; - - /** - * Amount of data used by batch commands, in bytes. - */ - size_t used; - - /** - * Data contained in the command buffer. - */ - uint8_t buffer[MARSHAL_MAX_CMD_SIZE]; -}; - void _mesa_glthread_init(struct gl_context *ctx); void _mesa_glthread_destroy(struct gl_context *ctx); -- cgit v1.2.3