wgpu_noboiler/
buffer.rs

1use bytemuck::Pod;
2use wgpu::util::{BufferInitDescriptor, DeviceExt};
3use wgpu::{Buffer, BufferSlice, BufferUsages, Device};
4
5/// Builder Patter for wgpu [Buffer]
6pub struct BufferCreator<'a, T: Pod> {
7    data: Vec<T>,
8    device: &'a Device,
9    usage: BufferUsages,
10
11    label: &'a str,
12}
13
14impl<'a> BufferCreator<'a, i32> {
15    /// Helps to create indices-buffer
16    ///
17    /// IndexFormat: u32
18    pub fn indices(device: &'a Device) -> BufferCreator<'a, i32> {
19        BufferCreator {
20            data: vec![],
21            device,
22            usage: BufferUsages::INDEX,
23            label: "Indices Buffer",
24        }
25    }
26}
27
28impl<'a, T: Pod> BufferCreator<'a, T> {
29    /// Helps to create vertex-buffer
30    pub fn vertex(device: &'a Device) -> BufferCreator<'a, T> {
31        BufferCreator {
32            data: vec![],
33            device,
34            usage: BufferUsages::VERTEX,
35            label: "Vertex Buffer",
36        }
37    }
38
39    /// sets Label (name of the buffer)
40    pub fn label(mut self, label: &'a str) -> Self {
41        self.label = label;
42
43        self
44    }
45
46    /// sets data
47    ///
48    /// overwrites data which was stored before
49    pub fn data(mut self, data: Vec<T>) -> Self {
50        self.data = data;
51        self
52    }
53
54    /// [push](Vec::push) data to current dataVec
55    pub fn add_data(&mut self, data: T) -> &mut Self {
56        self.data.push(data);
57
58        self
59    }
60
61    /// [appends](Vec::append) data to current dataVec
62    pub fn append_data(&mut self, data: &mut Vec<T>) -> &mut Self {
63        self.data.append(data);
64
65        self
66    }
67
68    /// creates SimpleBuffer
69    pub fn build(&self) -> SimpleBuffer {
70        SimpleBuffer {
71            buffer: self.device.create_buffer_init(&BufferInitDescriptor {
72                label: Some(self.label),
73                contents: bytemuck::cast_slice(&self.data),
74                usage: self.usage,
75            }),
76
77            size: self.data.len() as u32,
78        }
79    }
80}
81
82/// wrapper for [Buffer] which stores count of elements
83pub struct SimpleBuffer {
84    buffer: Buffer,
85    size: u32,
86}
87
88impl SimpleBuffer {
89    pub fn size(&self) -> u32 {
90        self.size
91    }
92
93    pub fn slice(&self) -> BufferSlice {
94        self.buffer.slice(..)
95    }
96}