Don't want to see articles from a certain category? When logged in, go to your User Settings and adjust your feed in the Content Preferences section where you can block tags!
We do often include affiliate links to earn us some pennies. See more here.

D8VK translates Direct3D 8 to Vulkan, just like DXVK for Direct3D 9 / 10 / 11 and VKD3D-Proton for Direct3D 12 used with Wine and Proton on Linux and Steam Deck. Fantastic to see the progress on this. I reported on an earlier release, but now the "production-ready" 1.0 is available for you to play with.

In the release notes the developer mentioned "This is the first production-ready release of d8vk that has been tested against many hundreds of games with better performance and compatibility than is possible with WineD3D or d3d8to9".

The developer also included a bunch of benchmarks in 3DMark 2001 SE to show the differences in performance between different translations:

Implementation WineD3D d3d8to9 + dxvk (2.1) d8vk
Score 97134 118033 144660
Car Chase - Low 1409.1 fps 2075.5 fps 2017.5 fps
Car Chase - High 352.1 fps 148.9 fps 553.8 fps
Dragothic - Low 1510.4 fps 1853.3 fps 2016.9 fps
Dragothic - High 807.6 fps 792.3 fps 1167.4 fps
Lobby - Low 1278.5 fps 1528.5 fps 1545.7 fps
Lobby - High 585.6 fps 523.3 fps 778.4 fps
Nature 1012.4 fps 1708.6 fps 1943.4 fps
Fill Rate - Single Texture 80163.2 MTexels/s 64208.1 MTexels/s 62904.5 MTexels/s
Fill Rate - Multitexturing 159903.7 MTexels/s 97900.4 MTexels/s 96772.7 MTexels/s
High Poly Count (1 light) 1335.1 MTris/s 2217.0 MTris/s 2375.5 MTris/s
High Poly Count (8 lights) 1267.6 MTris/s 2092.4 MTris/s 1853.5 MTris/s
Environment Bump Mapping 526.9 fps 1430.8 fps 2333.4 fps
DOT3 (Normal) Mapping 2025.1 fps 1608.9 fps 2331.6 fps
Vertex Shader 727.2 fps 788.7 fps 846.9 fps
Pixel Shader 1220.9 fps 1059.8 fps 1337.1 fps
"Advanced" Pixel Shader 4066.1 fps 2808.6 fps (broken) 2544.7 fps
Point Sprites 1193.9 MSprites/s 1071.4 MSprites/s 987.5 MSprites/s

So clearly there's a few cases where D8VK is beaten but for an initial 1.0 release, this is a very good show for it. Hopefully it can continue to see upgrades over time too, so that we can all enjoy even more classics with great performance across Linux desktop and Steam Deck.

The main changes in v1.0:


  • Single combined d3d8.dll (d3d9 is statically linked)
  • New custom batcher for certain drawcall-heavy games
  • Support overriding vertex shader declaration for games with undefined behavior
  • Vertex buffers may now be stored in the managed pool automatically for improved performance and to prevent write ordering issues
  • Implemented bem instruction
  • Support compiling on MSVC
  • Correct surface desc sizes based on format
  • State block types are now supported and should capture the relevant state
  • Allow preserving current Proton installation by @Sid127 in #51
  • Support GetInfo queries
  • Countless game-specific configurations and minor features and tweaks

Bug Fixes

  • Fixed a bug where CreateTexture would try to wrap a null texture
  • Always use at least one backbuffer by @WinterSnowfall in #91
  • Fixed backbuffers not being cached or referenced by the owning device
  • Fixed textures, streams, and indices not clearing on reset
  • Red Faction: Disable direct buffer mapping by @WinterSnowfall in #96
  • Fixed location of Direct3DCreate8 in d3d8.def
  • Fixed ref counting for rendertargets, depth stencils, and textures.
  • Fixed null pixel shaders not being remembered
  • Fixed rendertargets and depth stencils not being cached
  • Fixed error if the client tries to enable SWVP on a hardware device
  • Fixed devices not being freed
  • Fixed segfault on freeing device with bound textures
  • Countless other fixes...

See more on the GitHub.

Article taken from
About the author -
author picture
I am the owner of GamingOnLinux. After discovering Linux back in the days of Mandrake in 2003, I constantly came back to check on the progress of Linux until Ubuntu appeared on the scene and it helped me to really love it. You can reach me easily by emailing GamingOnLinux directly. Find me on Mastodon.
See more from me

mrdeathjr May 10, 2023
Yeah is a big step for old games and win in most test vs wined3d and d3d8to9

In my tests run very well

and run some interesting demos with d8vk 1.0:

Respect older version them stay working on this


and have avalaible artifacts too here


but dont work in my case, i try testing eracer from rage software and divine divinity


Last edited by mrdeathjr on 13 May 2023 at 9:30 am UTC
Grogan May 10, 2023
View PC info
  • Supporter Plus
Awesome, I've not yet run into a DirectX 8 game, but I wondered how it would be if I ever did. I just assumed it wouldn't matter, for such old games the CPU overhead of WineD3D would be OK.

A lot of games got updates that ported them to DX9 to keep them playable.

I hope this gets merged with DXVK (seems cooperative)
fenglengshun May 11, 2023
Quoting: GroganAwesome, I've not yet run into a DirectX 8 game, but I wondered how it would be if I ever did. I just assumed it wouldn't matter, for such old games the CPU overhead of WineD3D would be OK.

A lot of games got updates that ported them to DX9 to keep them playable.

I hope this gets merged with DXVK (seems cooperative)
On Proton at least, there doesn't seem to be much issue. I played Trails in the Sky FC just fine with the DX8 version -- it went better than using the DX9 with the mods, in fact. Of course, that's a really simple game, and I'd like to see how well this one works. Also, audio for movies was broken for some reason, not sure if it's a codec issue or issue with DX8 games on Linux.
hardpenguin May 11, 2023
Quote3DMark 2001 SE
Wow that was a blast from the past.

Quoting: GroganAwesome, I've not yet run into a DirectX 8 game
Everything is fine until you find an overly specific rendering bug making playing it impossible in Wine 👴

Luckily, dgVoodoo2 dll files often help:
mrdeathjr May 11, 2023
Quoting: fenglengshunAlso, audio for movies was broken for some reason, not sure if it's a codec issue or issue with DX8 games on Linux.

mfplat wine implementation attacking again but in last 6 months them stay working on that

thanks to that some h.264 playback begin work and some wmv too, but need more work specially with wmv audio format like wmapro (used in many cinematics)

however this weeks appear various commits around wmv (winegstreamer)

Quotewinegstreamer: Use codec format in stream_props_GetMediaType.

winegstreamer: Implement amt_from_wg_format_video_wmv.

winegstreamer: Implement wg_parser_stream_get_codec_format.

winegstreamer: Introduce format_is_compressed.

winegstreamer: Remove unnecessary media source stream states.

winegstreamer: Synchronize access to the media source from callbacks.

winegstreamer: Synchronize concurrent access to the media stream.

winegstreamer: Only break cyclic references in IMFMediaSource_Shutdown.

winegstreamer: Keep a IMFMediaSource pointer in the media stream.

winegstreamer: Query the wg_parser stream in media_stream_create.

mfplat/buffer: Implement IMF2DBuffer::ContiguousCopyTo().

mfplat/tests: Test IMF2DBuffer::ContiguousCopyTo().

mfplat/buffer: Implement IMF2DBuffer::ContiguousCopyFrom().

This is a generic implementation, which is probably fine for buffers
backed by system memory. The implementation for buffers backed by
GPU memory can probably be optimized.

mfplat/tests: Test IMF2DBuffer::ContiguousCopyFrom().

mfplat/tests: Test large RGB image formats.

mfplat/buffer: Support YV12, I420 and IYUV image formats.*** (this personally think can solve some issues respect color in some h264 like elderborn or greak)

mfplat/buffer: Use the appropriate image copy function for NV11.

mfplat/tests: Push image size and format as context.

mfplat: Implement MFCreatePathFromURL().

quartz: Check whether the pin is connected in IBasicVideo::GetVideoSize().

winegstreamer: Create media source presentation descriptor as needed.

winegstreamer: Keep a stream descriptor array on the media source.

winegstreamer: Avoid eating errors in media source async commands.

winegstreamer: Simplify media source wait_on_sample control flow.

winegstreamer: Start media streams in a dedicated media_stream_start helper.

winegstreamer: Use helpers to convert stream descriptor type to wg_format.

winegstreamer: Avoid potential leak of media source async commands.

winegstreamer: Return a IUnknown pointer from source_create_async_op.

mfplat/tests: Add another test for MFCopyImage().

maybe this friday wine 8.8 can be interesting in this area, in my case waiting for staging 8.8 in some point of this weekend

almost forget maybe *** can help you Avehicle7887

Last edited by mrdeathjr on 11 May 2023 at 1:31 pm UTC
tuubi May 13, 2023
View PC info
  • Supporter
Quoting: GroganI hope this gets merged with DXVK (seems cooperative)
While you're here, please consider supporting GamingOnLinux on:

Reward Tiers: Patreon. Plain Donations: PayPal.

This ensures all of our main content remains totally free for everyone! Patreon supporters can also remove all adverts and sponsors! Supporting us helps bring good, fresh content. Without your continued support, we simply could not continue!

You can find even more ways to support us on this dedicated page any time. If you already are, thank you!
Login / Register

Or login with...
Sign in with Steam Sign in with Google
Social logins require cookies to stay logged in.