1use encase::{
2 self,
3 private::{AlignmentValue, Writer},
4};
5use wgpu;
6
7pub struct Buffer {
10 pub buffer: wgpu::Buffer,
11 pub size_bytes: usize,
12 cpu_byte_buffer: Vec<u8>,
13 offset: usize,
14 alignment: AlignmentValue,
15}
16
17impl Buffer {
18 pub fn new_empty(device: &wgpu::Device, usage: wgpu::BufferUsages, label: wgpu::Label, size_bytes: usize) -> Self {
19 let buffer = device.create_buffer(&wgpu::BufferDescriptor {
20 label,
21 size: size_bytes as u64,
22 usage,
23 mapped_at_creation: false,
24 });
25
26 let cpu_byte_buffer = Vec::new();
27
28 Self {
29 buffer,
30 size_bytes,
31 cpu_byte_buffer,
33 offset: 0,
34 alignment: AlignmentValue::new(256),
35 }
36 }
37
38 pub fn is_empty(&self) -> bool {
39 self.size_bytes == 0
40 }
41
42 pub fn write_buffer(&mut self, queue: &wgpu::Queue, offset_bytes: usize, data: &[u8]) {
43 queue.write_buffer(&self.buffer, offset_bytes as u64, bytemuck::cast_slice(data));
44 }
45
46 pub fn push_cpu_chunk_aligned<T: encase::ShaderType + encase::internal::WriteInto>(&mut self, chunk: &T) -> u32 {
52 let offset = self.offset;
53 let mut writer = Writer::new(chunk, &mut self.cpu_byte_buffer, offset).unwrap();
54 chunk.write_into(&mut writer);
55 self.offset += usize::try_from(self.alignment.round_up(chunk.size().get())).unwrap();
57 u32::try_from(offset).unwrap()
58 }
59
60 pub fn push_cpu_chunk_packed<T: encase::ShaderType + encase::internal::WriteInto>(&mut self, chunk: &T) {
67 let offset = self.offset;
68 let mut writer = Writer::new(chunk, &mut self.cpu_byte_buffer, offset).unwrap();
69 chunk.write_into(&mut writer);
70 self.offset += usize::try_from(chunk.size().get()).unwrap();
71 }
72
73 pub fn upload_from_cpu_chunks(&mut self, queue: &wgpu::Queue) {
75 queue.write_buffer(&self.buffer, 0, self.cpu_byte_buffer.as_slice());
77 }
78
79 pub fn reset_chunks_offset(&mut self) {
82 self.offset = 0;
83 }
84
85 pub fn reset_chunks_offset_if_necessary(&mut self) {
90 if self.offset > self.size_bytes / 2 {
92 self.offset = 0;
93 }
94 }
95
96 pub fn offset(&self) -> usize {
97 self.offset
98 }
99}