Mesa (master): nir,spirv: allow non-uniform OpArrayLength

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 27 13:24:11 UTC 2021


Module: Mesa
Branch: master
Commit: 30f40364f6b2ba48f1dbe7b39ff8316dc2bb9fd5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=30f40364f6b2ba48f1dbe7b39ff8316dc2bb9fd5

Author: Rhys Perry <pendingchaos02 at gmail.com>
Date:   Mon Oct 12 15:03:28 2020 +0100

nir,spirv: allow non-uniform OpArrayLength

Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7969>

---

 src/compiler/nir/nir_divergence_analysis.c | 7 +++++--
 src/compiler/nir/nir_intrinsics.py         | 4 ++--
 src/compiler/nir/nir_lower_io.c            | 3 ++-
 src/compiler/spirv/vtn_variables.c         | 6 ++++--
 4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c
index e50086e3629..5bad5bc8817 100644
--- a/src/compiler/nir/nir_divergence_analysis.c
+++ b/src/compiler/nir/nir_divergence_analysis.c
@@ -248,6 +248,11 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
                      instr->src[1].ssa->divergent;
       break;
 
+   case nir_intrinsic_get_ssbo_size:
+   case nir_intrinsic_deref_buffer_array_length:
+      is_divergent = instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM);
+      break;
+
    case nir_intrinsic_image_load:
    case nir_intrinsic_image_deref_load:
    case nir_intrinsic_bindless_image_load:
@@ -282,12 +287,10 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
    case nir_intrinsic_image_samples:
    case nir_intrinsic_image_deref_samples:
    case nir_intrinsic_bindless_image_samples:
-   case nir_intrinsic_get_ssbo_size:
    case nir_intrinsic_image_size:
    case nir_intrinsic_image_deref_size:
    case nir_intrinsic_bindless_image_size:
    case nir_intrinsic_copy_deref:
-   case nir_intrinsic_deref_buffer_array_length:
    case nir_intrinsic_vulkan_resource_index:
    case nir_intrinsic_vulkan_resource_reindex:
    case nir_intrinsic_load_vulkan_descriptor:
diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py
index 70819dba2b4..8e5b0328fb0 100644
--- a/src/compiler/nir/nir_intrinsics.py
+++ b/src/compiler/nir/nir_intrinsics.py
@@ -272,12 +272,12 @@ intrinsic("interp_deref_at_vertex", src_comp=[1, 1], dest_comp=0,
 
 # Gets the length of an unsized array at the end of a buffer
 intrinsic("deref_buffer_array_length", src_comp=[-1], dest_comp=1,
-          flags=[CAN_ELIMINATE, CAN_REORDER])
+          indices=[ACCESS], flags=[CAN_ELIMINATE, CAN_REORDER])
 
 # Ask the driver for the size of a given SSBO. It takes the buffer index
 # as source.
 intrinsic("get_ssbo_size", src_comp=[-1], dest_comp=1, bit_sizes=[32],
-          flags=[CAN_ELIMINATE, CAN_REORDER])
+          indices=[ACCESS], flags=[CAN_ELIMINATE, CAN_REORDER])
 intrinsic("get_ubo_size", src_comp=[-1], dest_comp=1,
           flags=[CAN_ELIMINATE, CAN_REORDER])
 
diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c
index 22d319f74c3..07be1b2998a 100644
--- a/src/compiler/nir/nir_lower_io.c
+++ b/src/compiler/nir/nir_lower_io.c
@@ -1985,8 +1985,9 @@ lower_explicit_io_array_length(nir_builder *b, nir_intrinsic_instr *intrin,
    nir_ssa_def *addr = &deref->dest.ssa;
    nir_ssa_def *index = addr_to_index(b, addr, addr_format);
    nir_ssa_def *offset = addr_to_offset(b, addr, addr_format);
+   unsigned access = nir_intrinsic_access(intrin);
 
-   nir_ssa_def *arr_size = nir_get_ssbo_size(b, index);
+   nir_ssa_def *arr_size = nir_get_ssbo_size(b, index, .access=access);
    arr_size = nir_imax(b, nir_isub(b, arr_size, offset), nir_imm_int(b, 0u));
    arr_size = nir_idiv(b, arr_size, nir_imm_int(b, stride));
 
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 1481e6b4e57..ac5af93bf7d 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -2465,7 +2465,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
 
          nir_ssa_def *array_length =
             nir_build_deref_buffer_array_length(&b->nb, 32,
-                                                vtn_pointer_to_ssa(b, array));
+                                                vtn_pointer_to_ssa(b, array),
+                                                .access=ptr->access | ptr->type->access);
 
          vtn_push_nir_ssa(b, w[2], array_length);
       } else {
@@ -2480,7 +2481,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
             vtn_assert(ptr->block_index);
          }
 
-         nir_ssa_def *buf_size = nir_get_ssbo_size(&b->nb, ptr->block_index);
+         nir_ssa_def *buf_size = nir_get_ssbo_size(&b->nb, ptr->block_index,
+                                                   .access=ptr->access | ptr->type->access);
 
          /* array_length = max(buffer_size - offset, 0) / stride */
          nir_ssa_def *array_length =



More information about the mesa-commit mailing list