tgsi/scan: get more information about arrays and handle arrays correctly (v2)
v2: use less memory for the information
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user