sketch_2d/buffer/
mod.rs

1/*
2 * Created on Mon Jul 03 2023
3 *
4 * Copyright (c) storycraft. Licensed under the MIT Licence.
5 */
6
7pub mod stream;
8
9use std::borrow::Cow;
10
11use wgpu::{Buffer, BufferAddress, BufferDescriptor, BufferUsages, Device};
12
13#[derive(Debug)]
14/// Dynamically resizing buffer.
15pub 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    /// Allocate and provide buffer given size.
44    /// Return reference to buffer and bool if the buffer is mapped
45    /// The size of buffer can be larger than requested size.
46    /// Reusing buffer if possible.
47    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}