[Mesa-stable] [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-stable
mailing list