From 5ddb46e96376f2ef5ef73d52a589d908d6577d51 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 21 Mar 2023 15:07:02 +0800 Subject: [PATCH] ac/llvm: respect channel_type when ac_build_buffer_load MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Mainly for nir_load_smem_buffer_amd which pass i32 for this parameter. Fixes: 8030fbcf16a ("nir,ac/llvm: add nir_load_smem_buffer_amd") Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/amd/llvm/ac_llvm_build.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/amd/llvm/ac_llvm_build.c b/src/amd/llvm/ac_llvm_build.c index 85792da..54a95cd 100644 --- a/src/amd/llvm/ac_llvm_build.c +++ b/src/amd/llvm/ac_llvm_build.c @@ -1349,23 +1349,28 @@ LLVMValueRef ac_build_buffer_load(struct ac_llvm_context *ctx, LLVMValueRef rsrc if (soffset) offset = LLVMBuildAdd(ctx->builder, offset, soffset, ""); + char name[256], type_name[8]; + ac_build_type_name_for_intr(channel_type, type_name, sizeof(type_name)); + snprintf(name, sizeof(name), "llvm.amdgcn.s.buffer.load.%s", type_name); + + LLVMValueRef channel_size = LLVMConstInt(ctx->i32, ac_get_type_size(channel_type), 0); + for (int i = 0; i < num_channels; i++) { if (i) { - offset = LLVMBuildAdd(ctx->builder, offset, LLVMConstInt(ctx->i32, 4, 0), ""); + offset = LLVMBuildAdd(ctx->builder, offset, channel_size, ""); } LLVMValueRef args[3] = { rsrc, offset, LLVMConstInt(ctx->i32, get_load_cache_policy(ctx, cache_policy), 0), }; - result[i] = ac_build_intrinsic(ctx, "llvm.amdgcn.s.buffer.load.f32", ctx->f32, args, 3, - AC_ATTR_INVARIANT_LOAD); + result[i] = ac_build_intrinsic(ctx, name, channel_type, args, 3, AC_ATTR_INVARIANT_LOAD); } if (num_channels == 1) return result[0]; if (num_channels == 3 && !ac_has_vec3_support(ctx->gfx_level, false)) - result[num_channels++] = LLVMGetUndef(ctx->f32); + result[num_channels++] = LLVMGetUndef(channel_type); return ac_build_gather_values(ctx, result, num_channels); } -- 2.7.4