From e7e24d5039cca6c1254935ea8067e7c925b04c51 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Fri, 8 May 2020 09:08:55 -0700 Subject: [PATCH] intel/fs: Handle nir_intrinsic_terminate For terminate operation, jump the invocation without predicating on the rest of the quad being disabled -- which is what is done for demote and discard. Reviewed-by: Jason Ekstrand Part-of: --- src/intel/compiler/brw_fs.cpp | 15 --------------- src/intel/compiler/brw_fs.h | 1 - src/intel/compiler/brw_fs_nir.cpp | 21 ++++++++++++++++++--- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 26b8785..06a3dbe 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -1529,21 +1529,6 @@ fs_visitor::resolve_source_modifiers(const fs_reg &src) } void -fs_visitor::emit_discard_jump() -{ - assert(brw_wm_prog_data(this->prog_data)->uses_kill); - - /* For performance, after a discard, jump to the end of the - * shader if all relevant channels have been discarded. - */ - fs_inst *discard_jump = bld.emit(FS_OPCODE_DISCARD_JUMP); - discard_jump->flag_subreg = sample_mask_flag_subreg(this); - - discard_jump->predicate = BRW_PREDICATE_ALIGN1_ANY4H; - discard_jump->predicate_inverse = true; -} - -void fs_visitor::emit_gs_thread_end() { assert(stage == MESA_SHADER_GEOMETRY); diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h index 774f414..8b71f8c 100644 --- a/src/intel/compiler/brw_fs.h +++ b/src/intel/compiler/brw_fs.h @@ -213,7 +213,6 @@ public: const fs_reg &texture_handle); void emit_gen6_gather_wa(uint8_t wa, fs_reg dst); fs_reg resolve_source_modifiers(const fs_reg &src); - void emit_discard_jump(); void emit_fsign(const class brw::fs_builder &, const nir_alu_instr *instr, fs_reg result, fs_reg *op, unsigned fsign_src); void emit_shader_float_controls_execution_mode(); diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index 81e7f4a..69f5ef7 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -3427,8 +3427,10 @@ fs_visitor::nir_emit_fs_intrinsic(const fs_builder &bld, case nir_intrinsic_demote: case nir_intrinsic_discard: + case nir_intrinsic_terminate: case nir_intrinsic_demote_if: - case nir_intrinsic_discard_if: { + case nir_intrinsic_discard_if: + case nir_intrinsic_terminate_if: { /* We track our discarded pixels in f0.1/f1.0. By predicating on it, we * can update just the flag bits that aren't yet discarded. If there's * no condition, we emit a CMP of g0 != g0, so all currently executing @@ -3436,7 +3438,8 @@ fs_visitor::nir_emit_fs_intrinsic(const fs_builder &bld, */ fs_inst *cmp = NULL; if (instr->intrinsic == nir_intrinsic_demote_if || - instr->intrinsic == nir_intrinsic_discard_if) { + instr->intrinsic == nir_intrinsic_discard_if || + instr->intrinsic == nir_intrinsic_terminate_if) { nir_alu_instr *alu = nir_src_as_alu_instr(instr->src[0]); if (alu != NULL && @@ -3492,7 +3495,19 @@ fs_visitor::nir_emit_fs_intrinsic(const fs_builder &bld, cmp->predicate = BRW_PREDICATE_NORMAL; cmp->flag_subreg = sample_mask_flag_subreg(this); - emit_discard_jump(); + fs_inst *jump = bld.emit(FS_OPCODE_DISCARD_JUMP); + jump->flag_subreg = sample_mask_flag_subreg(this); + jump->predicate_inverse = true; + + if (instr->intrinsic == nir_intrinsic_terminate || + instr->intrinsic == nir_intrinsic_terminate_if) { + jump->predicate = BRW_PREDICATE_NORMAL; + } else { + /* Only jump when the whole quad is demoted. For historical + * reasons this is also used for discard. + */ + jump->predicate = BRW_PREDICATE_ALIGN1_ANY4H; + } if (devinfo->gen < 7) limit_dispatch_width( -- 2.7.4