Skip to content

Commit c4c932b

Browse files
committed
address feedback
1 parent 829ba6c commit c4c932b

File tree

5 files changed

+38
-29
lines changed

5 files changed

+38
-29
lines changed

crates/bevy_pbr/src/meshlet/asset.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,11 @@ impl AssetSaver for MeshletMeshSaver {
169169
.write_all(&MESHLET_MESH_ASSET_VERSION.to_le_bytes())
170170
.await?;
171171

172+
writer.write_all(bytemuck::bytes_of(&asset.aabb)).await?;
173+
writer
174+
.write_all(bytemuck::bytes_of(&asset.bvh_depth))
175+
.await?;
176+
172177
// Compress and write asset data
173178
let mut writer = FrameEncoder::new(AsyncWriteSyncAdapter(writer));
174179
write_slice(&asset.vertex_positions, &mut writer)?;
@@ -178,8 +183,6 @@ impl AssetSaver for MeshletMeshSaver {
178183
write_slice(&asset.bvh, &mut writer)?;
179184
write_slice(&asset.meshlets, &mut writer)?;
180185
write_slice(&asset.meshlet_cull_data, &mut writer)?;
181-
writer.write_all(bytemuck::bytes_of(&asset.aabb))?;
182-
writer.write_all(bytemuck::bytes_of(&asset.bvh_depth))?;
183186
writer.finish()?;
184187

185188
Ok(())
@@ -212,6 +215,13 @@ impl AssetLoader for MeshletMeshLoader {
212215
return Err(MeshletMeshSaveOrLoadError::WrongVersion { found: version });
213216
}
214217

218+
let mut bytes = [0u8; 24];
219+
reader.read_exact(&mut bytes).await?;
220+
let aabb = bytemuck::cast(bytes);
221+
let mut bytes = [0u8; 4];
222+
reader.read_exact(&mut bytes).await?;
223+
let bvh_depth = u32::from_le_bytes(bytes);
224+
215225
// Load and decompress asset data
216226
let reader = &mut FrameDecoder::new(AsyncReadSyncAdapter(reader));
217227
let vertex_positions = read_slice(reader)?;
@@ -221,12 +231,6 @@ impl AssetLoader for MeshletMeshLoader {
221231
let bvh = read_slice(reader)?;
222232
let meshlets = read_slice(reader)?;
223233
let meshlet_cull_data = read_slice(reader)?;
224-
let mut bytes = [0u8; 24];
225-
reader.read_exact(&mut bytes)?;
226-
let aabb = bytemuck::cast(bytes);
227-
let mut bytes = [0u8; 4];
228-
reader.read_exact(&mut bytes)?;
229-
let bvh_depth = u32::from_le_bytes(bytes);
230234

231235
Ok(MeshletMesh {
232236
vertex_positions,

crates/bevy_pbr/src/meshlet/cull_bvh.wgsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
}
2626

2727
@compute
28-
@workgroup_size(128, 1, 1) // 8 threads per node
28+
@workgroup_size(128, 1, 1) // 8 threads per node, 16 nodes per workgroup
2929
fn cull_bvh(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) {
3030
// Calculate the queue ID for this thread
3131
let dispatch_id = global_invocation_id.x;

crates/bevy_pbr/src/meshlet/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,10 @@ impl Plugin for MeshletPlugin {
147147
std::process::exit(1);
148148
}
149149

150-
embedded_asset!(app, "clear_visibility_buffer.wgsl");
151150
load_shader_library!(app, "meshlet_bindings.wgsl");
152151
load_shader_library!(app, "visibility_buffer_resolve.wgsl");
153152
load_shader_library!(app, "meshlet_cull_shared.wgsl");
153+
embedded_asset!(app, "clear_visibility_buffer.wgsl");
154154
embedded_asset!(app, "cull_instances.wgsl");
155155
embedded_asset!(app, "cull_bvh.wgsl");
156156
embedded_asset!(app, "cull_clusters.wgsl");

crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::meshlet::asset::{BvhNode, MeshletAabbErrorOffset, MeshletCullData};
1+
use crate::meshlet::asset::{BvhNode, MeshletCullData};
22

33
use super::{asset::Meshlet, persistent_buffer::PersistentGpuBufferable};
44
use alloc::sync::Arc;
@@ -18,27 +18,31 @@ impl PersistentGpuBufferable for Arc<[BvhNode]> {
1818
buffer_slice: &mut [u8],
1919
buffer_offset: BufferAddress,
2020
) {
21+
const SIZE: usize = size_of::<BvhNode>();
22+
for (i, &node) in self.iter().enumerate() {
23+
let bytes: [u8; SIZE] =
24+
bytemuck::cast(node.offset_aabbs(base_meshlet_index, buffer_offset));
25+
buffer_slice[i * SIZE..(i + 1) * SIZE].copy_from_slice(&bytes);
26+
}
27+
}
28+
}
29+
30+
impl BvhNode {
31+
fn offset_aabbs(mut self, base_meshlet_index: u32, buffer_offset: BufferAddress) -> Self {
2132
let size = size_of::<BvhNode>();
2233
let base_bvh_node_index = (buffer_offset / size as u64) as u32;
23-
for (i, &node) in self.iter().enumerate() {
24-
let bytes = bytemuck::cast::<_, [u8; size_of::<BvhNode>()]>(BvhNode {
25-
aabbs: core::array::from_fn(|i| {
26-
let aabb = node.aabbs[i];
27-
MeshletAabbErrorOffset {
28-
child_offset: aabb.child_offset
29-
+ if node.child_counts[i] == u8::MAX {
30-
base_bvh_node_index
31-
} else {
32-
base_meshlet_index
33-
},
34-
..aabb
35-
}
36-
}),
37-
..node
38-
});
39-
let i = i * size;
40-
buffer_slice[i..(i + size)].clone_from_slice(&bytes);
34+
for i in 0..self.aabbs.len() {
35+
self.aabbs[i].child_offset += if self.child_is_bvh_node(i) {
36+
base_bvh_node_index
37+
} else {
38+
base_meshlet_index
39+
};
4140
}
41+
self
42+
}
43+
44+
fn child_is_bvh_node(&self, i: usize) -> bool {
45+
self.child_counts[i] == u8::MAX
4246
}
4347
}
4448

crates/bevy_pbr/src/meshlet/resource_manager.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ impl ResourceManager {
7373
pub fn new(cluster_buffer_slots: u32, render_device: &RenderDevice) -> Self {
7474
let needs_dispatch_remap =
7575
cluster_buffer_slots > render_device.limits().max_compute_workgroups_per_dimension;
76+
// The IDs are a (u32, u32) of instance and index.
7677
let cull_queue_size = 2 * cluster_buffer_slots as u64 * size_of::<u32>() as u64;
7778

7879
Self {

0 commit comments

Comments
 (0)