lima: add summary report for shader-db
authorErico Nunes <nunes.erico@gmail.com>
Sat, 3 Aug 2019 08:56:12 +0000 (10:56 +0200)
committerErico Nunes <nunes.erico@gmail.com>
Tue, 6 Aug 2019 13:43:31 +0000 (15:43 +0200)
Very basic summary, loops and gpir spills:fills are not updated yet and
are only there to comply with the strings to shader-db report.py regex.

For now it can be used to analyze the impact of changes in instruction
count in both gpir and ppir.

The LIMA_DEBUG=shaderdb setting can be useful to output stats on
applications other than shader-db.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
src/gallium/drivers/lima/ir/gp/codegen.c
src/gallium/drivers/lima/ir/gp/gpir.h
src/gallium/drivers/lima/ir/gp/nir.c
src/gallium/drivers/lima/ir/lima_ir.h
src/gallium/drivers/lima/ir/pp/nir.c
src/gallium/drivers/lima/ir/pp/ppir.h
src/gallium/drivers/lima/ir/pp/regalloc.c
src/gallium/drivers/lima/lima_program.c
src/gallium/drivers/lima/lima_screen.c
src/gallium/drivers/lima/lima_screen.h

index 19eb38c18a77d68b12fae0c8fe9d17fdae78b7c9..76e360b4fb1235afe44fc8d40b9c5a569b2982c1 100644 (file)
@@ -602,6 +602,7 @@ bool gpir_codegen_prog(gpir_compiler *comp)
 
    comp->prog->shader = code;
    comp->prog->shader_size = num_instr * sizeof(gpir_codegen_instr);
+   comp->num_instr = num_instr;
 
    if (lima_debug & LIMA_DEBUG_GP) {
       gpir_codegen_print_prog(comp);
index e7707814b7c215b7faf807a14bc64e8eee1cf38d..36553a7e169908afb8a92dac59dead77a290dd74 100644 (file)
@@ -388,6 +388,12 @@ typedef struct gpir_compiler {
 
    struct lima_vs_shader_state *prog;
    int constant_base;
+
+   /* shaderdb */
+   int num_instr;
+   int num_loops;
+   int num_spills;
+   int num_fills;
 } gpir_compiler;
 
 #define GPIR_VALUE_REG_NUM 11
index 18121b9a914621fe9d46fcdc846a8780d887cb5a..c208d735b9d98b0ef5d9e8b8f4057efe9b172681 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "util/ralloc.h"
 #include "compiler/nir/nir.h"
+#include "pipe/p_state.h"
+
 
 #include "gpir.h"
 #include "lima_context.h"
@@ -396,7 +398,29 @@ static int gpir_glsl_type_size(enum glsl_base_type type)
    return 4;
 }
 
-bool gpir_compile_nir(struct lima_vs_shader_state *prog, struct nir_shader *nir)
+static void gpir_print_shader_db(struct nir_shader *nir, gpir_compiler *comp,
+                                 struct pipe_debug_callback *debug)
+{
+   const struct shader_info *info = &nir->info;
+   char *shaderdb;
+   int ret = asprintf(&shaderdb,
+                      "%s shader: %d inst, %d loops, %d:%d spills:fills\n",
+                      gl_shader_stage_name(info->stage),
+                      comp->num_instr,
+                      comp->num_loops,
+                      comp->num_spills,
+                      comp->num_fills);
+   assert(ret >= 0);
+
+   if (lima_debug & LIMA_DEBUG_SHADERDB)
+      fprintf(stderr, "SHADER-DB: %s\n", shaderdb);
+
+   pipe_debug_message(debug, SHADER_INFO, "%s", shaderdb);
+   free(shaderdb);
+}
+
+bool gpir_compile_nir(struct lima_vs_shader_state *prog, struct nir_shader *nir,
+                      const struct pipe_debug_callback *debug)
 {
    nir_function_impl *func = nir_shader_get_entrypoint(nir);
    gpir_compiler *comp = gpir_compiler_create(prog, func->reg_alloc, func->ssa_alloc);
@@ -446,6 +470,8 @@ bool gpir_compile_nir(struct lima_vs_shader_state *prog, struct nir_shader *nir)
       v->components += glsl_get_components(var->type);
    }
 
