[Mesa-dev] [PATCH] [RFC v3] mesa/glthread: Call unmarshal_batch directly in glthread_finish

Thomas Helland thomashelland90 at gmail.com
Wed Mar 29 19:17:15 UTC 2017


2017-03-29 19:35 GMT+02:00 Bartosz Tomczyk <bartosz.tomczyk86 at gmail.com>:
> I  would be very grateful if someone could help with testing performance
> impact of this change.
>

Currently prepping some tests on my HTPC, which is a bit CPU-bound.
I'll report back in about an hour or so.

> On Wed, Mar 29, 2017 at 7:31 PM, Bartosz Tomczyk
> <bartosz.tomczyk86 at gmail.com> wrote:
>>
>> Call it directly when batch queue is empty. This avoids costly thread
>> synchronisation. With this fix games that previously regressed
>> with mesa_glthread=true like xonotic or grid autosport.
>> ---
>>  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..faf42c2b89 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);
>>  }
>> --
>> 2.12.2
>>
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list