From: Rob Clark <[email protected]> If we assert in nir_validate_shader(), print the shader with the offending instruction prefixed with "=>" to make it easier to find what part of the shader nir_validate is complaining about.
Macro funny-business in nir_validate() was just to avoid changing a bazillion assert() lines to validate_assert() (or similar) for the point of an RFC ;-) Example output: http://hastebin.com/raw/qorirayazu --- src/compiler/nir/nir.h | 1 + src/compiler/nir/nir_print.c | 14 +++++++++++++- src/compiler/nir/nir_validate.c | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index ade584c..6bb9fbe 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2196,6 +2196,7 @@ unsigned nir_index_instrs(nir_function_impl *impl); void nir_index_blocks(nir_function_impl *impl); void nir_print_shader(nir_shader *shader, FILE *fp); +void nir_print_shader_err(nir_shader *shader, FILE *fp, nir_instr *instr); void nir_print_instr(const nir_instr *instr, FILE *fp); nir_shader *nir_shader_clone(void *mem_ctx, const nir_shader *s); diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c index a36561e..3b25a49 100644 --- a/src/compiler/nir/nir_print.c +++ b/src/compiler/nir/nir_print.c @@ -53,6 +53,8 @@ typedef struct { /* an index used to make new non-conflicting names */ unsigned index; + + nir_instr *err_instr; } print_state; static void @@ -916,6 +918,8 @@ print_block(nir_block *block, print_state *state, unsigned tabs) free(preds); nir_foreach_instr(instr, block) { + if (instr == state->err_instr) + fprintf(fp, "=>"); print_instr(instr, state, tabs); fprintf(fp, "\n"); } @@ -1090,11 +1094,13 @@ destroy_print_state(print_state *state) } void -nir_print_shader(nir_shader *shader, FILE *fp) +nir_print_shader_err(nir_shader *shader, FILE *fp, nir_instr *instr) { print_state state; init_print_state(&state, shader, fp); + state.err_instr = instr; + fprintf(fp, "shader: %s\n", gl_shader_stage_name(shader->stage)); if (shader->info.name) @@ -1144,6 +1150,12 @@ nir_print_shader(nir_shader *shader, FILE *fp) } void +nir_print_shader(nir_shader *shader, FILE *fp) +{ + nir_print_shader_err(shader, fp, NULL); +} + +void nir_print_instr(const nir_instr *instr, FILE *fp) { print_state state = { diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index 84334d4..b47087f 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -97,6 +97,21 @@ typedef struct { struct hash_table *var_defs; } validate_state; + + +static void +dump_assert(validate_state *state, const char *failed) +{ + fprintf(stderr, "validate failed: %s\n", failed); + if (state->instr) + nir_print_shader_err(state->shader, stderr, state->instr); +} + +#define __assert assert +#undef assert +#define assert(x) do { if (!(x)) { dump_assert(state, #x); __assert_fail(#x, __FILE__, __LINE__, __func__); } } while (0) + + static void validate_src(nir_src *src, validate_state *state); static void -- 2.5.5 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
