use std::sync::{
Mutex, PoisonError,
atomic::{AtomicUsize, Ordering},
};
use crate::ShaderWarmUp;
static REQUESTED: Mutex<Vec<ShaderWarmUp>> = Mutex::new(Vec::new());
static REQUESTED_COUNT: AtomicUsize = AtomicUsize::new(0);
pub fn request_shader_warm_ups(warm_ups: impl IntoIterator<Item = ShaderWarmUp>) {
let mut requested = REQUESTED.lock().unwrap_or_else(PoisonError::into_inner);
for warm_up in warm_ups {
if !requested.contains(&warm_up) {
requested.push(warm_up);
}
}
REQUESTED_COUNT.store(requested.len(), Ordering::Release);
}
pub fn shader_warm_ups_after(seen: usize) -> Vec<ShaderWarmUp> {
if REQUESTED_COUNT.load(Ordering::Acquire) <= seen {
return Vec::new();
}
let requested = REQUESTED.lock().unwrap_or_else(PoisonError::into_inner);
requested
.get(seen..)
.map_or_else(Vec::new, <[ShaderWarmUp]>::to_vec)
}
#[cfg(test)]
#[path = "tests/shader_warm_up_tests.rs"]
mod tests;