tgsi_to_nir: Split to smaller functions.

Previously, tgsi_to_nir was a single big function, and this patch
intends to make the code easier to understand by splitting it up
to multiple smaller pieces.

Signed-Off-By: Timur Kristóf <timur.kristof@gmail.com>
Tested-by: Andre Heider <a.heider@gmail.com>
Tested-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Acked-By: Tested-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
Timur Kristóf 2019-02-08 09:59:58 +01:00 committed by Eric Anholt
parent 950aebbc53
commit 4dba72c4b3

View File

@ -1779,15 +1779,50 @@ ttn_add_output_stores(struct ttn_compile *c)
}
}
struct nir_shader *
tgsi_to_nir(const void *tgsi_tokens,
const nir_shader_compiler_options *options)
/**
* Parses the given TGSI tokens.
*/
static void
ttn_parse_tgsi(struct ttn_compile *c, const void *tgsi_tokens)
{
struct tgsi_parse_context parser;
struct tgsi_shader_info scan;
int ret;
ret = tgsi_parse_init(&parser, tgsi_tokens);
assert(ret == TGSI_PARSE_OK);
while (!tgsi_parse_end_of_tokens(&parser)) {
tgsi_parse_token(&parser);
c->token = &parser.FullToken;
switch (parser.FullToken.Token.Type) {
case TGSI_TOKEN_TYPE_DECLARATION:
ttn_emit_declaration(c);
break;
case TGSI_TOKEN_TYPE_INSTRUCTION:
ttn_emit_instruction(c);
break;
case TGSI_TOKEN_TYPE_IMMEDIATE:
ttn_emit_immediate(c);
break;
}
}
tgsi_parse_free(&parser);
}
/**
* Initializes a TGSI-to-NIR compiler.
*/
static struct ttn_compile *
ttn_compile_init(const void *tgsi_tokens,
const nir_shader_compiler_options *options)
{
struct ttn_compile *c;
struct nir_shader *s;
int ret;
struct tgsi_shader_info scan;
c = rzalloc(NULL, struct ttn_compile);
@ -1797,6 +1832,7 @@ tgsi_to_nir(const void *tgsi_tokens,
nir_builder_init_simple_shader(&c->build, NULL,
tgsi_processor_to_shader_stage(scan.processor),
options);
s = c->build.shader;
if (s->info.stage == MESA_SHADER_FRAGMENT)
@ -1827,32 +1863,26 @@ tgsi_to_nir(const void *tgsi_tokens,
c->loop_stack = rzalloc_array(c, nir_cursor,
scan.opcode_count[TGSI_OPCODE_BGNLOOP]);
ret = tgsi_parse_init(&parser, tgsi_tokens);
assert(ret == TGSI_PARSE_OK);
while (!tgsi_parse_end_of_tokens(&parser)) {
tgsi_parse_token(&parser);
c->token = &parser.FullToken;
switch (parser.FullToken.Token.Type) {
case TGSI_TOKEN_TYPE_DECLARATION:
ttn_emit_declaration(c);
break;
case TGSI_TOKEN_TYPE_INSTRUCTION:
ttn_emit_instruction(c);
break;
case TGSI_TOKEN_TYPE_IMMEDIATE:
ttn_emit_immediate(c);
break;
}
}
tgsi_parse_free(&parser);
ttn_parse_tgsi(c, tgsi_tokens);
ttn_add_output_stores(c);
nir_validate_shader(c->build.shader, "TTN: after parsing TGSI and creating the NIR shader");
return c;
}
struct nir_shader *
tgsi_to_nir(const void *tgsi_tokens,
const nir_shader_compiler_options *options)
{
struct ttn_compile *c;
struct nir_shader *s;
c = ttn_compile_init(tgsi_tokens, options);
s = c->build.shader;
ralloc_free(c);
return s;
}