radeonsi: postponed KILL isn't postponed anymore, but maintains WQM
This restores performance for the drirc workaround, i.e. KILL_IF does: visible = src0 >= 0; kill_flag &= visible; // accumulate kills amdgcn_kill(wqm_vote(visible)); // kill fully dead quads only And all helper pixels are killed at the end of the shader: amdgcn_kill(kill_flag); Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -1405,6 +1405,13 @@ LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
|
||||
AC_FUNC_ATTR_LEGACY);
|
||||
}
|
||||
|
||||
LLVMValueRef ac_build_wqm_vote(struct ac_llvm_context *ctx, LLVMValueRef i1)
|
||||
{
|
||||
assert(HAVE_LLVM >= 0x0600);
|
||||
return ac_build_intrinsic(ctx, "llvm.amdgcn.wqm.vote", ctx->i1,
|
||||
&i1, 1, AC_FUNC_ATTR_READNONE);
|
||||
}
|
||||
|
||||
void ac_build_kill_if_false(struct ac_llvm_context *ctx, LLVMValueRef i1)
|
||||
{
|
||||
if (HAVE_LLVM >= 0x0600) {
|
||||
|
@@ -265,6 +265,7 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
||||
struct ac_image_args *a);
|
||||
LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
|
||||
LLVMValueRef args[2]);
|
||||
LLVMValueRef ac_build_wqm_vote(struct ac_llvm_context *ctx, LLVMValueRef i1);
|
||||
void ac_build_kill_if_false(struct ac_llvm_context *ctx, LLVMValueRef i1);
|
||||
LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input,
|
||||
LLVMValueRef offset, LLVMValueRef width,
|
||||
|
@@ -69,6 +69,12 @@ static void kil_emit(const struct lp_build_tgsi_action *action,
|
||||
}
|
||||
|
||||
if (ctx->shader->selector->force_correct_derivs_after_kill) {
|
||||
/* LLVM 6.0 can kill immediately while maintaining WQM. */
|
||||
if (HAVE_LLVM >= 0x0600) {
|
||||
ac_build_kill_if_false(&ctx->ac,
|
||||
ac_build_wqm_vote(&ctx->ac, visible));
|
||||
}
|
||||
|
||||
LLVMValueRef mask = LLVMBuildLoad(builder, ctx->postponed_kill, "");
|
||||
mask = LLVMBuildAnd(builder, mask, visible, "");
|
||||
LLVMBuildStore(builder, mask, ctx->postponed_kill);
|
||||
|
Reference in New Issue
Block a user