st/mesa: use PROGRAM_ARRAY for storing structs containing arrays

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

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Brian Paul 2015-08-26 13:58:23 -06:00
parent 42c7be5877
commit bcae4640c8
1 changed files with 29 additions and 3 deletions

View File

@ -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*)