#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct WgpuQueueSnapshot {
pub nodes: usize,
pub bytes: u64,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct WgpuQueueLimits {
pub max_nodes: usize,
pub max_bytes: u64,
pub deadline_tick: u64,
}
#[derive(Clone, Debug)]
pub struct WgpuSubmissionQueue {
limits: WgpuQueueLimits,
nodes: usize,
bytes: u64,
}
impl WgpuSubmissionQueue {
pub fn new(limits: WgpuQueueLimits) -> Self {
Self {
limits,
nodes: 0,
bytes: 0,
}
}
pub fn push(&mut self, bytes: u64, deadline_tick: u64) -> Result<(), String> {
if deadline_tick > self.limits.deadline_tick {
return Err("wgpu submission deadline expired".to_owned());
}
if self.nodes >= self.limits.max_nodes {
return Err("wgpu submission queue node limit reached".to_owned());
}
if self.bytes.saturating_add(bytes) > self.limits.max_bytes {
return Err("wgpu submission queue byte limit reached".to_owned());
}
self.nodes += 1;
self.bytes += bytes;
Ok(())
}
pub fn flush(&mut self) -> WgpuQueueSnapshot {
let snapshot = self.snapshot();
self.nodes = 0;
self.bytes = 0;
snapshot
}
pub fn snapshot(&self) -> WgpuQueueSnapshot {
WgpuQueueSnapshot {
nodes: self.nodes,
bytes: self.bytes,
}
}
}