From: Marek Olšák <marek.ol...@amd.com>

This is needed to get shader-db stats for LS,HS,ES,GS stages on gfx9.
---
 src/gallium/drivers/radeonsi/si_shader.c        | 33 +++++++++++++++----------
 src/gallium/drivers/radeonsi/si_shader.h        |  2 ++
 src/gallium/drivers/radeonsi/si_state_shaders.c |  1 +
 3 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index f1ac94f..de1f725 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -5418,29 +5418,43 @@ static void si_calculate_max_simd_waves(struct 
si_shader *shader)
                max_simd_waves = MIN2(max_simd_waves, 256 / conf->num_vgprs);
 
        /* LDS is 64KB per CU (4 SIMDs), which is 16KB per SIMD (usage above
         * 16KB makes some SIMDs unoccupied). */
        if (lds_per_wave)
                max_simd_waves = MIN2(max_simd_waves, 16384 / lds_per_wave);
 
        conf->max_simd_waves = max_simd_waves;
 }
 
+void si_shader_dump_stats_for_shader_db(const struct si_shader *shader,
+                                       struct pipe_debug_callback *debug)
+{
+       const struct si_shader_config *conf = &shader->config;
+
+       pipe_debug_message(debug, SHADER_INFO,
+                          "Shader Stats: SGPRS: %d VGPRS: %d Code Size: %d "
+                          "LDS: %d Scratch: %d Max Waves: %d Spilled SGPRs: %d 
"
+                          "Spilled VGPRs: %d PrivMem VGPRs: %d",
+                          conf->num_sgprs, conf->num_vgprs,
+                          si_get_shader_binary_size(shader),
+                          conf->lds_size, conf->scratch_bytes_per_wave,
+                          conf->max_simd_waves, conf->spilled_sgprs,
+                          conf->spilled_vgprs, conf->private_mem_vgprs);
+}
+
 static void si_shader_dump_stats(struct si_screen *sscreen,
                                 const struct si_shader *shader,
-                                struct pipe_debug_callback *debug,
                                 unsigned processor,
                                 FILE *file,
                                 bool check_debug_option)
 {
        const struct si_shader_config *conf = &shader->config;
-       unsigned code_size = si_get_shader_binary_size(shader);
 
        if (!check_debug_option ||
            si_can_dump_shader(sscreen, processor)) {
                if (processor == PIPE_SHADER_FRAGMENT) {
                        fprintf(file, "*** SHADER CONFIG ***\n"
                                "SPI_PS_INPUT_ADDR = 0x%04x\n"
                                "SPI_PS_INPUT_ENA  = 0x%04x\n",
                                conf->spi_ps_input_addr, 
conf->spi_ps_input_ena);
                }
 
@@ -5450,33 +5464,25 @@ static void si_shader_dump_stats(struct si_screen 
*sscreen,
                        "Spilled SGPRs: %d\n"
                        "Spilled VGPRs: %d\n"
                        "Private memory VGPRs: %d\n"
                        "Code Size: %d bytes\n"
                        "LDS: %d blocks\n"
                        "Scratch: %d bytes per wave\n"
                        "Max Waves: %d\n"
                        "********************\n\n\n",
                        conf->num_sgprs, conf->num_vgprs,
                        conf->spilled_sgprs, conf->spilled_vgprs,
-                       conf->private_mem_vgprs, code_size,
+                       conf->private_mem_vgprs,
+                       si_get_shader_binary_size(shader),
                        conf->lds_size, conf->scratch_bytes_per_wave,
                        conf->max_simd_waves);
        }
-
-       pipe_debug_message(debug, SHADER_INFO,
-                          "Shader Stats: SGPRS: %d VGPRS: %d Code Size: %d "
-                          "LDS: %d Scratch: %d Max Waves: %d Spilled SGPRs: %d 
"
-                          "Spilled VGPRs: %d PrivMem VGPRs: %d",
-                          conf->num_sgprs, conf->num_vgprs, code_size,
-                          conf->lds_size, conf->scratch_bytes_per_wave,
-                          conf->max_simd_waves, conf->spilled_sgprs,
-                          conf->spilled_vgprs, conf->private_mem_vgprs);
 }
 
 const char *si_get_shader_name(const struct si_shader *shader, unsigned 
processor)
 {
        switch (processor) {
        case PIPE_SHADER_VERTEX:
                if (shader->key.as_es)
                        return "Vertex Shader as ES";
                else if (shader->key.as_ls)
                        return "Vertex Shader as LS";
@@ -5540,21 +5546,21 @@ void si_shader_dump(struct si_screen *sscreen, const 
struct si_shader *shader,
                                                   debug, "prolog2", file);
 
                si_shader_dump_disassembly(&shader->binary, debug, "main", 
file);
 
                if (shader->epilog)
                        si_shader_dump_disassembly(&shader->epilog->binary,
                                                   debug, "epilog", file);
                fprintf(file, "\n");
        }
 
-       si_shader_dump_stats(sscreen, shader, debug, processor, file,
+       si_shader_dump_stats(sscreen, shader, processor, file,
                             check_debug_option);
 }
 
 static int si_compile_llvm(struct si_screen *sscreen,
                           struct ac_shader_binary *binary,
                           struct si_shader_config *conf,
                           LLVMTargetMachineRef tm,
                           LLVMModuleRef mod,
                           struct pipe_debug_callback *debug,
                           unsigned processor,
@@ -6969,20 +6975,21 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                        shader->info.ancillary_vgpr_index = 
shader->info.num_input_vgprs;
                        shader->info.num_input_vgprs += 1;
                }
                if 
(G_0286CC_SAMPLE_COVERAGE_ENA(shader->config.spi_ps_input_addr))
                        shader->info.num_input_vgprs += 1;
                if (G_0286CC_POS_FIXED_PT_ENA(shader->config.spi_ps_input_addr))
                        shader->info.num_input_vgprs += 1;
        }
 
        si_calculate_max_simd_waves(shader);