+   gpir_print_shader_db(nir, comp, debug);
+
    ralloc_free(comp);
    return true;
 
index 9ef4b68235eefd51ae4fbe9ebc241de1fab544a2..8685b5db300cda061334224473aea24fe8a2fe58 100644 (file)
@@ -53,12 +53,14 @@ struct lima_vs_shader_state;
 struct lima_fs_shader_state;
 
 /* gpir interface */
-bool gpir_compile_nir(struct lima_vs_shader_state *prog, struct nir_shader *nir);
+bool gpir_compile_nir(struct lima_vs_shader_state *prog, struct nir_shader *nir,
+                      const struct pipe_debug_callback *debug);
 
 
 /* ppir interface */
 bool ppir_compile_nir(struct lima_fs_shader_state *prog, struct nir_shader *nir,
-                      struct ra_regs *ra);
+                      struct ra_regs *ra,
+                      const struct pipe_debug_callback *debug);
 struct ra_regs *ppir_regalloc_init(void *mem_ctx);
 
 void lima_nir_lower_uniform_to_scalar(nir_shader *shader);
index b0714c8363f5f1d3d8cf009caebe93749db70ea4..e73a7967dc9f933eb3e25cb5c95220f67774973d 100644 (file)
@@ -27,6 +27,8 @@
 #include "util/ralloc.h"
 #include "util/bitscan.h"
 #include "compiler/nir/nir.h"
+#include "pipe/p_state.h"
+
 
 #include "ppir.h"
 
@@ -562,8 +564,30 @@ static void ppir_add_ordering_deps(ppir_compiler *comp)
    }
 }
 
