1#import bevy_pbr::meshlet_bindings::{ 3 meshlet_global_cluster_count, 4 meshlet_instance_meshlet_counts, 5 meshlet_instance_meshlet_slice_starts, 6 meshlet_cluster_instance_ids, 7 meshlet_cluster_meshlet_ids, 12var<workgroup> cluster_slice_start_workgroup: u32; 15@workgroup_size(1024, 1, 1) 16fn fill_cluster_buffers( 17 @builtin(workgroup_id) workgroup_id: vec3<u32>, 18 @builtin(num_workgroups) num_workgroups: vec3<u32>, 19 @builtin(local_invocation_index) local_invocation_index: u32, 22 var instance_id = workgroup_id.x + (workgroup_id.y * num_workgroups.x); 23 if instance_id >= scene_instance_count { return; } 25 let instance_meshlet_count = meshlet_instance_meshlet_counts[instance_id]; 26 let instance_meshlet_slice_start = meshlet_instance_meshlet_slice_starts[instance_id]; 29 if local_invocation_index == 0u { 30 cluster_slice_start_workgroup = atomicAdd(&meshlet_global_cluster_count, instance_meshlet_count); 32 let cluster_slice_start = workgroupUniformLoad(&cluster_slice_start_workgroup); 35 for (var clusters_written = 0u; clusters_written < instance_meshlet_count; clusters_written += 1024u) { 37 let meshlet_id_local = clusters_written + local_invocation_index; 38 if meshlet_id_local >= instance_meshlet_count { return; } 41 let cluster_id = cluster_slice_start + meshlet_id_local; 44 let meshlet_id = instance_meshlet_slice_start + meshlet_id_local; 47 meshlet_cluster_instance_ids[cluster_id] = instance_id; 48 meshlet_cluster_meshlet_ids[cluster_id] = meshlet_id;