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

Thomas Helland thomashelland90 at gmail.com
Wed Mar 29 20:10:18 UTC 2017


2017-03-29 21:17 GMT+02:00 Thomas Helland <thomashelland90 at gmail.com>:
> 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.
>

My HTPC has a RX460, i3-6100 combination, so I was thinking
the low number of threads on the processor could be impacted
by the threaded dispatch. However, I've tested Talos Principle,
Dota 2, and Metro Last Light, and none of these show any
regressions as could be seen in Michael Larabels tests on
phoronix back in mid-March. My system is probably to
GPU-limited for any possible bottleneck to show.

I'll see if I can get my workstation up and running.
It has an RX480, and FX-8320 combination.
So weaker cores, and stronger graphics card.
Hopefully I will be able to reproduce things there.

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