[perf] Per-frame whole-buffer flush of TLAS instance+metadata buffers (RenderingElement3D.cpp)
[perf] Staged UploadDeviceLocal allocates+frees a fresh staging buffer every call (VulkanBuffer.cppm)
[perf] Mesh::Refit re-uploads the full vertex buffer every frame (Mesh.cpp)
[perf] TLAS rebuilds entire host instance+metadata buffer every frame (RenderingElement3D.cpp)
[perf] Acquire/present barriers use ALL_COMMANDS scope (Window.cpp)
[perf] ReclaimDeletions compacts the whole deletion queue every frame (Device.cpp)
[perf] Inter-pass barrier is ALL_COMMANDS global cache flush per frame (Window.cpp)
[perf] Per-image dedicated alloc + leaked persistent staging buffer (ImageVulkan.cppm)
[perf] No buffer suballocator — vkAllocateMemory per buffer (VulkanBuffer.cppm)
[perf][LOW] Compressed-asset Update re-Resizes both staging buffers every call
[perf] Per-allocation vkAllocateMemory, no suballocator
[perf][MEDIUM] Descriptor heaps force HOST_VISIBLE|DEVICE_LOCAL with no fallback
[perf] Runtime upload-strategy helper: direct HOST_VISIBLE|DEVICE_LOCAL vs staging (ReBAR-aware)
[perf][MEDIUM] Single shared semaphore pair prevents multiple frames in flight
[perf][MEDIUM] Single shared semaphore pair prevents multiple frames in flight
Merged into #40 — per-frame fences and per-frame semaphores are a single, mutually-dependent deliverable (neither is correct on its own), so tracking them as one issue. Closing in favor of #40.
[perf] TLAS metadataBuffer is HOST_VISIBLE, CPU-written + shader-read every frame
[perf] SaveFrame readback uses HOST_COHERENT (write-combined) — should be HOST_CACHED
[perf] Mesh vertex/index/aabb buffers are HOST_VISIBLE — should be DEVICE_LOCAL for GPU reads