Skip to content

Commit 44d53ec

Browse files
committed
feat(rendering): add bounded virtual draw fallback
1 parent 10437c6 commit 44d53ec

6 files changed

Lines changed: 463 additions & 73 deletions

File tree

native/shared/shaders/virtual_geometry/visibility_raster.wgsl

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ fn bloom_invalid_virtual_vertex() -> VirtualVisibilityVertexOut {
1414
return VirtualVisibilityVertexOut(vec4<f32>(2.0, 2.0, 2.0, 1.0), 0u, 0u);
1515
}
1616

17-
@vertex
18-
fn vs_virtual_visibility(
19-
@builtin(vertex_index) corner: u32,
20-
@builtin(instance_index) selected_index: u32,
17+
fn bloom_virtual_visibility_vertex(
18+
selected_index: u32,
19+
corner: u32,
2120
) -> VirtualVisibilityVertexOut {
2221
if (selected_index >= arrayLength(&virtual_selected.records)) {
2322
return bloom_invalid_virtual_vertex();
@@ -61,6 +60,14 @@ fn vs_virtual_visibility(
6160
);
6261
}
6362

63+
@vertex
64+
fn vs_virtual_visibility(
65+
@builtin(vertex_index) corner: u32,
66+
@builtin(instance_index) selected_index: u32,
67+
) -> VirtualVisibilityVertexOut {
68+
return bloom_virtual_visibility_vertex(selected_index, corner);
69+
}
70+
6471
@fragment
6572
fn fs_virtual_visibility(
6673
in: VirtualVisibilityVertexOut,
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Bounded fallback for adapters without indirect-count submission. GPU
2+
// compaction writes selected indices into 22 power-of-two triangle bins, so
3+
// this path issues a constant 22 draws and invokes fewer than twice the exact
4+
// number of cluster vertices.
5+
6+
struct VirtualBinnedSelectionIndices { records: array<u32>, };
7+
@group(0) @binding(5) var<storage, read> virtual_binned_selection_indices:
8+
VirtualBinnedSelectionIndices;
9+
10+
@vertex
11+
fn vs_virtual_visibility_binned(
12+
@builtin(vertex_index) corner: u32,
13+
@builtin(instance_index) binned_index: u32,
14+
) -> VirtualVisibilityVertexOut {
15+
if (binned_index >= arrayLength(&virtual_binned_selection_indices.records)) {
16+
return bloom_invalid_virtual_vertex();
17+
}
18+
return bloom_virtual_visibility_vertex(
19+
virtual_binned_selection_indices.records[binned_index],
20+
corner,
21+
);
22+
}

0 commit comments

Comments
 (0)