Module: Mesa Branch: main Commit: ed12be533e2673b08e958be32fbe5d6af2737fbc URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ed12be533e2673b08e958be32fbe5d6af2737fbc
Author: Rhys Perry <pendingchao...@gmail.com> Date: Wed Oct 11 14:43:03 2023 +0100 radv: call lower_array_deref_of_vec before lower_io_arrays_to_elements nir_lower_io_arrays_to_elements does not support array derefs of vectors, even when nir_deref_instr_is_known_out_of_bounds is fixed. They can occur with mesh shaders. Found by inspection. Signed-off-by: Rhys Perry <pendingchao...@gmail.com> Reviewed-by: Timur Kristóf <timur.kris...@gmail.com> Cc: mesa-stable Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25659> --- src/amd/vulkan/nir/radv_nir_lower_io.c | 3 --- src/amd/vulkan/radv_pipeline_graphics.c | 7 +++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_lower_io.c b/src/amd/vulkan/nir/radv_nir_lower_io.c index bc5ecfe41e9..e78523a7a49 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_io.c +++ b/src/amd/vulkan/nir/radv_nir_lower_io.c @@ -41,9 +41,6 @@ radv_nir_lower_io_to_scalar_early(nir_shader *nir, nir_variable_mode mask) { bool progress = false; - NIR_PASS(progress, nir, nir_lower_array_deref_of_vec, mask, - nir_lower_direct_array_deref_of_vec_load | nir_lower_indirect_array_deref_of_vec_load | - nir_lower_direct_array_deref_of_vec_store | nir_lower_indirect_array_deref_of_vec_store); NIR_PASS(progress, nir, nir_lower_io_to_scalar_early, mask); if (progress) { /* Optimize the new vector code and then remove dead vars */ diff --git a/src/amd/vulkan/radv_pipeline_graphics.c b/src/amd/vulkan/radv_pipeline_graphics.c index d02c53f778c..9b648dbc7c2 100644 --- a/src/amd/vulkan/radv_pipeline_graphics.c +++ b/src/amd/vulkan/radv_pipeline_graphics.c @@ -1338,6 +1338,13 @@ radv_link_shaders(const struct radv_device *device, nir_shader *producer, nir_sh nir_link_xfb_varyings(producer, consumer); } + unsigned array_deref_of_vec_options = + nir_lower_direct_array_deref_of_vec_load | nir_lower_indirect_array_deref_of_vec_load | + nir_lower_direct_array_deref_of_vec_store | nir_lower_indirect_array_deref_of_vec_store; + + NIR_PASS(progress, producer, nir_lower_array_deref_of_vec, nir_var_shader_out, array_deref_of_vec_options); + NIR_PASS(progress, consumer, nir_lower_array_deref_of_vec, nir_var_shader_in, array_deref_of_vec_options); + nir_lower_io_arrays_to_elements(producer, consumer); nir_validate_shader(producer, "after nir_lower_io_arrays_to_elements"); nir_validate_shader(consumer, "after nir_lower_io_arrays_to_elements");