r600g: Also clear bc data when we're destroying a shader.
authorTilman Sauerbeck <tilman@code-monkey.de>
Sat, 23 Oct 2010 11:33:22 +0000 (13:33 +0200)
committerDave Airlie <airlied@redhat.com>
Sun, 24 Oct 2010 02:56:35 +0000 (12:56 +1000)
[airlied: remove unused vars]

Signed-off-by: Tilman Sauerbeck <tilman@code-monkey.de>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_asm.c
src/gallium/drivers/r600/r600_asm.h
src/gallium/drivers/r600/r600_shader.c

index d13da0ef6381f9960dce766c903e17625dc8533b..a71d95ff1d08d04b7dc9a5a96c12c833664435b3 100644 (file)
@@ -871,3 +871,39 @@ int r600_bc_build(struct r600_bc *bc)
        }
        return 0;
 }
+
+void r600_bc_clear(struct r600_bc *bc)
+{
+       struct r600_bc_cf *cf, *next_cf;
+
+       free(bc->bytecode);
+       bc->bytecode = NULL;
+
+       LIST_FOR_EACH_ENTRY_SAFE(cf, next_cf, &bc->cf, list) {
+               struct r600_bc_alu *alu, *next_alu;
+               struct r600_bc_tex *tex, *next_tex;
+               struct r600_bc_tex *vtx, *next_vtx;
+
+               LIST_FOR_EACH_ENTRY_SAFE(alu, next_alu, &cf->alu, list) {
+                       free(alu);
+               }
+
+               LIST_INITHEAD(&cf->alu);
+
+               LIST_FOR_EACH_ENTRY_SAFE(tex, next_tex, &cf->tex, list) {
+                       free(tex);
+               }
+
+               LIST_INITHEAD(&cf->tex);
+
+               LIST_FOR_EACH_ENTRY_SAFE(vtx, next_vtx, &cf->vtx, list) {
+                       free(vtx);
+               }
+
+               LIST_INITHEAD(&cf->vtx);
+
+               free(cf);
+       }
+
+       LIST_INITHEAD(&cf->list);
+}
index bebc7c15b00c5cf43bd825b641a10c49656af4dd..97d08ee4b54e59e87080eda38bf6faef182cec42 100644 (file)
@@ -185,6 +185,7 @@ int eg_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf);
 
 /* r600_asm.c */
 int r600_bc_init(struct r600_bc *bc, enum radeon_family family);
+void r600_bc_clear(struct r600_bc *bc);
 int r600_bc_add_alu(struct r600_bc *bc, const struct r600_bc_alu *alu);
 int r600_bc_add_literal(struct r600_bc *bc, const u32 *value);
 int r600_bc_add_vtx(struct r600_bc *bc, const struct r600_bc_vtx *vtx);
index a4e052c23a321083e20a9a69627f30db8f8fbc8b..4106587398b68b9f8ee2bbc46a7182e477ca4bb0 100644 (file)
@@ -342,10 +342,11 @@ void
 r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
 {
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
-       struct r600_bc_cf *cf, *next_cf;
 
        r600_bo_reference(rctx->radeon, &shader->bo, NULL);
 
+       r600_bc_clear(&shader->shader.bc);
+
        /* FIXME: is there more stuff to free? */
 }