[Mesa-dev] [RFC PATCH 11/17] etnaviv: add eir_compiler

Christian Gmeiner christian.gmeiner at gmail.com
Fri May 10 09:09:09 UTC 2019


Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
---
 src/gallium/drivers/etnaviv/eir_cmdline.c | 189 ++++++++++++++++++++++
 src/gallium/drivers/etnaviv/meson.build   |  20 +++
 2 files changed, 209 insertions(+)
 create mode 100644 src/gallium/drivers/etnaviv/eir_cmdline.c

diff --git a/src/gallium/drivers/etnaviv/eir_cmdline.c b/src/gallium/drivers/etnaviv/eir_cmdline.c
new file mode 100644
index 00000000000..f888a649050
--- /dev/null
+++ b/src/gallium/drivers/etnaviv/eir_cmdline.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2017 Etnaviv Project
+ * Copyright (C) 2017 Zodiac Inflight Innovations
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Rob Clark <robclark at freedesktop.org>
+ *    Christian Gmeiner <christian.gmeiner at gmail.com>
+ */
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "main/mtypes.h"
+
+#include "compiler/eir_compiler.h"
+#include "compiler/eir_nir.h"
+#include "compiler/eir_shader.h"
+#include "compiler/glsl/standalone.h"
+#include "compiler/glsl/glsl_to_nir.h"
+
+#include "etnaviv_eir.h"
+
+#include "tgsi/tgsi_parse.h"
+#include "tgsi/tgsi_text.h"
+
+#include "util/u_debug.h"
+
+int st_glsl_type_size(const struct glsl_type *type);
+
+static nir_shader *
+load_glsl(const char *filename, gl_shader_stage stage)
+{
+   static const struct standalone_options options = {
+      .glsl_version = 120,
+      .do_link = true,
+   };
+   static struct gl_context local_ctx;
+	struct gl_shader_program *prog;
+
+	prog = standalone_compile_shader(&options, 1, (char * const*)&filename, &local_ctx);
+	if (!prog)
+		errx(1, "couldn't parse `%s'", filename);
+
+	nir_shader *nir = glsl_to_nir(&local_ctx, prog, stage, eir_get_compiler_options());
+
+	standalone_compiler_cleanup(prog);
+
+	return nir;
+}
+
+static int
+read_file(const char *filename, void **ptr, size_t *size)
+{
+   int fd, ret;
+   struct stat st;
+
+   *ptr = MAP_FAILED;
+
+   fd = open(filename, O_RDONLY);
+   if (fd == -1) {
+      warnx("couldn't open `%s'", filename);
+      return 1;
+   }
+
+   ret = fstat(fd, &st);
+   if (ret)
+      errx(1, "couldn't stat `%s'", filename);
+
+   *size = st.st_size;
+   *ptr = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
+   if (*ptr == MAP_FAILED)
+      errx(1, "couldn't map `%s'", filename);
+
+   close(fd);
+
+   return 0;
+}
+
+static void
+print_usage(void)
+{
+   printf("Usage: etnaviv_compiler [OPTIONS]... <file.tgsi | file.vert | file.frag>\n");
+   printf("    --verbose         - verbose compiler/debug messages\n");
+   printf("    --frag-rb-swap    - swap rb in color output (FRAG)\n");
+   printf("    --help            - show this message\n");
+}
+
+int main(int argc, char **argv)
+{
+   int ret, n = 1;
+   const char *filename;
+   struct eir_shader_key key = {};
+   void *ptr;
+   size_t size;
+   bool verbose = false;
+
+   while (n < argc) {
+      if (!strcmp(argv[n], "--verbose")) {
+         verbose = true;
+         n++;
+         continue;
+      }
+
+      if (!strcmp(argv[n], "--frag-rb-swap")) {
+         debug_printf(" %s", argv[n]);
+         key.frag_rb_swap = true;
+         n++;
+         continue;
+      }
+
+      if (!strcmp(argv[n], "--help")) {
+         print_usage();
+         return 0;
+      }
+
+      break;
+   }
+
+   filename = argv[n];
+
+   ret = read_file(filename, &ptr, &size);
+   if (ret) {
+      print_usage();
+      return ret;
+   }
+
+   debug_printf("%s\n", (char *)ptr);
+   nir_shader *nir;
+   const char *ext = rindex(filename, '.');
+
+   if (strcmp(ext, ".tgsi") == 0) {
+      struct tgsi_token toks[65536];
+
+      if (!tgsi_text_translate(ptr, toks, ARRAY_SIZE(toks)))
+         errx(1, "could not parse `%s'", filename);
+
+      nir = eir_tgsi_to_nir(toks, NULL);
+   } else if (strcmp(ext, ".frag") == 0) {
+      nir = load_glsl(filename, MESA_SHADER_FRAGMENT);
+   } else if (strcmp(ext, ".vert") == 0) {
+      nir = load_glsl(filename, MESA_SHADER_VERTEX);
+   } else {
+      print_usage();
+      return -1;
+   }
+
+   if (should_print_nir()) {
+      printf("starting point\n");
+      nir_print_shader(nir, stdout);
+   }
+
+   struct eir_compiler *c = eir_compiler_create();
+
+   if (verbose)
+      eir_compiler_debug |= EIR_DBG_OPTMSGS;
+
+   struct eir_shader *s = eir_shader_from_nir(c, nir);
+   bool created = false;
+   struct eir_shader_variant *v = eir_shader_get_variant(s, key, &created);
+
+   eir_dump_shader(v);
+   eir_shader_destroy(s);
+   eir_compiler_free(c);
+
+   return ret;
+}
diff --git a/src/gallium/drivers/etnaviv/meson.build b/src/gallium/drivers/etnaviv/meson.build
index 57316f8281f..3b5b66c24db 100644
--- a/src/gallium/drivers/etnaviv/meson.build
+++ b/src/gallium/drivers/etnaviv/meson.build
@@ -109,6 +109,26 @@ etnaviv_compiler = executable(
   install : with_tools.contains('etnaviv'),
 )
 
+eir_compiler = executable(
+  'eir_compiler',
+  'eir_cmdline.c',
+  include_directories : [inc_mesa, inc_mapi, inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_etnaviv],
+  dependencies : [
+    idep_nir,
+    dep_thread,
+  ],
+  link_with : [
+    libetnaviv,
+    libetnaviv_gc,
+    libetnaviv_compiler,
+    libgallium,
+    libglsl_standalone,
+    libmesa_util,
+  ],
+  build_by_default : with_tools.contains('etnaviv'),
+  install : with_tools.contains('etnaviv'),
+)
+
 driver_etnaviv = declare_dependency(
   compile_args : '-DGALLIUM_ETNAVIV',
   link_with : [libetnaviv, libetnavivdrm, libetnaviv_gc, libetnaviv_compiler],
-- 
2.21.0



More information about the mesa-dev mailing list