+static void ppir_print_shader_db(struct nir_shader *nir, ppir_compiler *comp,
+                                 const struct pipe_debug_callback *debug)
+{
+   const struct shader_info *info = &nir->info;
+   char *shaderdb;
+   int ret = asprintf(&shaderdb,
+                      "%s shader: %d inst, %d loops, %d:%d spills:fills\n",
+                      gl_shader_stage_name(info->stage),
+                      comp->cur_instr_index,
+                      comp->num_loops,
+                      comp->num_spills,
+                      comp->num_fills);
+   assert(ret >= 0);
+
+   if (lima_debug & LIMA_DEBUG_SHADERDB)
+      fprintf(stderr, "SHADER-DB: %s\n", shaderdb);
+
+   pipe_debug_message(debug, SHADER_INFO, "%s", shaderdb);
+   free(shaderdb);
+}
+
 bool ppir_compile_nir(struct lima_fs_shader_state *prog, struct nir_shader *nir,
-                      struct ra_regs *ra)
+                      struct ra_regs *ra,
+                      const struct pipe_debug_callback *debug)
 {
    nir_function_impl *func = nir_shader_get_entrypoint(nir);
    ppir_compiler *comp = ppir_compiler_create(prog, func->reg_alloc, func->ssa_alloc);
@@ -611,6 +635,8 @@ bool ppir_compile_nir(struct lima_fs_shader_state *prog, struct nir_shader *nir,
    if (!ppir_codegen_prog(comp))
       goto err_out0;
 
+   ppir_print_shader_db(nir, comp, debug);
+
    ralloc_free(comp);
    return true;
 
index d03b48a828b2c501c3a6bc5fd3bf6ee1d13c0108..e8c6e015f0efc056e7ac79489498e8ca1d1d82aa 100644 (file)
@@ -346,6 +346,11 @@ typedef struct ppir_compiler {
    /* for regalloc spilling debug */
    int force_spilling;
 
+   /* shaderdb */
+   int num_loops;
+   int num_spills;
+   int num_fills;
+
    ppir_block *discard_block;
 } ppir_compiler;
 
index 46903840099f630c14cb1db690d2c6847f911173..c1c3736aff5571f5e344033f5035c296cc49ae50 100644 (file)
@@ -392,6 +392,7 @@ static ppir_alu_node* ppir_update_spilled_src(ppir_compiler *comp,
    if (!load_node)
       return NULL;
    list_addtail(&load_node->list, &node->list);
+   comp->num_fills++;
 
    ppir_load_node *load = ppir_node_to_load(load_node);
 
@@ -484,6 +485,7 @@ static bool ppir_update_spilled_dest(ppir_compiler *comp, ppir_block *block,
    if (!load_node)
       return NULL;
    list_addtail(&load_node->list, &node->list);
+   comp->num_fills++;
 
    ppir_load_node *load = ppir_node_to_load(load_node);
 
@@ -533,6 +535,7 @@ static bool ppir_update_spilled_dest(ppir_compiler *comp, ppir_block *block,
    if (!store_node)
       return false;
    list_addtail(&store_node->list, &node->list);
+   comp->num_spills++;
 
    ppir_store_node *store = ppir_node_to_store(store_node);
 
index c22636fc50e665a39c1edabb55b3d8c074be0477..367ccb8a4e0dd9ebce11fda270ec65ce6120e152 100644 (file)
@@ -214,6 +214,7 @@ static void *
 lima_create_fs_state(struct pipe_context *pctx,
                      const struct pipe_shader_state *cso)
 {
+   struct lima_context *ctx = lima_context(pctx);
    struct lima_screen *screen = lima_screen(pctx->screen);
    struct lima_fs_shader_state *so = rzalloc(NULL, struct lima_fs_shader_state);
 
@@ -234,7 +235,7 @@ lima_create_fs_state(struct pipe_context *pctx,
    if (lima_debug & LIMA_DEBUG_PP)
       nir_print_shader(nir, stdout);
 
-   if (!ppir_compile_nir(so, nir, screen->pp_ra)) {
+   if (!ppir_compile_nir(so, nir, screen->pp_ra, &ctx->debug)) {
       ralloc_free(so);
       return NULL;
    }
@@ -306,6 +307,7 @@ static void *
 lima_create_vs_state(struct pipe_context *pctx,
                      const struct pipe_shader_state *cso)
 {
+   struct lima_context *ctx = lima_context(pctx);
    struct lima_vs_shader_state *so = rzalloc(NULL, struct lima_vs_shader_state);
 
    if (!so)
@@ -325,7 +327,7 @@ lima_create_vs_state(struct pipe_context *pctx,
    if (lima_debug & LIMA_DEBUG_GP)
       nir_print_shader(nir, stdout);
 
-   if (!gpir_compile_nir(so, nir)) {
+   if (!gpir_compile_nir(so, nir, &ctx->debug)) {
       ralloc_free(so);
       return NULL;
    }
index 26a7051e67eeabe300e5991674e405d76101faad..8e337425f7add310e8f4453971ccac7e44dbc4df 100644 (file)
@@ -440,6 +440,8 @@ static const struct debug_named_value debug_options[] = {
           "print PP shader compiler result of each stage" },
         { "dump",     LIMA_DEBUG_DUMP,
           "dump GPU command stream to $PWD/lima.dump" },
+        { "shaderdb", LIMA_DEBUG_SHADERDB,
+          "print shader information for shaderdb" },
         { NULL }
 };
 
index 7d1f6f829247d523279a3788938e8bece661aeaa..296931688282b829cc4ca8e611c1e7e14fd08048 100644 (file)
@@ -36,6 +36,7 @@
 #define LIMA_DEBUG_GP      (1 << 0)
 #define LIMA_DEBUG_PP      (1 << 1)
 #define LIMA_DEBUG_DUMP    (1 << 2)
+#define LIMA_DEBUG_SHADERDB (1 << 3)
 
 extern uint32_t lima_debug;
 extern FILE *lima_dump_command_stream;