Mesa (master): radv: cleanup LLVM implementation of vulkan_descriptor_index

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


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

Author: Rhys Perry <pendingchaos02 at gmail.com>
Date:   Wed Mar 10 14:44:52 2021 +0000

radv: cleanup LLVM implementation of vulkan_descriptor_index

Make it create a vec2 instead of a pointer, like what the NIR expects.

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/vulkan/radv_nir_to_llvm.c | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c
index 972470bab76..2e140b4a724 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -224,9 +224,10 @@ radv_load_resource(struct ac_shader_abi *abi, LLVMValueRef index, unsigned desc_
    }
 
    desc_ptr = LLVMBuildGEP(ctx->ac.builder, desc_ptr, &offset, 1, "");
-   desc_ptr = ac_cast_ptr(&ctx->ac, desc_ptr, ctx->ac.v4i32);
+   desc_ptr = LLVMBuildPtrToInt(ctx->ac.builder, desc_ptr, ctx->ac.i32, "");
 
-   return desc_ptr;
+   LLVMValueRef res[] = {desc_ptr, ctx->ac.i32_0};
+   return ac_build_gather_values(&ctx->ac, res, 2);
 }
 
 static uint32_t
@@ -414,27 +415,31 @@ radv_load_base_vertex(struct ac_shader_abi *abi, bool non_indexed_is_zero)
    return ac_get_arg(&ctx->ac, ctx->args->ac.base_vertex);
 }
 
+static LLVMValueRef
+convert_pointer_to_64_bit(struct radv_shader_context *ctx, LLVMValueRef ptr, bool non_uniform)
+{
+   unsigned addr_space = AC_ADDR_SPACE_CONST_32BIT;
+   if (non_uniform) {
+      /* 32-bit seems to always use SMEM. addrspacecast from 32-bit -> 64-bit is broken. */
+      LLVMValueRef dwords[] = {ptr,
+                               LLVMConstInt(ctx->ac.i32, ctx->args->options->address32_hi, false)};
+      ptr = ac_build_gather_values(&ctx->ac, dwords, 2);
+      ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, ctx->ac.i64, "");
+      addr_space = AC_ADDR_SPACE_CONST;
+   }
+   return LLVMBuildIntToPtr(ctx->ac.builder, ptr, LLVMPointerType(ctx->ac.v4i32, addr_space), "");
+}
+
 static LLVMValueRef
 radv_load_ssbo(struct ac_shader_abi *abi, LLVMValueRef buffer_ptr, bool write, bool non_uniform)
 {
    struct radv_shader_context *ctx = radv_shader_context_from_abi(abi);
    LLVMValueRef result;
 
+   buffer_ptr = convert_pointer_to_64_bit(ctx, buffer_ptr, non_uniform);
    if (!non_uniform)
       LLVMSetMetadata(buffer_ptr, ctx->ac.uniform_md_kind, ctx->ac.empty_md);
 
-   if (non_uniform &&
-       LLVMGetPointerAddressSpace(LLVMTypeOf(buffer_ptr)) == AC_ADDR_SPACE_CONST_32BIT) {
-      /* 32-bit seems to always use SMEM. addrspacecast from 32-bit -> 64-bit is broken. */
-      buffer_ptr = LLVMBuildPtrToInt(ctx->ac.builder, buffer_ptr, ctx->ac.i32, ""),
-      buffer_ptr = LLVMBuildZExt(ctx->ac.builder, buffer_ptr, ctx->ac.i64, "");
-      uint64_t hi = (uint64_t)ctx->args->options->address32_hi << 32;
-      buffer_ptr =
-         LLVMBuildOr(ctx->ac.builder, buffer_ptr, LLVMConstInt(ctx->ac.i64, hi, false), "");
-      buffer_ptr = LLVMBuildIntToPtr(ctx->ac.builder, buffer_ptr,
-                                     LLVMPointerType(ctx->ac.v4i32, AC_ADDR_SPACE_CONST), "");
-   }
-
    result = LLVMBuildLoad(ctx->ac.builder, buffer_ptr, "");
    LLVMSetMetadata(result, ctx->ac.invariant_load_md_kind, ctx->ac.empty_md);
 
@@ -477,6 +482,7 @@ radv_load_ubo(struct ac_shader_abi *abi, unsigned desc_set, unsigned binding, bo
       }
    }
 
+   buffer_ptr = convert_pointer_to_64_bit(ctx, buffer_ptr, false);
    LLVMSetMetadata(buffer_ptr, ctx->ac.uniform_md_kind, ctx->ac.empty_md);
 
    result = LLVMBuildLoad(ctx->ac.builder, buffer_ptr, "");



More information about the mesa-commit mailing list