Skip to main content

polyscope_render/
buffer.rs

1//! GPU buffer management.
2
3use wgpu::util::DeviceExt;
4
5/// Creates a vertex buffer from data.
6pub fn create_vertex_buffer<T: bytemuck::Pod>(
7    device: &wgpu::Device,
8    data: &[T],
9    label: Option<&str>,
10) -> wgpu::Buffer {
11    device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
12        label,
13        contents: bytemuck::cast_slice(data),
14        usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
15    })
16}
17
18/// Creates an index buffer from data.
19#[must_use]
20pub fn create_index_buffer(
21    device: &wgpu::Device,
22    data: &[u32],
23    label: Option<&str>,
24) -> wgpu::Buffer {
25    device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
26        label,
27        contents: bytemuck::cast_slice(data),
28        usage: wgpu::BufferUsages::INDEX | wgpu::BufferUsages::COPY_DST,
29    })
30}
31
32/// Creates a uniform buffer from data.
33pub fn create_uniform_buffer<T: bytemuck::Pod>(
34    device: &wgpu::Device,
35    data: &T,
36    label: Option<&str>,
37) -> wgpu::Buffer {
38    device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
39        label,
40        contents: bytemuck::bytes_of(data),
41        usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
42    })
43}
44
45/// Creates a storage buffer from data.
46pub fn create_storage_buffer<T: bytemuck::Pod>(
47    device: &wgpu::Device,
48    data: &[T],
49    label: Option<&str>,
50) -> wgpu::Buffer {
51    device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
52        label,
53        contents: bytemuck::cast_slice(data),
54        usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
55    })
56}
57
58/// Updates a buffer with new data.
59pub fn update_buffer<T: bytemuck::Pod>(queue: &wgpu::Queue, buffer: &wgpu::Buffer, data: &[T]) {
60    queue.write_buffer(buffer, 0, bytemuck::cast_slice(data));
61}