[Mesa-dev] [PATCH 1/2] ac: add ac_build_{struct, raw}_tbuffer_load() helpers

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Mar 13 13:04:13 UTC 2019


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

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at 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



More information about the mesa-dev mailing list