From: Timur Kristóf Date: Fri, 8 Feb 2019 08:59:58 +0000 (+0100) Subject: tgsi_to_nir: Split to smaller functions. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4dba72c4b35eeb312da232b2f30f067885bc9f07;p=mesa.git 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 Tested-by: Andre Heider Tested-by: Rob Clark Reviewed-by: Timothy Arceri Acked-By: Tested-by: Rob Clark --- diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c index bd2aaaed0dc..1260752f0f6 100644 --- a/src/gallium/auxiliary/nir/tgsi_to_nir.c +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c @@ -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; + ttn_parse_tgsi(c, tgsi_tokens); + ttn_add_output_stores(c); - case TGSI_TOKEN_TYPE_IMMEDIATE: - ttn_emit_immediate(c); - break; - } - } + nir_validate_shader(c->build.shader, "TTN: after parsing TGSI and creating the NIR shader"); - tgsi_parse_free(&parser); + return c; +} - ttn_add_output_stores(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; } +