Module: Mesa Branch: staging/20.2 Commit: 011d569557310218d95917b6fc4c2a7c43f1f10e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=011d569557310218d95917b6fc4c2a7c43f1f10e
Author: Jason Ekstrand <[email protected]> Date: Tue Sep 22 17:42:10 2020 -0500 intel/fs: NoMask initialize the address register for shuffles Cc: [email protected] Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2979 Tested-by: Iván Briano <[email protected]> Reviewed-by: Matt Turner <[email protected]> Reviewed-by: Francisco Jerez <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6825> (cherry picked from commit a8ac61b0ee2fdf4e8bc7b47aee9c24f96c40435c) --- .pick_status.json | 2 +- src/intel/compiler/brw_fs_generator.cpp | 37 ++++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 921cdd55752..b584e0c60ff 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -814,7 +814,7 @@ "description": "intel/fs: NoMask initialize the address register for shuffles", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/intel/compiler/brw_fs_generator.cpp b/src/intel/compiler/brw_fs_generator.cpp index 5b1f28950bf..1b62643027d 100644 --- a/src/intel/compiler/brw_fs_generator.cpp +++ b/src/intel/compiler/brw_fs_generator.cpp @@ -650,15 +650,42 @@ fs_generator::generate_shuffle(fs_inst *inst, group_idx = retype(spread(group_idx, 2), BRW_REGISTER_TYPE_W); } + uint32_t src_start_offset = src.nr * REG_SIZE + src.subnr; + + /* Whether we can use destination dependency control without running + * the risk of a hang if an instruction gets shot down. + */ + const bool use_dep_ctrl = !inst->predicate && + inst->exec_size == dispatch_width; + brw_inst *insn; + + /* Due to a hardware bug some platforms (particularly Gen11+) seem + * to require the address components of all channels to be valid + * whether or not they're active, which causes issues if we use VxH + * addressing under non-uniform control-flow. We can easily work + * around that by initializing the whole address register with a + * pipelined NoMask MOV instruction. + */ + insn = brw_MOV(p, addr, brw_imm_uw(src_start_offset)); + brw_inst_set_mask_control(devinfo, insn, BRW_MASK_DISABLE); + brw_inst_set_pred_control(devinfo, insn, BRW_PREDICATE_NONE); + if (devinfo->gen >= 12) + brw_set_default_swsb(p, tgl_swsb_null()); + else + brw_inst_set_no_dd_clear(devinfo, insn, use_dep_ctrl); + /* Take into account the component size and horizontal stride. */ assert(src.vstride == src.hstride + src.width); - brw_SHL(p, addr, group_idx, - brw_imm_uw(util_logbase2(type_sz(src.type)) + - src.hstride - 1)); + insn = brw_SHL(p, addr, group_idx, + brw_imm_uw(util_logbase2(type_sz(src.type)) + + src.hstride - 1)); + if (devinfo->gen >= 12) + brw_set_default_swsb(p, tgl_swsb_regdist(1)); + else + brw_inst_set_no_dd_check(devinfo, insn, use_dep_ctrl); /* Add on the register start offset */ - brw_set_default_swsb(p, tgl_swsb_regdist(1)); - brw_ADD(p, addr, addr, brw_imm_uw(src.nr * REG_SIZE + src.subnr)); + brw_ADD(p, addr, addr, brw_imm_uw(src_start_offset)); if (type_sz(src.type) > 4 && ((devinfo->gen == 7 && !devinfo->is_haswell) || _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
