nir/print: add support for print annotations
authorRob Clark <robclark@freedesktop.org>
Sat, 14 May 2016 19:37:32 +0000 (15:37 -0400)
committerRob Clark <robclark@freedesktop.org>
Tue, 17 May 2016 14:05:20 +0000 (10:05 -0400)
Caller can pass a hashtable mapping NIR object (currently instr or var,
but I guess others could be added as needed) to annotation msg to print
inline with the shader dump.  As the annotation msg is printed, it is
removed from the hashtable to give the caller a way to know about any
unassociated msgs.

This is used in the next patch, for nir_validate to try to associate
error msgs to nir_print dump.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
Reviewed-by: Eduardo Lima Mitev <elima@igalia.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/compiler/nir/nir.h
src/compiler/nir/nir_print.c

index d4edea7b97788bf85b0527d35764e8723a5664b0..a21a7bdc6fa9556254c49fedcb45ec6fcac81af5 100644 (file)
@@ -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);
index 583f66c2b0823e1b9f34aa7305f60df8c819792f..021f0d618d2b7620a2ad45bd311d4e9a653e07d8 100644 (file)
@@ -53,8 +53,30 @@ 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)
 {
@@ -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)
@@ -1149,6 +1176,12 @@ nir_print_shader(nir_shader *shader, FILE *fp)
    destroy_print_state(&state);
 }
 
+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)
 {