UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

3 lines (2 loc) 1.43 kB
export const computeGsplatIntervalScatterSource: "\n\nstruct Interval {\n workBufferBase: u32,\n splatCount: u32,\n boundsIndex: u32,\n pad: u32\n};\n\nstruct ScatterUniforms {\n numIntervals: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32\n};\n@group(0) @binding(0) var<uniform> uniforms: ScatterUniforms;\n\n@group(0) @binding(1) var<storage, read> intervals: array<Interval>;\n\n@group(0) @binding(2) var<storage, read> prefixSumBuffer: array<u32>;\n\n@group(0) @binding(3) var<storage, read_write> compactedOutput: array<u32>;\n\n@compute @workgroup_size({WORKGROUP_SIZE})\nfn main(\n @builtin(workgroup_id) wgId: vec3u,\n @builtin(num_workgroups) numWorkgroups: vec3u,\n @builtin(local_invocation_id) lid: vec3u\n) {\n // reconstruct the linear interval index from the (possibly Y-tiled) 2D dispatch\n let intervalIdx = wgId.y * numWorkgroups.x + wgId.x;\n if (intervalIdx >= uniforms.numIntervals) { return; }\n\n let outputOffset = prefixSumBuffer[intervalIdx];\n let nextOffset = prefixSumBuffer[intervalIdx + 1u];\n let count = nextOffset - outputOffset;\n if (count == 0u) { return; }\n\n let workBufferBase = intervals[intervalIdx].workBufferBase;\n let tid = lid.x;\n\n for (var j = tid; j < count; j += {WORKGROUP_SIZE}u) {\n compactedOutput[outputOffset + j] = workBufferBase + j;\n }\n}\n"; export default computeGsplatIntervalScatterSource;