spirv: Add a mechanism for dumping failing shaders

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand
2018-01-01 19:55:33 -08:00
parent 819adfdfb4
commit 53265c8798
2 changed files with 29 additions and 0 deletions

View File

@@ -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;

View File

@@ -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;