Reinstate: llvmpipe: allow vertex processing and fragment processing in parallel
This reinstates patch: ec8104c6b2
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 <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15684>
This commit is contained in:
parent
80a7ed273a
commit
6bbbe15a78
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue