[Mesa-dev] [PATCH 02/11] tgsi/scan: get more information about arrays and handle arrays correctly

Roland Scheidegger sroland at vmware.com
Wed May 27 05:30:32 PDT 2015


Yes, that looks better to me. It may be a bit inconsistent to only do
that for inputs/outputs and not for temp but at least this way there's
no additional limit on the number of arrays.

Roland

Am 26.05.2015 um 13:04 schrieb Marek Olšák:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> v2: use less memory for the information
> ---
>  src/gallium/auxiliary/tgsi/tgsi_scan.c | 24 +++++++++++++++++++++---
>  src/gallium/auxiliary/tgsi/tgsi_scan.h |  4 ++++
>  2 files changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> index d821072..369f56a 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> @@ -167,13 +167,31 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
>                 = &parse.FullToken.FullDeclaration;
>              const uint file = fulldecl->Declaration.File;
>              uint reg;
> -            if (fulldecl->Declaration.Array)
> -               info->array_max[file] = MAX2(info->array_max[file], fulldecl->Array.ArrayID);
> +
> +            if (fulldecl->Declaration.Array) {
> +               unsigned array_id = fulldecl->Array.ArrayID;
> +
> +               switch (file) {
> +               case TGSI_FILE_INPUT:
> +                  assert(array_id < ARRAY_SIZE(info->input_array_first));
> +                  info->input_array_first[array_id] = fulldecl->Range.First;
> +                  info->input_array_last[array_id] = fulldecl->Range.Last;
> +                  break;
> +               case TGSI_FILE_OUTPUT:
> +                  assert(array_id < ARRAY_SIZE(info->output_array_first));
> +                  info->output_array_first[array_id] = fulldecl->Range.First;
> +                  info->output_array_last[array_id] = fulldecl->Range.Last;
> +                  break;
> +               }
> +               info->array_max[file] = MAX2(info->array_max[file], array_id);
> +            }
> +
>              for (reg = fulldecl->Range.First;
>                   reg <= fulldecl->Range.Last;
>                   reg++) {
>                 unsigned semName = fulldecl->Semantic.Name;
> -               unsigned semIndex = fulldecl->Semantic.Index;
> +               unsigned semIndex =
> +                  fulldecl->Semantic.Index + (reg - fulldecl->Range.First);
>  
>                 /* only first 32 regs will appear in this bitfield */
>                 info->file_mask[file] |= (1 << reg);
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h
> index 0ea0e88..af4b128 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h
> @@ -65,6 +65,10 @@ struct tgsi_shader_info
>     int file_max[TGSI_FILE_COUNT];  /**< highest index of declared registers */
>     int const_file_max[PIPE_MAX_CONSTANT_BUFFERS];
>  
> +   ubyte input_array_first[PIPE_MAX_SHADER_INPUTS];
> +   ubyte input_array_last[PIPE_MAX_SHADER_INPUTS];
> +   ubyte output_array_first[PIPE_MAX_SHADER_OUTPUTS];
> +   ubyte output_array_last[PIPE_MAX_SHADER_OUTPUTS];
>     unsigned array_max[TGSI_FILE_COUNT];  /**< highest index array per register file */
>  
>     uint immediate_count; /**< number of immediates declared */
> 



More information about the mesa-dev mailing list