mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-23 00:53:02 -05:00
Every direct memory allocation had a memfd of its own, so each one the GPU used became its own udmabuf and its own imported buffer object. An imported buffer object cannot be always valid in the GPU VM: amdgpu validates every one of them at every command submission. PPSA14632 (LEGO Horizon Adventures) imports about 7000 allocations, 5800 of them 64 KiB, and each vkQueueSubmit took about 2.3 ms (5 s per 10 s, held under the GPU mutex). A standalone test shows the cost follows the count of imported dma-buf buffer objects, not their size or the count of ordinary allocations. - libkernel: on Linux all direct memory lives in one sparse memfd of DIRECT_MEMORY_SIZE, at file offset = physical address (PhysicalBacking keeps the file and its offset; SharedBacking returns that offset). A range allocated again is zeroed through a temporary mapping, as the old per-allocation memfd was. - Driver: an import of shared direct memory that lies inside one 64 MiB chunk of the file binds its own VkBuffer into that chunk's memory, one udmabuf import per chunk (HostImport::chunk holds it, so it lives until the last buffer bound to it retires). Ranges that cross a chunk or do not meet the buffer alignment are imported alone as before. On PPSA14632 vkQueueSubmit drops from about 2400 us to 46 us on average, the GPU idles 36 ms instead of 172 ms per present, and presents go from about 40 to 80-97 per 10 s. Released direct memory stays committed in the file (see TechnicalDebt.md): a live chunk import pins its pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>