[Mesa-dev] [PATCH 4/4] radeonsi: postponed KILL isn't postponed anymore, but maintains WQM
Nicolai Hähnle
nhaehnle at gmail.com
Mon Oct 23 16:17:30 UTC 2017
I found my peace with the new intrinsic for now. This series is
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
On 14.10.2017 02:58, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> 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);
> ---
> src/amd/common/ac_llvm_build.c | 7 +++++++
> src/amd/common/ac_llvm_build.h | 1 +
> src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c | 6 ++++++
> 3 files changed, 14 insertions(+)
>
> diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
> index 0550f80..2f8f59f 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -1398,20 +1398,27 @@ LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
> v2f16, args, 2,
> AC_FUNC_ATTR_READNONE);
> return LLVMBuildBitCast(ctx->builder, res, ctx->i32, "");
> }
>
> return ac_build_intrinsic(ctx, "llvm.SI.packf16", ctx->i32, args, 2,
> AC_FUNC_ATTR_READNONE |
> 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) {
> ac_build_intrinsic(ctx, "llvm.amdgcn.kill", ctx->voidt,
> &i1, 1, 0);
> return;
> }
>
> LLVMValueRef value = LLVMBuildSelect(ctx->builder, i1,
> LLVMConstReal(ctx->f32, 1),
> diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h
> index b721782..088a986 100644
> --- a/src/amd/common/ac_llvm_build.h
> +++ b/src/amd/common/ac_llvm_build.h
> @@ -258,20 +258,21 @@ struct ac_image_args {
> LLVMValueRef addr;
> unsigned dmask;
> bool unorm;
> bool da;
> };
>
> 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,
> bool is_signed);
>
> void ac_get_image_intr_name(const char *base_name,
> LLVMTypeRef data_type,
> LLVMTypeRef coords_type,
> LLVMTypeRef rsrc_type,
> char *out_name, unsigned out_len);
> diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> index 283a889..913b6c3 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> @@ -62,20 +62,26 @@ static void kil_emit(const struct lp_build_tgsi_action *action,
> LLVMValueRef visible;
>
> if (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_KILL_IF) {
> visible = emit_data->args[0];
> } else {
> assert(emit_data->inst->Instruction.Opcode == TGSI_OPCODE_KILL);
> visible = LLVMConstInt(ctx->i1, false, 0);
> }
>
> 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);
> return;
> }
>
> ac_build_kill_if_false(&ctx->ac, visible);
> }
>
> static void emit_icmp(const struct lp_build_tgsi_action *action,
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list