tgsi_to_nir: Split to smaller functions.
authorTimur Kristóf <timur.kristof@gmail.com>
Fri, 8 Feb 2019 08:59:58 +0000 (09:59 +0100)
committerEric Anholt <eric@anholt.net>
Tue, 5 Mar 2019 19:13:27 +0000 (19:13 +0000)
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>
src/gallium/auxiliary/nir/tgsi_to_nir.c

index bd2aaaed0dc3630f5d7eff493d4f9b0aa3c739de..1260752f0f6e7af832d7d4780f8f54703b877297 100644 (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;
+   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;
 }
+