r600g: fix memory leaks running gears.
authorDave Airlie <airlied@redhat.com>
Fri, 13 Aug 2010 00:16:29 +0000 (10:16 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 13 Aug 2010 00:22:46 +0000 (10:22 +1000)
I noticed gears memory usage was heading skywards, some r600 "states"
aren't properly refcounted, and the ctx->state is never freed.

src/gallium/drivers/r600/r600_state.c
src/gallium/winsys/r600/drm/radeon_ctx.c

index b9b46d64e3f2f10156092c7ff9452e5eda4e4b77..3efd409ae0d8a02f348e74d24b7d09bfdac80c36 100644 (file)
@@ -379,6 +379,8 @@ static void r600_set_scissor_state(struct pipe_context *ctx,
 
        rstate = r600_context_state(rctx, pipe_scissor_type, state);
        r600_bind_state(ctx, rstate);
+       /* refcount is taken care of this */
+       r600_delete_state(ctx, rstate);
 }
 
 static void r600_set_stencil_ref(struct pipe_context *ctx,
@@ -389,6 +391,8 @@ static void r600_set_stencil_ref(struct pipe_context *ctx,
 
        rstate = r600_context_state(rctx, pipe_stencil_ref_type, state);
        r600_bind_state(ctx, rstate);
+       /* refcount is taken care of this */
+       r600_delete_state(ctx, rstate);
 }
 
 static void r600_set_vertex_buffers(struct pipe_context *ctx,
@@ -433,6 +437,7 @@ static void r600_set_viewport_state(struct pipe_context *ctx,
 
        rstate = r600_context_state(rctx, pipe_viewport_type, state);
        r600_bind_state(ctx, rstate);
+       r600_delete_state(ctx, rstate);
 }
 
 void r600_init_state_functions(struct r600_context *rctx)
index ff70ce6de7a8d1efd19222498e3df62fc333ec91..45b706bb0f966d3df37975158218c523afadab88 100644 (file)
@@ -112,6 +112,7 @@ struct radeon_ctx *radeon_ctx_decref(struct radeon_ctx *ctx)
                ctx->bo[i] = radeon_bo_decref(ctx->radeon, ctx->bo[i]);
        }
        ctx->radeon = radeon_decref(ctx->radeon);
+       free(ctx->state);
        free(ctx->draw);
        free(ctx->bo);
        free(ctx->pm4);