Випуск 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 Speed: Carbon та Risen 1.

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

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

За гарячими слідами сформований коригуючий випуск D9VK 0.40.1, у якому виправлено на vec4(1) значення за промовчанням для COLOR0 у вершинних шейдерах і усунена помилка, через яку біти слотів для виходів шейдера за умовчанням неправильно застосовувалися і, отже, некоректно виправлялися бекендом, викликаючи їхню заміну на vec4(0).

Джерело: opennet.ru

Додати коментар або відгук