radeonsi: properly destroy the GS copy shader and scratch_bo for compute
authorMarek Olšák <marek.olsak@amd.com>
Thu, 18 Sep 2014 21:48:04 +0000 (23:48 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 24 Sep 2014 12:48:02 +0000 (14:48 +0200)
Cc: 10.2 10.3 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_state.c

index 726188524300905d9fc2de218dd9aa33c22ec8cb..9d2cc803c2d0410a6473f83d4cd72f5c1ecd62e6 100644 (file)
@@ -2973,5 +2973,9 @@ out:
 
 void si_shader_destroy(struct pipe_context *ctx, struct si_shader *shader)
 {
+       if (shader->gs_copy_shader)
+               si_shader_destroy(ctx, shader->gs_copy_shader);
+
        r600_resource_reference(&shader->bo, NULL);
+       r600_resource_reference(&shader->scratch_bo, NULL);
 }
index 2aa9aad2e07aee516cc1e15a1d9a59204497d300..ed90f13a074b6b885d08daf00ef369d1ad2a83f9 100644 (file)
@@ -2403,9 +2403,10 @@ static void si_delete_shader_selector(struct pipe_context *ctx,
 
        while (p) {
                c = p->next_variant;
-               if (sel->type == PIPE_SHADER_GEOMETRY)
+               if (sel->type == PIPE_SHADER_GEOMETRY) {
                        si_pm4_delete_state(sctx, gs, p->pm4);
-               else if (sel->type == PIPE_SHADER_FRAGMENT)
+                       si_pm4_delete_state(sctx, vs, p->gs_copy_shader->pm4);
+               } else if (sel->type == PIPE_SHADER_FRAGMENT)
                        si_pm4_delete_state(sctx, ps, p->pm4);
                else if (p->key.vs.as_es)
                        si_pm4_delete_state(sctx, es, p->pm4);
@@ -2418,7 +2419,7 @@ static void si_delete_shader_selector(struct pipe_context *ctx,
 
        free(sel->tokens);
        free(sel);
- }
+}
 
 static void si_delete_vs_shader(struct pipe_context *ctx, void *state)
 {