
D7VK 2.2 тепер доступна як нова версія шару перекладу графіки, призначеного для запуску класичних ігор Windows на Linux. Проект, похідний від DXVK, зосереджений на перекладі старих API Direct3D 7, 6, 5 та 3 на Vulkan для використання з Wine та Proton, і ця нова версія присвячує значну частину своєї роботи одній з областей, яка досі мала найбільше недоліків: підтримці Direct3D 3.
Оновлення виходить лише через кілька тижнів після D7VK 2.1 і продовжує процес розвитку технології, яка особливо цікава для тих, хто хоче грати в ігри кінця 90-х і початку 2000-х років на сучасних системах Linux. Окрім покращення Direct3D 3, D7VK 2.2 містить численні виправлення помилок та внутрішні налаштування, і базується на нещодавній версії DXVK 3.1.
D7VK 2.2 зосереджений на Direct3D 3
Головна нова функція в D7VK 2.2 пов'язана з Direct3D 3, API, який дещо відставав від інших старіших технологій, що підтримувалися проектом. Хоча ігри Direct3D 3, які розробник зміг зібрати та протестувати, вже працювали з D7VK, все ще існувало кілька крайніх випадків та моделей поведінки, які не були реалізовані належним чином.
Це було особливо проблематично, оскільки каталог ігор, що використовують Direct3D 3, важко відновити. Це дуже старі назви, багато з яких більше не є комерційно доступними або їх важко знайти, що ускладнює тестування всіх можливих реалізацій, які можуть зустрітися на практиці.
У цій версії розробник переглянув значну частину реалізації Direct3D 3, щоб наблизити її до рівня зрілості, досягнутого іншими API, сумісними з D7VK.
Поведінка пристроїв D3D3 відповідає оригіналу
Одна з технічних змін стосується переробки системи підрахунку посилань для пристроїв Direct3D 3. D7VK 2.2 модифікує цей механізм таким чином, щоб його поведінка відповідала поведінці нативної реалізації API.
Цей тип деталей може здаватися користувачеві неважливим, але він є критично важливим на рівні перекладу. Старіші ігри можуть залежати від певної поведінки, пов'язаної зі створенням та знищенням об'єктів, і, здавалося б, невелика різниця може призвести до помилок, які важко діагностувати.
Таким чином, нова реалізація зменшує ймовірність того, що деякі ігри не зможуть керувати своїми графічними пристроями так, як D7VK не очікував.
D7VK 2.2 впроваджує покращення прозорості за допомогою колірного ключа
D7VK 2.2 також змінює управління колірним ключем на пристроях з чистою підтримкою Direct3D 3. Досі в проекті використовувалася дуже проста модель, в якій ця функція завжди залишалася ввімкненою за певних обставин.
Нова версія дозволяє точно контролювати, коли його вмикати, більш точно відтворюючи поведінку Direct3D 3. Це особливо важливо для старіших ігор, які використовують методи прозорості на основі певних кольорів.
Крім того, було оптимізовано розрахунки, пов'язані з нормалізованими колірними діапазонами. Ці значення тепер оновлюються лише тоді, коли змінюється опис поверхні, що дозволяє їх кешувати та використовувати повторно пізніше.
Результатом має бути невелике або помірне покращення продуктивності в іграх, які використовують прозорість кольорових клавіш, а також більш коректна поведінка.
Виправлено граничні випадки у буферах виконання
Ще одним важливим аспектом D7VK 2.2 є перегляд валідацій буфера виконання Direct3D 3. У проекті було реорганізовано частину цієї логіки для вирішення різних граничних випадків, виявлених під час тестування.
Щоб перевірити очікувану поведінку API, розробник також зміг покластися на тести Wine, спеціально пов'язані з Direct3D 3. Ці тести дозволяють порівняти поведінку D7VK з очікуваною від сумісної реалізації та виявити відмінності, які можуть залишитися непоміченими при використанні лише добре відомих ігор.
Ця робота особливо цінна для такого старого API, де доступних для тестування назв недостатньо, і вони не завжди охоплюють усі можливості оригінальної реалізації.
Більша стійкість для текстур Direct3D 5 та 3
Оновлення не обмежується Direct3D 3. D7VK 2.2 також покращує обробку текстур, що використовуються Direct3D 5 та Direct3D 3, щоб запобігти виходу нижніх поверхонь за межі діапазону під час їх використання.
Ця зміна підвищує надійність обробки графічних ресурсів і може виправити помилки, які з'являються лише за певних послідовностей операцій. Розробник також зазначає, що це покращення позитивно вплинуло на Frogger , вперше випущений у 1997 році.
Патч показує, як внутрішні зміни, спрямовані на вирішення проблем управління ресурсами, можуть мати видимий вплив на певні ігри, навіть якщо модифікація не розроблена спеціально для них.
D7VK 2.2 також виправляє проблеми з перетвореннями та матрицями
У D7VK 2.2 також виправлено помилку, пов'язану з перетворенням буферів виконання Direct3D 3. Проблема була спричинена неправильним визначенням формату FVF, що використовується для вхідних даних вершин.
Також виправлено проблему зі старими обчисленнями матриць проекції. Помилку було виявлено за допомогою тесту Wine, який працював неналежним чином і міг негативно вплинути на певні програми Direct3D 6, 5 та 3.
Ці зміни ще раз демонструють важливість тестування сумісності для D7VK. Багато проблем зі старими графічними API не обов'язково проявляються в найпопулярніших іграх, а радше в певних комбінаціях функцій, які можуть залишатися прихованими роками.
Менше накладних витрат на застарілі шляхи відображення
У новій версії також реорганізовано шлях малювання Begin() / Vertex() / End() Використовується Direct3D 6 та Direct3D 5. Модифікація зменшує споживання пам'яті та забезпечує невелике покращення продуктивності.
Frogger знову ж таки є однією з ігор, які можуть отримати вигоду від цієї зміни. Хоча ця оптимізація не подвоїть FPS усіх ретро-ігор, вона допоможе зменшити деякі накладні витрати, що накопичуються на маршрутах, що використовуються старими API.
D7VK вже отримав значну оптимізацію продуктивності в попередніх версіях, тому поточна робота все більше зосереджена на вдосконаленні реалізації та усуненні непотрібних витрат.
D7VK 2.2 частина DXVK 3.1
Ще однією важливою особливістю цієї версії є те, що D7VK 2.2 була замінена на DXVK 3.1 . Це дозволяє проєкту скористатися перевагами новішої бази та узгодити свою реалізацію з розвитком DXVK.
Зв'язок між двома проектами особливо важливий. D7VK виник як відгалуження DXVK, що спеціалізується на старіших API Direct3D, не охоплених стандартним використанням DXVK, тоді як обидва використовують Vulkan як місце призначення для графічних викликів, що надходять з Windows.
Завдяки цим зв'язкам, структурні покращення, що з'являються в DXVK, можуть слугувати основою для подальшого розвитку D7VK без необхідності розробляти з нуля всю інфраструктуру, необхідну для зв'язку з Vulkan.
Проєкт, розроблений для відродження класичних ігор
D7VK має дуже конкретну мету в екосистемі Linux: дозволити іграм для Windows, які використовують Direct3D 7, 6, 5 та 3, запускатися за допомогою Vulkan. Це відрізняє його від DXVK, який в основному зосереджений на Direct3D 9, 10 та 11.
Важливість проєкту зростає, коли йдеться про ігри, що залежать від графічних технологій, які Wine безпосередньо не реалізує таким самим чином, або які могли б виграти від точнішого перекладу на Vulkan.
Поєднуючи D7VK з Wine або Proton, користувачі Linux можуть відновити значну кількість програмного забезпечення кінця 20-го та початку 21-го століть, не вдаючись до старої інсталяції Windows.
Для тих, хто використовує Wine або Proton для гри в ігри на Linux і зацікавлений у відродженні класичних ігор, D7VK 2.2 зміцнює один з найважливіших елементів інфраструктури сумісності. І хоча багато його покращень можуть бути непомітними для користувача, кожне виправлення збільшує шанси того, що інша гра, втрачена в еру Direct3D 3, 5, 6 або 7, знову зможе коректно функціонувати на сучасній системі Linux.