swr: make sure that all rendering is finished on shader destroy
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 12 Nov 2016 19:20:53 +0000 (14:20 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Wed, 16 Nov 2016 01:25:48 +0000 (20:25 -0500)
Rendering could still be ongoing (or have yet to start) when the shader
is deleted. There's no refcounting on the shader text, so insert a
pipeline stall unconditionally when this happens.

[Note, we should instead introduce a way to attach work to
fences, so that the freeing can be done in the current fence.]

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/swr_state.cpp

index 783afba2b424d3a5454515d9a8ee9bf2f929de17..c1beeebeda1e2d9349fa38931766746866bafcd4 100644 (file)
@@ -371,6 +371,10 @@ swr_delete_vs_state(struct pipe_context *pipe, void *vs)
 {
    struct swr_vertex_shader *swr_vs = (swr_vertex_shader *)vs;
    FREE((void *)swr_vs->pipe.tokens);
+   struct swr_screen *screen = swr_screen(pipe->screen);
+   if (!swr_is_fence_pending(screen->flush_fence))
+      swr_fence_submit(swr_context(pipe), screen->flush_fence);
+   swr_fence_finish(pipe->screen, NULL, screen->flush_fence, 0);
    delete swr_vs;
 }
 
@@ -407,6 +411,10 @@ swr_delete_fs_state(struct pipe_context *pipe, void *fs)
 {
    struct swr_fragment_shader *swr_fs = (swr_fragment_shader *)fs;
    FREE((void *)swr_fs->pipe.tokens);
+   struct swr_screen *screen = swr_screen(pipe->screen);
+   if (!swr_is_fence_pending(screen->flush_fence))
+      swr_fence_submit(swr_context(pipe), screen->flush_fence);
+   swr_fence_finish(pipe->screen, NULL, screen->flush_fence, 0);
    delete swr_fs;
 }