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

Edmondo Tommasina edmondo.tommasina at gmail.com
Wed Mar 29 20:03:54 UTC 2017


This patch helps against the massive performance drop of glthread with
Two Worlds.

The performance boost in Civ5 is not hurt by this patch. It looks good.

Some trivial comments in the patch:

On Wed, Mar 29, 2017 at 7:35 PM, Bartosz Tomczyk
<bartosz.tomczyk86 at gmail.com> wrote:
> I  would be very grateful if someone could help with testing performance
> impact of this change.
>
> 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;
>> +

Trailing whitespace.

>>     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);
>> +
>> +}

Move the the bracket one line up.

Thanks
edmondo

>> +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