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, } } /// Returns whether the `Buffer` was recreated, which stales any cached /// `BindGroup` holding it. pub fn update(&mut self, device: &Device, queue: &Queue, data: &[T]) -> bool { let resized = self.len != data.len(); if resized { 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)); resized } pub fn len(&self) -> usize { self.len } fn init_buf(device: &Device, size: usize, usage: BufferUsages, label: &'static str) -> Buffer { let mut size = size as u64; if usage.contains(BufferUsages::STORAGE) { // A binding cannot be empty or under the layout's minimum. size = size.max(std::mem::size_of::() as u64); } device.create_buffer(&BufferDescriptor { label: Some(label), size, mapped_at_creation: false, usage, }) } }