Vulkan renderer
The Vulkan backend loads the driver at runtime, requires Vulkan 1.2, and presents guest frames through a swapchain. Render targets, storage images and pipelines stay resident across draws.
Repository notes through October 10, 2026
Device and memory
The renderer loads the platform Vulkan loader itself, so the build does not need the Vulkan SDK headers. Initialization asks for Vulkan 1.2, the version that accepts the translator's SPIR-V 1.5, and prefers a discrete device with a queue family that can do both graphics and compute. Validation layers are requested in debug builds when they are installed.
One descriptor layout holds 64 storage buffers, separate 64-entry 2D and 3D sampled-image arrays, and typed storage images. A 512-set ring, a 128 MiB upload arena and persistent guest render targets keep a frame's resources on the device. Graphics translations use a 256 MiB, 1,024-entry cache. A streaming scene had exceeded the old 64 MiB budget and was translating the same modules again every frame.
Pipelines and timelines
Pipeline compilation uses two workers by default. PS5_GPU_COMPILER_WORKERS can set one to four. PS5_GPU_ASYNC_PIPELINES=0 returns to synchronous compilation and turns compute warmup off. Warmup replays previously compiled compute modules into the driver cache on the next launch. It never dispatches them, and it destroys the temporary pipelines. The driver cache is also stored in vulkan_pipeline_cache.bin, up to 4 GiB. A corrupt file is discarded. It can only affect startup time.
The default compatibility profile waits for each submitted batch. The timeline scheduler, selected with PS5_GPU_TIMELINE_SCHEDULER=1, lets several batches stay in flight and waits at a real readback, a guest synchronization point, or an exhausted resource ring. One title, PPSA25872, enables that scheduler and deferred small storage writeback on its own after measured comparisons. Image layout is tracked per aspect, mip and array layer, and barriers come from the previous use of that subresource.
Formats and residency
Fifty-six host formats are reachable, including BC1 through BC7, integer and normalized channels, R16 and RG16, half-float and RGBA32_FLOAT. Guest image allocations share one alias registry across color, depth, storage and sampled uses. A later pass can sample a depth target that an earlier pass wrote, without a round trip through guest memory, when the signatures match. Reinterpretations and partial overlaps go back through guest memory.
Compute detile on the GPU covers 4, 8 and 16-byte 2D and 3D standard and PRT surfaces. RB+ and MSAA detile still run on the CPU. Single-sample packed 11/11/10 UNORM targets blend through a storage-buffer copy and a fragment unpack, blend and repack. VideoOut is the swapchain on top of these images.
What is implemented
- Runtime Vulkan 1.2 device selection, a swapchain, and resident render targets.
- Fifty-six host formats, per-subresource layout tracking, and an image-alias registry.
- Two compiler workers, a persistent driver cache, and optional compute warmup.
- An opt-in timeline scheduler, with one title enabling it by default.
What is still missing
- The default profile still waits for each batch. Timeline submission is opt-in.
- RB+ and MSAA detile use the CPU.
- Game lighting and every compressed metadata path are not implied by the format list.
Related mechanisms
What these pages are