+       si_shader_dump_stats_for_shader_db(shader, debug);
        return 0;
 }
 
 /**
  * Create, compile and return a shader part (prolog or epilog).
  *
  * \param sscreen      screen
  * \param list         list of shader parts of the same category
  * \param type         shader type
  * \param key          shader part key
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index 6ed1646..3cc49ca 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -634,20 +634,22 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
                     struct si_shader *shader,
                     struct pipe_debug_callback *debug);
 void si_shader_destroy(struct si_shader *shader);
 unsigned si_shader_io_get_unique_index_patch(unsigned semantic_name, unsigned 
index);
 unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index);
 int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader 
*shader);
 void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
                    struct pipe_debug_callback *debug, unsigned processor,
                    FILE *f, bool check_debug_option);
+void si_shader_dump_stats_for_shader_db(const struct si_shader *shader,
+                                       struct pipe_debug_callback *debug);
 void si_multiwave_lds_size_workaround(struct si_screen *sscreen,
                                      unsigned *lds_size);
 void si_shader_apply_scratch_relocs(struct si_shader *shader,
                                    uint64_t scratch_va);
 void si_shader_binary_read_config(struct ac_shader_binary *binary,
                                  struct si_shader_config *conf,
                                  unsigned symbol_offset);
 const char *si_get_shader_name(const struct si_shader *shader, unsigned 
processor);
 
 /* si_shader_nir.c */
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index ecb8a0d..959aead 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1816,20 +1816,21 @@ static void si_init_shader_selector_async(void *job, 
int thread_index)
 
                if (sel->tokens)
                        tgsi_binary = si_get_tgsi_binary(sel);
 
                /* Try to load the shader from the shader cache. */
                mtx_lock(&sscreen->shader_cache_mutex);
 
                if (tgsi_binary &&
                    si_shader_cache_load_shader(sscreen, tgsi_binary, shader)) {
                        mtx_unlock(&sscreen->shader_cache_mutex);
+                       si_shader_dump_stats_for_shader_db(shader, debug);
                } else {
                        mtx_unlock(&sscreen->shader_cache_mutex);
 
                        /* Compile the shader if it hasn't been loaded from the 
cache. */
                        if (si_compile_tgsi_shader(sscreen, tm, shader, false,
                                                   debug) != 0) {
                                FREE(shader);
                                FREE(tgsi_binary);
                                fprintf(stderr, "radeonsi: can't compile a main 
shader part\n");
                                return;
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to