@group(0) @binding(0) var gridHashes: array; @group(0) @binding(1) var threadPassIndices: array; @group(0) @binding(2) var kArray: array; @group(0) @binding(3) var jArray: array; @group(0) @binding(4) var indices: array; @group(0) @binding(5) var totalCount: u32; @compute @workgroup_size(256) fn main(@builtin(global_invocation_id) global_id : vec3) { let idx = global_id.x; let threadPassIndex = threadPassIndices[idx]; threadPassIndices[idx] = threadPassIndices[idx] + 1u; let j = jArray[threadPassIndex]; let k = kArray[threadPassIndex]; let ixj = idx ^ j; if (ixj <= idx || ixj >= totalCount) { return; } if (ixj > idx) { let ascending = (idx & k) == 0u; let dist_idx = gridHashes[idx]; let dist_ixj = gridHashes[ixj]; var swap = false; if (ascending) { if (dist_idx > dist_ixj) { swap = true; } } else { if (dist_idx < dist_ixj) { swap = true; } } if (swap) { let tempDist = gridHashes[idx]; let tempIndex = indices[idx]; gridHashes[idx] = gridHashes[ixj]; gridHashes[ixj] = tempDist; indices[idx] = indices[ixj]; indices[ixj] = tempIndex; } } }