From 991def0edc823293d593fc23d2243556cbdc0ff4 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 21 Jul 2020 15:11:56 -0700 Subject: [PATCH] softpipe: Convert to comma-separated SOFTPIPE_DEBUG for debug options. This makes us more like other drivers, and avoids having tons of different names (particularly when you want to dump vs and fs in debugging). In the process, having a debug flag for vertex shaders just falls out. Reviewed-by: Dave Airlie Part-of: --- docs/envvars.rst | 25 ++++++++++++++++--------- src/gallium/drivers/softpipe/sp_clear.c | 3 ++- src/gallium/drivers/softpipe/sp_context.c | 7 ------- src/gallium/drivers/softpipe/sp_context.h | 5 ----- src/gallium/drivers/softpipe/sp_screen.c | 16 ++++++++++++++-- src/gallium/drivers/softpipe/sp_screen.h | 11 +++++++++++ src/gallium/drivers/softpipe/sp_setup.c | 10 +++++++--- src/gallium/drivers/softpipe/sp_state_shader.c | 10 +++++----- 8 files changed, 55 insertions(+), 32 deletions(-) diff --git a/docs/envvars.rst b/docs/envvars.rst index de6d496..76397ee 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -414,15 +414,22 @@ Clover environment variables Softpipe driver environment variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``SOFTPIPE_DUMP_FS`` - if set, the softpipe driver will print fragment shaders to stderr -``SOFTPIPE_DUMP_GS`` - if set, the softpipe driver will print geometry shaders to stderr -``SOFTPIPE_NO_RAST`` - if set, rasterization is no-op'd. For profiling purposes. -``SOFTPIPE_USE_LLVM`` - if set, the softpipe driver will try to use LLVM JIT for vertex - shading processing. +``SOFTPIPE_DEBUG`` + a comma-separated list of named flags, which do various things: + + ``vs`` + Dump vertex shader assembly to stderr + ``fs`` + Dump fragment shader assembly to stderr + ``gs`` + Dump geometry shader assembly to stderr + ``cs`` + Dump compute shader assembly to stderr + ``no_rast`` + rasterization is no-op'd. For profiling purposes. + ``use_llvm`` + the softpipe driver will try to use LLVM JIT for vertex + shading processing. LLVMpipe driver environment variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/gallium/drivers/softpipe/sp_clear.c b/src/gallium/drivers/softpipe/sp_clear.c index 300cbd0..7ad4b09 100644 --- a/src/gallium/drivers/softpipe/sp_clear.c +++ b/src/gallium/drivers/softpipe/sp_clear.c @@ -37,6 +37,7 @@ #include "util/u_surface.h" #include "sp_clear.h" #include "sp_context.h" +#include "sp_screen.h" #include "sp_query.h" #include "sp_tile_cache.h" @@ -57,7 +58,7 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, uint64_t cv; uint i; - if (softpipe->no_rast) + if (unlikely(sp_debug & SP_DBG_NO_RAST)) return; if (!softpipe_check_render_cond(softpipe)) diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c index ed0e678..6a896b8 100644 --- a/src/gallium/drivers/softpipe/sp_context.c +++ b/src/gallium/drivers/softpipe/sp_context.c @@ -214,10 +214,6 @@ softpipe_create_context(struct pipe_screen *screen, softpipe->tgsi.buffer[i] = sp_create_tgsi_buffer(); } - softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", false ); - softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", false ); - softpipe->dump_cs = debug_get_bool_option( "SOFTPIPE_DUMP_CS", false ); - softpipe->pipe.screen = screen; softpipe->pipe.destroy = softpipe_destroy; softpipe->pipe.priv = priv; @@ -316,9 +312,6 @@ softpipe_create_context(struct pipe_screen *screen, (struct tgsi_buffer *) softpipe->tgsi.buffer[PIPE_SHADER_GEOMETRY]); - if (debug_get_bool_option( "SOFTPIPE_NO_RAST", false )) - softpipe->no_rast = TRUE; - softpipe->vbuf_backend = sp_create_vbuf_backend(softpipe); if (!softpipe->vbuf_backend) goto fail; diff --git a/src/gallium/drivers/softpipe/sp_context.h b/src/gallium/drivers/softpipe/sp_context.h index 21b867a..d4be1ef 100644 --- a/src/gallium/drivers/softpipe/sp_context.h +++ b/src/gallium/drivers/softpipe/sp_context.h @@ -204,11 +204,6 @@ struct softpipe_context { * of sp_sampler_view? */ struct softpipe_tex_tile_cache *tex_cache[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS]; - - unsigned dump_fs : 1; - unsigned dump_gs : 1; - unsigned dump_cs : 1; - unsigned no_rast : 1; }; diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 49d571a..7066e2f 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -46,7 +46,17 @@ #include "sp_fence.h" #include "sp_public.h" -DEBUG_GET_ONCE_BOOL_OPTION(use_llvm, "SOFTPIPE_USE_LLVM", FALSE) +static const struct debug_named_value sp_debug_options[] = { + {"vs", SP_DBG_VS, "dump vertex shader assembly to stderr"}, + {"gs", SP_DBG_GS, "dump geometry shader assembly to stderr"}, + {"fs", SP_DBG_FS, "dump fragment shader assembly to stderr"}, + {"cs", SP_DBG_CS, "dump compute shader assembly to stderr"}, + {"no_rast", SP_DBG_NO_RAST, "no-ops rasterization, for profiling purposes"}, + {"use_llvm", SP_DBG_USE_LLVM, "Use LLVM if available for shaders"}, +}; + +int sp_debug; +DEBUG_GET_ONCE_FLAGS_OPTION(sp_debug, "SOFTPIPE_DEBUG", sp_debug_options, 0) static const char * softpipe_get_vendor(struct pipe_screen *screen) @@ -519,6 +529,8 @@ softpipe_create_screen(struct sw_winsys *winsys) if (!screen) return NULL; + sp_debug = debug_get_option_sp_debug(); + screen->winsys = winsys; screen->base.destroy = softpipe_destroy_screen; @@ -534,7 +546,7 @@ softpipe_create_screen(struct sw_winsys *winsys) screen->base.context_create = softpipe_create_context; screen->base.flush_frontbuffer = softpipe_flush_frontbuffer; screen->base.get_compute_param = softpipe_get_compute_param; - screen->use_llvm = debug_get_option_use_llvm(); + screen->use_llvm = sp_debug & SP_DBG_USE_LLVM; softpipe_init_screen_texture_funcs(&screen->base); softpipe_init_screen_fence_funcs(&screen->base); diff --git a/src/gallium/drivers/softpipe/sp_screen.h b/src/gallium/drivers/softpipe/sp_screen.h index f0e9291..969fa37 100644 --- a/src/gallium/drivers/softpipe/sp_screen.h +++ b/src/gallium/drivers/softpipe/sp_screen.h @@ -55,6 +55,17 @@ softpipe_screen( struct pipe_screen *pipe ) return (struct softpipe_screen *)pipe; } +enum sp_debug_flag { + SP_DBG_VS = BITFIELD_BIT(0), + /* SP_DBG_TCS = BITFIELD_BIT(1), */ + /* SP_DBG_TES = BITFIELD_BIT(2), */ + SP_DBG_GS = BITFIELD_BIT(3), + SP_DBG_FS = BITFIELD_BIT(4), + SP_DBG_CS = BITFIELD_BIT(5), + SP_DBG_USE_LLVM = BITFIELD_BIT(6), + SP_DBG_NO_RAST = BITFIELD_BIT(7), +}; +extern int sp_debug; #endif /* SP_SCREEN_H */ diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c index a91e4f5..c64337d 100644 --- a/src/gallium/drivers/softpipe/sp_setup.c +++ b/src/gallium/drivers/softpipe/sp_setup.c @@ -33,6 +33,7 @@ */ #include "sp_context.h" +#include "sp_screen.h" #include "sp_quad.h" #include "sp_quad_pipe.h" #include "sp_setup.h" @@ -808,7 +809,8 @@ sp_setup_tri(struct setup_context *setup, print_vertex(setup, v2); #endif - if (setup->softpipe->no_rast || setup->softpipe->rasterizer->rasterizer_discard) + if (unlikely(sp_debug & SP_DBG_NO_RAST) || + setup->softpipe->rasterizer->rasterizer_discard) return; det = calc_det(v0, v1, v2); @@ -1093,7 +1095,8 @@ sp_setup_line(struct setup_context *setup, print_vertex(setup, v1); #endif - if (setup->softpipe->no_rast || setup->softpipe->rasterizer->rasterizer_discard) + if (unlikely(sp_debug & SP_DBG_NO_RAST) || + setup->softpipe->rasterizer->rasterizer_discard) return; if (dx == 0 && dy == 0) @@ -1240,7 +1243,8 @@ sp_setup_point(struct setup_context *setup, assert(sinfo->valid); - if (setup->softpipe->no_rast || setup->softpipe->rasterizer->rasterizer_discard) + if (unlikely(sp_debug & SP_DBG_NO_RAST) || + setup->softpipe->rasterizer->rasterizer_discard) return; assert(setup->softpipe->reduced_prim == PIPE_PRIM_POINTS); diff --git a/src/gallium/drivers/softpipe/sp_state_shader.c b/src/gallium/drivers/softpipe/sp_state_shader.c index fef187e..b53d554 100644 --- a/src/gallium/drivers/softpipe/sp_state_shader.c +++ b/src/gallium/drivers/softpipe/sp_state_shader.c @@ -26,6 +26,7 @@ **************************************************************************/ #include "sp_context.h" +#include "sp_screen.h" #include "sp_state.h" #include "sp_fs.h" #include "sp_texture.h" @@ -137,7 +138,7 @@ softpipe_create_fs_state(struct pipe_context *pipe, struct softpipe_context *softpipe = softpipe_context(pipe); struct sp_fragment_shader *state = CALLOC_STRUCT(sp_fragment_shader); - softpipe_create_shader_state(&state->shader, templ, softpipe->dump_fs); + softpipe_create_shader_state(&state->shader, templ, sp_debug & SP_DBG_FS); /* draw's fs state */ state->draw_shader = draw_create_fragment_shader(softpipe->draw, @@ -221,7 +222,7 @@ softpipe_create_vs_state(struct pipe_context *pipe, if (!state) goto fail; - softpipe_create_shader_state(&state->shader, templ, false); + softpipe_create_shader_state(&state->shader, templ, sp_debug & SP_DBG_VS); if (!state->shader.tokens) goto fail; @@ -281,7 +282,7 @@ softpipe_create_gs_state(struct pipe_context *pipe, if (!state) goto fail; - softpipe_create_shader_state(&state->shader, templ, softpipe->dump_gs); + softpipe_create_shader_state(&state->shader, templ, sp_debug & SP_DBG_GS); if (templ->tokens) { state->draw_data = draw_create_geometry_shader(softpipe->draw, templ); @@ -380,7 +381,6 @@ static void * softpipe_create_compute_state(struct pipe_context *pipe, const struct pipe_compute_state *templ) { - struct softpipe_context *softpipe = softpipe_context(pipe); const struct tgsi_token *tokens; struct sp_compute_shader *state; if (templ->ir_type != PIPE_SHADER_IR_TGSI) @@ -388,7 +388,7 @@ softpipe_create_compute_state(struct pipe_context *pipe, tokens = templ->prog; /* debug */ - if (softpipe->dump_cs) + if (sp_debug & SP_DBG_CS) tgsi_dump(tokens, 0); state = CALLOC_STRUCT(sp_compute_shader); -- 2.7.4