D9VK 0.40 release, Direct3D 9 implementations on top of Vulkan

Took place project release D9VK 0.40, which provides a Direct3D 9 implementation that works via call translation to the graphics API Vulkan. The project is based on the project's codebase DXVK extension, which has been extended to support Direct3D 9. Compared to the WineD3D-based implementation of Direct9D 3, D9VK achieves better performance, since translating Direct3D 9 through OpenGL is slower than translating through Vulkan.

D9VK can be used to run 3D applications and games on Linux using Wine. Most Direct3D 9 based games using version 2 or 3 Shader Model are supported. Project code spreads under the free Zlib license. D9VK requires Vulkan API enabled drivers such as AMD RADV 18.3+, NVIDIA 415.22+, Intel ANV 19.0+ and AMDVLK.

Main improvements:

  • Implemented the ability to use more than 4 GB of video memory in 32-bit applications, which solved problems when launching mods for Skyrim and Oblivion games;
  • Enabled asynchronous processing of displaying the rendering result on the screen (presentation stage). To reduce latency on the main rendering thread, output processing is performed on the command submission thread;
  • Removed redundant command stream synchronization points when retrieving requested data;
  • The code for determining the internal time has been translated to use a platform-specific timer, which helped to solve problems with the incorrect behavior of the high_resolution_clock from MinGW;
  • MANAGED and SYSTEMMEM deferred buffers are unloaded at the stage before PrepareDraw is executed, which solved performance problems in the games Risen and Legend of the Heroes: Trails of the Sky;
  • Added support D3DTA_CONSTANT, which allowed to implement the correct rendering glow effect in games SpinTyres and Mudrunner;
  • Improved compatibility with DirectX 9Ex (D3D9Ex). The specifics of processing ResetEx and Reset are taken into account;
  • Code cleaning and refactoring;
  • Provided direct mapping of WRITEONLY buffers, which can positively affect performance and bypass a bug in the game
    Counter-Strike: Global Offensive, leading to the continuation of writing to the buffer after it is unlocked;

  • Method implemented SetDialogBoxMode, which allows you to use dialog boxes in full-screen applications;
  • Implemented support vertex blending, including indexed vertex blendingrequired for SWVP (SoftWare Vertex Processing);
  • Redesigned sampler counter displayed on top of the current image (heads-up display, HUD);
  • Added option d3d9.dialogBoxMode, which can be used to disable full screen mode only;
  • Performance optimizations have been made and issues have been resolved when launching 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 and Risen 1.

Additionally, it can be noted intention project developer DXVK extension (implementation of DXGI, Direct3D 10 and Direct3D 11 on top of the Vulkan API) focus only on fixing bugs for a while, slowing down the expansion of functionality. Similar desire caused by fears of degrading the quality of the codebase and making it more difficult to maintain in the future. Each update to the 1.4.x branch causes complaints about regressive changes that cannot be reproduced, localized and fixed.

These problems require an analysis of the causes of their occurrence, otherwise leaving them unfixed while continuing to add functionality can only aggravate the situation and turn the maintenance process into a nightmare. Among the plans that the DXVK developer intends to implement before switching to bug-fix-only mode is the addition of support for some useful Vulkan extensions and merging with the developments of the D9VK project.

Addendum: in hot pursuit formed corrective release of D9VK 0.40.1, in which fixed on vec4(1) the default value for COLOR0 in vertex shaders and fixed a bug where the slot bits for default shader outputs were incorrectly applied and therefore incorrectly fixed by the backend, causing them to be replaced by vec4(0).

Source: opennet.ru

Add a comment