Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1enable wgpu_ray_query;
3#import bevy_solari::world_cache::WORLD_CACHE_EMPTY_CELL
4#import bevy_solari::realtime_bindings::{
5 world_cache_life,
6 world_cache_checksums,
7 world_cache_radiance,
8 world_cache_luminance_deltas,
9 world_cache_a,
10 world_cache_b,
11 world_cache_active_cell_indices,
12 world_cache_active_cells_count,
15@group(2) @binding(0) var<storage, read_write> world_cache_active_cells_dispatch: vec3<u32>;
17var<workgroup> w1: array<u32, 1024u>;
18var<workgroup> w2: array<u32, 1024u>;
20@compute @workgroup_size(1024, 1, 1)
21fn decay_world_cache(@builtin(global_invocation_id) global_id: vec3<u32>) {
22 var life = world_cache_life[global_id.x];
23 if life > 0u {
24 life -= 1u;
25 world_cache_life[global_id.x] = life;
27 if life == 0u {
28 world_cache_checksums[global_id.x] = WORLD_CACHE_EMPTY_CELL;
29 world_cache_radiance[global_id.x] = vec4(0.0);
30 world_cache_luminance_deltas[global_id.x] = 0.0;
31 }
32 }
35@compute @workgroup_size(1024, 1, 1)
36fn compact_world_cache_single_block(
37 @builtin(global_invocation_id) cell_id: vec3<u32>,
38 @builtin(local_invocation_index) t: u32,
39) {
40 if t == 0u { w1[0u] = 0u; } else { w1[t] = u32(world_cache_life[cell_id.x - 1u] != 0u); }; workgroupBarrier();
41 if t < 1u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 1u]; } workgroupBarrier();
42 if t < 2u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 2u]; } workgroupBarrier();
43 if t < 4u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 4u]; } workgroupBarrier();
44 if t < 8u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 8u]; } workgroupBarrier();
45 if t < 16u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 16u]; } workgroupBarrier();
46 if t < 32u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 32u]; } workgroupBarrier();
47 if t < 64u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 64u]; } workgroupBarrier();
48 if t < 128u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 128u]; } workgroupBarrier();
49 if t < 256u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 256u]; } workgroupBarrier();
50 if t < 512u { world_cache_a[cell_id.x] = w2[t]; } else { world_cache_a[cell_id.x] = w2[t] + w2[t - 512u]; }
53@compute @workgroup_size(1024, 1, 1)
54fn compact_world_cache_blocks(@builtin(local_invocation_index) t: u32) {
55 if t == 0u { w1[0u] = 0u; } else { w1[t] = world_cache_a[t * 1024u - 1u]; }; workgroupBarrier();
56 if t < 1u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 1u]; } workgroupBarrier();
57 if t < 2u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 2u]; } workgroupBarrier();
58 if t < 4u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 4u]; } workgroupBarrier();
59 if t < 8u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 8u]; } workgroupBarrier();
60 if t < 16u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 16u]; } workgroupBarrier();
61 if t < 32u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 32u]; } workgroupBarrier();
62 if t < 64u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 64u]; } workgroupBarrier();
63 if t < 128u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 128u]; } workgroupBarrier();
64 if t < 256u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 256u]; } workgroupBarrier();
65 if t < 512u { world_cache_b[t] = w2[t]; } else { world_cache_b[t] = w2[t] + w2[t - 512u]; }
68@compute @workgroup_size(1024, 1, 1)
69fn compact_world_cache_write_active_cells(
70 @builtin(global_invocation_id) cell_id: vec3<u32>,
71 @builtin(workgroup_id) workgroup_id: vec3<u32>,
72 @builtin(local_invocation_index) thread_index: u32,
73) {
74 let compacted_index = world_cache_a[cell_id.x] + world_cache_b[workgroup_id.x];
75 let cell_active = world_cache_life[cell_id.x] != 0u;
77 if cell_active {
78 world_cache_active_cell_indices[compacted_index] = cell_id.x;
79 }
81 if thread_index == 1023u && workgroup_id.x == 1023u {
82 let active_cell_count = compacted_index + u32(cell_active);
83 world_cache_active_cells_count = active_cell_count;
84 world_cache_active_cells_dispatch = vec3((active_cell_count + 63u) / 64u, 1u, 1u);
85 }
Contents