From 729ebe4b17f0905f87f41c0ffe004e042f3c55f6 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 24 May 2021 17:05:30 +0200 Subject: [PATCH] aco: fix emitting discard when the program just ends MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For fragment shaders that only contain a discard, the exec mask has to be zero'd and everything discarded. It seems unnecessary to emit an export here because if the FS has no exports, the compiler already emits a null export at the end. Fixes incorrect hair rendering in Detroit: Become Human. fossil-db (Sienna Cichlid): Totals from 3 (0.00% of 149839) affected shaders: CodeSize: 2896 -> 2872 (-0.83%) Instrs: 556 -> 553 (-0.54%) Latency: 29266 -> 29214 (-0.18%) InvThroughput: 3374 -> 3372 (-0.06%) Cc: 21.1 mesa-stable Signed-off-by: Samuel Pitoiset Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 8ae43af5f97..9efd01d038b 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -5287,11 +5287,8 @@ void visit_discard(isel_context* ctx, nir_intrinsic_instr *instr) */ if (!ctx->cf_info.parent_if.is_divergent) { /* program just ends here */ - ctx->block->kind |= block_kind_uniform; - bld.exp(aco_opcode::exp, Operand(v1), Operand(v1), Operand(v1), Operand(v1), - 0 /* enabled mask */, 9 /* dest */, - false /* compressed */, true/* done */, true /* valid mask */); - bld.sopp(aco_opcode::s_endpgm); + ctx->block->kind |= block_kind_uses_discard_if; + bld.pseudo(aco_opcode::p_discard_if, Operand(0xFFFFFFFFu)); // TODO: it will potentially be followed by a branch which is dead code to sanitize NIR phis } else { ctx->block->kind |= block_kind_discard;