On 2013-06-18 11:14, Ian Romanick wrote: > 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? It would be 16 and it doesn't change if the function is in a different compilation unit. If we wanted it to be 3 we would have to update the array access tracker later. I thought about doing it during function inlining since currently all functions are always inlined for all drivers, but that's of course somewhat of a hack. > > float foo(float [16]); > > uniform float u[32]; I'm assuming you meant u[16], otherwise this doesn't compile. > > 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