2017-03-29 19:35 GMT+02:00 Bartosz Tomczyk <bartosz.tomczy...@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.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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev