summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2012-04-16 09:45:07 -0700
committerEric Anholt <[email protected]>2012-04-19 16:33:14 -0700
commit6de5da079682efd3f8887d3e0a7add7e70a5433d (patch)
treeb9d24a7a0144c4d39fd8ee72f8dc00d1867d0527
parent538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7 (diff)
glsl: Don't allow array splitting on function arguments.
This is the reason the declaration member existed in the reference visitor, but I didn't copy the code from structure splitting that avoided setting it. This wasn't currently a problem, because we don't allow splitting of in/out variables. But that would be nice to change some day. Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/glsl/opt_array_splitting.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/glsl/opt_array_splitting.cpp b/src/glsl/opt_array_splitting.cpp
index 73b35b5289f..67733ca6ba6 100644
--- a/src/glsl/opt_array_splitting.cpp
+++ b/src/glsl/opt_array_splitting.cpp
@@ -65,7 +65,11 @@ public:
/** Whether this array should be split or not. */
bool split;
- bool declaration; /* If the variable had a decl in the instruction stream */
+ /* If the variable had a decl we can work with in the instruction
+ * stream. We can't do splitting on function arguments, which
+ * don't get this variable set.
+ */
+ bool declaration;
ir_variable **components;
@@ -99,6 +103,7 @@ public:
virtual ir_visitor_status visit(ir_variable *);
virtual ir_visitor_status visit(ir_dereference_variable *);
virtual ir_visitor_status visit_enter(ir_dereference_array *);
+ virtual ir_visitor_status visit_enter(ir_function_signature *);
variable_entry *get_variable_entry(ir_variable *var);
@@ -183,6 +188,17 @@ ir_array_reference_visitor::visit_enter(ir_dereference_array *ir)
return visit_continue_with_parent;
}
+ir_visitor_status
+ir_array_reference_visitor::visit_enter(ir_function_signature *ir)
+{
+ /* We don't have logic for array-splitting function arguments,
+ * so just look at the body instructions and not the parameter
+ * declarations.
+ */
+ visit_list_elements(this, &ir->body);
+ return visit_continue_with_parent;
+}
+
bool
ir_array_reference_visitor::get_split_list(exec_list *instructions,
bool linked)