From 6de5da079682efd3f8887d3e0a7add7e70a5433d Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 16 Apr 2012 09:45:07 -0700 Subject: [PATCH] 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 --- src/glsl/opt_array_splitting.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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)