summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-07-20 11:27:38 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-07-20 17:48:24 -0700
commit60e2d06d1ccc66ad00cd7ab81c418853f21be291 (patch)
treef464e04e73a934858b92153b35ae5c1a79f7c426 /src
parent2462a536ea5c98867296905e3da127eba7c7bdff (diff)
glsl2: Implement utility routine to talloc reparent an IR tree
Diffstat (limited to 'src')
-rw-r--r--src/glsl/ir.cpp15
-rw-r--r--src/glsl/ir.h3
-rw-r--r--src/glsl/main.cpp10
-rw-r--r--src/mesa/shader/ir_to_mesa.cpp10
4 files changed, 20 insertions, 18 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 146ff17af3..a2732962f0 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -875,3 +875,18 @@ visit_exec_list(exec_list *list, ir_visitor *visitor)
}
}
+
+static void
+steal_memory(ir_instruction *ir, void *new_ctx)
+{
+ talloc_steal(new_ctx, ir);
+}
+
+
+void
+reparent_ir(exec_list *list, void *mem_ctx)
+{
+ foreach_list(node, list) {
+ visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
+ }
+}
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 9fd9850391..e4b0e9f082 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -1315,4 +1315,7 @@ extern void
_mesa_glsl_initialize_functions(exec_list *instructions,
struct _mesa_glsl_parse_state *state);
+extern void
+reparent_ir(exec_list *list, void *mem_ctx);
+
#endif /* IR_H */
diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp
index 6b1a01c704..cf9a515785 100644
--- a/src/glsl/main.cpp
+++ b/src/glsl/main.cpp
@@ -118,12 +118,6 @@ 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)
{
@@ -232,9 +226,7 @@ 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);
- }
+ reparent_ir(shader->ir, shader);
talloc_free(state);
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index 1a9b0e3948..d1c09febd6 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -2146,12 +2146,6 @@ get_mesa_program(GLcontext *ctx, struct gl_shader_program *shader_program,
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)
{
@@ -2215,9 +2209,7 @@ _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
shader->Version = state->language_version;
/* Retain any live IR, but trash the rest. */
- foreach_list(node, shader->ir) {
- visit_tree((ir_instruction *) node, steal_memory, shader);
- }
+ reparent_ir(shader->ir, shader);
talloc_free(state);
}