summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Smith <[email protected]>2017-06-26 17:17:32 +0100
committerBas Nieuwenhuizen <[email protected]>2017-06-28 21:05:04 +0200
commit909184ac9cf59f23803915773f5659f05c161394 (patch)
tree4d94291167b1320e44db3d46cfa1606743cb4d4d
parent69a17da037d26b54e075d90c8b5ce887255291a7 (diff)
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 <[email protected]> Cc: <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]>
-rw-r--r--src/amd/common/ac_nir_to_llvm.c63
1 files 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 a02968efc86..68f021828a3 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);
}