On 06/03/2013 01:23 PM, Fabian Bieler wrote:
Uniform arrays are subject to beeing shrunk if higher members were not accessed.
^^^^^^ being
Update the max_array_access flag so array members that were only accessed in the function are not optimized away. This fixes Piglit test spec/glsl-1.10/execution/samplers/in-parameter-array.shader_test. Signed-off-by: Fabian Bieler <fabianbie...@fastmail.fm> --- src/glsl/ast_function.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp index 00e0c05..9378894 100644 --- a/src/glsl/ast_function.cpp +++ b/src/glsl/ast_function.cpp @@ -322,6 +322,18 @@ generate_call(exec_list *instructions, ir_function_signature *sig, assert (!"Illegal formal parameter mode"); break; } + } else if (formal->type->is_array()) { + /* Update the max_array_access field for array parameters. + * If the max_array_access of the formal parameter is zero, chances + * are we haven't parsed the function yet. Just set the array access + * to the whole array in that case. + */
What will be the size of 'u' in the following vertex shader with this change? Will it be 3 or 16 or something else? Does that change of the definition of foo is in a different compilation unit?
float foo(float [16]); uniform float u[32]; void main() { gl_Position = vec4(foo(u)); } float foo(float x[16]) { return x[2]; }
+ const unsigned max_array_access = (formal->max_array_access != 0) + ? formal->max_array_access : (formal->type->array_size() - 1); + ir_variable *var = actual->whole_variable_referenced(); + if (var) + var->max_array_access = + MAX2(var->max_array_access, max_array_access); } actual_iter.next();
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev