
D7VK continues to mature its Direct3D 7, 6, 5 and 3 to Vulkan translation, to bring improvements for retro Windows games with Wine / Proton on Linux.
The latest released version 2.1 had a nice focus on optimizing loading times for various games, with the developer noting “Some titles can see a big impact, with loading times cut in half or more… that being said, they weren’t typically a problem in early D3D to begin with”.
Additionally they noted that they’re reaching the stage of diminishing returns, but the code is now “a lot more manageable and maintainable as a result, though there aren’t any particularly flashy performance jumps to showcase this time”.

Pictured – Empire Earth: The Art of Conquest
- Reduced the overhead of object creation (by trimming down lifecycle tracking), which has improved loading/startup times overall, with a visible impact in a variety of games, across all supported APIs.
- Fixed a use-after-free bug on attached depth stencil surface release, which, strangely, was only hit with MSVC/clang compiled binaries (thanks to @NemesisElectron for bringing it to my attention). This has fixed a crash on startup in Arx Fatalis.
- Added an optional direct path for
GetDC/ReleaseDCcalls, which might improve performance in games that are heavy users of such calls. Note that this path also has the potential to slow things down even more, depending on what the game does, so your mileage may vary. While an increase of FPS in Arx Fatalis has been observed during gameplay, by about 5-10%, it unfortunately comes with a noticeable performance drop when rendering the main menu. A classic example of “you can’t have your cake and eat it too“. - Added an optimistic path for the early initialization of D3D7/6 vertex buffers, which eliminates any frametime spikes on initial object access. This, however, isn’t always possible, so it’s an optimization entirely dependent on game behavior.
- Further optimized logging use to reduce CPU overhead and the overall memory footprint, this time with little to no impact on benchmarks (it might have a positive impact on performance in CPU limited scenarios on (very) slow CPUs).
- Slightly improved the performance of surface uploads/downloads, as well as devised a few more tricks to ignore needless transfers in certain cases. This yields a minor, but noticeable performance increase in Blade of Darkness, Knight Rider, Silent Hunter II and possibly other titles when “god rays” are rendered.
- Tweaked DDraw objects and helper libraries to have less of an overhead when D7VK acts as a simple forwarding proxy to DDraw. This is primarily aimed at DDraw-only games which will be forwarded to WineD3D/Windows native DDraw entirely, but D7VK D3D-related DDraw operations will also benefit from slightly less overhead as a result.
- Added an alternate pixel center config option, along with a fixed function implementation, which has fixed background image artifacts in Resident Evil 2 (retail release). The option will, for any practical purpose, act like the similarly named ancient ATI/Nvidia driver option from the Windows 9x/XP era, shifting pixel center alignment by half a texel. Note that there’s no reason to use the workaround outside of known misbehaving applications, as it WILL cause artifacting, especially on any rendered text.
- Improved overall performance in Project I.G.I. and Sonic World DX by using managed vertex buffers.
- Worked around suboptimal buffer access patterns in Empire Earth (:The Art of Conquest), improving CPU-bound performance when a lot of units are in view.
- Worked around missing main menu backgrounds in MechWarrior 3.
- Thanks to @CkNoSFeRaTU, we now have non-SSE2 ProcessVertices() fallback helpers, which are used when compiling for ARM architectures. They are known to be slower and have only been introduced for comparative testing or an otherwise academical purpose (there are no ARM-native DDraw games, of course).
- Fixed a bug which caused DDraw surface description corrections to be applied erroneously, which in turn might have caused improper surface type/format mappings in the DXVK backend.
- Added support for
R3G3B28-bit color surfaces, thanks to @CkNoSFeRaTU. This is kept disabled by default, however, as in most cases a lack of support forces games to switch to 16-bit color formats, which improves image quality. A second reason for keeping it disabled is the fact that such surfaces can outright fail on creation in certain cases, due to a WineD3D limitation. - Extended the 8-bit mode masking config option to filter out any 8-bit color modes reported by DDraw during display mode enumeration.
- Optimized device cap(abilities) struct copies and caching, along with device enumeration, which improves performance in cases where games abuse such calls. This has reduced the initial startup time in Empire Earth (up to intro playback) to about one second, down from 3-4 seconds.
🌐 External Sources: GitHub – d7vk – v2.1