From 6bbbe15a783a3b004d994057a96b91d5cf5d08da Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 31 Mar 2020 16:02:08 +1000 Subject: [PATCH] Reinstate: llvmpipe: allow vertex processing and fragment processing in parallel This reinstates patch: ec8104c6b227421b3a21e9c0652e3050066bb169 llvmpipe: allow vertex processing and fragment processing in parallel For now unknown reasons bisecting an error had lead to this patch, but the actual bug was in virglrendrerer and the accoring feature was now only enabled with https://gitlab.freedesktop.org/mesa/mesa/-/issues/6130 Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6130 Original patch was Reviewed-by: Roland Scheidegger Part-of: --- src/gallium/drivers/llvmpipe/lp_rast.c | 2 -- src/gallium/drivers/llvmpipe/lp_scene.c | 2 +- src/gallium/drivers/llvmpipe/lp_setup.c | 18 ++++-------------- .../drivers/llvmpipe/lp_setup_context.h | 1 - 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index f67fbda6b01..e27d78a3432 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -81,8 +81,6 @@ lp_rast_begin( struct lp_rasterizer *rast, static void lp_rast_end( struct lp_rasterizer *rast ) { - lp_scene_end_rasterization( rast->curr_scene ); - rast->curr_scene = NULL; } diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c index 3d109ff52b6..dbe0cc3873c 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.c +++ b/src/gallium/drivers/llvmpipe/lp_scene.c @@ -100,7 +100,7 @@ lp_scene_create( struct lp_setup_context *setup ) void lp_scene_destroy(struct lp_scene *scene) { - lp_fence_reference(&scene->fence, NULL); + lp_scene_end_rasterization(scene); mtx_destroy(&scene->mutex); assert(scene->data.head == &scene->data.first); slab_free_st(&scene->setup->scene_slab, scene); diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 38d5232dd9b..83fb4ad1fd0 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -73,6 +73,7 @@ lp_setup_wait_empty_scene(struct lp_setup_context *setup) debug_printf("%s: wait for scene %d\n", __FUNCTION__, setup->scenes[0]->fence->id); lp_fence_wait(setup->scenes[0]->fence); + lp_scene_end_rasterization(setup->scenes[0]); } return 0; } @@ -86,8 +87,10 @@ lp_setup_get_empty_scene(struct lp_setup_context *setup) /* try and find a scene that isn't being used */ for (i = 0; i < setup->num_active_scenes; i++) { if (setup->scenes[i]->fence) { - if (lp_fence_signalled(setup->scene->fence)) + if (lp_fence_signalled(setup->scenes[i]->fence)) { + lp_scene_end_rasterization(setup->scenes[i]); break; + } } else break; } @@ -210,22 +213,9 @@ lp_setup_rasterize_scene( struct lp_setup_context *setup ) setup->last_fence->issued = TRUE; mtx_lock(&screen->rast_mutex); - - /* FIXME: We enqueue the scene then wait on the rasterizer to finish. - * This means we never actually run any vertex stuff in parallel to - * rasterization (not in the same context at least) which is what the - * multiple scenes per setup is about - when we get a new empty scene - * any old one is already empty again because we waited here for - * raster tasks to be finished. Ideally, we shouldn't need to wait here - * and rely on fences elsewhere when waiting is necessary. - * Certainly, lp_scene_end_rasterization() would need to be deferred too - * and there's probably other bits why this doesn't actually work. - */ lp_rast_queue_scene(screen->rast, scene); - lp_rast_finish(screen->rast); mtx_unlock(&screen->rast_mutex); - lp_scene_end_rasterization(setup->scene); lp_setup_reset( setup ); LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h index 92dfeb890d5..420b78e2f52 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_context.h +++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h @@ -56,7 +56,6 @@ struct lp_setup_variant; /** Max number of scenes */ -/* XXX: make multiple scenes per context work, see lp_setup_rasterize_scene */ #define INITIAL_SCENES 4 #define MAX_SCENES 64