A static (!allowUpdate) mesh can never refit, so its per-mesh DEVICE_LOCAL scratch buffer is dead weight the moment the build's GPU work completes — yet it was kept alive for the mesh's whole lifetime. In many-mesh scenes (where static meshes dominate) this is real, accumulating VRAM waste. Release it via scratchBuffer.DeferredClear() right after recording a fresh build for a static mesh. The old "free-after-build is a UAF, the GPU is still building" hazard is gone: the fence-keyed deferred-deletion queue (#101/#102) retires the allocation only once the build's frame has passed its fence. A later Refit on a static mesh takes the rebuild fallback, whose Resize sees the nulled handle and re-Creates the scratch. Refit-capable (allowUpdate) meshes keep their scratch as before — an in-place UPDATE reuses it each frame. Extends the BLASBuildOptions hardware test to assert the scratch is retained for allowUpdate meshes and released for static ones (including across a static-mesh refit rebuild), with the validation layer confirming zero errors. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| BLASBuildOptions | ||
| DeferredDeletion | ||
| FontAdvanceCache | ||
| FontAtlasDirtyRect | ||
| FrameLoopSync | ||
| InputFieldHitTest | ||
| MemoryTypeFallback | ||
| MipChainBarrierBatch | ||
| MouseScroll | ||
| PipelineCacheValidation | ||
| PushConstantRewrite | ||
| ShapeTextCache | ||
| TLASHighWaterMark | ||
| UIClipFlag | ||
| UIFusedShader | ||
| UploadStrategy | ||
| VulkanBufferFlushGate | ||
| VulkanBufferRangedFlush | ||
| VulkanBufferResizeReuse | ||