diff --git a/implementations/Crafter.Graphics-RenderingElement3D-WebGPU.cpp b/implementations/Crafter.Graphics-RenderingElement3D-WebGPU.cpp index 326f049..2cafd67 100644 --- a/implementations/Crafter.Graphics-RenderingElement3D-WebGPU.cpp +++ b/implementations/Crafter.Graphics-RenderingElement3D-WebGPU.cpp @@ -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) {