[Mesa-dev] [PATCH] mesa/glthread: Call unmarshal_batch directly in glthread_finish
Timothy Arceri
tarceri at itsqueeze.com
Mon Apr 3 00:35:24 UTC 2017
Trailing whitespace and style issue with else fixed and pushed. Thanks!
On 31/03/17 17:22, Nicolai Hähnle wrote:
> On 30.03.2017 22:31, Bartosz Tomczyk wrote:
>> Call it directly when batch queue is empty. This avoids costly thread
>> synchronisation. This commit improves performance of games that have
>> previously regressed with mesa_glthread=true.
>
> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
>> ---
>> src/mesa/main/glthread.c | 47
>> ++++++++++++++++++++++++++++++++++-------------
>> 1 file changed, 34 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c
>> index 06115b916d..4fcd322163 100644
>> --- a/src/mesa/main/glthread.c
>> +++ b/src/mesa/main/glthread.c
>> @@ -194,16 +194,12 @@ _mesa_glthread_restore_dispatch(struct
>> gl_context *ctx)
>> }
>> }
>>
>> -void
>> -_mesa_glthread_flush_batch(struct gl_context *ctx)
>> +static void
>> +_mesa_glthread_flush_batch_locked(struct gl_context *ctx)
>> {
>> struct glthread_state *glthread = ctx->GLThread;
>> - struct glthread_batch *batch;
>> -
>> - if (!glthread)
>> - return;
>> -
>> - batch = glthread->batch;
>> + struct glthread_batch *batch = glthread->batch;
>> +
>> if (!batch->used)
>> return;
>>
>> @@ -223,10 +219,26 @@ _mesa_glthread_flush_batch(struct gl_context *ctx)
>> return;
>> }
>>
>> - pthread_mutex_lock(&glthread->mutex);
>> *glthread->batch_queue_tail = batch;
>> glthread->batch_queue_tail = &batch->next;
>> pthread_cond_broadcast(&glthread->new_work);
>> +}
>> +
>> +void
>> +_mesa_glthread_flush_batch(struct gl_context *ctx)
>> +{
>> + struct glthread_state *glthread = ctx->GLThread;
>> + struct glthread_batch *batch;
>> +
>> + if (!glthread)
>> + return;
>> +
>> + batch = glthread->batch;
>> + if (!batch->used)
>> + return;
>> +
>> + pthread_mutex_lock(&glthread->mutex);
>> + _mesa_glthread_flush_batch_locked(ctx);
>> pthread_mutex_unlock(&glthread->mutex);
>> }
>>
>> @@ -252,12 +264,21 @@ _mesa_glthread_finish(struct gl_context *ctx)
>> if (pthread_self() == glthread->thread)
>> return;
>>
>> - _mesa_glthread_flush_batch(ctx);
>> -
>> pthread_mutex_lock(&glthread->mutex);
>>
>> - while (glthread->batch_queue || glthread->busy)
>> - pthread_cond_wait(&glthread->work_done, &glthread->mutex);
>> + if (!(glthread->batch_queue || glthread->busy)) {
>> + if (glthread->batch && glthread->batch->used) {
>> + struct _glapi_table *dispatch = _glapi_get_dispatch();
>> + glthread_unmarshal_batch(ctx, glthread->batch);
>> + _glapi_set_dispatch(dispatch);
>> + glthread_allocate_batch(ctx);
>> + }
>> + }
>> + else {
>> + _mesa_glthread_flush_batch_locked(ctx);
>> + while (glthread->batch_queue || glthread->busy)
>> + pthread_cond_wait(&glthread->work_done, &glthread->mutex);
>> + }
>>
>> pthread_mutex_unlock(&glthread->mutex);
>> }
>>
>
>
More information about the mesa-dev
mailing list