diff options
author | Jason Ekstrand <[email protected]> | 2018-01-01 19:55:33 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-01-08 14:57:44 -0800 |
commit | 53265c8798ee83e812f2e27356c8d9affc5356ca (patch) | |
tree | 85720f1b64dddd64813a8ae5d834cc3af69c0588 | |
parent | 819adfdfb4601eed9c1642f23efa0c8077213a35 (diff) |
spirv: Add a mechanism for dumping failing shaders
Reviewed-by: Lionel Landwerlin <[email protected]>
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 28 | ||||
-rw-r--r-- | src/compiler/spirv/vtn_private.h | 1 |
2 files changed, 29 insertions, 0 deletions
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index d195fbe09b9..7a4b52f4fde 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -31,6 +31,8 @@ #include "nir/nir_constant_expressions.h" #include "spirv_info.h" +#include <stdio.h> + void vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level, size_t spirv_offset, const char *message) @@ -94,6 +96,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; + + FILE *f = fopen(filename, "w"); + if (f == NULL) + return; + + fwrite(b->spirv, sizeof(*b->spirv), b->spirv_word_count, f); + fclose(f); + + 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 +140,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); } @@ -3706,6 +3733,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 f7d8f49c98e..374643a7a84 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; |