nak: Add and use a ShaderModel::needs_scoreboard() helper

For now, this is just !Op::has_fixed_latency() but this is actually the
question the scheduling code is asking.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Mel Henning <mhenning@darkrefraction.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34302>
This commit is contained in:
Faith Ekstrand 2025-03-31 12:12:46 -05:00 committed by Marge Bot
parent d134379631
commit 3112fbcc56
3 changed files with 19 additions and 15 deletions

View file

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

View file

@ -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(_))
}

View file

@ -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);