[Mesa-dev] [PATCH] st/mesa: use PROGRAM_ARRAY for storing structs containing arrays

Marek Olšák maraeo at gmail.com
Thu Aug 27 02:36:33 PDT 2015


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Aug 26, 2015 at 10:55 PM, Brian Paul <brianp at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list