ac/nir: Use correct LLVM intrinsics for atomic ops on imageBuffers
authorAlex Smith <asmith@feralinteractive.com>
Mon, 26 Jun 2017 16:17:32 +0000 (17:17 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Wed, 28 Jun 2017 19:05:04 +0000 (21:05 +0200)
The buffer intrinsics should be used instead of the image ones.

Signed-off-by: Alex Smith <asmith@feralinteractive.com>
Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/common/ac_nir_to_llvm.c

index a02968efc865957d6ea8b16d8a95f194503c930c..68f021828a3a51f5e130729da8cf6c2f454c805c 100644 (file)
@@ -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);
 }