On 01.11.2016 05:32, Dave Airlie wrote:
From: Dave Airlie <[email protected]>

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

Unfortunately, this will end up messing up other stuff when the kill _isn't_ uniform, because now you have two places where you return from the function, which is bound to mess with control flow in hilarious ways.

If you want to workaround the problem that you mentioned, I suggest trying to see whether you can use some NIR transformation to lower the kill as

kill(condition)

rather than

br condition, die, live

die:
kill

live:

Nicolai


---
 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);

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to