From cfc461fca6ad5656f58c48803d13052537063316 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 1 Sep 2010 08:12:51 +0200 Subject: [PATCH] r300g: add a new debug option which disables compiler optimizations Those are: - dead-code elimination - constant folding - peephole (mainly copy propagation) - register allocation There are some bugs which I need to track down. Also fix up the descriptions of all the debug options. --- src/gallium/drivers/r300/r300_debug.c | 37 ++++++++++--------- src/gallium/drivers/r300/r300_fs.c | 1 + src/gallium/drivers/r300/r300_screen.h | 1 + src/gallium/drivers/r300/r300_vs.c | 1 + .../drivers/dri/r300/compiler/r3xx_fragprog.c | 7 ++-- .../drivers/dri/r300/compiler/r3xx_vertprog.c | 7 ++-- .../dri/r300/compiler/radeon_compiler.h | 1 + src/mesa/drivers/dri/r300/r300_blit.c | 2 + .../drivers/dri/r300/r300_fragprog_common.c | 1 + src/mesa/drivers/dri/r300/r300_vertprog.c | 1 + 10 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/gallium/drivers/r300/r300_debug.c b/src/gallium/drivers/r300/r300_debug.c index c3e157e99af..786fdf6ce8d 100644 --- a/src/gallium/drivers/r300/r300_debug.c +++ b/src/gallium/drivers/r300/r300_debug.c @@ -27,24 +27,25 @@ #include static const struct debug_named_value debug_options[] = { - { "fp", DBG_FP, "Fragment program handling (for debugging)" }, - { "vp", DBG_VP, "Vertex program handling (for debugging)" }, - { "draw", DBG_DRAW, "Draw calls (for debugging)" }, - { "swtcl", DBG_SWTCL, "SWTCL-specific info (for debugging)" }, - { "rsblock", DBG_RS_BLOCK, "Rasterizer registers (for debugging)" }, - { "psc", DBG_PSC, "Vertex stream registers (for debugging)" }, - { "tex", DBG_TEX, "Textures (for debugging)" }, - { "texalloc", DBG_TEXALLOC, "Texture allocation (for debugging)" }, - { "fall", DBG_FALL, "Fallbacks (for debugging)" }, - { "rs", DBG_RS, "Rasterizer (for debugging)" }, - { "fb", DBG_FB, "Framebuffer (for debugging)" }, - { "cbzb", DBG_CBZB, "Fast color clear info (for debugging)" }, - { "fakeocc", DBG_FAKE_OCC, "Use fake occlusion queries (for debugging)" }, - { "anisohq", DBG_ANISOHQ, "High quality anisotropic filtering (for benchmarking)" }, - { "notiling", DBG_NO_TILING, "Disable tiling (for benchmarking)" }, - { "noimmd", DBG_NO_IMMD, "Disable immediate mode (for benchmarking)" }, - { "stats", DBG_STATS, "Gather statistics" }, - { "hyperz", DBG_HYPERZ, "HyperZ (for debugging)" }, + { "fp", DBG_FP, "Log fragment program compilation" }, + { "vp", DBG_VP, "Log bertex program compilation" }, + { "draw", DBG_DRAW, "Log draw calls" }, + { "swtcl", DBG_SWTCL, "Log SWTCL-specific info" }, + { "rsblock", DBG_RS_BLOCK, "Log rasterizer registers" }, + { "psc", DBG_PSC, "Log vertex stream registers" }, + { "tex", DBG_TEX, "Log basic info about textures" }, + { "texalloc", DBG_TEXALLOC, "Log texture mipmap tree info" }, + { "fall", DBG_FALL, "Log fallbacks" }, + { "rs", DBG_RS, "Log rasterizer" }, + { "fb", DBG_FB, "Log framebuffer" }, + { "cbzb", DBG_CBZB, "Log fast color clear info" }, + { "stats", DBG_STATS, "Log emission statistics" }, + { "hyperz", DBG_HYPERZ, "Log HyperZ info" }, + { "fakeocc", DBG_FAKE_OCC, "Use fake occlusion queries" }, + { "anisohq", DBG_ANISOHQ, "Use high quality anisotropic filtering" }, + { "notiling", DBG_NO_TILING, "Disable tiling" }, + { "noimmd", DBG_NO_IMMD, "Disable immediate mode" }, + { "noopt", DBG_NO_OPT, "Disable shader optimizations" }, /* must be last */ DEBUG_NAMED_VALUE_END diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index e8ebe90b33b..b9f4d77dea7 100644 --- a/src/gallium/drivers/r300/r300_fs.c +++ b/src/gallium/drivers/r300/r300_fs.c @@ -385,6 +385,7 @@ static void r300_translate_fragment_shader( compiler.code = &shader->code; compiler.state = shader->compare_state; compiler.Base.is_r500 = r300->screen->caps.is_r500; + compiler.Base.disable_optimizations = DBG_ON(r300, DBG_NO_OPT); compiler.Base.has_half_swizzles = TRUE; compiler.Base.max_temp_regs = compiler.Base.is_r500 ? 128 : 32; compiler.Base.max_constants = compiler.Base.is_r500 ? 256 : 32; diff --git a/src/gallium/drivers/r300/r300_screen.h b/src/gallium/drivers/r300/r300_screen.h index 13a3320b992..f2f63213e0d 100644 --- a/src/gallium/drivers/r300/r300_screen.h +++ b/src/gallium/drivers/r300/r300_screen.h @@ -97,6 +97,7 @@ r300_winsys_screen(struct pipe_screen *screen) { #define DBG_NO_TILING (1 << 17) #define DBG_NO_IMMD (1 << 18) #define DBG_FAKE_OCC (1 << 19) +#define DBG_NO_OPT (1 << 20) /* Statistics. */ #define DBG_STATS (1 << 24) /*@}*/ diff --git a/src/gallium/drivers/r300/r300_vs.c b/src/gallium/drivers/r300/r300_vs.c index 2db7b52a87e..add3d552c45 100644 --- a/src/gallium/drivers/r300/r300_vs.c +++ b/src/gallium/drivers/r300/r300_vs.c @@ -205,6 +205,7 @@ void r300_translate_vertex_shader(struct r300_context *r300, compiler.code = &vs->code; compiler.UserData = vs; 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; compiler.Base.max_temp_regs = 32; compiler.Base.max_constants = 256; diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c index 096afe8ad6a..137267f4a63 100644 --- a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c +++ b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c @@ -94,6 +94,7 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c) { int is_r500 = c->Base.is_r500; int kill_consts = c->Base.remove_unused_constants; + int opt = !c->Base.disable_optimizations; /* Lists of instruction transformations. */ struct radeon_program_transformation rewrite_tex[] = { @@ -128,9 +129,9 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c) {"transform TEX", 1, 1, rc_local_transform, rewrite_tex}, {"native rewrite", 1, is_r500, rc_local_transform, native_rewrite_r500}, {"native rewrite", 1, !is_r500, rc_local_transform, native_rewrite_r300}, - {"deadcode", 1, 1, rc_dataflow_deadcode, dataflow_outputs_mark_use}, + {"deadcode", 1, opt, rc_dataflow_deadcode, dataflow_outputs_mark_use}, {"emulate loops", 1, !is_r500, rc_emulate_loops, NULL}, - {"dataflow optimize", 1, 1, rc_optimize, NULL}, + {"dataflow optimize", 1, opt, rc_optimize, NULL}, {"dataflow swizzles", 1, 1, rc_dataflow_swizzles, NULL}, {"dead constants", 1, kill_consts, rc_remove_unused_constants, &c->code->constants_remap_table}, /* This pass makes it easier for the scheduler to group TEX @@ -139,7 +140,7 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c) {"register rename", 1, !is_r500, rc_rename_regs, NULL}, {"pair translate", 1, 1, rc_pair_translate, NULL}, {"pair scheduling", 1, 1, rc_pair_schedule, NULL}, - {"register allocation", 1, 1, rc_pair_regalloc, NULL}, + {"register allocation", 1, opt, rc_pair_regalloc, NULL}, {"final code validation", 0, 1, rc_validate_final_shader, NULL}, {"machine code generation", 0, is_r500, r500BuildFragmentProgramHwCode, NULL}, {"machine code generation", 0, !is_r500, r300BuildFragmentProgramHwCode, NULL}, diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c index e9fb49e7c13..3e8a8236c05 100644 --- a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c +++ b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c @@ -991,6 +991,7 @@ void r3xx_compile_vertex_program(struct r300_vertex_program_compiler *c) { int is_r500 = c->Base.is_r500; int kill_consts = c->Base.remove_unused_constants; + int opt = !c->Base.disable_optimizations; /* Lists of instruction transformations. */ struct radeon_program_transformation alu_rewrite_r500[] = { @@ -1029,12 +1030,12 @@ void r3xx_compile_vertex_program(struct r300_vertex_program_compiler *c) {"native rewrite", 1, is_r500, rc_local_transform, alu_rewrite_r500}, {"native rewrite", 1, !is_r500, rc_local_transform, alu_rewrite_r300}, {"emulate modifiers", 1, !is_r500, rc_local_transform, emulate_modifiers}, - {"deadcode", 1, 1, rc_dataflow_deadcode, dataflow_outputs_mark_used}, - {"dataflow optimize", 1, 1, rc_optimize, NULL}, + {"deadcode", 1, opt, rc_dataflow_deadcode, dataflow_outputs_mark_used}, + {"dataflow optimize", 1, opt, rc_optimize, NULL}, /* This pass must be done after optimizations. */ {"source conflict resolve", 1, 1, rc_local_transform, resolve_src_conflicts}, {"dataflow swizzles", 1, 1, rc_dataflow_swizzles, NULL}, - {"register allocation", 1, 1, allocate_temporary_registers, NULL}, + {"register allocation", 1, opt, allocate_temporary_registers, NULL}, {"dead constants", 1, kill_consts, rc_remove_unused_constants, &c->code->constants_remap_table}, {"final code validation", 0, 1, rc_validate_final_shader, NULL}, {"machine code generation", 0, 1, translate_vertex_program, NULL}, diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h index f6a8e834342..85c2e43ad67 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h +++ b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h @@ -42,6 +42,7 @@ struct radeon_compiler { /* Hardware specification. */ unsigned is_r500:1; unsigned has_half_swizzles:1; + unsigned disable_optimizations:1; unsigned max_temp_regs; unsigned max_constants; int max_alu_insts; diff --git a/src/mesa/drivers/dri/r300/r300_blit.c b/src/mesa/drivers/dri/r300/r300_blit.c index e43f0eeb889..5f261e07e62 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.c +++ b/src/mesa/drivers/dri/r300/r300_blit.c @@ -89,6 +89,7 @@ static void create_vertex_program(struct r300_context *r300) compiler.SetHwInputOutput = vp_ins_outs; compiler.code = &r300->blit.vp_code; compiler.Base.is_r500 = r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515; + compiler.Base.disable_optimizations = 0; compiler.Base.has_half_swizzles = 0; compiler.Base.max_temp_regs = 32; compiler.Base.max_constants = 256; @@ -124,6 +125,7 @@ static void create_fragment_program(struct r300_context *r300) compiler.OutputDepth = FRAG_RESULT_DEPTH; compiler.enable_shadow_ambient = GL_TRUE; compiler.Base.is_r500 = (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515); + compiler.Base.disable_optimizations = 0; compiler.Base.has_half_swizzles = 1; compiler.Base.max_temp_regs = (compiler.Base.is_r500) ? 128 : 32; compiler.Base.max_constants = compiler.Base.is_r500 ? 256 : 32; diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_common.c b/src/mesa/drivers/dri/r300/r300_fragprog_common.c index 47cf3e49008..d0006d6c3c2 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_common.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_common.c @@ -220,6 +220,7 @@ static void translate_fragment_program(GLcontext *ctx, struct r300_fragment_prog compiler.state = fp->state; compiler.enable_shadow_ambient = GL_TRUE; compiler.Base.is_r500 = (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) ? GL_TRUE : GL_FALSE; + compiler.Base.disable_optimizations = 0; compiler.Base.has_half_swizzles = 1; compiler.Base.max_temp_regs = (compiler.Base.is_r500) ? 128 : 32; compiler.Base.max_constants = compiler.Base.is_r500 ? 256 : 32; diff --git a/src/mesa/drivers/dri/r300/r300_vertprog.c b/src/mesa/drivers/dri/r300/r300_vertprog.c index 1d24266fbdd..4a3bbdb44d1 100644 --- a/src/mesa/drivers/dri/r300/r300_vertprog.c +++ b/src/mesa/drivers/dri/r300/r300_vertprog.c @@ -245,6 +245,7 @@ static struct r300_vertex_program *build_program(GLcontext *ctx, compiler.RequiredOutputs = compute_required_outputs(vp->Base, vp->key.FpReads); compiler.SetHwInputOutput = &t_inputs_outputs; compiler.Base.is_r500 = R300_CONTEXT(ctx)->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515; + compiler.Base.disable_optimizations = 0; compiler.Base.has_half_swizzles = 0; compiler.Base.max_temp_regs = 32; compiler.Base.max_constants = 256; -- 2.30.2