steamengine_renderer_util/
simple_buffer.rs

1use std::sync::Arc;
2use steamengine_renderer::Renderer;
3use tracing::*;
4use wgpu::Buffer;
5use wgpu::BufferUsages;
6use wgpu::util::DrawIndexedIndirectArgs;
7
8/// Abstraction of a buffer
9pub trait SimpleBuffer<'a, T: bytemuck::NoUninit> {
10    /// create a new buffer with limit of objects inside the buffer
11    /// limit = size_of<T>() * limit;
12    fn new(renderer: Arc<Renderer<'a>>, limit: u64) -> Self;
13    /// Sets a unic entry inside the buffer
14    fn set(&self, index: u64, data: T) {
15        if index > self.limit() {
16            error!(
17                "attempt to nest an entity outside the limits of the buffer, SimpleBuffer Overflow"
18            );
19            return;
20        }
21        self.renderer()
22            .update_buffer_entry(self.buffer(), index, data);
23    }
24    /// Sets all the buffer
25    fn set_all(&self, data: &[T]) {
26        if data.len() as u64 > self.limit() {
27            error!(
28                "attempt to nest an entity outside the limits of the buffer, SimpleBuffer Overflow"
29            );
30            return;
31        }
32        self.renderer().update_buffer(self.buffer(), data);
33    }
34    /// Converts the buffert to a binding resource
35    fn as_entrie(&self) -> wgpu::BindingResource {
36        self.buffer().as_entire_binding()
37    }
38    /// Gets the buffer
39    fn buffer(&self) -> &wgpu::Buffer;
40    fn renderer(&self) -> Arc<Renderer<'a>>;
41    fn limit(&self) -> u64;
42}
43
44/// Implementation of simple buffer for commands buffer
45pub struct DrawQueueBuffer<'a> {
46    /// Wgpu Buffer
47    buffer: Buffer,
48    /// Renderer
49    renderer: Arc<Renderer<'a>>,
50    /// Limit of the buffer
51    limit: u64,
52}
53impl<'a> SimpleBuffer<'a, DrawIndexedIndirectArgs> for DrawQueueBuffer<'a> {
54    fn new(renderer: Arc<Renderer<'a>>, limit: u64) -> Self {
55        let lock = renderer.clone();
56        let buffer = lock.create_buffer(
57            "Indexed Indirect Buffer",
58            BufferUsages::INDIRECT | BufferUsages::COPY_DST,
59            limit * std::mem::size_of::<DrawIndexedIndirectArgs>() as u64,
60        );
61
62        Self {
63            buffer,
64            renderer,
65            limit,
66        }
67    }
68    fn buffer(&self) -> &wgpu::Buffer {
69        &self.buffer
70    }
71    fn renderer(&self) -> Arc<Renderer<'a>> {
72        self.renderer.clone()
73    }
74    fn limit(&self) -> u64 {
75        self.limit
76    }
77}