diff --git a/src/nouveau/compiler/nak/calc_instr_deps.rs b/src/nouveau/compiler/nak/calc_instr_deps.rs index d11ab79be2d..e33252833c8 100644 --- a/src/nouveau/compiler/nak/calc_instr_deps.rs +++ b/src/nouveau/compiler/nak/calc_instr_deps.rs @@ -257,18 +257,7 @@ fn assign_barriers(f: &mut Function, sm: &dyn ShaderModel) { waits.extend_from_slice(u.deps()); }); - if instr.has_fixed_latency(sm.sm()) { - // Delays will cover us here. We just need to make sure - // that we wait on any uses that we consume. - uses.for_each_instr_src_mut(instr, |_, u| { - let u = u.clear_write(); - waits.extend_from_slice(u.deps()); - }); - uses.for_each_instr_dst_mut(instr, |_, u| { - let u = u.clear(); - waits.extend_from_slice(u.deps()); - }); - } else { + if instr.needs_scoreboard(sm.sm()) { let (rd, wr) = deps.add_instr(bi, ip); uses.for_each_instr_src_mut(instr, |_, u| { // Only mark a dep as signaled if we actually have @@ -291,6 +280,17 @@ fn assign_barriers(f: &mut Function, sm: &dyn ShaderModel) { } } }); + } else { + // Delays will cover us here. We just need to make sure + // that we wait on any uses that we consume. + uses.for_each_instr_src_mut(instr, |_, u| { + let u = u.clear_write(); + waits.extend_from_slice(u.deps()); + }); + uses.for_each_instr_dst_mut(instr, |_, u| { + let u = u.clear(); + waits.extend_from_slice(u.deps()); + }); } deps.add_waits(bi, ip, waits); } @@ -314,7 +314,7 @@ fn assign_barriers(f: &mut Function, sm: &dyn ShaderModel) { instr.deps.set_yield(true); } - if instr.has_fixed_latency(sm.sm()) { + if !instr.needs_scoreboard(sm.sm()) { continue; } diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index bba05b04217..dd4dc1d546f 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -7006,6 +7006,10 @@ impl Instr { self.op.has_fixed_latency(sm) } + pub fn needs_scoreboard(&self, sm: u8) -> bool { + !self.has_fixed_latency(sm) + } + pub fn needs_yield(&self) -> bool { matches!(&self.op, Op::Bar(_) | Op::BSync(_)) } diff --git a/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs b/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs index 2b21a87429d..c36de2ced1c 100644 --- a/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs +++ b/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs @@ -96,7 +96,7 @@ fn generate_dep_graph( r_src_idx, ) }; - if !instr.has_fixed_latency(sm.sm()) { + if instr.needs_scoreboard(sm.sm()) { latency = max( latency, estimate_variable_latency(sm.sm(), &instr.op), @@ -134,7 +134,7 @@ fn generate_dep_graph( .map(|i| instr_latency(sm.sm(), &instr.op, i)) .max() .unwrap_or(0); - if !instr.has_fixed_latency(sm.sm()) { + if instr.needs_scoreboard(sm.sm()) { let var_latency = estimate_variable_latency(sm.sm(), &instr.op) + exec_latency(sm.sm(), &instrs[instrs.len() - 1].op); ready_cycle = max(ready_cycle, var_latency);