playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
44 lines (42 loc) • 1.59 kB
JavaScript
const computeGsplatLocalPlaceEntriesLargeSource = `
const WG_SIZE: u32 = 256u;
var<storage, read> pairBuffer: array<u32>;
var<storage, read> splatPairStart: array<u32>;
var<storage, read> splatPairCount: array<u32>;
var<storage, read> tileSplatCounts: array<u32>;
var<storage, read_write> tileEntries: array<u32>;
var<storage, read> largeSplatIds: array<u32>;
var<storage, read> countersBuffer: array<u32>;
fn main(
wgId: vec3u,
numWorkgroups: vec3u,
lid: u32
) {
let largeSplatIdx = wgId.y * numWorkgroups.x + wgId.x;
let numLarge = min(countersBuffer[1], arrayLength(&largeSplatIds));
if (largeSplatIdx >= numLarge) {
return;
}
let threadIdx = largeSplatIds[largeSplatIdx];
let pairCount = splatPairCount[threadIdx] & 0x7FFFFFFFu;
if (pairCount == 0u) {
return;
}
let start = splatPairStart[threadIdx];
let pairLen = arrayLength(&pairBuffer);
let tileEntriesLen = arrayLength(&tileEntries);
for (var j = lid; j < pairCount; j += WG_SIZE) {
let pairIdx = start + j;
if (pairIdx >= pairLen) { break; }
let packed = pairBuffer[pairIdx];
let tileIdx = packed >> 16u;
let localOff = packed & 0xFFFFu;
let entryIdx = tileSplatCounts[tileIdx] + localOff;
if (entryIdx < tileEntriesLen) {
tileEntries[entryIdx] = threadIdx;
}
}
}
`;
export { computeGsplatLocalPlaceEntriesLargeSource };