spirv: Add a mechanism for dumping failing shaders
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
@@ -31,6 +31,8 @@
|
|||||||
#include "nir/nir_constant_expressions.h"
|
#include "nir/nir_constant_expressions.h"
|
||||||
#include "spirv_info.h"
|
#include "spirv_info.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
void
|
void
|
||||||
vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level,
|
vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level,
|
||||||
size_t spirv_offset, const char *message)
|
size_t spirv_offset, const char *message)
|
||||||
@@ -94,6 +96,27 @@ vtn_log_err(struct vtn_builder *b,
|
|||||||
ralloc_free(msg);
|
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
|
void
|
||||||
_vtn_warn(struct vtn_builder *b, const char *file, unsigned line,
|
_vtn_warn(struct vtn_builder *b, const char *file, unsigned line,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
@@ -117,6 +140,10 @@ _vtn_fail(struct vtn_builder *b, const char *file, unsigned line,
|
|||||||
file, line, fmt, args);
|
file, line, fmt, args);
|
||||||
va_end(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);
|
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 */
|
/* Initialize the stn_builder object */
|
||||||
struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
|
struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
|
||||||
b->spirv = words;
|
b->spirv = words;
|
||||||
|
b->spirv_word_count = word_count;
|
||||||
b->file = NULL;
|
b->file = NULL;
|
||||||
b->line = -1;
|
b->line = -1;
|
||||||
b->col = -1;
|
b->col = -1;
|
||||||
|
@@ -531,6 +531,7 @@ struct vtn_builder {
|
|||||||
jmp_buf fail_jump;
|
jmp_buf fail_jump;
|
||||||
|
|
||||||
const uint32_t *spirv;
|
const uint32_t *spirv;
|
||||||
|
size_t spirv_word_count;
|
||||||
|
|
||||||
nir_shader *shader;
|
nir_shader *shader;
|
||||||
const struct spirv_to_nir_options *options;
|
const struct spirv_to_nir_options *options;
|
||||||
|
Reference in New Issue
Block a user