diff options
author | Timothy Arceri <tarceri@itsqueeze.com> | 2023-07-07 15:20:42 +1000 |
---|---|---|
committer | Timothy Arceri <tarceri@itsqueeze.com> | 2023-07-10 12:47:59 +1000 |
commit | 9cbdf5c9e5a0e940810217e9c0c10245fa1d9aae (patch) | |
tree | 2e5a0e5b38644c96bdb37520e44686b919c51a96 | |
parent | 689f38b2b452a8b8bad5ab9388c7f71ff9074cec (diff) |
glsl: remove dead varyings before assigning attr locations
The GLSL IR code used to clean these up. Some apps such as the Heaven
benchmark fail linking if we don't eliminate them before the linker
validation.
Fixes: a8534c7b4cfc ("glsl: drop the dce of global vars from GLSL IR linker")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9319
Tested-by: Marcus Seyfarth <m.seyfarth@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24035>
-rw-r--r-- | src/compiler/glsl/gl_nir_linker.c | 28 | ||||
-rw-r--r-- | src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt | 3 |
2 files changed, 19 insertions, 12 deletions
diff --git a/src/compiler/glsl/gl_nir_linker.c b/src/compiler/glsl/gl_nir_linker.c index 473456e01cb..deb251f66b5 100644 --- a/src/compiler/glsl/gl_nir_linker.c +++ b/src/compiler/glsl/gl_nir_linker.c @@ -873,6 +873,17 @@ can_remove_varying_before_linking(nir_variable *var, void *data) return true; } +static void +remove_dead_varyings_pre_linking(nir_shader *nir) +{ + struct nir_remove_dead_variables_options opts; + bool is_sso = nir->info.separate_shader; + opts.can_remove_var_data = &is_sso; + opts.can_remove_var = &can_remove_varying_before_linking; + nir_variable_mode mask = nir_var_shader_in | nir_var_shader_out; + nir_remove_dead_variables(nir, mask, &opts); +} + /* - create a gl_PointSize variable * - find every gl_Position write * - store 1.0 to gl_PointSize after every gl_Position write @@ -1015,13 +1026,6 @@ preprocess_shader(const struct gl_constants *consts, (nir->info.outputs_written & (VARYING_BIT_CLIP_DIST0 | VARYING_BIT_CLIP_DIST1))) NIR_PASS_V(nir, gl_nir_zero_initialize_clip_distance); - struct nir_remove_dead_variables_options opts; - bool is_sso = nir->info.separate_shader; - opts.can_remove_var_data = &is_sso; - opts.can_remove_var = &can_remove_varying_before_linking; - nir_variable_mode mask = nir_var_shader_in | nir_var_shader_out; - nir_remove_dead_variables(nir, mask, &opts); - if (options->lower_all_io_to_temps || nir->info.stage == MESA_SHADER_VERTEX || nir->info.stage == MESA_SHADER_GEOMETRY) { @@ -1134,8 +1138,11 @@ gl_nir_link_spirv(const struct gl_constants *consts, MESA_TRACE_FUNC(); for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i]) + if (prog->_LinkedShaders[i]) { linked_shader[num_shaders++] = prog->_LinkedShaders[i]; + + remove_dead_varyings_pre_linking(prog->_LinkedShaders[i]->Program->nir); + } } if (!prelink_lowering(consts, exts, prog, linked_shader, num_shaders)) @@ -1318,8 +1325,11 @@ gl_nir_link_glsl(const struct gl_constants *consts, unsigned num_shaders = 0; for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i]) + if (prog->_LinkedShaders[i]) { linked_shader[num_shaders++] = prog->_LinkedShaders[i]; + + remove_dead_varyings_pre_linking(prog->_LinkedShaders[i]->Program->nir); + } } if (!gl_assign_attribute_or_color_locations(consts, prog)) diff --git a/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt b/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt index 819a78fe145..b52fbd96804 100644 --- a/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt +++ b/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt @@ -409,6 +409,3 @@ spec@nv_copy_depth_to_color@nv_copy_depth_to_color 1 0x223344ff,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 1 0x76356278,Fail spec@nv_copy_image@nv_copy_image-formats,Crash wgl@wgl-multi-context-single-window,Fail - -# Introduced while CI was disabled -spec@arb_draw_buffers@fbo-mrt-new-bind,Fail |