<div dir="ltr">I  would be very grateful if someone could help with testing performance impact of this change.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 29, 2017 at 7:31 PM, Bartosz Tomczyk <span dir="ltr"><<a href="mailto:bartosz.tomczyk86@gmail.com" target="_blank">bartosz.tomczyk86@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Call it directly when batch queue is empty. This avoids costly thread<br>
synchronisation. With this fix games that previously regressed<br>
with mesa_glthread=true like xonotic or grid autosport.<br>
---<br>
 src/mesa/main/glthread.c | 47 ++++++++++++++++++++++++++++++<wbr>++++-------------<br>
 1 file changed, 34 insertions(+), 13 deletions(-)<br>
<br>
diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c<br>
index 06115b916d..faf42c2b89 100644<br>
--- a/src/mesa/main/glthread.c<br>
+++ b/src/mesa/main/glthread.c<br>
@@ -194,16 +194,12 @@ _mesa_glthread_restore_<wbr>dispatch(struct gl_context *ctx)<br>
    }<br>
 }<br>
<br>
-void<br>
-_mesa_glthread_flush_batch(<wbr>struct gl_context *ctx)<br>
+static void<br>
+_mesa_glthread_flush_batch_<wbr>locked(struct gl_context *ctx)<br>
 {<br>
    struct glthread_state *glthread = ctx->GLThread;<br>
-   struct glthread_batch *batch;<br>
-<br>
-   if (!glthread)<br>
-      return;<br>
-<br>
-   batch = glthread->batch;<br>
+   struct glthread_batch *batch = glthread->batch;<br>
+<br>
    if (!batch->used)<br>
       return;<br>
<br>
@@ -223,10 +219,26 @@ _mesa_glthread_flush_batch(<wbr>struct gl_context *ctx)<br>
       return;<br>
    }<br>
<br>
-   pthread_mutex_lock(&glthread-><wbr>mutex);<br>
    *glthread->batch_queue_tail = batch;<br>
    glthread->batch_queue_tail = &batch->next;<br>
    pthread_cond_broadcast(&<wbr>glthread->new_work);<br>
+<br>
+}<br>
+void<br>
+_mesa_glthread_flush_batch(<wbr>struct gl_context *ctx)<br>
+{<br>
+   struct glthread_state *glthread = ctx->GLThread;<br>
+   struct glthread_batch *batch;<br>
+<br>
+   if (!glthread)<br>
+      return;<br>
+<br>
+   batch = glthread->batch;<br>
+   if (!batch->used)<br>
+      return;<br>
+<br>
+   pthread_mutex_lock(&glthread-><wbr>mutex);<br>
+   _mesa_glthread_flush_batch_<wbr>locked(ctx);<br>
    pthread_mutex_unlock(&<wbr>glthread->mutex);<br>
 }<br>
<br>
@@ -252,12 +264,21 @@ _mesa_glthread_finish(struct gl_context *ctx)<br>
    if (pthread_self() == glthread->thread)<br>
       return;<br>
<br>
-   _mesa_glthread_flush_batch(<wbr>ctx);<br>
-<br>
    pthread_mutex_lock(&glthread-><wbr>mutex);<br>
<br>
-   while (glthread->batch_queue || glthread->busy)<br>
-      pthread_cond_wait(&glthread-><wbr>work_done, &glthread->mutex);<br>
+   if (!(glthread->batch_queue || glthread->busy)) {<br>
+      if (glthread->batch && glthread->batch->used) {<br>
+         struct _glapi_table *dispatch = _glapi_get_dispatch();<br>
+         glthread_unmarshal_batch(ctx, glthread->batch);<br>
+         _glapi_set_dispatch(dispatch);<br>
+         glthread_allocate_batch(ctx);<br>
+      }<br>
+   }<br>
+   else {<br>
+      _mesa_glthread_flush_batch_<wbr>locked(ctx);<br>
+      while (glthread->batch_queue || glthread->busy)<br>
+         pthread_cond_wait(&glthread-><wbr>work_done, &glthread->mutex);<br>
+   }<br>
<br>
    pthread_mutex_unlock(&<wbr>glthread->mutex);<br>
 }<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.12.2<br>
<br>
</font></span></blockquote></div><br></div>