anv: enable shaderUniformBufferArrayNonUniformIndexing
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Fri, 21 Apr 2023 10:20:39 +0000 (13:20 +0300)
committerMarge Bot <emma+marge@anholt.net>
Thu, 27 Apr 2023 09:08:03 +0000 (09:08 +0000)
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22624>

src/intel/vulkan/anv_device.c
src/intel/vulkan/anv_nir_apply_pipeline_layout.c

index f82d870..5521586 100644 (file)
@@ -1296,7 +1296,7 @@ void anv_GetPhysicalDeviceFeatures2(
       .shaderInputAttachmentArrayDynamicIndexing          = false,
       .shaderUniformTexelBufferArrayDynamicIndexing       = true,
       .shaderStorageTexelBufferArrayDynamicIndexing       = true,
-      .shaderUniformBufferArrayNonUniformIndexing         = false,
+      .shaderUniformBufferArrayNonUniformIndexing         = true,
       .shaderSampledImageArrayNonUniformIndexing          = true,
       .shaderStorageBufferArrayNonUniformIndexing         = true,
       .shaderStorageImageArrayNonUniformIndexing          = true,
index 9194f98..4660cf2 100644 (file)
@@ -730,6 +730,13 @@ try_lower_direct_buffer_intrinsic(nir_builder *b,
 
    nir_address_format addr_format = descriptor_address_format(desc, state);
 
+   /* Although we could lower non uniform binding table accesses with
+    * nir_opt_non_uniform_access, we might as well use an A64 message and
+    * avoid the loops inserted by that lowering pass.
+    */
+   if (nir_intrinsic_access(intrin) & ACCESS_NON_UNIFORM)
+      return false;
+
    if (nir_deref_mode_is(deref, nir_var_mem_ssbo)) {
       /* 64-bit atomics only support A64 messages so we can't lower them to
        * the index+offset model.
@@ -738,12 +745,6 @@ try_lower_direct_buffer_intrinsic(nir_builder *b,
           !state->pdevice->info.has_lsc)
          return false;
 
-      /* Normal binding table-based messages can't handle non-uniform access
-       * so we have to fall back to A64.
-       */
-      if (nir_intrinsic_access(intrin) & ACCESS_NON_UNIFORM)
-         return false;
-
       if (!descriptor_has_bti(desc, state))
          return false;