summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2014-03-07 21:52:51 +0100
committerChristian König <christian.koenig@amd.com>2014-03-08 16:08:15 +0100
commit58d2afa2232060b88f9c444ce7a0d6e63c841bb2 (patch)
tree287f79427e18851d22992fe81973fa66c5b40469
parent1fa2acba6195230fc738d2854678bc28864ca5c0 (diff)
radeonsi: fix leaking the bound state on destruction v2
v2: rebased on stale pointer fixes Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r--src/gallium/drivers/radeonsi/si_pipe.c2
-rw-r--r--src/gallium/drivers/radeonsi/si_pm4.c7
-rw-r--r--src/gallium/drivers/radeonsi/si_pm4.h1
3 files changed, 10 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index ac9e49a9cb8..1a44492b63c 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -102,6 +102,8 @@ static void si_destroy_context(struct pipe_context *context)
util_blitter_destroy(sctx->blitter);
+ si_pm4_cleanup(sctx);
+
r600_common_context_cleanup(&sctx->b);
FREE(sctx);
}
diff --git a/src/gallium/drivers/radeonsi/si_pm4.c b/src/gallium/drivers/radeonsi/si_pm4.c
index 51bf67eccb7..0a5673ba917 100644
--- a/src/gallium/drivers/radeonsi/si_pm4.c
+++ b/src/gallium/drivers/radeonsi/si_pm4.c
@@ -251,3 +251,10 @@ void si_pm4_reset_emitted(struct si_context *sctx)
{
memset(&sctx->emitted, 0, sizeof(sctx->emitted));
}
+
+void si_pm4_cleanup(struct si_context *sctx)
+{
+ for (int i = 0; i < NUMBER_OF_STATES; ++i) {
+ si_pm4_free_state(sctx, sctx->queued.array[i], i);
+ }
+}
diff --git a/src/gallium/drivers/radeonsi/si_pm4.h b/src/gallium/drivers/radeonsi/si_pm4.h
index c9bc091173f..e1d0cac3b73 100644
--- a/src/gallium/drivers/radeonsi/si_pm4.h
+++ b/src/gallium/drivers/radeonsi/si_pm4.h
@@ -91,5 +91,6 @@ unsigned si_pm4_dirty_dw(struct si_context *sctx);
void si_pm4_emit(struct si_context *sctx, struct si_pm4_state *state);
void si_pm4_emit_dirty(struct si_context *sctx);
void si_pm4_reset_emitted(struct si_context *sctx);
+void si_pm4_cleanup(struct si_context *sctx);
#endif