playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
42 lines (41 loc) • 1.34 kB
JavaScript
const computeGsplatIntervalScatterSource = `
struct Interval {
workBufferBase: u32,
splatCount: u32,
boundsIndex: u32,
pad: u32
};
struct ScatterUniforms {
numIntervals: u32,
pad0: u32,
pad1: u32,
pad2: u32
};
var<uniform> uniforms: ScatterUniforms;
var<storage, read> intervals: array<Interval>;
var<storage, read> prefixSumBuffer: array<u32>;
var<storage, read_write> compactedOutput: array<u32>;
fn main(
wgId: vec3u,
numWorkgroups: vec3u,
lid: vec3u
) {
let intervalIdx = wgId.y * numWorkgroups.x + wgId.x;
if (intervalIdx >= uniforms.numIntervals) { return; }
let outputOffset = prefixSumBuffer[intervalIdx];
let nextOffset = prefixSumBuffer[intervalIdx + 1u];
let count = nextOffset - outputOffset;
if (count == 0u) { return; }
let workBufferBase = intervals[intervalIdx].workBufferBase;
let tid = lid.x;
for (var j = tid; j < count; j += {WORKGROUP_SIZE}u) {
compactedOutput[outputOffset + j] = workBufferBase + j;
}
}
`;
var compute_gsplat_interval_scatter_default = computeGsplatIntervalScatterSource;
export {
computeGsplatIntervalScatterSource,
compute_gsplat_interval_scatter_default as default
};