cvkg_render_gpu/subsystems/
geometry_buffers.rs1use crate::vertex::{InstanceData, Vertex};
9
10pub struct GeometryBuffers {
14 pub vertex_buffer: wgpu::Buffer,
16 pub index_buffer: wgpu::Buffer,
18 pub instance_buffer: wgpu::Buffer,
20 pub max_vertices: usize,
22 pub max_indices: usize,
24}
25
26impl GeometryBuffers {
27 pub fn forge(
31 device: &wgpu::Device,
32 max_vertices: usize,
33 max_indices: usize,
34 ) -> Self {
35 let vertex_buffer = device.create_buffer(&wgpu::BufferDescriptor {
36 label: Some("Surtr Vertex Anvil"),
37 size: (max_vertices * std::mem::size_of::<Vertex>()) as u64,
38 usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
39 mapped_at_creation: false,
40 });
41 let index_buffer = device.create_buffer(&wgpu::BufferDescriptor {
42 label: Some("Surtr Index Anvil"),
43 size: (max_indices * std::mem::size_of::<u32>()) as u64,
44 usage: wgpu::BufferUsages::INDEX | wgpu::BufferUsages::COPY_DST,
45 mapped_at_creation: false,
46 });
47 let instance_buffer = device.create_buffer(&wgpu::BufferDescriptor {
48 label: Some("Surtr Instance Anvil"),
49 size: (max_vertices / 4 * std::mem::size_of::<InstanceData>()) as u64,
50 usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
51 mapped_at_creation: false,
52 });
53 Self {
54 vertex_buffer,
55 index_buffer,
56 instance_buffer,
57 max_vertices,
58 max_indices,
59 }
60 }
61
62 pub fn vram_bytes(&self) -> u64 {
64 let vertex_bytes = self.max_vertices * std::mem::size_of::<Vertex>();
65 let index_bytes = self.max_indices * std::mem::size_of::<u32>();
66 let instance_bytes =
67 (self.max_vertices / 4) * std::mem::size_of::<InstanceData>();
68 (vertex_bytes + index_bytes + instance_bytes) as u64
69 }
70
71 pub fn grow_vertex_buffer(
77 &mut self,
78 device: &wgpu::Device,
79 min_capacity: usize,
80 max_capacity: usize,
81 ) -> bool {
82 let current = self.vertex_buffer.size() as usize
83 / std::mem::size_of::<Vertex>();
84 if min_capacity <= current {
85 return false;
86 }
87 let new_size = (min_capacity.min(max_capacity)) * std::mem::size_of::<Vertex>();
88 self.vertex_buffer = device.create_buffer(&wgpu::BufferDescriptor {
89 label: Some("Vertex Buffer (Grown)"),
90 size: new_size as u64,
91 usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
92 mapped_at_creation: false,
93 });
94 true
95 }
96
97 pub fn grow_index_buffer(
102 &mut self,
103 device: &wgpu::Device,
104 min_capacity: usize,
105 max_capacity: usize,
106 ) -> bool {
107 let current = self.index_buffer.size() as usize
108 / std::mem::size_of::<u32>();
109 if min_capacity <= current {
110 return false;
111 }
112 let new_size = (min_capacity.min(max_capacity)) * std::mem::size_of::<u32>();
113 self.index_buffer = device.create_buffer(&wgpu::BufferDescriptor {
114 label: Some("Index Buffer (Grown)"),
115 size: new_size as u64,
116 usage: wgpu::BufferUsages::INDEX | wgpu::BufferUsages::COPY_DST,
117 mapped_at_creation: false,
118 });
119 true
120 }
121}