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.tomczy...@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@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev