Vulkan is a low-level cross-platform graphic API broadly supported. There are several projects to implement all other the existing graphic and compute API’s like OpenGL, OpenGL ES, OpenCL, WebGL, DirectX and even Glide on top of Vulkan. Some projects translate Vulkan to other API’s in case there is no native support available due to restrictions of the operating system or not yet available drivers.

The implementation of all the other graphic and compute API’s on top of Vulkan greatly improves compatibility and reduces development efforts of hardware drivers that got more and more complex with the legacy API’s. This unification on one hardware driver reduces development efforts and bugs. The perfect example is RADV for AMD GPU’s, basically just 2 developers implemented a new driver in one year. Vulkan is the right approach to unify the other API’s for the first time successfully. One improvement in the Vulkan stack will benefit all the implementations on top of it.
Vulkan target
- Direct3D + DirectDraw -> Vulkan
- D3D1..D3D8 + DD1..DD7 -> D3D9
- DXWrapper (license BSD, https://github.com/elishacloud/dxwrapper) includes several components to translate Direct3D or DirectDraw to Vulkan
- DXWrapper (license BSD, https://github.com/elishacloud/dxwrapper) is wrapping Direct3D 1 until Direct3D 6 calls into Direct3D 7. Info: D3D4 has never been released.
- DXWrapper (license BSD, https://github.com/elishacloud/dxwrapper) is wrapping Direct3D 7 calls into Direct3D 9 (work in progress, using Dd7to9). See comments https://github.com/elishacloud/dxwrapper/issues/101
- Dd7to9 is wrapping DirectDraw 1 to 7 to Direct3D 9. Info: DD8 or greater doesn’t exist, this separate 2D graphic library was integrated into Direct3D 8
- D3D8to9 (license BSD, https://github.com/crosire/d3d8to9) which is converting Direct3D 8 to Direct3D 9. It can be used together with DXVK.
- DXWrapper can convert DirectInput 1-7 to 8 (requires no further translation as it is input only).
- dgVoodoo2 (license proprietary but free of charge, http://www.dege.freeweb.hu) translates Direct3D 1-8.1 to DirextX 10.1 It can translate as well DirectDraw. This allows the combination with DXVK. Would be nice if GOG would support to release this as open source!
- DXWrapper (license BSD, https://github.com/elishacloud/dxwrapper) includes several components to translate Direct3D or DirectDraw to Vulkan
- D3D9+D3D10+D3D11
- DXVK (license zlib, https://github.com/doitsujin/dxvk) translates DX9, DX10 and DX11 to Vulkan and it works extremly well on Proton (Steam Play) and Wine in Linux. DXVK is almost feature complete. Follow this guide to get DXVK up and running in Wine or just use Steam Play (Proton).
- D3D12
- VKD3D (license LGPL, https://source.winehq.org/git/vkd3d.git) is a Wine project and maps Direct3D 12 directly to Vulkan. There are only a few real D3D12 exclusive titles and usually D3D11 is faster and better supported if available in a game. Though as Direct3D 12 borrowed a lot of concepts from Vulkan and its predecessor Mantle, it’s much less complex compared to Direct3D 11. VKD3D is kept separately so that other developers can use it and the DXVK main developer supports now the development. On proprietary Apple platforms VKD3D supports the use of MoltenVK (see below) to translate from Vulkan further to proprietary Metal.
- Microsoft has translation layers from D3D9/10/11 (via Microsofts D3D12TranslationLayer, license proprietary), OpenGL (as a Gallium driver in Mesa based on Zink) and OpenCL (compiler stack built out of Mesa, extending Clover and separate from Mesa proprietary runtime based on Microsofts D3D12TranslationLayer) to D3D12. So this could be another possibility to extend the use of VKD3D to translate this to Vulkan.
- D3D1..D3D8 + DD1..DD7 -> D3D9
- OpenGL -> Vulkan
- ZINK (license MIT, https://gitlab.freedesktop.org/mesa/mesa) implements OpenGL translation to Vulkan via Gallium3D API calls in Mesa based on NIR. Zink supports since Mesa 21.0 OpenGL 4.1 + OpenGL ES 3.0. The support for OpenGL 4.6 + OpenGL ES 3.1 is already merged to Mesa-git. Theoretically GalliumNine could be used on top of Zink to translate as well D3D8/D3D9 based on Gallium 3D to Vulkan (testing).
- OpenGL ES/WebGL -> Vulkan
- ZINK (refer to OpenGL above)
- ANGLE (license BSD, https://github.com/google/angle) is a cross platform project developed by Google. The project describes itself as “ANGLE currently provides translation from OpenGL ES 2.0/3.0 to desktop OpenGL, OpenGL ES, Direct3D 9, Direct3D 11 and Vulkan. Support to translate OpenGL ES 2.0 to Vulkan is available in Android Q, OpenGL ES 3.0 and 3.1 is in development, 3.2 is planned. This project is interesting as it allows at least Android, Linux and Windows to translate OpenGL ES to Vulkan. With this the GPU hardware vendor for Android would only need to supply a Vulkan driver and not anymore the more complex OpenGL ES driver. Another user of ANGLE is hardware acceleration in Chromium and Firefox (with the Webrender engine written in Rust to translate OpenGL ES if not available directly to D3D11) on Windows, so even here Vulkan could be great to unify all drivers.
- OpenCL -> Vulkan
- CLVK (license Apache 2.0, https://github.com/kpet/clvk) implements OpenCL 1.2 on top of Vulkan with the usage of the CLSPV compiler. The first applications like Darktable and Blender do work already with CLVK https://github.com/kpet/clvk/blob/master/docs/supported-applications.md.
- CLSPV (license Apache 2.0, https://github.com/google/clspv) is a prototype compiler for a subset of OpenCL C 1.2 to Vulkan compute shaders. This could be interesting as most of the OpenCL efforts of Intel/AMD struggled in the past (like beignet, rocM), Nvidia is denying any standard with their proprietary Cuda API.
- CLVK (license Apache 2.0, https://github.com/kpet/clvk) implements OpenCL 1.2 on top of Vulkan with the usage of the CLSPV compiler. The first applications like Darktable and Blender do work already with CLVK https://github.com/kpet/clvk/blob/master/docs/supported-applications.md.
- Glide -> Vulkan
- OpenGlide (license GPLv2, https://sourceforge.net/projects/openglide) can convert Glide to OpenGL and with this it could be used on to of Zink (refer to OpenGL above).
- MesaFX (older builds https://www.vogonsdrivers.com/wrappers/files/OpenGL/Glide/MesaFx and https://3dfxarchive.com/mesafx.htm) was part of Mesa until 6.2.1 (https://www.vogons.org/viewtopic.php?f=8&t=76200, 6.4 doesn’t build without issues) and offered Glide support.
- nGlide (license proprietary but free of charge, http://www.zeus-software.com/downloads/nglide) supports the translation from the old Glide graphic API (created by 3Dfx) to Vulkan since version 2.00, read http://www.zeus-software.com/forum/viewtopic.php?f=2&t=2044.
- dgVoodoo2 see DX8 to DX11. Additionally it translates Glide 2.11, 2.45, 3.1 and 3.1 Napalm to DX11. By this it can be used together with DXVK.
- Mantle -> Vulkan
- GRVK (license zlib, https://github.com/libcg/grvk/releases/tag/0.1.0) is mapping the predecessor of Vulkan developed by AMD as Mantle to Vulkan. Mantle was used very seldom and almost all games do provide anyway a Direct3D 11API besides Mantle.
Vulkan base
- Vulkan -> CPU fallback (without GPU)
- Lavapipe (previously Vallium) is a new driver based to run Vulkan on a regular CPU in case a GPU Vulkan driver is missing like for nouveau where no open source driver is available or in a virtual machine. It is merged since Mesa 20.3 and can run Vulkan demos but needs more work for Vulkan games. It works similar to Gallium3D based on LLVMpipe for OpenGL on a CPU. Use cases are computing tasks, Vulkan desktops where no open source Vulkan driver is available, testing a vendor neutral implementation and virtual machines/clouds without a real GPU.
- SwiftShader (license Apache 2.0, https://github.com/google/swiftshader) offers a cross platform Vulkan 1.1 on CPU backend (previously based on OpenGL ES and Direct3D 9) similiar to LLVMpipe for OpenGL. Combined with ANGLE it allows other API’s like OpenGL ES to run as well on the CPU. SwiftShader can be seen as well like a fallback driver in case the GPU driver doesn’t work or for testing, it is used by Android, Chrome and Firefox (not yet enabled).
- Vulkan -> Vulkan/DX12/Metal/OpenGL ES
- gfx-rs (license Apache 2.0, https://github.com/gfx-rs/gfx) is a Mozilla effort to develop a graphics/hardware abstraction layer written in Rust. The gfx-hal (https://github.com/gfx-rs/portability) is a hardware abstraction layer based on the Vulkan-ic to translate to native backends on Vulkan and additionally to DX12, Metal and OpenGL ES (OpenGL, WebGL). Mozilla is using this for the WebGPU-servo project to use Vulkan for the Web (https://github.com/gfx-rs/wgpu). So besides Firefox becoming a user of gfx-rs they collaborate as well with Dolphin and RPCS3 to improve MacOS support https://gfx-rs.github.io/2018/09/03/rpcs3-dolphin.html.
- Vulkan -> Metal
- MoltenVK (license Apache 2.0, https://github.com/KhronosGroup/MoltenVK, https://moltengl.com/moltenvk) provides Vulkan 1.1 via a translation to Metal for proprietary Apple platforms. This effort is only necessary as Apple refuses and blocks Vulkan support, which is sad for everyone developing platform independent. Thanks to Valve MoltenVK is now open sourced.
- See gfx-rs
- Vulkan -> DX12
- See gfx-rs
- Vulkan -> WebVK/WebGPU -> Vulkan, DX12, Metal
- WebGPU (license MPL2.0, https://github.com/gfx-rs/wgpu) merges common API overlaps of Vulkan, Direct3D 12 (D3D12) and Metal in a new “WebGPU” version http://www.tomshardware.com/news/khronos-meta-api-vulkan-metal-directx12,33962.html or https://gfx-rs.github.io/2019/03/06/wgpu.html. Another alternative is provided by Google with Dawn https://dawn.googlesource.com/dawn. WebGPU offers backends for Vulkan, DX12 and Metal and it will run additionally in web browsers. This efforts seems to be required only because Apple refused to allow and implement Vulkan for supporting their proprietary Metal API only for MacOSX and iOS and Microsoft did the same for the Xbox console with DX12. For Linux itself this effort is important, Vulkan is a platform independent solution and this will payout in the long run.
Harmonization
SPIR-V
SPIR-V is a platform independent intermediate language layer for OpenCL and GLSL that is supported by Vulkan. It will be extended to NIR by the nouveau developers.
NIR
The intermediate representation NIR is becoming the common foundation of the Mesa Gallium3D drivers and it allows the Vulkan developments to share more code (paths) with OpenGL and OpenCL. Originally NIR was developed by Intel for their OpenGL mesa driver, later support for the Intel ANV Vulkan driver was added. NIR provided as well the groundwork of the community Vulkan driver RADV for AMD GPU’s.
To avoid the legacy GLSL-to-TGSI code path in drivers without direct NIR support, a conversion from NIR-to-TGSI was merged to Mesa 20.3. This will allow to get rid of GLSL.
NIR Status
- OpenGL
- Intel: standard in the Gallium3D Iris driver and in i915
- AMD: standard in the Gallium3D RadeonSI. Development to support NIR in R600 is ongoing and improved in Mesa 20.2.
- Nouveau: testing since Mesa 19.1 (requires parameter NV50_PROG_USE_NIR=1, https://www.phoronix.com/scan.php?page=news_item&px=Nouveau-NIR-IR-V6), required for OpenGL 4.6.
- Vivante: testing in Etnaviv since Mesa 19.2 (requires parameter ETNA_MESA_DEBUG=nir, will be activated hopefully as default in Mesa 20.3)
- VC4/Freedreno: Gallium3D, required for OpenGL 4.6 (https://www.phoronix.com/scan.php?page=news_item&px=Freedreno-OpenCL-SPIR-V-Too)
- VC5/VC6: In development via V3D
- Mali: In development, but not as a Gallium3D driver ( https://www.phoronix.com/scan.php?page=news_item&px=Chai-ARM-Midgard-To-NIR)
- LLVMpipe software fallback Gallium3D: standard (before Mesa 20.0 it required LP_DEBUG=nir)
- Vulkan
- Intel: standard in ANV
- RadeonSI: standard in RADV
- Zink: standard in Gallium3D for Zink
- Nouveau: not started
- Vivante: not started
- VC4/Freedreno: rpi-vulkan-driver, early stages (https://github.com/Yours3lf/rpi-vulkan-driver/commits/master), but Vulkan support might be limited due to OpenGL ES 2.1 limits (https://www.phoronix.com/scan.php?page=news_item&px=Raspberry-Pi-Vulkan-Code-Drop)
- VC5/VC6: standard in TURNIP (Mesa 19.1)
- OpenCL
- Intel: Beignet offers an alternative OpenCL approach
- RadeonSI: In development via Gallium3D “Clover” (OpenCL 1.1 and 1.2 with Mesa 20.3, SPIR-V support since 19.0, https://www.phoronix.com/scan.php?page=news_item&px=SPIR-V-Clover-OpenCL-2018). If the driver doesn’t support SPIR-V yet, this can be translated back to NIR and then it would work on VC5/VC6, Etnaviv or LLVM R too. ROCm is used now for OpenCL on AMD GPU’s instead with its own implementation
- Nouveau: almost finished, patches for Mesa 19.2 ( https://www.phoronix.com/scan.php?page=news_item&px=Nouveau-NIR-V2)
- VC4/Freedreno: development
- VC5/VC6: –
- LLVMpipe software fallback driver offers now OpenCL support after Nir has been enabled (LP_DEBUG=cl)
- DX9
- GalliumNine added NIR support with Mesa 19.1 so that it can be used together with the new Intel Iris Gallium3D driver and with Zink.
HLSL
Glslang could convert HLSL as well to SPIR-V, but not at the same time with the output to DXIL and SPIR-V. Microsoft open sourced in 2017 the Direct X shader compiler DXC for HLSL (high level shading compiler) based on LLVM/Clang. Orginally it did output only DXIL for Windows 10, but Google added in June 2018 a SPIR-V output, which in turn can be used by Vulkan, OpenGL 4.6 and OpenCL (https://github.com/google/DirectXShaderCompiler/tree/linux).
Shader Conductor
Shader Conductor (license MIT, https://github.com/Microsoft/ShaderConductor) is a new project from Microsoft. Besides the DXIL output the Direct X shader compiler can provide as well SPIR-V. SPIR-V could then output to Vulkan or to OpenGL via SPIRV-Cross. Besides this SPIRV-Cross allows as well to go again OpenGL (via GLSL), OpenGL ES (via ESSL), D3d 9/10/11 (via MSL) or to Metal (via MSL), for more details read https://www.phoronix.com/scan.php?page=news_item&px=Microsoft-Shader-Conductor.
Legacy Projects
- Kazan (formerly Vulkan-CPU, license LGPLv2.1, https://salsa.debian.org/Kazan-team/kazan) is a Vulkan driver for Linux that runs on top of a regular CPU. Instead of C++ the new Kazan got rewritten in Rust. Development slowed down a lot in recent months as of the focus to develop open GPU hardware.
- GLOVE (license LGPLv3, https://github.com/Think-Silicon/GLOVE) is a open source project (2018-08-01) that is able to translate OpenGL ES 2.0 and EGL 1.4 to Vulkan, with support for Linux (actually limited to X11/XCB without Wayland support), Android and Windows. Think Silicon will extend the support to OpenGL ES 3.2 and OpenGL as well, but there is no OpenGL support so far. Developers wanting to extend Glove can find helpful information here https://github.com/Think-Silicon/GLOVE/blob/master/Docs/GLOVEDesignDocument.md. Requires a CLA to contribute and development stopped almost completly.
- DXUP (license MIT, https://github.com/Joshua-Ashton/dxup) started as a project (2018-04-25) to implement a Direct3D 10 to Direct3D 11 translation layer, and by this it would allow to run via DXVK. But as DXVK got it’s own D3D10 implementation, DXUP had now a separate D3D9-dev branch https://github.com/Joshua-Ashton/dxup/tree/d3d9-dev and it got replaced now by D9VK.
- VK9 (https://github.com/disks86/VK9) runs Direct3D 9 (DX9) on top of Vulkan. It is a wrapper and some demos and some games might run already like Unreal Tournament 1999 (UT99). The project reached milestone 29 at UT99 runs now without major graphical glitches https://techtinker.blogspot.com/2018/12/vk9-has-reached-its-29th-milestone.html. A roadmap can be found here https://github.com/disks86/VK9/wiki/Roadmap. The main developer of VK9 takes a break from this project, so not much progress is expected in the next time.
- VKGL (license MIT, https://github.com/kbiElude/VKGL) is a new project (2018-08-04) with the aim to run Doom 3 in OpenGL 3.2 core profile context on Vulkan as a user translation library. But no goal to extend and it doesn’t work so far.
- GLO (https://github.com/g-truc/glo) is a platform independent project to run OpenGL on top of Vulkan in very early stages and that stagnated. They don’t try to use Mesa Gallium3D code and started from scratch. For more details read https://www.phoronix.com/scan.php?page=news_item&px=OpenGL-Overload-Vulkan.
- D3D9to11 (license LGPLv3, https://github.com/GabrielMajeri/d3d9-to-11) converts DX9 to DX11 which can then be run on Vulkan via DXVK. The project started as code merge proposal to the original DXVK project (2018-08-09, https://github.com/GabrielMajeri/dxvk/tree/d3d9), but as it is off target, it will live now in a separate branch and by this it will continue to use a lot of the groundwork of DXVK. No activity in September and October, discontinued in November 2018.
- VulkanOnD3D12 (license Apache, https://github.com/Chabloom/VulkanOnD3D12) translates native Vulkan into DX12. This might be helpful only for XBox as Microsoft refuses and disallows Vulkan on this platform. On Windows itself Vulkan drivers are available from the Hardware vendors and this effort is just an academic one. No developments in several months.
- Rostkatze (license Apache 2.0, https://github.com/msiglreith/rostkatze) is another Vulkan to DX12 implementation, for more details read https://www.phoronix.com/scan.php?page=news_item&px=Rostkatze-Vulkan-D3D12. No developments in several months.