Бэкенд Direct3D 12
Экспериментальный нативный рендерер для Windows, добавленный после 0.3.5. Он разделяет с Vulkan декодер PM4 и перевод шейдеров RDNA2, а исполняет и выводит кадры через D3D12 и DXGI. По умолчанию остаётся Vulkan, и игры через этот путь пока не работают.
Заметки репозитория по 17 октября 2026 г.
Выбор рендерера
В настройках лаунчера для Windows есть карточка «Графический API» с вариантами Vulkan и DirectX 12. Лаунчер сохраняет graphics_api=vulkan или graphics_api=d3d12 в портативный ps5pcem.ini и передаёт PS5_GRAPHICS_API в game-run, поэтому выбор действует со следующего запуска. По умолчанию выбран Vulkan. На всех двенадцати языках лаунчер помечает DirectX 12 как экспериментальный, а боковая панель показывает его вместо статуса устройства Vulkan.
Та же переменная работает из командной строки, где принимаются и d3d12, и dx12. Сборки для Linux выбирают Vulkan, и раннер там отвергает d3d12. Неизвестное значение отвергается до загрузки игры. Если инициализация или исполнение D3D12 не удаются, раннер не подставляет Vulkan: неподдерживаемая GPU-работа выводит причину и завершает экспериментальный запуск, а не сообщает, что работа выполнена. Безоконного режима у этого бэкенда нет.
Что исполняет бэкенд
Устройство, прямая очередь, аллокаторы и списки команд, барьеры, фенсы и время жизни ресурсов скрыты за небольшим интерфейсом на C поверх COM. Реализованы буферы загрузки, обычные буферы и буферы чтения, массивы сырых UAV-дескрипторов и копирование на GPU. Шейдеры проходят через тот же декодер RDNA2, IR и генерацию SPIR-V, что и путь Vulkan; SPIRV-Cross превращает этот SPIR-V в HLSL, а D3DCompiler из Windows выдаёт байт-код Shader Model 5.1. SPIR-V здесь только промежуточная форма, и ничего не исполняется через Vulkan. SPIRV-Cross закреплён по хешу исходников, а его лицензия Apache-2.0 поставляется вместе с проектом.
Со стороны PM4 DISPATCH_DIRECT исполняется с ограниченными, статически разрешёнными storage-дескрипторами MUBUF и MTBUF, специализацией USER_DATA и точной записью результатов в гостевую память. DRAW_INDEX_AUTO работает в ограниченном случае: вершинный и пиксельный шейдеры без ресурсов, списки или полосы треугольников, одна линейная цель RGBA8 UNORM, viewport, scissor, отсечение граней, маски каналов и инстансинг, с сохранением уже записанных байтов цели. Цепочка обмена DXGI flip на три буфера выводит линейные RGBA8 и BGRA8 и показывает рендерер и FPS в заголовке окна. Работа GPU завершается синхронно до того, как её результат попадает в гостевую память, параллельное исполнение AGC выключено, а шейдеры, состояние пайплайна и подготовленные ресурсы между вызовами пока не кешируются.
Что проверено
17 октября 2026 года на NVIDIA GeForce RTX 3070 Ti прошли аппаратные проверки: загрузка и чтение буферов шести размеров, нативные вычисления при шести размерах диспатча, перевод вычислительных и растровых шейдеров RDNA2 с точной проверкой результата, вычисления и отрисовка PM4 через исполнитель команд в D3D12 с записью в гостевую память и вывод в окно при трёх размерах цепочки обмена. Отладочный слой D3D12 не был установлен, поэтому эти запуски не подтверждают чистоту под отладочным слоем.
Запуск Raiden IV с PS5_GRAPHICS_API=d3d12 выбрал RTX 3070 Ti, запустил игру и остановился с кодом выхода 1 на первой индексированной отрисовке (IndexedAndIndirectDrawNotImplemented). Это подтверждённое ограничение, а не загрузка игры на D3D12. Все результаты игр и значения FPS на этом сайте измерены на Vulkan.
Что реализовано
- Выбор в лаунчере сохраняется в ps5pcem.ini и передаётся как PS5_GRAPHICS_API; по умолчанию Vulkan.
- Нативное устройство, очередь, фенсы, буферы, UAV-дескрипторы и копирование на GPU за интерфейсом на C поверх COM.
- Шейдеры RDNA2 через общий путь SPIR-V, HLSL от SPIRV-Cross и байт-код Shader Model 5.1.
- Ограниченные вычислительные диспатчи, урезанная отрисовка с автоиндексами и цепочка обмена DXGI flip на три буфера.
Чего ещё нет
- Текстуры и сэмплеры, форматы изображений и разворот тайлов, индексированная и косвенная отрисовка, NGG и тесселяция пока не реализованы.
- Гостевые глубина и трафарет, смешивание, несколько рендер-таргетов, MSAA, метаданные и вывод видео ещё отсутствуют.
- Без кеширования шейдеров и пайплайнов и без асинхронного завершения FPS в играх измерить нельзя, а в сборках для Linux D3D12 нет.
Связанные механизмы
Чему посвящены эти страницы