[Mesa-dev] [PATCH] [rfc] ac/nir->llvm: workaround llvm lowering kill to exec mask

Marek Olšák maraeo at gmail.com
Tue Nov 1 10:41:25 UTC 2016


The commit message is total non-sense. Exports are always executed
regardless of EXEC.

Marek

On Tue, Nov 1, 2016 at 5:32 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This just a discussion holder patch, radv has generated a shader
> using discard that lowers the kilp intrinsic into
>
> s_mov_b64 exec, 0                               ; BEFE0180
>
> however that means exports never happen, and I think this leads
> to a GPU hang as the frag shader must make at least one NULL export.
>
> This hacks just replaces kilp intrinsic with an explcit export
> and endpgm for now. I'm sure it's probably all sorts of wrong.
>
> Either way I expect the fix has to be in the compiler, but this
> patch lets me get CTS to run again
> ---
>  src/amd/common/ac_nir_to_llvm.c | 26 ++++++++++++++++++++++----
>  1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> index a655806..4dd0d79 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -2614,6 +2614,27 @@ static void emit_barrier(struct nir_to_llvm_context *ctx)
>                             ctx->voidt, NULL, 0, 0);
>  }
>
> +static void
> +si_export_mrt_color(struct nir_to_llvm_context *ctx,
> +                   LLVMValueRef *color, unsigned param, bool is_last);
> +
> +static void emit_discard(struct nir_to_llvm_context *ctx)
> +{
> +       ctx->shader_info->fs.can_discard = true;
> +
> +       /* workaround LLVM lowering kilp to an execmask set to 0,
> +        * which later means we don't do an export and hang the GPU.
> +        */
> +       if (1) {
> +               si_export_mrt_color(ctx, NULL, V_008DFC_SQ_EXP_NULL, true);
> +               LLVMBuildRetVoid(ctx->builder);
> +       } else {
> +               emit_llvm_intrinsic(ctx, "llvm.AMDGPU.kilp",
> +                                   LLVMVoidTypeInContext(ctx->context),
> +                                   NULL, 0, 0);
> +       }
> +}
> +
>  static LLVMValueRef
>  visit_load_local_invocation_index(struct nir_to_llvm_context *ctx)
>  {
> @@ -2921,10 +2942,7 @@ static void visit_intrinsic(struct nir_to_llvm_context *ctx,
>                 result = visit_image_size(ctx, instr);
>                 break;
>         case nir_intrinsic_discard:
> -               ctx->shader_info->fs.can_discard = true;
> -               emit_llvm_intrinsic(ctx, "llvm.AMDGPU.kilp",
> -                                   LLVMVoidTypeInContext(ctx->context),
> -                                   NULL, 0, 0);
> +               emit_discard(ctx);
>                 break;
>         case nir_intrinsic_memory_barrier:
>                 emit_waitcnt(ctx);
> --
> 2.5.5
>
> _______________________________________________
> 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