<div dir="ltr"><div>For the series:</div><div><br></div><div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>Marek<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, May 13, 2019 at 5:15 PM Nicolai Hähnle <<a href="mailto:nhaehnle@gmail.com">nhaehnle@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Nicolai Hähnle <<a href="mailto:nicolai.haehnle@amd.com" target="_blank">nicolai.haehnle@amd.com</a>><br>
<br>
This dumps disassembly to the pipe_debug_callback together with shader<br>
stats.<br>
<br>
Can be used together with shader-db to get full disassembly of all shaders<br>
in the database.<br>
---<br>
 src/gallium/drivers/radeonsi/si_debug_options.h |  1 +<br>
 src/gallium/drivers/radeonsi/si_shader.c        | 15 +++++++++------<br>
 2 files changed, 10 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/src/gallium/drivers/radeonsi/si_debug_options.h b/src/gallium/drivers/radeonsi/si_debug_options.h<br>
index db642366ca6..ef8435804fb 100644<br>
--- a/src/gallium/drivers/radeonsi/si_debug_options.h<br>
+++ b/src/gallium/drivers/radeonsi/si_debug_options.h<br>
@@ -1,8 +1,9 @@<br>
 OPT_BOOL(clear_db_cache_before_clear, false, "Clear DB cache before fast depth clear")<br>
 OPT_BOOL(enable_nir, false, "Enable NIR")<br>
 OPT_BOOL(aux_debug, false, "Generate ddebug_dumps for the auxiliary context")<br>
 OPT_BOOL(sync_compile, false, "Always compile synchronously (will cause stalls)")<br>
 OPT_BOOL(dump_shader_binary, false, "Dump shader binary as part of ddebug_dumps")<br>
+OPT_BOOL(debug_disassembly, false, "Report shader disassembly as part of driver debug messages (for shader db)")<br>
 OPT_BOOL(vs_fetch_always_opencode, false, "Always open code vertex fetches (less efficient, purely for testing)")<br>
<br>
 #undef OPT_BOOL<br>
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c<br>
index 2186938fec9..4c321dc60dc 100644<br>
--- a/src/gallium/drivers/radeonsi/si_shader.c<br>
+++ b/src/gallium/drivers/radeonsi/si_shader.c<br>
@@ -5154,27 +5154,22 @@ static void si_shader_dump_disassembly(struct si_screen *screen,<br>
                        .elf_ptrs = &binary->elf_buffer,<br>
                        .elf_sizes = &binary->elf_size }))<br>
                return;<br>
<br>
        const char *disasm;<br>
        uint64_t nbytes;<br>
<br>
        if (!ac_rtld_get_section_by_name(&rtld_binary, ".AMDGPU.disasm", &disasm, &nbytes))<br>
                goto out;<br>
<br>
-       fprintf(file, "Shader %s disassembly:\n", name);<br>
-       if (nbytes > INT_MAX) {<br>
-               fprintf(file, "too long\n");<br>
+       if (nbytes > INT_MAX)<br>
                goto out;<br>
-       }<br>
-<br>
-       fprintf(file, "%*s", (int)nbytes, disasm);<br>
<br>
        if (debug && debug->debug_message) {<br>
                /* Very long debug messages are cut off, so send the<br>
                 * disassembly one line at a time. This causes more<br>
                 * overhead, but on the plus side it simplifies<br>
                 * parsing of resulting logs.<br>
                 */<br>
                pipe_debug_message(debug, SHADER_INFO,<br>
                                   "Shader Disassembly Begin");<br>
<br>
@@ -5190,20 +5185,25 @@ static void si_shader_dump_disassembly(struct si_screen *screen,<br>
                                                   "%.*s", count, disasm + line);<br>
                        }<br>
<br>
                        line += count + 1;<br>
                }<br>
<br>
                pipe_debug_message(debug, SHADER_INFO,<br>
                                   "Shader Disassembly End");<br>
        }<br>
<br>
+       if (file) {<br>
+               fprintf(file, "Shader %s disassembly:\n", name);<br>
+               fprintf(file, "%*s", (int)nbytes, disasm);<br>
+       }<br>
+<br>
 out:<br>
        ac_rtld_close(&rtld_binary);<br>
 }<br>
<br>
 static void si_calculate_max_simd_waves(struct si_shader *shader)<br>
 {<br>
        struct si_screen *sscreen = shader->selector->screen;<br>
        struct ac_shader_config *conf = &shader->config;<br>
        unsigned num_inputs = shader->selector->info.num_inputs;<br>
        unsigned lds_increment = sscreen->info.chip_class >= CIK ? 512 : 256;<br>
@@ -5255,20 +5255,23 @@ static void si_calculate_max_simd_waves(struct si_shader *shader)<br>
<br>
        shader->max_simd_waves = max_simd_waves;<br>
 }<br>
<br>
 void si_shader_dump_stats_for_shader_db(struct si_screen *screen,<br>
                                        struct si_shader *shader,<br>
                                        struct pipe_debug_callback *debug)<br>
 {<br>
        const struct ac_shader_config *conf = &shader->config;<br>
<br>
+       if (screen->options.debug_disassembly)<br>
+               si_shader_dump_disassembly(screen, &shader->binary, debug, "main", NULL);<br>
+<br>
        pipe_debug_message(debug, SHADER_INFO,<br>
                           "Shader Stats: SGPRS: %d VGPRS: %d Code Size: %d "<br>
                           "LDS: %d Scratch: %d Max Waves: %d Spilled SGPRs: %d "<br>
                           "Spilled VGPRs: %d PrivMem VGPRs: %d",<br>
                           conf->num_sgprs, conf->num_vgprs,<br>
                           si_get_shader_binary_size(screen, shader),<br>
                           conf->lds_size, conf->scratch_bytes_per_wave,<br>
                           shader->max_simd_waves, conf->spilled_sgprs,<br>
                           conf->spilled_vgprs, shader->private_mem_vgprs);<br>
 }<br>
-- <br>
2.20.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a></blockquote></div>