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);
|
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)
|
void ac_build_kill_if_false(struct ac_llvm_context *ctx, LLVMValueRef i1)
|
||||||
{
|
{
|
||||||
if (HAVE_LLVM >= 0x0600) {
|
if (HAVE_LLVM >= 0x0600) {
|
||||||
|
@@ -265,6 +265,7 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
|
|||||||
struct ac_image_args *a);
|
struct ac_image_args *a);
|
||||||
LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
|
LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
|
||||||
LLVMValueRef args[2]);
|
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);
|
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 ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input,
|
||||||
LLVMValueRef offset, LLVMValueRef width,
|
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) {
|
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, "");
|
LLVMValueRef mask = LLVMBuildLoad(builder, ctx->postponed_kill, "");
|
||||||
mask = LLVMBuildAnd(builder, mask, visible, "");
|
mask = LLVMBuildAnd(builder, mask, visible, "");
|
||||||
LLVMBuildStore(builder, mask, ctx->postponed_kill);
|
LLVMBuildStore(builder, mask, ctx->postponed_kill);
|
||||||
|
Reference in New Issue
Block a user