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.tomczy...@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.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; >> + 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@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