diff options
author | Eric Anholt <[email protected]> | 2012-04-16 09:45:07 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2012-04-19 16:33:14 -0700 |
commit | 6de5da079682efd3f8887d3e0a7add7e70a5433d (patch) | |
tree | b9d24a7a0144c4d39fd8ee72f8dc00d1867d0527 /src | |
parent | 538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7 (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]>
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/opt_array_splitting.cpp | 18 |
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) |