diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 47cb27c0c4c..cd499cef7db 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -46,6 +46,7 @@ static const struct debug_named_value radeonsi_debug_options[] = { {"initaco", DBG(INIT_ACO), "Print initial ACO IR before optimizations"}, {"aco", DBG(ACO), "Print final ACO IR"}, {"asm", DBG(ASM), "Print final shaders in asm"}, + {"stats", DBG(STATS), "Print shader-db stats to stderr"}, /* Shader compiler options the shader cache should be aware of: */ {"w32ge", DBG(W32_GE), "Use Wave32 for vertex, tessellation, and geometry shaders."}, diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 0b7c748b1c7..11cb9df0744 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -181,6 +181,7 @@ enum DBG_INIT_ACO, DBG_ACO, DBG_ASM, + DBG_STATS, /* Shader compiler options the shader cache should be aware of: */ DBG_FS_CORRECT_DERIVS_AFTER_KILL, diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 62a15291d71..2dba1233c14 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1176,6 +1176,7 @@ bool si_can_dump_shader(struct si_screen *sscreen, gl_shader_stage stage, [SI_DUMP_INIT_ACO_IR] = DBG(INIT_ACO), [SI_DUMP_ACO_IR] = DBG(ACO), [SI_DUMP_ASM] = DBG(ASM), + [SI_DUMP_STATS] = DBG(STATS), [SI_DUMP_ALWAYS] = DBG(VS) | DBG(TCS) | DBG(TES) | DBG(GS) | DBG(PS) | DBG(CS), }; assert(dump_type < ARRAY_SIZE(filter)); @@ -2556,6 +2557,14 @@ si_set_spi_ps_input_config(struct si_shader *shader) shader->config.spi_ps_input_addr = shader->config.spi_ps_input_ena; } +static void +debug_message_stderr(void *data, unsigned *id, enum util_debug_type ptype, + const char *fmt, va_list args) +{ + vfprintf(stderr, fmt, args); + fprintf(stderr, "\n"); +} + bool si_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compiler, struct si_shader *shader, struct util_debug_callback *debug) { @@ -2730,7 +2739,16 @@ bool si_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compi } si_calculate_max_simd_waves(shader); - si_shader_dump_stats_for_shader_db(sscreen, shader, debug); + + if (si_can_dump_shader(sscreen, sel->stage, SI_DUMP_STATS)) { + struct util_debug_callback out_stderr = { + .debug_message = debug_message_stderr, + }; + + si_shader_dump_stats_for_shader_db(sscreen, shader, &out_stderr); + } else { + si_shader_dump_stats_for_shader_db(sscreen, shader, debug); + } out: if (free_nir) diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index fa1f3446526..cd7c5832df4 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -313,6 +313,7 @@ enum si_shader_dump_type { SI_DUMP_INIT_ACO_IR, /* initial ACO IR before optimizations */ SI_DUMP_ACO_IR, /* final ACO IR */ SI_DUMP_ASM, /* final asm shaders */ + SI_DUMP_STATS, /* print statistics as shader-db */ SI_DUMP_ALWAYS, };