mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
use bytemuck::Pod;
|
|
use wgpu::util::DeviceExt;
|
|
|
|
#[derive(Clone)]
|
|
pub struct Buffer<T: Copy + Pod> {
|
|
pub buf: wgpu::Buffer,
|
|
// bytes
|
|
count: usize,
|
|
phantom_data: std::marker::PhantomData<T>,
|
|
}
|
|
|
|
impl<T: Copy + Pod> Buffer<T> {
|
|
pub fn new(device: &mut wgpu::Device, cap: usize, usage: wgpu::BufferUsage) -> Self {
|
|
Self {
|
|
buf: device.create_buffer(&wgpu::BufferDescriptor {
|
|
label: None,
|
|
mapped_at_creation: false,
|
|
size: cap,
|
|
usage: usage | wgpu::BufferUsage::MAP_WRITE,
|
|
}),
|
|
count: 0,
|
|
phantom_data: std::marker::PhantomData,
|
|
}
|
|
}
|
|
|
|
pub fn new_with_data(device: &mut wgpu::Device, usage: wgpu::BufferUsage, data: &[T]) -> Self {
|
|
let contents = data.as_bytes();
|
|
|
|
Self {
|
|
buf: device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
|
label: None,
|
|
contents,
|
|
usage: usage | wgpu::BufferUsage::MAP_WRITE,
|
|
}),
|
|
count: data.len(),
|
|
phantom_data: std::marker::PhantomData,
|
|
}
|
|
}
|
|
|
|
pub fn update(
|
|
&mut self,
|
|
device: &wgpu::Device,
|
|
queue: &wgpu::Queue,
|
|
vals: &[T],
|
|
offset: usize,
|
|
) {
|
|
if !vals.is_empty() {
|
|
queue.write_buffer(&self.buf, offset, vals.as_bytes())
|
|
}
|
|
}
|
|
|
|
pub fn count(&self) -> usize { self.count }
|
|
}
|