The struct version sets IDXEN=1, while the raw version sets IDXEN=0.

Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/amd/common/ac_llvm_build.c    | 48 +++++++++++++++++++++++++++----
 src/amd/common/ac_llvm_build.h    | 37 ++++++++++++++++--------
 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,
@@ -1453,6 +1454,43 @@ ac_build_tbuffer_load(struct ac_llvm_context *ctx,
                                  ac_get_load_intr_attribs(can_speculate));
 }
 
+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,
@@ -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) {
-- 
2.21.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to