Module: Mesa Branch: main Commit: 8006f271d45901d10b2c74bb95ddcc9f1ecb8cf1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8006f271d45901d10b2c74bb95ddcc9f1ecb8cf1
Author: Faith Ekstrand <faith.ekstr...@collabora.com> Date: Thu Dec 14 16:24:07 2023 -0600 nak: Add a delay of 2 cycles for barriers Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26615> --- src/nouveau/compiler/nak/calc_instr_deps.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/nouveau/compiler/nak/calc_instr_deps.rs b/src/nouveau/compiler/nak/calc_instr_deps.rs index cb1804f48c5..65665418d58 100644 --- a/src/nouveau/compiler/nak/calc_instr_deps.rs +++ b/src/nouveau/compiler/nak/calc_instr_deps.rs @@ -311,8 +311,16 @@ fn calc_delays(f: &mut Function) { for b in f.blocks.iter_mut().rev() { let mut cycle = 0_u32; let mut ready = RegTracker::new(0_u32); + let mut bars_ready = [0_u32; 6]; for instr in b.instrs.iter_mut().rev() { let mut min_start = cycle + 1; /* TODO: co-issue */ + // Barriers take two cycles before we can wait on them + if let Some(bar) = instr.deps.rd_bar() { + min_start = max(min_start, bars_ready[usize::from(bar)] + 2); + } + if let Some(bar) = instr.deps.wr_bar() { + min_start = max(min_start, bars_ready[usize::from(bar)] + 2); + } if instr.has_fixed_latency() { for (idx, dst) in instr.dsts().iter().enumerate() { if let Dst::Reg(reg) = dst { @@ -331,7 +339,14 @@ fn calc_delays(f: &mut Function) { .unwrap(); instr.deps.set_delay(delay); + ready.for_each_instr_pred_mut(instr, |c| *c = min_start); ready.for_each_instr_src_mut(instr, |c| *c = min_start); + for (bar, c) in bars_ready.iter_mut().enumerate() { + if instr.deps.wt_bar_mask & (1 << bar) != 0 { + *c = min_start; + } + } + cycle = min_start; } }