[Mesa-dev] [PATCH 15/15] radeonsi: properly destroy the GS copy shader and scratch_bo for compute

Marek Olšák maraeo at gmail.com
Fri Sep 19 13:17:18 PDT 2014


From: Marek Olšák <marek.olsak at amd.com>

Cc: 10.2 10.3 <mesa-stable at lists.freedesktop.org>
---
 src/gallium/drivers/radeonsi/si_shader.c | 4 ++++
 src/gallium/drivers/radeonsi/si_state.c  | 7 ++++---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 7aa65c9..94db1dc 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -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);
 }
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 2aa9aad..ed90f13 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -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)
 {
-- 
1.9.1



More information about the mesa-dev mailing list