[Mesa-dev] [PATCH v3 11/11] ac: use new LLVM 8 intrinsics in ac_build_buffer_store_dword()

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Tue Mar 19 20:49:10 UTC 2019


Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

FYI since the new intrinsics don't merge voffset and soffset anymore,
you can remove the tbuffer variants for LLVM8+.

On Wed, Mar 13, 2019 at 5:38 PM Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
>
> New buffer intrinsics have a separate soffset parameter.
>
> v3: - use ac_build_raw_tbuffer_store()
> v2: - use the raw version as vindex is not used
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/amd/common/ac_llvm_build.c | 66 ++++++++++++++--------------------
>  1 file changed, 26 insertions(+), 40 deletions(-)
>
> diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
> index c86a4f98864..541ad75c877 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -1227,59 +1227,45 @@ ac_build_buffer_store_dword(struct ac_llvm_context *ctx,
>         if (!swizzle_enable_hint) {
>                 LLVMValueRef offset = soffset;
>
> -               static const char *types[] = {"f32", "v2f32", "v4f32"};
> -
>                 if (inst_offset)
>                         offset = LLVMBuildAdd(ctx->builder, offset,
>                                               LLVMConstInt(ctx->i32, inst_offset, 0), "");
> -               if (voffset)
> -                       offset = LLVMBuildAdd(ctx->builder, offset, voffset, "");
> -
> -               LLVMValueRef args[] = {
> -                       ac_to_float(ctx, vdata),
> -                       LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, ""),
> -                       ctx->i32_0,
> -                       offset,
> -                       LLVMConstInt(ctx->i1, glc, 0),
> -                       LLVMConstInt(ctx->i1, slc, 0),
> -               };
> -
> -               char name[256];
> -               snprintf(name, sizeof(name), "llvm.amdgcn.buffer.store.%s",
> -                        types[CLAMP(num_channels, 1, 3) - 1]);
>
> -               ac_build_intrinsic(ctx, name, ctx->voidt,
> -                                  args, ARRAY_SIZE(args),
> -                                  ac_get_store_intr_attribs(writeonly_memory));
> +               if (HAVE_LLVM >= 0x800) {
> +                       ac_build_llvm8_buffer_store_common(ctx, rsrc,
> +                                                          ac_to_float(ctx, vdata),
> +                                                          ctx->i32_0,
> +                                                          voffset, offset,
> +                                                          num_channels,
> +                                                          glc, slc,
> +                                                          writeonly_memory,
> +                                                          false, false);
> +               } else {
> +                       if (voffset)
> +                               offset = LLVMBuildAdd(ctx->builder, offset, voffset, "");
> +
> +                       ac_build_buffer_store_common(ctx, rsrc,
> +                                                    ac_to_float(ctx, vdata),
> +                                                    ctx->i32_0, offset,
> +                                                    num_channels, glc, slc,
> +                                                    writeonly_memory, false);
> +               }
>                 return;
>         }
>
> -       static const unsigned dfmt[] = {
> +       static const unsigned dfmts[] = {
>                 V_008F0C_BUF_DATA_FORMAT_32,
>                 V_008F0C_BUF_DATA_FORMAT_32_32,
>                 V_008F0C_BUF_DATA_FORMAT_32_32_32,
>                 V_008F0C_BUF_DATA_FORMAT_32_32_32_32
>         };
> -       static const char *types[] = {"i32", "v2i32", "v4i32"};
> -       LLVMValueRef args[] = {
> -               vdata,
> -               LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, ""),
> -               ctx->i32_0,
> -               voffset ? voffset : ctx->i32_0,
> -               soffset,
> -               LLVMConstInt(ctx->i32, inst_offset, 0),
> -               LLVMConstInt(ctx->i32, dfmt[num_channels - 1], 0),
> -               LLVMConstInt(ctx->i32, V_008F0C_BUF_NUM_FORMAT_UINT, 0),
> -               LLVMConstInt(ctx->i1, glc, 0),
> -               LLVMConstInt(ctx->i1, slc, 0),
> -       };
> -       char name[256];
> -       snprintf(name, sizeof(name), "llvm.amdgcn.tbuffer.store.%s",
> -                types[CLAMP(num_channels, 1, 3) - 1]);
> +       unsigned dfmt = dfmts[num_channels - 1];
> +       unsigned nfmt = V_008F0C_BUF_NUM_FORMAT_UINT;
> +       LLVMValueRef immoffset = LLVMConstInt(ctx->i32, inst_offset, 0);
>
> -       ac_build_intrinsic(ctx, name, ctx->voidt,
> -                          args, ARRAY_SIZE(args),
> -                          ac_get_store_intr_attribs(writeonly_memory));
> +       ac_build_raw_tbuffer_store(ctx, rsrc, vdata, voffset, soffset,
> +                                  immoffset, num_channels, dfmt, nfmt, glc,
> +                                  slc, writeonly_memory);
>  }
>
>  static LLVMValueRef
> --
> 2.21.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list