wde_renderer/utils/
ssbo_mesh.rs

1use bevy::{ecs::system::SystemParamItem, prelude::*};
2use wde_wgpu::{buffer::BufferUsage, utils::Vertex};
3
4use crate::prelude::*;
5
6/// Maximum number of vertices that can be stored in the SSBO buffers.
7const MAX_VERTICES: usize = 1_000_000;
8/// Maximum number of indices that can be stored in the SSBO buffers.
9const MAX_INDICES: usize = 3_000_000;
10
11/// Resource describing the layout of [SsboMesh] data.
12#[derive(Resource, Default)]
13pub struct SsboMeshDescriptor {
14    // Cursor to the current offset in the buffers (in elements, not bytes)
15    pub vertex_buffer_offset: u32,
16    pub index_buffer_offset: u32
17}
18
19/// Resource representing the SSBO mesh data.
20/// It is filled by every GpuMesh if use_ssbo is set to true.
21/// The position of the vertex and index data in the buffers is then stored in the GpuMesh resource.
22#[derive(Asset, Clone, TypePath, Default)]
23pub struct SsboMesh;
24impl SsboMesh {
25    pub const VERTEX_BUFFER_ID: u32 = 0;
26    pub const INDEX_BUFFER_ID: u32 = 1;
27}
28impl RenderData for SsboMesh {
29    type Params = ();
30
31    fn describe(_params: &mut SystemParamItem<Self::Params>, builder: &mut RenderDataBuilder) {
32        builder.add_buffer(
33            Self::VERTEX_BUFFER_ID,
34            Buffer {
35                label: "ssbo-mesh-vertex-buffer-gpu".to_string(),
36                size: std::mem::size_of::<Vertex>() * MAX_VERTICES,
37                usage: BufferUsage::STORAGE | BufferUsage::COPY_DST,
38                content: None
39            }
40        );
41        builder.add_buffer(
42            Self::INDEX_BUFFER_ID,
43            Buffer {
44                label: "ssbo-mesh-index-buffer-gpu".to_string(),
45                size: std::mem::size_of::<u32>() * MAX_INDICES,
46                usage: BufferUsage::STORAGE | BufferUsage::COPY_DST,
47                content: None
48            }
49        );
50    }
51}
52
53#[derive(Asset, Clone, TypePath, Default)]
54pub struct SsboMeshBinding;
55impl RenderBinding for SsboMeshBinding {
56    type Params = SRenderData<SsboMesh>;
57
58    fn describe(
59        &mut self,
60        render_binding: &SystemParamItem<Self::Params>,
61        builder: &mut RenderBindingBuilder
62    ) {
63        builder.add_buffer(render_binding, SsboMesh::VERTEX_BUFFER_ID);
64        builder.add_buffer(render_binding, SsboMesh::INDEX_BUFFER_ID);
65    }
66
67    fn label(&self) -> &'static str {
68        "ssbo_mesh_binding"
69    }
70}