From 8ddefb8ea5789137d3ea99f255f3d17d10d291e0 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Tue, 7 Dec 2021 10:18:03 -0800 Subject: [PATCH] r300: Route shader stats output to ARB_debug_output. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This lets us use shader-db to compare stats on shaders, rather than having to manually review the RADEON_DEBUG=pstat output. Reviewed-by: Marek Olšák Part-of: --- .../drivers/r300/compiler/radeon_compiler.c | 47 +++++-------------- .../drivers/r300/compiler/radeon_compiler.h | 4 +- src/gallium/drivers/r300/r300_context.c | 13 +++++ src/gallium/drivers/r300/r300_context.h | 2 + src/gallium/drivers/r300/r300_debug.c | 1 - src/gallium/drivers/r300/r300_fs.c | 3 +- src/gallium/drivers/r300/r300_screen.h | 2 - src/gallium/drivers/r300/r300_vs.c | 3 +- 8 files changed, 32 insertions(+), 43 deletions(-) diff --git a/src/gallium/drivers/r300/compiler/radeon_compiler.c b/src/gallium/drivers/r300/compiler/radeon_compiler.c index 78902d98068..85bdab1d97f 100644 --- a/src/gallium/drivers/r300/compiler/radeon_compiler.c +++ b/src/gallium/drivers/r300/compiler/radeon_compiler.c @@ -26,6 +26,8 @@ #include #include +#include "util/u_debug.h" +#include "pipe/p_state.h" #include "radeon_dataflow.h" #include "radeon_program.h" #include "radeon_program_pair.h" @@ -417,40 +419,17 @@ static void print_stats(struct radeon_compiler * c) { struct rc_program_stats s; - if (c->initial_num_insts <= 5) - return; - rc_get_stats(c, &s); - switch (c->type) { - case RC_VERTEX_PROGRAM: - fprintf(stderr,"~~~~~~~~~ VERTEX PROGRAM ~~~~~~~~\n" - "~%4u Instructions\n" - "~%4u Flow Control Instructions\n" - "~%4u Temporary Registers\n" - "~~~~~~~~~~~~~~ END ~~~~~~~~~~~~~~\n", - s.num_insts, s.num_fc_insts, s.num_temp_regs); - break; - - case RC_FRAGMENT_PROGRAM: - fprintf(stderr,"~~~~~~~~ FRAGMENT PROGRAM ~~~~~~~\n" - "~%4u Instructions\n" - "~%4u Vector Instructions (RGB)\n" - "~%4u Scalar Instructions (Alpha)\n" - "~%4u Flow Control Instructions\n" - "~%4u Texture Instructions\n" - "~%4u Presub Operations\n" - "~%4u OMOD Operations\n" - "~%4u Temporary Registers\n" - "~%4u Inline Literals\n" - "~~~~~~~~~~~~~~ END ~~~~~~~~~~~~~~\n", - s.num_insts, s.num_rgb_insts, s.num_alpha_insts, - s.num_fc_insts, s.num_tex_insts, s.num_presub_ops, - s.num_omod_ops, s.num_temp_regs, s.num_inline_literals); - break; - default: - assert(0); - } + /* Note that we print some dummy values for instruction categories that + * only the FS has, becasue shader-db's report.py wants all shaders to + * have the same set. + */ + pipe_debug_message(c->debug, SHADER_INFO, "%s shader: %d inst, %d vinst, %d sinst, %d flowcontrol, %d tex, %d presub, %d omod, %d temps, %d lits", + c->type == RC_VERTEX_PROGRAM ? "VS" : "FS", + s.num_insts, s.num_rgb_insts, s.num_alpha_insts, + s.num_fc_insts, s.num_tex_insts, s.num_presub_ops, + s.num_omod_ops, s.num_temp_regs, s.num_inline_literals); } static const char *shader_name[RC_NUM_PROGRAM_TYPES] = { @@ -481,7 +460,6 @@ void rc_run_compiler(struct radeon_compiler *c, struct radeon_compiler_pass *lis struct rc_program_stats s; rc_get_stats(c, &s); - c->initial_num_insts = s.num_insts; if (c->Debug & RC_DBG_LOG) { fprintf(stderr, "%s: before compilation\n", shader_name[c->type]); @@ -490,8 +468,7 @@ void rc_run_compiler(struct radeon_compiler *c, struct radeon_compiler_pass *lis rc_run_compiler_passes(c, list); - if (c->Debug & RC_DBG_STATS) - print_stats(c); + print_stats(c); } void rc_validate_final_shader(struct radeon_compiler *c, void *user) diff --git a/src/gallium/drivers/r300/compiler/radeon_compiler.h b/src/gallium/drivers/r300/compiler/radeon_compiler.h index 7089bcbea2c..e33872482ea 100644 --- a/src/gallium/drivers/r300/compiler/radeon_compiler.h +++ b/src/gallium/drivers/r300/compiler/radeon_compiler.h @@ -29,7 +29,6 @@ #include "radeon_emulate_loops.h" #define RC_DBG_LOG (1 << 0) -#define RC_DBG_STATS (1 << 1) struct rc_swizzle_caps; @@ -43,6 +42,7 @@ struct radeon_compiler { struct memory_pool Pool; struct rc_program Program; const struct rc_regalloc_state *regalloc_state; + struct pipe_debug_callback *debug; enum rc_program_type type; unsigned Debug:2; unsigned Error:1; @@ -72,8 +72,6 @@ struct radeon_compiler { /*@}*/ struct emulate_loop_state loop_state; - - unsigned initial_num_insts; /* Number of instructions at start. */ }; void rc_init(struct radeon_compiler * c, const struct rc_regalloc_state *rs); diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c index b5a7d10a075..3acc55d312a 100644 --- a/src/gallium/drivers/r300/r300_context.c +++ b/src/gallium/drivers/r300/r300_context.c @@ -368,6 +368,18 @@ static void r300_init_states(struct pipe_context *pipe) } } +static void +r300_set_debug_callback(struct pipe_context *context, + const struct pipe_debug_callback *cb) +{ + struct r300_context *r300 = r300_context(context); + + if (cb) + r300->debug = *cb; + else + memset(&r300->debug, 0, sizeof(r300->debug)); +} + struct pipe_context* r300_create_context(struct pipe_screen* screen, void *priv, unsigned flags) { @@ -383,6 +395,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen, r300->context.screen = screen; r300->context.priv = priv; + r300->context.set_debug_callback = r300_set_debug_callback; r300->context.destroy = r300_destroy_context; diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 61899809026..e35e6271e5a 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -547,6 +547,8 @@ struct r300_context { /* Occlusion query. */ struct r300_atom query_start; + struct pipe_debug_callback debug; + /* The pointers to the first and the last atom. */ struct r300_atom *first_dirty, *last_dirty; diff --git a/src/gallium/drivers/r300/r300_debug.c b/src/gallium/drivers/r300/r300_debug.c index 13acb634cd1..c86577cd251 100644 --- a/src/gallium/drivers/r300/r300_debug.c +++ b/src/gallium/drivers/r300/r300_debug.c @@ -30,7 +30,6 @@ static const struct debug_named_value r300_debug_options[] = { { "info", DBG_INFO, "Print hardware info (printed by default on debug builds"}, { "fp", DBG_FP, "Log fragment program compilation" }, { "vp", DBG_VP, "Log vertex program compilation" }, - { "pstat", DBG_P_STAT, "Log vertex/fragment program stats" }, { "draw", DBG_DRAW, "Log draw calls" }, { "swtcl", DBG_SWTCL, "Log SWTCL-specific info" }, { "rsblock", DBG_RS_BLOCK, "Log rasterizer registers" }, diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index 382f39b006c..241e5c141c9 100644 --- a/src/gallium/drivers/r300/r300_fs.c +++ b/src/gallium/drivers/r300/r300_fs.c @@ -429,10 +429,11 @@ static void r300_translate_fragment_shader( memset(&compiler, 0, sizeof(compiler)); rc_init(&compiler.Base, &r300->fs_regalloc_state); DBG_ON(r300, DBG_FP) ? compiler.Base.Debug |= RC_DBG_LOG : 0; - DBG_ON(r300, DBG_P_STAT) ? compiler.Base.Debug |= RC_DBG_STATS : 0; compiler.code = &shader->code; compiler.state = shader->compare_state; + if (!shader->dummy) + compiler.Base.debug = &r300->debug; compiler.Base.is_r500 = r300->screen->caps.is_r500; compiler.Base.is_r400 = r300->screen->caps.is_r400; compiler.Base.disable_optimizations = DBG_ON(r300, DBG_NO_OPT); diff --git a/src/gallium/drivers/r300/r300_screen.h b/src/gallium/drivers/r300/r300_screen.h index b28de008304..09332b3adcc 100644 --- a/src/gallium/drivers/r300/r300_screen.h +++ b/src/gallium/drivers/r300/r300_screen.h @@ -103,8 +103,6 @@ radeon_winsys(struct pipe_screen *screen) { #define DBG_NO_ZMASK (1 << 21) #define DBG_NO_HIZ (1 << 22) #define DBG_NO_CMASK (1 << 23) -/* Statistics. */ -#define DBG_P_STAT (1 << 25) /*@}*/ static inline boolean SCREEN_DBG_ON(struct r300_screen * screen, unsigned flags) diff --git a/src/gallium/drivers/r300/r300_vs.c b/src/gallium/drivers/r300/r300_vs.c index 96d6c4386ae..fb225296592 100644 --- a/src/gallium/drivers/r300/r300_vs.c +++ b/src/gallium/drivers/r300/r300_vs.c @@ -214,9 +214,10 @@ void r300_translate_vertex_shader(struct r300_context *r300, rc_init(&compiler.Base, NULL); DBG_ON(r300, DBG_VP) ? compiler.Base.Debug |= RC_DBG_LOG : 0; - DBG_ON(r300, DBG_P_STAT) ? compiler.Base.Debug |= RC_DBG_STATS : 0; compiler.code = &vs->code; compiler.UserData = vs; + if (!vs->dummy) + compiler.Base.debug = &r300->debug; compiler.Base.is_r500 = r300->screen->caps.is_r500; compiler.Base.disable_optimizations = DBG_ON(r300, DBG_NO_OPT); compiler.Base.has_half_swizzles = FALSE;