Mesa (master): etnaviv: shader-db traces

Christian Gmeiner austriancoder at kemper.freedesktop.org
Sat Feb 11 20:23:14 UTC 2017


Module: Mesa
Branch: master
Commit: 137ad879d5be404e86095267808baa91890e1390
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=137ad879d5be404e86095267808baa91890e1390

Author: Christian Gmeiner <christian.gmeiner at gmail.com>
Date:   Wed Jan  4 22:59:38 2017 +0100

etnaviv: shader-db traces

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
Reviewed-By: Wladimir J. van der Laan <laanwj at gmail.com>

---

 src/gallium/drivers/etnaviv/etnaviv_compiler.h |  2 ++
 src/gallium/drivers/etnaviv/etnaviv_debug.h    |  1 +
 src/gallium/drivers/etnaviv/etnaviv_screen.c   |  1 +
 src/gallium/drivers/etnaviv/etnaviv_shader.c   | 44 +++++++++++++++++++++++++-
 4 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.h b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
index 211ae1a..de3e20d 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
@@ -56,6 +56,8 @@ struct etna_shader_io_file {
 
 /* shader object, for linking */
 struct etna_shader {
+   uint32_t id; /* for debug */
+
    uint processor; /* TGSI_PROCESSOR_... */
    uint32_t code_size; /* code size in uint32 words */
    uint32_t *code;
diff --git a/src/gallium/drivers/etnaviv/etnaviv_debug.h b/src/gallium/drivers/etnaviv/etnaviv_debug.h
index cfda52b..f47dffe 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_debug.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_debug.h
@@ -51,6 +51,7 @@
 #define ETNA_DBG_FLUSH_ALL       0x100000 /* Flush after every rendered primitive */
 #define ETNA_DBG_ZERO            0x200000 /* Zero all resources after allocation */
 #define ETNA_DBG_DRAW_STALL      0x400000 /* Stall FE/PE after every draw op */
+#define ETNA_DBG_SHADERDB        0x800000 /* dump program compile information */
 
 extern int etna_mesa_debug; /* set in etna_screen.c from ETNA_DEBUG */
 
diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
index e3090dc..9324a95 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
@@ -62,6 +62,7 @@ static const struct debug_named_value debug_options[] = {
    {"flush_all",      ETNA_DBG_FLUSH_ALL, "Flush after every rendered primitive"},
    {"zero",           ETNA_DBG_ZERO, "Zero all resources after allocation"},
    {"draw_stall",     ETNA_DBG_DRAW_STALL, "Stall FE/PE after each rendered primitive"},
+   {"shaderdb",       ETNA_DBG_SHADERDB, "Enable shaderdb output"},
    DEBUG_NAMED_VALUE_END
 };
 
diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.c b/src/gallium/drivers/etnaviv/etnaviv_shader.c
index 8895311..87edf5b 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_shader.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_shader.c
@@ -223,6 +223,42 @@ etna_shader_update_vs_inputs(struct etna_context *ctx,
    return true;
 }
 
+static inline const char *
+etna_shader_stage(struct etna_shader *shader)
+{
+   switch (shader->processor) {
+   case PIPE_SHADER_VERTEX:     return "VERT";
+   case PIPE_SHADER_FRAGMENT:   return "FRAG";
+   case PIPE_SHADER_COMPUTE:    return "CL";
+   default:
+      unreachable("invalid type");
+      return NULL;
+   }
+}
+
+static void
+dump_shader_info(struct etna_shader *shader, struct pipe_debug_callback *debug)
+{
+   if (!unlikely(etna_mesa_debug & ETNA_DBG_SHADERDB))
+      return;
+
+   pipe_debug_message(debug, SHADER_INFO, "\n"
+         "SHADER-DB: %s prog %d: %u instructions %u temps\n"
+         "SHADER-DB: %s prog %d: %u immediates %u consts\n"
+         "SHADER-DB: %s prog %d: %u loops\n",
+         etna_shader_stage(shader),
+         shader->id,
+         shader->code_size,
+         shader->num_temps,
+         etna_shader_stage(shader),
+         shader->id,
+         shader->uniforms.imm_count,
+         shader->uniforms.const_count,
+         etna_shader_stage(shader),
+         shader->id,
+         shader->num_loops);
+}
+
 bool
 etna_shader_update_vertex(struct etna_context *ctx)
 {
@@ -235,8 +271,14 @@ etna_create_shader_state(struct pipe_context *pctx,
                          const struct pipe_shader_state *pss)
 {
    struct etna_context *ctx = etna_context(pctx);
+   struct etna_shader *shader = etna_compile_shader(&ctx->specs, pss->tokens);
+
+   static uint32_t id;
+   shader->id = id++;
+
+   dump_shader_info(shader, &ctx->debug);
 
-   return etna_compile_shader(&ctx->specs, pss->tokens);
+   return shader;
 }
 
 static void




More information about the mesa-commit mailing list