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;
         }
     }

Reply via email to