perf(webgpu): range-flush only live TLAS metadata slots (#130) #149
1 changed files with 5 additions and 1 deletions
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>
commit
db35e78eaf
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue