r600g: fix memory/bo leak
authorJerome Glisse <jglisse@redhat.com>
Thu, 2 Sep 2010 15:32:32 +0000 (11:32 -0400)
committerJerome Glisse <jglisse@redhat.com>
Thu, 2 Sep 2010 15:47:30 +0000 (11:47 -0400)
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
src/gallium/drivers/r600/r600_context.c
src/gallium/drivers/r600/r600_context.h
src/gallium/drivers/r600/r600_draw.c
src/gallium/winsys/r600/drm/radeon_ctx.c

index 0e5e0632bf115ed7e2067408bca6eda5fd40d805..7a0e5b4049f135de1b120d914cfe3b22ea596fb1 100644 (file)
@@ -39,6 +39,21 @@ static void r600_destroy_context(struct pipe_context *context)
 {
        struct r600_context *rctx = r600_context(context);
 
+       rctx->rasterizer = r600_context_state_decref(rctx->rasterizer);
+       rctx->poly_stipple = r600_context_state_decref(rctx->poly_stipple);
+       rctx->scissor = r600_context_state_decref(rctx->scissor);
+       rctx->clip = r600_context_state_decref(rctx->clip);
+       rctx->ps_shader = r600_context_state_decref(rctx->ps_shader);
+       rctx->vs_shader = r600_context_state_decref(rctx->vs_shader);
+       rctx->depth = r600_context_state_decref(rctx->depth);
+       rctx->stencil = r600_context_state_decref(rctx->stencil);
+       rctx->alpha = r600_context_state_decref(rctx->alpha);
+       rctx->dsa = r600_context_state_decref(rctx->dsa);
+       rctx->blend = r600_context_state_decref(rctx->blend);
+       rctx->stencil_ref = r600_context_state_decref(rctx->stencil_ref);
+       rctx->viewport = r600_context_state_decref(rctx->viewport);
+       rctx->framebuffer = r600_context_state_decref(rctx->framebuffer);
+       radeon_ctx_fini(&rctx->ctx);
        FREE(rctx);
 }
 
index d4e3baa69d23684f79b00933f50d5bda36129118..cea0813054597bb633bb25e5fdc2150945681792 100644 (file)
@@ -131,6 +131,7 @@ struct r600_context {
        struct radeon_state             config;
        /* FIXME get rid of those vs_resource,vs/ps_constant */
        struct radeon_state             vs_resource[160];
+       unsigned                        vs_nresource;
        struct radeon_state             vs_constant[256];
        struct radeon_state             ps_constant[256];
        /* hw states */
index 9cc26bbadad578be5c3c81166f5d907ea4062ad6..fabd337d239c757ba6d6b248df319ca3d4d7713d 100644 (file)
@@ -94,6 +94,9 @@ static int r600_draw_common(struct r600_draw *draw)
        radeon_draw_bind(&rctx->draw, &rctx->vs_shader->rstate[0]);
        radeon_draw_bind(&rctx->draw, &rctx->ps_shader->rstate[0]);
 
+       for (i = 0 ; i < rctx->vs_nresource; i++) {
+               radeon_state_fini(&rctx->vs_resource[i]);
+       }
        for (i = 0 ; i < rctx->vertex_elements->count; i++) {
                vs_resource = &rctx->vs_resource[i];
                j = rctx->vertex_elements->elements[i].vertex_buffer_index;
@@ -120,6 +123,7 @@ static int r600_draw_common(struct r600_draw *draw)
                }
                radeon_draw_bind(&rctx->draw, vs_resource);
        }
+       rctx->vs_nresource = rctx->vertex_elements->count;
        /* FIXME start need to change winsys */
        radeon_state_init(&draw->draw, rscreen->rw, R600_STATE_DRAW, 0, 0);
        draw->draw.states[R600_DRAW__VGT_NUM_INDICES] = draw->count;
index 50c5e4741e1f423b7a8151f80d14dcf560a1f5de..47fca76136825902c0b774b0f0854a7a260acc17 100644 (file)
@@ -121,8 +121,7 @@ void radeon_ctx_fini(struct radeon_ctx *ctx)
        free(ctx->bo);
        free(ctx->pm4);
        free(ctx->reloc);
-       memset(ctx, 0, sizeof(*ctx));
-       free(ctx);
+       memset(ctx, 0, sizeof(struct radeon_ctx));
 }
 
 static int radeon_ctx_state_bo(struct radeon_ctx *ctx, struct radeon_state *state)