mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 10:40:11 +01:00
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:
parent
d134379631
commit
3112fbcc56
3 changed files with 19 additions and 15 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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(_))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue