Перейти к содержимому
PS5PCEM
ЧастичноГрафика

Бэкенд 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 нет.

Связанные механизмы

Чему посвящены эти страницы

Текст следует архитектурным заметкам и отчётам октября 2026 года в репозитории PS5PCEM. Пройденный точечный тест — это не новая частота кадров и не новое прохождение.

Все технологии