glsl2: Steal the live IR and free the rest of the junk.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 25 Jun 2010 21:10:01 +0000 (14:10 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 30 Jun 2010 20:52:24 +0000 (13:52 -0700)
src/glsl/main.cpp
src/mesa/shader/ir_to_mesa.cpp

index 1ed22e1f33bed28d901e70ac5b5e05ec55b4a345..8b2eeaa13ab8e9068e98cf7e4ee4b230c10d86e5 100644 (file)
@@ -99,6 +99,12 @@ const struct option compiler_opts[] = {
    { NULL, 0, NULL, 0 }
 };
 
+static void
+steal_memory(ir_instruction *ir, void *new_ctx)
+{
+   talloc_steal(new_ctx, ir);
+}
+
 void
 compile_shader(struct gl_shader *shader)
 {
@@ -187,6 +193,11 @@ compile_shader(struct gl_shader *shader)
 
    shader->InfoLog = state->info_log;
 
+   /* Retain any live IR, but trash the rest. */
+   foreach_list(node, shader->ir) {
+      visit_tree((ir_instruction *) node, steal_memory, shader);
+   }
+
    talloc_free(state);
 
    return;
index 75021a70fdb8b925bfffe04b4ac717d51516b9e7..c3de3aae05b9c4ae8196774fd299766e3a9fc45c 100644 (file)
@@ -1650,6 +1650,12 @@ get_mesa_program(GLcontext *ctx, void *mem_ctx, struct gl_shader *shader)
 
 extern "C" {
 
+static void
+steal_memory(ir_instruction *ir, void *new_ctx)
+{
+   talloc_steal(new_ctx, ir);
+}
+
 void
 _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
 {
@@ -1712,6 +1718,11 @@ _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
    shader->CompileStatus = !state->error;
    shader->InfoLog = state->info_log;
 
+   /* Retain any live IR, but trash the rest. */
+   foreach_list(node, shader->ir) {
+      visit_tree((ir_instruction *) node, steal_memory, shader);
+   }
+
    talloc_free(state);
  }