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");

Reply via email to