[Mesa-dev] [PATCH] ac/nir: Use correct LLVM intrinsics for atomic ops on imageBuffers

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Wed Jun 28 19:23:17 UTC 2017


Thanks, pushed.

On Mon, Jun 26, 2017 at 6:17 PM, Alex Smith <asmith at feralinteractive.com> wrote:
> 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>
> ---
> This applies on top of James Legg's recent series [1], since they both
> touch the same function.
>
> [1] https://lists.freedesktop.org/archives/mesa-dev/2017-June/160245.html
> ---
>  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 5e9f147..468ce4d 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -3369,37 +3369,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";
> @@ -3428,11 +3405,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);
>  }
> --
> 2.9.4
>


More information about the mesa-dev mailing list