1pub mod stream;
8
9use std::borrow::Cow;
10
11use wgpu::{Buffer, BufferAddress, BufferDescriptor, BufferUsages, Device};
12
13#[derive(Debug)]
14pub struct GrowingBuffer<'label> {
16 label: Option<Cow<'label, str>>,
17 usages: BufferUsages,
18 mapped_at_creation: bool,
19
20 buffer: Option<Buffer>,
21 buffer_size: BufferAddress,
22}
23
24impl<'label> GrowingBuffer<'label> {
25 pub const fn new(
26 label: Option<Cow<'label, str>>,
27 usages: BufferUsages,
28 mapped_at_creation: bool,
29 ) -> Self {
30 Self {
31 label,
32 usages,
33 mapped_at_creation,
34 buffer: None,
35 buffer_size: 0,
36 }
37 }
38
39 pub const fn size(&self) -> BufferAddress {
40 self.buffer_size
41 }
42
43 pub fn get(&mut self, device: &Device, size: BufferAddress) -> (&Buffer, bool) {
48 if self.buffer.is_none() || self.buffer_size < size || self.buffer_size > size * 2 {
49 let buf = device.create_buffer(&BufferDescriptor {
50 label: self.label.as_deref(),
51 size,
52 usage: self.usages,
53 mapped_at_creation: self.mapped_at_creation,
54 });
55
56 self.buffer = Some(buf);
57
58 return (self.buffer.as_ref().unwrap(), self.mapped_at_creation);
59 }
60
61 (self.buffer.as_ref().unwrap(), false)
62 }
63}