steamengine_renderer_util/
simple_buffer.rs1use std::sync::Arc;
2use steamengine_renderer::Renderer;
3use tracing::*;
4use wgpu::Buffer;
5use wgpu::BufferUsages;
6use wgpu::util::DrawIndexedIndirectArgs;
7
8pub trait SimpleBuffer<'a, T: bytemuck::NoUninit> {
10 fn new(renderer: Arc<Renderer<'a>>, limit: u64) -> Self;
13 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 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 fn as_entrie(&self) -> wgpu::BindingResource {
36 self.buffer().as_entire_binding()
37 }
38 fn buffer(&self) -> &wgpu::Buffer;
40 fn renderer(&self) -> Arc<Renderer<'a>>;
41 fn limit(&self) -> u64;
42}
43
44pub struct DrawQueueBuffer<'a> {
46 buffer: Buffer,
48 renderer: Arc<Renderer<'a>>,
50 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}