瀏覽代碼

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>
tags/11.1-branchpoint
Rob Clark 10 年之前
父節點
當前提交
86358e949e
共有 2 個文件被更改,包括 21 次插入0 次删除
  1. 16
    0
      src/gallium/auxiliary/tgsi/tgsi_scan.c
  2. 5
    0
      src/gallium/auxiliary/tgsi/tgsi_scan.h

+ 16
- 0
src/gallium/auxiliary/tgsi/tgsi_scan.c 查看文件

@@ -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;

+ 5
- 0
src/gallium/auxiliary/tgsi/tgsi_scan.h 查看文件

@@ -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…
取消
儲存