Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Wed, Aug 26, 2015 at 10:55 PM, Brian Paul <bri...@vmware.com> wrote: > Previously, we used PROGRAM_ARRAY only for variables which were > arrays or matrices. But if the variable is a structure containing > an array or matrix, we need to use PROGRAM_ARRAY for that too. > > Before, we failed an assertion: > state_tracker/st_glsl_to_tgsi.cpp:4900: > Assertion `src_reg->file != PROGRAM_TEMPORARY' failed. > when running the piglit test > glsl-1.20/execution/fs-const-array-of-struct-of-array.shader_test > --- > src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 32 > +++++++++++++++++++++++++++--- > 1 file changed, 29 insertions(+), 3 deletions(-) > > diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > index cba9881..6956441 100644 > --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > @@ -1123,6 +1123,34 @@ type_size(const struct glsl_type *type) > return 0; > } > > + > +/** > + * If the given GLSL type is an array or matrix or a structure containing > + * an array/matrix member, return true. Else return false. > + * > + * This is used to determine which kind of temp storage (PROGRAM_TEMPORARY > + * or PROGRAM_ARRAY) should be used for variables of this type. Anytime > + * we have an array that might be indexed with a variable, we need to use > + * the later storage type. > + */ > +static bool > +type_has_array_or_matrix(const glsl_type *type) > +{ > + if (type->is_array() || type->is_matrix()) > + return true; > + > + if (type->is_record()) { > + for (unsigned i = 0; i < type->length; i++) { > + if (type_has_array_or_matrix(type->fields.structure[i].type)) { > + return true; > + } > + } > + } > + > + return false; > +} > + > + > /** > * In the initial pass of codegen, we assign temporary numbers to > * intermediate results. (not SSA -- variable assignments will reuse > @@ -1137,9 +1165,7 @@ glsl_to_tgsi_visitor::get_temp(const glsl_type *type) > src.reladdr = NULL; > src.negate = 0; > > - if (!options->EmitNoIndirectTemp && > - (type->is_array() || type->is_matrix())) { > - > + if (!options->EmitNoIndirectTemp && type_has_array_or_matrix(type)) { > if (next_array >= max_num_arrays) { > max_num_arrays += 32; > array_sizes = (unsigned*) > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev