diff options
-rw-r--r-- | src/amd/common/ac_llvm_build.c | 48 | ||||
-rw-r--r-- | src/amd/common/ac_llvm_build.h | 37 | ||||
-rw-r--r-- | src/amd/vulkan/radv_nir_to_llvm.c | 13 |
3 files changed, 75 insertions, 23 deletions
diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index b9eaf26f603..2d873d79102 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1407,7 +1407,7 @@ ac_build_llvm8_tbuffer_load(struct ac_llvm_context *ctx, ac_get_load_intr_attribs(can_speculate)); } -LLVMValueRef +static LLVMValueRef ac_build_tbuffer_load(struct ac_llvm_context *ctx, LLVMValueRef rsrc, LLVMValueRef vindex, @@ -1419,7 +1419,8 @@ ac_build_tbuffer_load(struct ac_llvm_context *ctx, unsigned nfmt, bool glc, bool slc, - bool can_speculate) + bool can_speculate, + bool structurized) /* only matters for LLVM 8+ */ { if (HAVE_LLVM >= 0x800) { voffset = LLVMBuildAdd(ctx->builder, voffset, immoffset, ""); @@ -1427,12 +1428,12 @@ ac_build_tbuffer_load(struct ac_llvm_context *ctx, return ac_build_llvm8_tbuffer_load(ctx, rsrc, vindex, voffset, soffset, num_channels, dfmt, nfmt, glc, slc, - can_speculate, true); + can_speculate, structurized); } LLVMValueRef args[] = { rsrc, - vindex, + vindex ? vindex : ctx->i32_0, voffset, soffset, immoffset, @@ -1454,6 +1455,43 @@ ac_build_tbuffer_load(struct ac_llvm_context *ctx, } LLVMValueRef +ac_build_struct_tbuffer_load(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef vindex, + LLVMValueRef voffset, + LLVMValueRef soffset, + LLVMValueRef immoffset, + unsigned num_channels, + unsigned dfmt, + unsigned nfmt, + bool glc, + bool slc, + bool can_speculate) +{ + return ac_build_tbuffer_load(ctx, rsrc, vindex, voffset, soffset, + immoffset, num_channels, dfmt, nfmt, glc, + slc, can_speculate, true); +} + +LLVMValueRef +ac_build_raw_tbuffer_load(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef voffset, + LLVMValueRef soffset, + LLVMValueRef immoffset, + unsigned num_channels, + unsigned dfmt, + unsigned nfmt, + bool glc, + bool slc, + bool can_speculate) +{ + return ac_build_tbuffer_load(ctx, rsrc, NULL, voffset, soffset, + immoffset, num_channels, dfmt, nfmt, glc, + slc, can_speculate, false); +} + +LLVMValueRef ac_build_tbuffer_load_short(struct ac_llvm_context *ctx, LLVMValueRef rsrc, LLVMValueRef vindex, @@ -1467,7 +1505,7 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx, LLVMValueRef res; res = ac_build_tbuffer_load(ctx, rsrc, vindex, voffset, soffset, - immoffset, 1, dfmt, nfmt, glc, false, false); + immoffset, 1, dfmt, nfmt, glc, false, false, true); return LLVMBuildTrunc(ctx->builder, res, ctx->i16, ""); } diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h index d746c864229..c6475320990 100644 --- a/src/amd/common/ac_llvm_build.h +++ b/src/amd/common/ac_llvm_build.h @@ -307,18 +307,31 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx, bool glc); LLVMValueRef -ac_build_tbuffer_load(struct ac_llvm_context *ctx, - LLVMValueRef rsrc, - LLVMValueRef vindex, - LLVMValueRef voffset, - LLVMValueRef soffset, - LLVMValueRef immoffset, - unsigned num_channels, - unsigned dfmt, - unsigned nfmt, - bool glc, - bool slc, - bool can_speculate); +ac_build_struct_tbuffer_load(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef vindex, + LLVMValueRef voffset, + LLVMValueRef soffset, + LLVMValueRef immoffset, + unsigned num_channels, + unsigned dfmt, + unsigned nfmt, + bool glc, + bool slc, + bool can_speculate); + +LLVMValueRef +ac_build_raw_tbuffer_load(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef voffset, + LLVMValueRef soffset, + LLVMValueRef immoffset, + unsigned num_channels, + unsigned dfmt, + unsigned nfmt, + bool glc, + bool slc, + bool can_speculate); LLVMValueRef ac_get_thread_id(struct ac_llvm_context *ctx); diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index 3dd3e80f3b9..dbe4be907ec 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -2181,12 +2181,13 @@ handle_vs_input_decl(struct radv_shader_context *ctx, t_offset = LLVMConstInt(ctx->ac.i32, attrib_binding, false); t_list = ac_build_load_to_sgpr(&ctx->ac, t_list_ptr, t_offset); - input = ac_build_tbuffer_load(&ctx->ac, t_list, buffer_index, - LLVMConstInt(ctx->ac.i32, attrib_offset, false), - ctx->ac.i32_0, ctx->ac.i32_0, - num_channels, - data_format, num_format, - false, false, true); + input = ac_build_struct_tbuffer_load(&ctx->ac, t_list, + buffer_index, + LLVMConstInt(ctx->ac.i32, attrib_offset, false), + ctx->ac.i32_0, ctx->ac.i32_0, + num_channels, + data_format, num_format, + false, false, true); if (ctx->options->key.vs.post_shuffle & (1 << attrib_index)) { if (num_channels > 1) { |