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 <[email protected]> > > 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 */ > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
