tgsi/scan: add support to figure out max nesting depth
Sometimes a useful thing for compilers (or, for example, tgsi_to_nir) to know. And pretty trivial for scan to figure this out for us. Signed-off-by: Rob Clark <robclark@freedesktop.org> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
d6fbcf6ee2
commit
86358e949e
|
@ -56,6 +56,7 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
|
|||
{
|
||||
uint procType, i;
|
||||
struct tgsi_parse_context parse;
|
||||
unsigned current_depth = 0;
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
for (i = 0; i < TGSI_FILE_COUNT; i++)
|
||||
|
@ -100,6 +101,21 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
|
|||
assert(fullinst->Instruction.Opcode < TGSI_OPCODE_LAST);
|
||||
info->opcode_count[fullinst->Instruction.Opcode]++;
|
||||
|
||||
switch (fullinst->Instruction.Opcode) {
|
||||
case TGSI_OPCODE_IF:
|
||||
case TGSI_OPCODE_UIF:
|
||||
case TGSI_OPCODE_BGNLOOP:
|
||||
current_depth++;
|
||||
info->max_depth = MAX2(info->max_depth, current_depth);
|
||||
break;
|
||||
case TGSI_OPCODE_ENDIF:
|
||||
case TGSI_OPCODE_ENDLOOP:
|
||||
current_depth--;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (fullinst->Instruction.Opcode >= TGSI_OPCODE_F2D &&
|
||||
fullinst->Instruction.Opcode <= TGSI_OPCODE_DSSG)
|
||||
info->uses_doubles = true;
|
||||
|
|
|
@ -113,6 +113,11 @@ struct tgsi_shader_info
|
|||
unsigned indirect_files_written;
|
||||
|
||||
unsigned properties[TGSI_PROPERTY_COUNT]; /* index with TGSI_PROPERTY_ */
|
||||
|
||||
/**
|
||||
* Max nesting limit of loops/if's
|
||||
*/
|
||||
unsigned max_depth;
|
||||
};
|
||||
|
||||
extern void
|
||||
|
|
Loading…
Reference in New Issue