[v2,08/12] ac/nir: use ac_build_buffer_load() for SSBO load operations

Submitted by Samuel Pitoiset on March 13, 2019, 10:50 a.m.

Details

Message ID 20190313105020.17683-9-samuel.pitoiset@gmail.com
State New
Headers show
Series "ac: use LLVM 8 buffer intrinsics everywhere" ( rev: 2 ) in Mesa

Not browsing as part of any series.

Commit Message

Samuel Pitoiset March 13, 2019, 10:50 a.m.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
---
 src/amd/common/ac_nir_to_llvm.c | 35 ++++++---------------------------
 1 file changed, 6 insertions(+), 29 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index a25e5388bce..af0c3cc679d 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -1704,7 +1704,6 @@  static LLVMValueRef visit_load_buffer(struct ac_nir_context *ctx,
 	int num_components = instr->num_components;
 	enum gl_access_qualifier access = nir_intrinsic_access(instr);
 	unsigned cache_policy = get_cache_policy(ctx, access, false, false);
-	LLVMValueRef glc = (cache_policy & ac_glc) ? ctx->ac.i1true : ctx->ac.i1false;
 
 	LLVMValueRef offset = get_src(ctx, instr->src[1]);
 	LLVMValueRef rsrc = ctx->abi->load_ssbo(ctx->abi,
@@ -1735,34 +1734,12 @@  static LLVMValueRef visit_load_buffer(struct ac_nir_context *ctx,
 							  immoffset,
 							  cache_policy & ac_glc);
 		} else {
-			const char *load_name;
-			LLVMTypeRef data_type;
-			switch (load_bytes) {
-			case 16:
-			case 12:
-				load_name = "llvm.amdgcn.buffer.load.v4f32";
-				data_type = ctx->ac.v4f32;
-				break;
-			case 8:
-			case 6:
-				load_name = "llvm.amdgcn.buffer.load.v2f32";
-				data_type = ctx->ac.v2f32;
-				break;
-			case 4:
-				load_name = "llvm.amdgcn.buffer.load.f32";
-				data_type = ctx->ac.f32;
-				break;
-			default:
-				unreachable("Malformed load buffer.");
-			}
-			LLVMValueRef params[] = {
-				rsrc,
-				vindex,
-				LLVMBuildAdd(ctx->ac.builder, offset, immoffset, ""),
-				glc,
-				ctx->ac.i1false,
-			};
-			ret = ac_build_intrinsic(&ctx->ac, load_name, data_type, params, 5, 0);
+			int num_channels = util_next_power_of_two(load_bytes) / 4;
+
+			ret = ac_build_buffer_load(&ctx->ac, rsrc, num_channels,
+						   vindex, offset, immoffset, 0,
+						   cache_policy & ac_glc, false,
+						   false, false);
 		}
 
 		LLVMTypeRef byte_vec = LLVMVectorType(ctx->ac.i8, ac_get_type_size(LLVMTypeOf(ret)));