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