summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compiler/nir/nir.h1
-rw-r--r--src/compiler/nir/nir_print.c35
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 = {