perf(webgpu): range-flush only live TLAS metadata slots (#130)

The metadata mirror is padded to kNPadded (65536) but only primitiveCount
slots are live. metadataBuffer.FlushDevice() wgpuWriteBuffer'd all 256 KB
through the WASM->JS staging path every frame (~100-250x waste for a
few-hundred-instance scene). Switch to the existing FlushDeviceRange
overload — the same one the instanceBuffer loop directly above uses —
sized to primitiveCount * sizeof(uint32_t). The Vulkan parallel already
sizes its flush to primitiveCount, so this was WebGPU-specific.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
catbot 2026-06-18 13:56:21 +00:00
commit db35e78eaf

View file

@ -159,7 +159,11 @@ void RenderingElement3D::BuildTLASUpload(WebGPUCommandEncoderRef /*cmd*/, std::u
runOwned = currOwned;
}
tlas.metadataBuffer.FlushDevice();
// Only primitiveCount slots are live; the buffer is padded to kNPadded
// (65536). Flushing the whole thing wgpuWriteBuffers all 256 KB through
// the WASM->JS staging path every frame — ~100-250x waste for a
// few-hundred-instance scene. Range-flush just the live entries.
tlas.metadataBuffer.FlushDeviceRange(0, 0, primitiveCount * sizeof(std::uint32_t));
}
void RenderingElement3D::BuildTLASBuild(WebGPUCommandEncoderRef /*cmd*/, std::uint32_t index) {