<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>