Выпуск D9VK 0.40, реализации Direct3D 9 поверх Vulkan

Состоялся выпуск проекта D9VK 0.40, предоставляющего реализацию Direct3D 9, работающую через трансляцию вызовов в графический API Vulkan. Проект основан на кодовой базе проекта DXVK, которая была расширена поддержкой Direct3D 9. По сравнению с реализацией Direct3D 9 на базе WineD3D, D9VK позволяет добиться более высокой производительности, так как трансляция Direct3D 9 через OpenGL работает медленнее трансляции через Vulkan.

D9VK может применяться для запуска 3D-приложений и игр в Linux при помощи Wine. Поддерживается запуск большей части игр на базе Direct3D 9, использующих 2 или 3 версию Shader Model. Код проекта распространяется под свободной лицензией Zlib. Для использования D9VK требуется наличие драйверов с поддержкой API Vulkan, таких как AMD RADV 18.3+, NVIDIA 415.22+, Intel ANV 19.0+ и AMDVLK.

Основные улучшения:

  • Реализована возможность использования более 4 ГБ видеопамяти в 32-разрядных приложениях, что решило проблемы при запуске модов игр Skyrim и Oblivion;
  • Включена асинхронная обработка вывода результата рендеринга на экран (стадия presentation). Для уменьшения задержек в основном потоке рендеринга, обработка вывода выполняется в потоке передачи команд (command submission thread);
  • Убраны излишние точки синхронизации потока команд при извлечении запрашиваемых данных;
  • Код для определения внутреннего времени переведён на использование специфичного для платформ таймера, что помогло решить проблемы с некорректным поведением high_resolution_clock из MinGW;
  • Обеспечена выгрузка отложенных буферов MANAGED и SYSTEMMEM на стадии до выполнение PrepareDraw, что решило проблемы с производительностью в играх Risen и Legend of the Heroes: Trails of the Sky;
  • Добавлена поддержка D3DTA_CONSTANT, позволившая реализовать корректный рендеринг эффекта свечения в играх SpinTyres и Mudrunner;
  • Улучшена совместимость с DirectX 9Ex (D3D9Ex). Учтена специфика обработки ResetEx и Reset;
  • Проведены чистка и рефакторинг кода;
  • Обеспечен прямой маппинг буферов WRITEONLY, что может положительно повлиять на производительность и обойти ошибку в игре
    Counter-Strike: Global Offensive, приводящую к продолжению записи в буфер после его разблокировки;

  • Реализован метод SetDialogBoxMode, позволяющий использовать диалоговые окна в полноэкранных приложениях;
  • Реализована поддержка смешивания вершин, в том числе индексируемого смешивания вершин, необходимого для SWVP (SoftWare Vertex Processing);
  • Переделан счётчик семплера, выводимый поверх текущего изображения (heads-up display, HUD);
  • Добавлена опция d3d9.dialogBoxMode, которую можно использовать для отключения работы только в полноэкранном режиме;
  • Внесены оптимизации производительности и решены проблемы, проявляющиеся при запуске игр GTA: San Andreas, The Masquerade Bloodlines, Max Payne 2, The Sims 2, Silent Hunter 3, Senran Kagura Shinovi, Dungeons and Dragons, Crysis, Metal Slug X, ANGLE, Need for Speed: Carbon и Risen 1.

Дополнительно можно отметить намерение разработчика проекта DXVK (реализация DXGI, Direct3D 10 и Direct3D 11 поверх API Vulkan) на время сосредоточить усилия только на исправлении ошибок, притормозив расширение функциональности. Подобное желание вызвано опасениями о снижении качества кодовой базы и усложнения сопровождения в будущем. Каждое обновление ветки 1.4.x вызывает появление жалоб о регрессивных изменениях, которые не удаётся воспроизвести, локализовать и устранить.

Данные проблемы требуют разбора причин их появления, иначе оставление их неисправленными при продолжении наращивания функциональности может лишь усугубить ситуацию и превратить процесс сопровождения в кошмар. Из планов, которые разработчик DXVK намерен реализовать до перехода в режим только исправления ошибок, называется добавление поддержки некоторых полезных расширений Vulkan и слияние c наработками проекта D9VK.

Дополнение: по горячим следам сформирован корректирующий выпуск D9VK 0.40.1, в котором исправлено на vec4(1) значение по умолчанию для COLOR0 в вершинных шейдерах и устранена ошибка, из-за которой биты слотов для выходов шейдера по умолчанию неправильно применялись и, следовательно, некорректно исправлялись бэкэндом, вызывая их замену на vec4(0).

Источник: opennet.ru

Добавить комментарий