From f3df3d4c80f5613791f969020189ebff9da99e32 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Thu, 5 May 2022 16:28:34 -0700 Subject: [PATCH] glsl: Make all drivers take the GLSLOptimizeConservatively path. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that all consumers of GLSL use NIR, make the remaining drivers take the path that relies on NIR to really do optimization. nouveau steam shader-db runtime -6.69631% +/- 1.29235% (n=12). No change on shader-db there. Reviewed-by: Marek Olšák Reviewed-by: Karol Herbst Reviewed-by: Rob Clark Reviewed-by: Timothy Arceri Part-of: --- docs/gallium/screen.rst | 3 --- src/compiler/glsl/glsl_parser_extras.cpp | 24 ++++++------------- src/compiler/glsl/linker.cpp | 16 ++++--------- .../glsl/tests/lower_precision_test.py | 2 +- src/gallium/auxiliary/util/u_screen.c | 1 - src/gallium/drivers/d3d12/d3d12_screen.cpp | 3 --- src/gallium/drivers/etnaviv/etnaviv_screen.c | 1 - .../drivers/freedreno/freedreno_screen.c | 1 - src/gallium/drivers/i915/i915_screen.c | 1 - src/gallium/drivers/llvmpipe/lp_screen.c | 1 - .../drivers/nouveau/nv30/nv30_screen.c | 1 - .../drivers/nouveau/nv50/nv50_screen.c | 1 - .../drivers/nouveau/nvc0/nvc0_screen.c | 1 - src/gallium/drivers/r300/r300_screen.c | 2 -- src/gallium/drivers/r600/r600_pipe.c | 3 --- src/gallium/drivers/radeonsi/si_get.c | 1 - src/gallium/drivers/svga/svga_screen.c | 1 - src/gallium/drivers/virgl/virgl_screen.c | 1 - src/gallium/drivers/zink/zink_screen.c | 3 --- src/gallium/include/pipe/p_defines.h | 1 - src/mesa/main/consts_exts.h | 7 ------ src/mesa/main/ff_fragment_shader.cpp | 10 -------- src/mesa/state_tracker/st_extensions.c | 2 -- 23 files changed, 12 insertions(+), 75 deletions(-) diff --git a/docs/gallium/screen.rst b/docs/gallium/screen.rst index 06c4bbf4d10..808afec859a 100644 --- a/docs/gallium/screen.rst +++ b/docs/gallium/screen.rst @@ -412,9 +412,6 @@ The integer capabilities: ARB_transform_feedback3. * ``PIPE_CAP_SHADER_CAN_READ_OUTPUTS``: Whether every TGSI shader stage can read from the output file. -* ``PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY``: Tell the GLSL compiler to use - the minimum amount of optimizations just to be able to do all the linking - and lowering. * ``PIPE_CAP_FBFETCH``: The number of render targets whose value in the current framebuffer can be read in the shader. 0 means framebuffer fetch is not supported. 1 means that only the first render target can be read, diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 4576d076582..a9cacdb7f28 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -2109,18 +2109,12 @@ opt_shader_and_create_symbol_table(const struct gl_constants *consts, &consts->ShaderCompilerOptions[shader->Stage]; /* Do some optimization at compile time to reduce shader IR size - * and reduce later work if the same shader is linked multiple times + * and reduce later work if the same shader is linked multiple times. + * + * Run it just once, since NIR will do the real optimization. */ - if (consts->GLSLOptimizeConservatively) { - /* Run it just once. */ - do_common_optimization(shader->ir, false, false, options, - consts->NativeIntegers); - } else { - /* Repeat it until it stops making changes. */ - while (do_common_optimization(shader->ir, false, false, options, - consts->NativeIntegers)) - ; - } + do_common_optimization(shader->ir, false, false, options, + consts->NativeIntegers); validate_ir_tree(shader->ir); @@ -2470,12 +2464,8 @@ do_common_optimization(exec_list *ir, bool linked, delete ls; } - /* If the PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY cap is set, this pass will - * only be called once rather than repeatedly until no further progress is - * made. - * - * If an optimization pass fails to preserve the invariant flag, calling - * the pass only once may result in incorrect code generation. Always call + /* If an optimization pass fails to preserve the invariant flag, calling + * the pass only once earlier may result in incorrect code generation. Always call * propagate_invariance() last to avoid this possibility. */ OPT(propagate_invariance, ir); diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index e0fafa3f772..f0ba5c39666 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -4188,18 +4188,10 @@ static void linker_optimisation_loop(const struct gl_constants *consts, exec_list *ir, unsigned stage) { - if (consts->GLSLOptimizeConservatively) { - /* Run it just once. */ - do_common_optimization(ir, true, false, - &consts->ShaderCompilerOptions[stage], - consts->NativeIntegers); - } else { - /* Repeat it until it stops making changes. */ - while (do_common_optimization(ir, true, false, - &consts->ShaderCompilerOptions[stage], - consts->NativeIntegers)) - ; - } + /* Run it just once, since NIR will do the real optimizaiton. */ + do_common_optimization(ir, true, false, + &consts->ShaderCompilerOptions[stage], + consts->NativeIntegers); } void diff --git a/src/compiler/glsl/tests/lower_precision_test.py b/src/compiler/glsl/tests/lower_precision_test.py index 51b00993235..fea5718e77e 100644 --- a/src/compiler/glsl/tests/lower_precision_test.py +++ b/src/compiler/glsl/tests/lower_precision_test.py @@ -1268,7 +1268,7 @@ TESTS = [ color2 = y + 1; } """, - r'assign \(x\) \(var_ref x\) \(expression float f162f'), + r'assign \(x\) \(var_ref x@2\) \(expression float f162f'), Test("ldexp", """ #version 310 es diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index b9a1ccb552e..2cfe1fadf25 100644 --- a/src/gallium/auxiliary/util/u_screen.c +++ b/src/gallium/auxiliary/util/u_screen.c @@ -294,7 +294,6 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, case PIPE_CAP_RASTERIZER_SUBPIXEL_BITS: return 4; /* GLES 2.0 minimum value */ - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_PREFER_BACK_BUFFER_REUSE: return 1; diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index 093697e6bef..73c02514459 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -254,9 +254,6 @@ d3d12_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_PCI_FUNCTION: return 0; /* TODO: figure these out */ - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: - return 0; /* not sure */ - case PIPE_CAP_FLATSHADE: case PIPE_CAP_ALPHA_TEST: case PIPE_CAP_TWO_SIDED_COLOR: diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index 684370b5132..9fd2ce946e7 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -185,7 +185,6 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) /* Unsupported features. */ case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: case PIPE_CAP_TEXRECT: return 0; diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 04aaf6cf78a..68d1c59f293 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -408,7 +408,6 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return 64 * 1024 * 1024; case PIPE_CAP_SHAREABLE_SHADERS: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: if (is_ir3(screen)) return 1; return 0; diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c index 61988a52f54..d22a646062b 100644 --- a/src/gallium/drivers/i915/i915_screen.c +++ b/src/gallium/drivers/i915/i915_screen.c @@ -410,7 +410,6 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap) case PIPE_CAP_PCI_FUNCTION: return 0; - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: return 0; diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 06b706e15c4..94eda66c66c 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -329,7 +329,6 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_PCI_BUS: case PIPE_CAP_PCI_DEVICE: case PIPE_CAP_PCI_FUNCTION: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: return 0; diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index 7240e932335..8571a3beb65 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -218,7 +218,6 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_SHADER_ARRAY_COMPONENTS: case PIPE_CAP_SHADER_CAN_READ_OUTPUTS: case PIPE_CAP_NATIVE_FENCE_FD: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_FBFETCH: case PIPE_CAP_TGSI_MUL_ZERO_WINS: case PIPE_CAP_DOUBLES: diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index 220827ea203..4c23a69e778 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -338,7 +338,6 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: case PIPE_CAP_SHADER_CAN_READ_OUTPUTS: case PIPE_CAP_NATIVE_FENCE_FD: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_FBFETCH: case PIPE_CAP_DOUBLES: case PIPE_CAP_INT64: diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c index 8a875fd4cc0..bac94957928 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -384,7 +384,6 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_PCI_FUNCTION: case PIPE_CAP_SHADER_CAN_READ_OUTPUTS: case PIPE_CAP_NATIVE_FENCE_FD: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE: case PIPE_CAP_NIR_SAMPLERS_AS_DEREF: case PIPE_CAP_MEMOBJ: diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index 8027b3cef51..d4521247c4a 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -176,8 +176,6 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_VERTEX_SHADER_SATURATE: return is_r500 ? 1 : 0; - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: - return 0; case PIPE_CAP_SHAREABLE_SHADERS: return 0; diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index d2fc3fce6dc..cc6fbba79e3 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -411,9 +411,6 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_MAX_COMBINED_SHADER_BUFFERS: return 8; - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: - return 0; - case PIPE_CAP_INT64: case PIPE_CAP_DOUBLES: if (rscreen->b.family == CHIP_ARUBA || diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index 870ebe9d000..07d0a2457d6 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -128,7 +128,6 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_CULL_DISTANCE: case PIPE_CAP_SHADER_ARRAY_COMPONENTS: case PIPE_CAP_SHADER_CAN_READ_OUTPUTS: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: case PIPE_CAP_DOUBLES: diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index dd17f5ed1bf..b5fe42a2e67 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c @@ -450,7 +450,6 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_DOUBLES: return sws->have_sm5; case PIPE_CAP_UMA: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: return 0; case PIPE_CAP_TGSI_DIV: diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 19c816a595d..135ccf2fd03 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -315,7 +315,6 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_PCI_BUS: case PIPE_CAP_PCI_DEVICE: case PIPE_CAP_PCI_FUNCTION: - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: return 0; case PIPE_CAP_CLEAR_TEXTURE: diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index c9049a7513f..8eb19c15bb2 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -684,9 +684,6 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS: return screen->info.props.limits.viewportSubPixelBits; - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: - return 0; /* not sure */ - case PIPE_CAP_MAX_GS_INVOCATIONS: return screen->info.props.limits.maxGeometryShaderInvocations; diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 5e09f00cfad..88975e66026 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -888,7 +888,6 @@ enum pipe_cap PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS, PIPE_CAP_SHADER_CAN_READ_OUTPUTS, PIPE_CAP_NATIVE_FENCE_FD, - PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY, PIPE_CAP_GLSL_TESS_LEVELS_AS_INPUTS, PIPE_CAP_FBFETCH, PIPE_CAP_TGSI_MUL_ZERO_WINS, diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h index 1de115b162e..8af55ad3085 100644 --- a/src/mesa/main/consts_exts.h +++ b/src/mesa/main/consts_exts.h @@ -765,13 +765,6 @@ struct gl_constants bool GLSLPointCoordIsSysVal; bool GLSLFrontFacingIsSysVal; - /** - * Run the minimum amount of GLSL optimizations to be able to link - * shaders optimally (eliminate dead varyings and uniforms) and just do - * all the necessary lowering. - */ - bool GLSLOptimizeConservatively; - /** * Whether to call lower_const_arrays_to_uniforms() during linking. */ diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp index c9f0a73028f..add6a09d7c4 100644 --- a/src/mesa/main/ff_fragment_shader.cpp +++ b/src/mesa/main/ff_fragment_shader.cpp @@ -1093,16 +1093,6 @@ create_new_program(struct gl_context *ctx, struct state_key *key) validate_ir_tree(p.shader->ir); - const struct gl_shader_compiler_options *options = - &ctx->Const.ShaderCompilerOptions[MESA_SHADER_FRAGMENT]; - - /* Conservative approach: Don't optimize here, the linker does it too. */ - if (!ctx->Const.GLSLOptimizeConservatively) { - while (do_common_optimization(p.shader->ir, false, false, options, - ctx->Const.NativeIntegers)) - ; - } - reparent_ir(p.shader->ir, p.shader->ir); p.shader->CompileStatus = COMPILE_SUCCESS; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 61707d7a5dc..251c5d5ab06 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -387,8 +387,6 @@ void st_init_limits(struct pipe_screen *screen, c->Program[MESA_SHADER_GEOMETRY].MaxUniformComponents + c->Program[MESA_SHADER_FRAGMENT].MaxUniformComponents; - c->GLSLOptimizeConservatively = - screen->get_param(screen, PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY); c->GLSLLowerConstArrays = screen->get_param(screen, PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF); c->GLSLTessLevelsAsInputs =