pub const BROADPHASE_SORT_SHADER: &str = r#"
// Bitonic sort pass for SAP broadphase.
// Each invocation compares and optionally swaps one pair of elements.
pub(super) struct SortParams { n: u32, step: u32, stage: u32, _pad: u32, }
@group(0) @binding(0) var<storage, read_write> keys: array<f32>;
@group(0) @binding(1) var<storage, read_write> values: array<u32>;
@group(0) @binding(2) var<uniform> params: SortParams;
@compute @workgroup_size(64)
pub(super) fn main(@builtin(global_invocation_id) id: vec3<u32>) {
let idx = id.x;
let n = params.n;
if (idx >= n / 2u) { return; }
let step = params.step;
let stage = params.stage;
let j = idx & (step - 1u);
let i = (idx - j) * 2u + j;
let i2 = i + step;
if (i2 >= n) { return; }
// Ascending sort when the block bit is 0.
let ascending = ((i / (stage * 2u)) & 1u) == 0u;
let swap = (keys[i] > keys[i2]) == ascending;
if (swap) {
let tmp_k = keys[i]; keys[i] = keys[i2]; keys[i2] = tmp_k;
let tmp_v = values[i]; values[i] = values[i2]; values[i2] = tmp_v;
}
}
"#;Expand description
WGSL compute shader for bitonic sort used in SAP broadphase.