diff options
Diffstat (limited to 'src/intel/compiler/brw_fs.cpp')
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 38 |
1 files changed, 5 insertions, 33 deletions
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 5c225fb0a3b..78994216b12 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -1071,7 +1071,8 @@ fs_inst::flags_written() const opcode != BRW_OPCODE_IF && opcode != BRW_OPCODE_WHILE)) || opcode == SHADER_OPCODE_FIND_LIVE_CHANNEL || - opcode == FS_OPCODE_FB_WRITE) { + opcode == FS_OPCODE_FB_WRITE || + opcode == FS_OPCODE_DISCARD_LANDING_PAD) { return flag_mask(this); } else { return flag_mask(dst, size_written); @@ -1499,21 +1500,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 = 1; - - discard_jump->predicate = BRW_PREDICATE_ALIGN1_ANY4H; - discard_jump->predicate_inverse = true; -} - -void fs_visitor::emit_gs_thread_end() { assert(stage == MESA_SHADER_GEOMETRY); @@ -2976,7 +2962,7 @@ fs_visitor::opt_redundant_discard_jumps() fs_inst *placeholder_halt = NULL; foreach_inst_in_block_reverse(fs_inst, inst, last_bblock) { - if (inst->opcode == FS_OPCODE_PLACEHOLDER_HALT) { + if (inst->opcode == FS_OPCODE_DISCARD_LANDING_PAD) { placeholder_halt = inst; break; } @@ -4232,10 +4218,9 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst, } if (prog_data->uses_kill) { - assert(bld.group() < 16); ubld.group(1, 0).MOV(retype(component(header, 15), BRW_REGISTER_TYPE_UW), - brw_flag_reg(0, 1)); + brw_flag_subreg(inst->flag_subreg + inst->group / 16)); } assert(length == 0); @@ -7100,8 +7085,6 @@ fs_visitor::optimize() OPT(opt_peephole_sel); } - OPT(opt_redundant_discard_jumps); - if (OPT(lower_load_payload)) { split_virtual_grfs(); OPT(register_coalesce); @@ -7616,24 +7599,13 @@ fs_visitor::run_fs(bool allow_spilling, bool do_rep_send) emit_interpolation_setup_gen6(); } - /* We handle discards by keeping track of the still-live pixels in f0.1. - * Initialize it with the dispatched pixels. - */ - if (wm_prog_data->uses_kill) { - const fs_reg dispatch_mask = - devinfo->gen >= 6 ? brw_vec1_grf(1, 7) : brw_vec1_grf(0, 0); - bld.exec_all().group(1, 0) - .MOV(retype(brw_flag_reg(0, 1), BRW_REGISTER_TYPE_UW), - retype(dispatch_mask, BRW_REGISTER_TYPE_UW)); - } - emit_nir_code(); if (failed) return false; if (wm_prog_data->uses_kill) - bld.emit(FS_OPCODE_PLACEHOLDER_HALT); + bld.emit(FS_OPCODE_DISCARD_LANDING_PAD); if (wm_key->alpha_test_func) emit_alpha_test(); |