---
src/compiler/spirv/spirv_to_nir.c | 29 +++++++++++++++++++++++++++++
src/compiler/spirv/vtn_private.h | 1 +
2 files changed, 30 insertions(+)
diff --git a/src/compiler/spirv/spirv_to_nir.c
b/src/compiler/spirv/spirv_to_nir.c
index dcff56f..751fb03 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -31,6 +31,9 @@
#include "nir/nir_constant_expressions.h"
#include "spirv_info.h"
+#include <fcntl.h>
+#include <unistd.h>
+
void
vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level,
size_t spirv_offset, const char *message)
@@ -94,6 +97,27 @@ vtn_log_err(struct vtn_builder *b,
ralloc_free(msg);
}
+static void
+vtn_dump_shader(struct vtn_builder *b, const char *path, const char *prefix)
+{
+ static int idx = 0;
+
+ char filename[1024];
+ int len = snprintf(filename, sizeof(filename), "%s/%s-%d.spirv",
+ path, prefix, idx++);
+ if (len < 0 || len >= sizeof(filename))
+ return;
+
+ int fd = open(filename, O_CREAT | O_CLOEXEC | O_WRONLY, 0777);
+ if (fd < 0)
+ return;
+
+ write(fd, b->spirv, b->spirv_word_count * 4);
+ close(fd);
+
+ vtn_info("SPIR-V shader dumped to %s", filename);
+}
+
void
_vtn_warn(struct vtn_builder *b, const char *file, unsigned line,
const char *fmt, ...)
@@ -117,6 +141,10 @@ _vtn_fail(struct vtn_builder *b, const char *file,
unsigned line,
file, line, fmt, args);
va_end(args);
+ const char *dump_path = getenv("MESA_SPIRV_FAIL_DUMP_PATH");
+ if (dump_path)
+ vtn_dump_shader(b, dump_path, "fail");
+
longjmp(b->fail_jump, 1);
}
@@ -3690,6 +3718,7 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
/* Initialize the stn_builder object */
struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
b->spirv = words;
+ b->spirv_word_count = word_count;
b->file = NULL;
b->line = -1;
b->col = -1;
diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h
index f7d8f49..374643a 100644
--- a/src/compiler/spirv/vtn_private.h
+++ b/src/compiler/spirv/vtn_private.h
@@ -531,6 +531,7 @@ struct vtn_builder {
jmp_buf fail_jump;
const uint32_t *spirv;
+ size_t spirv_word_count;
nir_shader *shader;
const struct spirv_to_nir_options *options;
--
2.5.0.400.gff86faf
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev