[Mesa-dev] [PATCH] [RFC v2] mesa/glthread: Call unmarshal_batch directly in glthread_finish when batch queue is empty.
Matt Turner
mattst88 at gmail.com
Wed Mar 29 17:08:36 UTC 2017
On Wed, Mar 29, 2017 at 9:11 AM, Bartosz Tomczyk
<bartosz.tomczyk86 at gmail.com> wrote:
> This avoids costly thread synchronisation. With this fix games that previously regressed with mesa_glthread=true like xonotic or grid autosport.
> Could someone test if games that benefit from glthread didn't regress?
> ---
> src/mesa/main/glthread.c | 49 +++++++++++++++++++++++++++++++++---------------
> 1 file changed, 34 insertions(+), 15 deletions(-)
>
> diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c
> index 06115b916d..eef7202f01 100644
> --- a/src/mesa/main/glthread.c
> +++ b/src/mesa/main/glthread.c
> @@ -194,18 +194,11 @@ _mesa_glthread_restore_dispatch(struct gl_context *ctx)
> }
> }
>
> -void
> -_mesa_glthread_flush_batch(struct gl_context *ctx)
> +static void
> +_mesa_glthread_flush_batch_no_lock(struct gl_context *ctx)
> {
> struct glthread_state *glthread = ctx->GLThread;
> - struct glthread_batch *batch;
> -
> - if (!glthread)
> - return;
> -
> - batch = glthread->batch;
> - if (!batch->used)
> - return;
> + struct glthread_batch *batch = glthread->batch;
>
> /* Immediately reallocate a new batch, since the next marshalled call would
> * just do it.
> @@ -223,10 +216,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_no_lock(ctx);
> pthread_mutex_unlock(&glthread->mutex);
> }
>
> @@ -252,12 +261,22 @@ _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)
> + {
> + glthread_unmarshal_batch(ctx, glthread->batch);
> + }
Please follow the existing style of putting the braces on the same
line as the if and else.
More information about the mesa-dev
mailing list