use std::marker::PhantomData; use bytemuck::Pod; use wgpu::*; pub struct ArrBuf { label: &'static str, usage: BufferUsages, pub buffer: Buffer, len: usize, _pd: PhantomData, } impl ArrBuf { pub fn new(device: &Device, usage: BufferUsages, label: &'static str) -> Self { Self { label, usage, buffer: Self::init_buf(device, 0, usage, label), len: 0, _pd: PhantomData, } } pub fn update(&mut self, device: &Device, queue: &Queue, data: &[T]) { if self.len != data.len() { self.len = data.len(); self.buffer = Self::init_buf(device, std::mem::size_of_val(data), self.usage, self.label); } queue.write_buffer(&self.buffer, 0, bytemuck::cast_slice(data)); } fn init_buf(device: &Device, size: usize, usage: BufferUsages, label: &'static str) -> Buffer { let mut size = size as u64; if usage.contains(BufferUsages::STORAGE) { size = size.max(std::mem::size_of::() as u64); } device.create_buffer(&BufferDescriptor { label: Some(label), size, mapped_at_creation: false, usage, }) } #[allow(clippy::len_without_is_empty)] pub fn len(&self) -> usize { self.len } }