UNPKG

playcanvas

Version:

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

2 lines (1 loc) 1.71 kB
export const computeGsplatLocalPlaceEntriesLargeSource: "\n\nconst WG_SIZE: u32 = 256u;\n\n@group(0) @binding(0) var<storage, read> pairBuffer: array<u32>;\n@group(0) @binding(1) var<storage, read> splatPairStart: array<u32>;\n@group(0) @binding(2) var<storage, read> splatPairCount: array<u32>;\n@group(0) @binding(3) var<storage, read> tileSplatCounts: array<u32>;\n@group(0) @binding(4) var<storage, read_write> tileEntries: array<u32>;\n@group(0) @binding(5) var<storage, read> largeSplatIds: array<u32>;\n@group(0) @binding(6) var<storage, read> countersBuffer: array<u32>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(workgroup_id) wgId: vec3u,\n @builtin(num_workgroups) numWorkgroups: vec3u,\n @builtin(local_invocation_index) lid: u32\n) {\n let largeSplatIdx = wgId.y * numWorkgroups.x + wgId.x;\n let numLarge = min(countersBuffer[1], arrayLength(&largeSplatIds));\n if (largeSplatIdx >= numLarge) {\n return;\n }\n\n let threadIdx = largeSplatIds[largeSplatIdx];\n let pairCount = splatPairCount[threadIdx] & 0x7FFFFFFFu;\n if (pairCount == 0u) {\n return;\n }\n\n let start = splatPairStart[threadIdx];\n let pairLen = arrayLength(&pairBuffer);\n let tileEntriesLen = arrayLength(&tileEntries);\n\n for (var j = lid; j < pairCount; j += WG_SIZE) {\n let pairIdx = start + j;\n if (pairIdx >= pairLen) { break; }\n\n let packed = pairBuffer[pairIdx];\n let tileIdx = packed >> 16u;\n let localOff = packed & 0xFFFFu;\n\n let entryIdx = tileSplatCounts[tileIdx] + localOff;\n if (entryIdx < tileEntriesLen) {\n tileEntries[entryIdx] = threadIdx;\n }\n }\n}\n";