diff options
-rw-r--r-- | src/compiler/nir/nir.h | 1 | ||||
-rw-r--r-- | src/compiler/nir/nir_print.c | 35 |
2 files changed, 35 insertions, 1 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index d4edea7b977..a21a7bdc6fa 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2213,6 +2213,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_annotated(nir_shader *shader, FILE *fp, struct hash_table *errors); 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 583f66c2b08..021f0d618d2 100644 --- a/src/compiler/nir/nir_print.c +++ b/src/compiler/nir/nir_print.c @@ -53,9 +53,31 @@ typedef struct { /* an index used to make new non-conflicting names */ unsigned index; + + /** + * Optional table of annotations mapping nir object + * (such as instr or var) to message to print. + */ + struct hash_table *annotations; } print_state; static void +print_annotation(print_state *state, void *obj) +{ + if (!state->annotations) + return; + + struct hash_entry *entry = _mesa_hash_table_search(state->annotations, obj); + if (!entry) + return; + + const char *note = entry->data; + _mesa_hash_table_remove(state->annotations, entry); + + fprintf(stderr, "%s\n\n", note); +} + +static void print_register(nir_register *reg, print_state *state) { FILE *fp = state->fp; @@ -413,6 +435,7 @@ print_var_decl(nir_variable *var, print_state *state) } fprintf(fp, "\n"); + print_annotation(state, var); } static void @@ -924,6 +947,7 @@ print_block(nir_block *block, print_state *state, unsigned tabs) nir_foreach_instr(instr, block) { print_instr(instr, state, tabs); fprintf(fp, "\n"); + print_annotation(state, instr); } print_tabs(tabs, fp); @@ -1096,11 +1120,14 @@ destroy_print_state(print_state *state) } void -nir_print_shader(nir_shader *shader, FILE *fp) +nir_print_shader_annotated(nir_shader *shader, FILE *fp, + struct hash_table *annotations) { print_state state; init_print_state(&state, shader, fp); + state.annotations = annotations; + fprintf(fp, "shader: %s\n", gl_shader_stage_name(shader->stage)); if (shader->info.name) @@ -1150,6 +1177,12 @@ nir_print_shader(nir_shader *shader, FILE *fp) } void +nir_print_shader(nir_shader *shader, FILE *fp) +{ + nir_print_shader_annotated(shader, fp, NULL); +} + +void nir_print_instr(const nir_instr *instr, FILE *fp) { print_state state = { |