summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-12-06 10:54:05 -0800
committerKenneth Graunke <kenneth@whitecape.org>2010-12-06 13:43:22 -0800
commit6fae1e4c4d33769e2f255d50907b5aa0ab80edd4 (patch)
treeccacbb0644e5b987bf0ac986b26e61941e43faaf
parentd72cb9c94d0194861df3ca53e7181cfa08fd782a (diff)
glsl: Factor out code which emits a new function into the IR stream.
A future commit will use the newly created function in a second place.
-rw-r--r--src/glsl/ast.h4
-rw-r--r--src/glsl/ast_to_hir.cpp40
2 files changed, 26 insertions, 18 deletions
diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index e5aa5c1b3b5..a77b522705c 100644
--- a/src/glsl/ast.h
+++ b/src/glsl/ast.h
@@ -714,4 +714,8 @@ _mesa_ast_field_selection_to_hir(const ast_expression *expr,
exec_list *instructions,
struct _mesa_glsl_parse_state *state);
+void
+emit_function(_mesa_glsl_parse_state *state, exec_list *instructions,
+ ir_function *f);
+
#endif /* AST_H */
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index f5b1120f785..d24a7bb752f 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2477,6 +2477,27 @@ ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters,
}
+void
+emit_function(_mesa_glsl_parse_state *state, exec_list *instructions,
+ ir_function *f)
+{
+ /* Emit the new function header */
+ if (state->current_function == NULL) {
+ instructions->push_tail(f);
+ } else {
+ /* IR invariants disallow function declarations or definitions nested
+ * within other function definitions. Insert the new ir_function
+ * block in the instruction sequence before the ir_function block
+ * containing the current ir_function_signature.
+ */
+ ir_function *const curr =
+ const_cast<ir_function *>(state->current_function->function());
+
+ curr->insert_before(f);
+ }
+}
+
+
ir_rvalue *
ast_function::hir(exec_list *instructions,
struct _mesa_glsl_parse_state *state)
@@ -2588,24 +2609,7 @@ ast_function::hir(exec_list *instructions,
return NULL;
}
- /* Emit the new function header */
- if (state->current_function == NULL)
- instructions->push_tail(f);
- else {
- /* IR invariants disallow function declarations or definitions nested
- * within other function definitions. Insert the new ir_function
- * block in the instruction sequence before the ir_function block
- * containing the current ir_function_signature.
- *
- * This can only happen in a GLSL 1.10 shader. In all other GLSL
- * versions this nesting is disallowed. There is a check for this at
- * the top of this function.
- */
- ir_function *const curr =
- const_cast<ir_function *>(state->current_function->function());
-
- curr->insert_before(f);
- }
+ emit_function(state, instructions, f);
}
/* Verify the return type of main() */