Skip to main content

BROADPHASE_SORT_SHADER

Constant BROADPHASE_SORT_SHADER 

Source
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.