2017-03-29 21:17 GMT+02:00 Thomas Helland <thomashellan...@gmail.com>: > 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. >
My HTPC has a RX460, i3-6100 combination, so I was thinking the low number of threads on the processor could be impacted by the threaded dispatch. However, I've tested Talos Principle, Dota 2, and Metro Last Light, and none of these show any regressions as could be seen in Michael Larabels tests on phoronix back in mid-March. My system is probably to GPU-limited for any possible bottleneck to show. I'll see if I can get my workstation up and running. It has an RX480, and FX-8320 combination. So weaker cores, and stronger graphics card. Hopefully I will be able to reproduce things there. >> 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