intel/fs: Allow FS_OPCODE_SCHEDULING_FENCE stall on registers
It will generate the MOVs (or SYNC_NOP in Gen12+) needed for stall. Reviewed-by: Francisco Jerez <currojerez@riseup.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3278>
This commit is contained in:

committed by
Marge Bot

parent
9248b04528
commit
0e96b0d6dd
@@ -465,6 +465,9 @@ enum opcode {
|
||||
|
||||
/**
|
||||
* Scheduling-only fence.
|
||||
*
|
||||
* Sources can be used to force a stall until the registers in those are
|
||||
* available. This might generate MOVs or SYNC_NOPs (Gen12+).
|
||||
*/
|
||||
FS_OPCODE_SCHEDULING_FENCE,
|
||||
|
||||
|
@@ -2228,8 +2228,33 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width,
|
||||
}
|
||||
|
||||
case FS_OPCODE_SCHEDULING_FENCE:
|
||||
if (unlikely(debug_flag))
|
||||
disasm_info->use_tail = true;
|
||||
if (inst->sources == 0 && inst->sched.regdist == 0 &&
|
||||
inst->sched.mode == TGL_SBID_NULL) {
|
||||
if (unlikely(debug_flag))
|
||||
disasm_info->use_tail = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (devinfo->gen >= 12) {
|
||||
/* Use the available SWSB information to stall. A single SYNC is
|
||||
* sufficient since if there were multiple dependencies, the
|
||||
* scoreboard algorithm already injected other SYNCs before this
|
||||
* instruction.
|
||||
*/
|
||||
brw_SYNC(p, TGL_SYNC_NOP);
|
||||
} else {
|
||||
for (unsigned i = 0; i < inst->sources; i++) {
|
||||
/* Emit a MOV to force a stall until the instruction producing the
|
||||
* registers finishes.
|
||||
*/
|
||||
brw_MOV(p, retype(brw_null_reg(), BRW_REGISTER_TYPE_UW),
|
||||
retype(src[i], BRW_REGISTER_TYPE_UW));
|
||||
}
|
||||
|
||||
if (inst->sources > 1)
|
||||
multiple_instructions_emitted = true;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_INTERLOCK:
|
||||
|
Reference in New Issue
Block a user