Mesa (master): radv: implement vulkan_resource_reindex

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Apr 27 16:18:34 UTC 2021


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

Author: Rhys Perry <pendingchaos02 at gmail.com>
Date:   Wed Mar 10 16:47:15 2021 +0000

radv: implement vulkan_resource_reindex

Fixes dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.dynamic_offset.select_descriptor_array

Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9523>

---

 src/amd/llvm/ac_nir_to_llvm.c | 14 --------------
 src/amd/vulkan/radv_shader.c  | 28 ++++++++++++++++++++++++++--
 2 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c
index 359500cd2bb..1b181c1ce47 100644
--- a/src/amd/llvm/ac_nir_to_llvm.c
+++ b/src/amd/llvm/ac_nir_to_llvm.c
@@ -1541,17 +1541,6 @@ static LLVMValueRef build_tex_intrinsic(struct ac_nir_context *ctx, const nir_te
    return ac_build_image_opcode(&ctx->ac, args);
 }
 
-static LLVMValueRef visit_vulkan_resource_reindex(struct ac_nir_context *ctx,
-                                                  nir_intrinsic_instr *instr)
-{
-   LLVMValueRef ptr = get_src(ctx, instr->src[0]);
-   LLVMValueRef index = get_src(ctx, instr->src[1]);
-
-   LLVMValueRef result = LLVMBuildGEP(ctx->ac.builder, ptr, &index, 1, "");
-   LLVMSetMetadata(result, ctx->ac.uniform_md_kind, ctx->ac.empty_md);
-   return result;
-}
-
 static LLVMValueRef visit_load_push_constant(struct ac_nir_context *ctx, nir_intrinsic_instr *instr)
 {
    LLVMValueRef ptr, addr;
@@ -3548,9 +3537,6 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
       result = ctx->abi->load_resource(ctx->abi, index, desc_set, binding);
       break;
    }
-   case nir_intrinsic_vulkan_resource_reindex:
-      result = visit_vulkan_resource_reindex(ctx, instr);
-      break;
    case nir_intrinsic_store_ssbo:
       visit_store_ssbo(ctx, instr);
       break;
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index cf40d00c194..6dec0958bc8 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -266,7 +266,8 @@ mark_geom_invariant(nir_shader *nir)
 }
 
 static bool
-lower_intrinsics(nir_shader *nir, const struct radv_pipeline_key *key)
+lower_intrinsics(nir_shader *nir, const struct radv_pipeline_key *key,
+                 const struct radv_pipeline_layout *layout)
 {
    nir_function_impl *entry = nir_shader_get_entrypoint(nir);
    bool progress = false;
@@ -285,6 +286,29 @@ lower_intrinsics(nir_shader *nir, const struct radv_pipeline_key *key)
          nir_ssa_def *def = NULL;
          if (intrin->intrinsic == nir_intrinsic_load_vulkan_descriptor) {
             def = nir_vec2(&b, nir_channel(&b, intrin->src[0].ssa, 0), nir_imm_int(&b, 0));
+         } else if (intrin->intrinsic == nir_intrinsic_vulkan_resource_index) {
+            unsigned desc_set = nir_intrinsic_desc_set(intrin);
+            unsigned binding = nir_intrinsic_binding(intrin);
+            struct radv_descriptor_set_layout *desc_layout = layout->set[desc_set].layout;
+
+            nir_ssa_def *new_res = nir_vulkan_resource_index(
+               &b, 2, 32, intrin->src[0].ssa, .desc_set = desc_set, .binding = binding,
+               .desc_type = nir_intrinsic_desc_type(intrin));
+            nir_ssa_def *ptr = nir_channel(&b, new_res, 0);
+
+            nir_ssa_def *stride;
+            if (desc_layout->binding[binding].type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC ||
+                desc_layout->binding[binding].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) {
+               stride = nir_imm_int(&b, 16);
+            } else {
+               stride = nir_imm_int(&b, desc_layout->binding[binding].size);
+            }
+            def = nir_vec2(&b, ptr, stride);
+         } else if (intrin->intrinsic == nir_intrinsic_vulkan_resource_reindex) {
+            nir_ssa_def *ptr = nir_channel(&b, intrin->src[0].ssa, 0);
+            nir_ssa_def *stride = nir_channel(&b, intrin->src[0].ssa, 1);
+            ptr = nir_iadd(&b, ptr, nir_imul(&b, intrin->src[1].ssa, stride));
+            def = nir_vec2(&b, ptr, stride);
          } else if (intrin->intrinsic == nir_intrinsic_is_sparse_texels_resident) {
             def = nir_ieq_imm(&b, intrin->src[0].ssa, 0);
          } else if (intrin->intrinsic == nir_intrinsic_sparse_residency_code_and) {
@@ -614,7 +638,7 @@ radv_shader_compile_to_nir(struct radv_device *device, struct vk_shader_module *
    NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_ubo | nir_var_mem_ssbo,
               nir_address_format_32bit_index_offset);
 
-   NIR_PASS_V(nir, lower_intrinsics, key);
+   NIR_PASS_V(nir, lower_intrinsics, key, layout);
 
    /* Lower deref operations for compute shared memory. */
    if (nir->info.stage == MESA_SHADER_COMPUTE) {



More information about the mesa-commit mailing list