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";
