Nach einem halben Jahr Entwicklung wurde eine neue Version von DXVK (Direct3D to Vulkan Translation Layer) veröffentlicht, einer offenen Bibliothek, die API-Aufrufe von Direct3D 8, 9, 10 und 11 in Vulkan-Befehle umwandelt. Sie ermöglicht es, 3D-Anwendungen und Spiele, die für Windows entwickelt wurden, auf Systemen auszuführen, die keine native Direct3D-Unterstützung bieten, und dabei die Fähigkeiten der effizienteren Grafik-API Vulkan zu nutzen.
Wesentliche Änderungen
In der neuen Version wurde die Nutzung der Spezifikationen und Erweiterungen von Vulkan 1.4 eingeführt, was entsprechend erfordert einen kompatiblen Treiber.
DXVK verwendet nun dxbc-spirv zum Kompilieren von Shaders für alle unterstützten Shader-Modelle. Dies beseitigt eine Reihe von Problemen, die zuvor nicht gelöst werden konnten:
Rendering-Probleme in Spielen, die entweder darauf zurückzuführen sind, dass in den Spielen auf unbestimmtes Verhalten vertraut wird, oder dass FXC in einigen Fällen fehlerhaften Code generiert, wie in Postal: Brain Damaged, Snowrunner.
Der generierte Code ist kompakter als einfach übersetzter SPIR-V-Code, was den Speicherbedarf von DXVK erheblich reduziert. In Spielen wie Overwatch oder God of War kann dies etwa 1 GiB Arbeitsspeicher einsparen.
Die Shader-Kompilierung wurde jetzt vollständig auf Arbeitsprozesse verlagert, was die Startzeit in Spielen wie Days Gone und Final Fantasy XIV verkürzen oder in einigen Fällen die Hänger reduzieren kann. Zuvor führte DXVK die SPIR-V-Übersetzung im Anwendungs-Thread durch und kompilierte nur die tatsächlichen Vulkan-Pipelines in Arbeitsprozessen.
Die Zwischenrepräsentation der kompilierten Shader von DXVK wird nun im Verzeichnis AppData/Local des aktuellen Wine-Präfixes auf der Festplatte zwischengespeichert. Dies ist notwendig, da die Kompilierungszeit im Vergleich zum alten Compiler gestiegen ist. Der Pfad zum Cache kann mit der Umgebungsvariable DXVK_SHADER_CACHE_PATH geändert werden.
Die neue Vulkan-Erweiterung VK_EXT_descriptor_heap wird nun standardmäßig in Treibern verwendet, die sie unterstützen.
Es wird erwartet, dass diese neue Bindungsmodell im Vergleich zur alten Implementierung des Modells, das auf VK_EXT_descriptor_buffer basiert, ungefähr das gleiche Maß an CPU-bezogener Leistung bietet, dabei aber Leistungseinbußen bei Nvidia-GPUs vermeidet (benötigt nvidia-drivers-595.84 oder neuer).
Änderungen an D3D9
Um die veraltete Fixed-Function-Pipeline zu emulieren, die es D3D8- und D3D9-Spielen ermöglicht, ohne Shader zu rendern, generierte DXVK zuvor eigenen Shader-Code zur Laufzeit basierend auf dem Pipeline-Zustand. In einigen Spielen, wie Unreal Tournament 2004, konnte dies zu merklichen Rucklern führen, selbst nach längeren Spielperioden.
Um dies zu beheben, implementiert DXVK jetzt die Fixed-Function-Pipeline in Form von zwei Ubershaders, für die optimierte Versionen im Hintergrund kompiliert werden.
Optimierung des Pufferladevorgangs
Um das Verhalten von Windows genauer nachzubilden, werden verschiedene Pufferarten, die zuvor direkt im VRAM gespeichert wurden, jetzt auf Abruf geladen, und es wurde eine Strategie zur Begrenzung des Arbeitsspeichers implementiert, die Abstürze im Zusammenhang mit dem Adressraum in einer Reihe von 32-Bit D3D9-Spielen behebt.
Diese Änderungen können auch die Leistung auf Systemen ohne veränderbare BAR-Größe in Spielen wie GTA IV verbessern.
In Systemen, die VK_EXT_sample_locations und VK_EXT_extended_dynamic_state3 ausreichend unterstützen, funktioniert der Rendering-Zustand D3DRS_MULTISAMPLEANTIALIAS jetzt korrekt, wodurch Anwendungen Rasterisierung mit einer Probe beim Rendern in Ziel-Renderobjekte mit mehreren Proben verwenden können. Dies behebt Probleme mit der Benutzeroberflächen-Darstellung in Anno 1701, Men of War Assault Squad und ähnlichen Problemen in anderen Spielen mit aktiviertem MSAA.
Gemeinsame Ressourcen funktionieren jetzt mit der originalen Implementierung von Wine und benötigen keine spezifischen Proton-Patches mehr.
Es sollten auch zahlreiche Fehlerbehebungen für verschiedene Spiele erwähnt werden, die jetzt besser funktionieren.
Quelle: linux.org.ru
