Mesa (master): ac/nir: Use correct LLVM intrinsics for atomic ops on imageBuffers

Bas Nieuwenhuizen bnieuwenhuizen at kemper.freedesktop.org
Wed Jun 28 19:21:50 UTC 2017


Module: Mesa
Branch: master
Commit: 909184ac9cf59f23803915773f5659f05c161394
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=909184ac9cf59f23803915773f5659f05c161394

Author: Alex Smith <asmith at feralinteractive.com>
Date:   Mon Jun 26 17:17:32 2017 +0100

ac/nir: Use correct LLVM intrinsics for atomic ops on imageBuffers

The buffer intrinsics should be used instead of the image ones.

Signed-off-by: Alex Smith <asmith at feralinteractive.com>
Cc: <mesa-stable at lists.freedesktop.org>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

---

 src/amd/common/ac_nir_to_llvm.c | 63 ++++++++++++++++++++++-------------------
 1 file changed, 34 insertions(+), 29 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index a02968efc8..68f021828a 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -3400,37 +3400,14 @@ static LLVMValueRef visit_image_atomic(struct nir_to_llvm_context *ctx,
 	int param_count = 0;
 	const nir_variable *var = instr->variables[0]->var;
 
-	const char *base_name = "llvm.amdgcn.image.atomic";
 	const char *atomic_name;
-	LLVMValueRef coords;
-	char intrinsic_name[41], coords_type[8];
+	char intrinsic_name[41];
 	const struct glsl_type *type = glsl_without_array(var->type);
+	MAYBE_UNUSED int length;
 
 	if (ctx->stage == MESA_SHADER_FRAGMENT)
 		ctx->shader_info->fs.writes_memory = true;
 
-	params[param_count++] = get_src(ctx, instr->src[2]);
-	if (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap)
-		params[param_count++] = get_src(ctx, instr->src[3]);
-
-	if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF) {
-		params[param_count++] = get_sampler_desc(ctx, instr->variables[0], DESC_BUFFER);
-		coords = params[param_count++] = LLVMBuildExtractElement(ctx->builder, get_src(ctx, instr->src[0]),
-									LLVMConstInt(ctx->i32, 0, false), ""); /* vindex */
-		params[param_count++] = ctx->i32zero; /* voffset */
-		params[param_count++] = ctx->i1false;  /* glc */
-		params[param_count++] = ctx->i1false;  /* slc */
-	} else {
-		bool da = glsl_sampler_type_is_array(type) ||
-		          glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_CUBE;
-
-		coords = params[param_count++] = get_image_coords(ctx, instr);
-		params[param_count++] = get_sampler_desc(ctx, instr->variables[0], DESC_IMAGE);
-		params[param_count++] = ctx->i1false; /* r128 */
-		params[param_count++] = da ? ctx->i1true : ctx->i1false;      /* da */
-		params[param_count++] = ctx->i1false;  /* slc */
-	}
-
 	switch (instr->intrinsic) {
 	case nir_intrinsic_image_atomic_add:
 		atomic_name = "add";
@@ -3459,11 +3436,39 @@ static LLVMValueRef visit_image_atomic(struct nir_to_llvm_context *ctx,
 	default:
 		abort();
 	}
-	build_int_type_name(LLVMTypeOf(coords),
-			    coords_type, sizeof(coords_type));
 
-	MAYBE_UNUSED const int length = snprintf(intrinsic_name, sizeof(intrinsic_name),
-						 "%s.%s.%s", base_name, atomic_name, coords_type);
+	params[param_count++] = get_src(ctx, instr->src[2]);
+	if (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap)
+		params[param_count++] = get_src(ctx, instr->src[3]);
+
+	if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF) {
+		params[param_count++] = get_sampler_desc(ctx, instr->variables[0], DESC_BUFFER);
+		params[param_count++] = LLVMBuildExtractElement(ctx->builder, get_src(ctx, instr->src[0]),
+								LLVMConstInt(ctx->i32, 0, false), ""); /* vindex */
+		params[param_count++] = ctx->i32zero; /* voffset */
+		params[param_count++] = ctx->i1false;  /* slc */
+
+		length = snprintf(intrinsic_name, sizeof(intrinsic_name),
+				  "llvm.amdgcn.buffer.atomic.%s", atomic_name);
+	} else {
+		char coords_type[8];
+
+		bool da = glsl_sampler_type_is_array(type) ||
+		          glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_CUBE;
+
+		LLVMValueRef coords = params[param_count++] = get_image_coords(ctx, instr);
+		params[param_count++] = get_sampler_desc(ctx, instr->variables[0], DESC_IMAGE);
+		params[param_count++] = ctx->i1false; /* r128 */
+		params[param_count++] = da ? ctx->i1true : ctx->i1false;      /* da */
+		params[param_count++] = ctx->i1false;  /* slc */
+
+		build_int_type_name(LLVMTypeOf(coords),
+				    coords_type, sizeof(coords_type));
+
+		length = snprintf(intrinsic_name, sizeof(intrinsic_name),
+				  "llvm.amdgcn.image.atomic.%s.%s", atomic_name, coords_type);
+	}
+
 	assert(length < sizeof(intrinsic_name));
 	return ac_build_intrinsic(&ctx->ac, intrinsic_name, ctx->i32, params, param_count, 0);
 }




More information about the mesa-commit mailing list