use dashmap::DashMap;
use std::sync::Arc;
use wgpu::util::{BufferInitDescriptor, DeviceExt};
use wgpu::{Buffer, BufferUsages, Device};
#[derive(Copy, Clone, PartialEq, Eq, Hash, bytemuck::Pod, bytemuck::Zeroable)]
#[repr(C, align(16))]
pub struct ViewShape {
pub size: [u32; 2],
pub stride: u32,
pub offset: u32,
}
#[derive(Default)]
pub struct ViewShapeBuffers {
buffers: DashMap<ViewShape, Arc<Buffer>>,
}
impl ViewShapeBuffers {
pub fn new() -> Self {
Self {
buffers: DashMap::new(),
}
}
pub fn get(&self, device: &Device, shape: ViewShape) -> Arc<Buffer> {
self.buffers
.entry(shape)
.or_insert_with(|| {
Arc::new(device.create_buffer_init(&BufferInitDescriptor {
label: None,
contents: bytemuck::cast_slice(&[shape]),
usage: BufferUsages::UNIFORM,
}))
})
.clone()
}
}