[Mesa-dev] [PATCH 3/3] radeonsi: Fix memory leaks if returning early from some state functions.

Michel Dänzer michel at daenzer.net
Wed Aug 15 09:37:08 PDT 2012


From: Michel Dänzer <michel.daenzer at amd.com>

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/gallium/drivers/radeonsi/r600_hw_context.c |    3 ++-
 src/gallium/drivers/radeonsi/si_state.c        |   23 ++++++++++++-----------
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/r600_hw_context.c b/src/gallium/drivers/radeonsi/r600_hw_context.c
index 5480cb5..f8b1b38 100644
--- a/src/gallium/drivers/radeonsi/r600_hw_context.c
+++ b/src/gallium/drivers/radeonsi/r600_hw_context.c
@@ -155,11 +155,12 @@ void r600_need_cs_space(struct r600_context *ctx, unsigned num_dw,
 
 static void r600_flush_framebuffer(struct r600_context *ctx)
 {
-	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
+	struct si_pm4_state *pm4;
 
 	if (!(ctx->flags & R600_CONTEXT_DST_CACHES_DIRTY))
 		return;
 
+	pm4 = CALLOC_STRUCT(si_pm4_state);
 	si_cmd_surface_sync(pm4, S_0085F0_CB0_DEST_BASE_ENA(1) |
 				S_0085F0_CB1_DEST_BASE_ENA(1) |
 				S_0085F0_CB2_DEST_BASE_ENA(1) |
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index db3ea25..2b6a0aa 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -39,11 +39,15 @@
  */
 static void si_update_fb_blend_state(struct r600_context *rctx)
 {
-	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
+	struct si_pm4_state *pm4;
 	struct si_state_blend *blend = rctx->queued.named.blend;
 	uint32_t mask;
 
-	if (pm4 == NULL || blend == NULL)
+	if (blend == NULL)
+		return;
+
+	pm4 = CALLOC_STRUCT(si_pm4_state);
+	if (pm4 == NULL)
 		return;
 
 	mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1;
@@ -300,14 +304,12 @@ static void si_set_viewport_state(struct pipe_context *ctx,
 static void si_update_fb_rs_state(struct r600_context *rctx)
 {
 	struct si_state_rasterizer *rs = rctx->queued.named.rasterizer;
-	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
+	struct si_pm4_state *pm4;
 	unsigned offset_db_fmt_cntl = 0, depth;
 	float offset_units;
 
-	if (!rs || !rctx->framebuffer.zsbuf) {
-		FREE(pm4);
+	if (!rs || !rctx->framebuffer.zsbuf)
 		return;
-	}
 
 	offset_units = rctx->queued.named.rasterizer->offset_units;
 	switch (rctx->framebuffer.zsbuf->texture->format) {
@@ -330,6 +332,7 @@ static void si_update_fb_rs_state(struct r600_context *rctx)
 		return;
 	}
 
+	pm4 = CALLOC_STRUCT(si_pm4_state);
 	/* FIXME some of those reg can be computed with cso */
 	offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth);
 	si_pm4_set_reg(pm4, R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE,
@@ -2070,18 +2073,17 @@ static void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint i
 {
 	struct r600_context *rctx = (struct r600_context *)ctx;
 	struct si_resource *rbuffer = cb ? si_resource(cb->buffer) : NULL;
-	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
+	struct si_pm4_state *pm4;
 	uint64_t va_offset;
 	uint32_t offset;
 
 	/* Note that the state tracker can unbind constant buffers by
 	 * passing NULL here.
 	 */
-	if (cb == NULL) {
-		FREE(pm4);
+	if (cb == NULL)
 		return;
-	}
 
+	pm4 = CALLOC_STRUCT(si_pm4_state);
 	si_pm4_inval_shader_cache(pm4);
 
 	if (cb->user_buffer)
@@ -2108,7 +2110,6 @@ static void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint i
 
 	default:
 		R600_ERR("unsupported %d\n", shader);
-		return;
 	}
 
 	if (cb->buffer != &rbuffer->b.b)
-- 
1.7.10.4



More information about the mesa-dev mailing list