use std::marker::PhantomData;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
#[derive(Clone, Copy, Debug, Default)]
pub struct WgpuFilterStats {
pub frames: u64,
pub upload_secs: f64,
pub gpu_secs: f64,
pub download_secs: f64,
}
pub struct WgpuParamsHandle<P: bytemuck::Pod> {
pub(crate) bytes: Arc<Mutex<Vec<u8>>>,
pub(crate) dirty: Arc<AtomicBool>,
pub(crate) _marker: PhantomData<P>,
}
impl<P: bytemuck::Pod> WgpuParamsHandle<P> {
pub fn set(&self, value: P) {
let mut bytes = self
.bytes
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
bytes.clear();
bytes.extend_from_slice(bytemuck::bytes_of(&value));
self.dirty.store(true, Ordering::Release);
}
}
pub(crate) struct SharedParams {
pub(crate) bytes: Arc<Mutex<Vec<u8>>>,
pub(crate) dirty: Arc<AtomicBool>,
pub(crate) len: usize,
}
impl SharedParams {
pub(crate) fn new(initial: Vec<u8>) -> Self {
Self {
len: initial.len(),
bytes: Arc::new(Mutex::new(initial)),
dirty: Arc::new(AtomicBool::new(true)),
}
}
}