Vulkan’ize Graphic and Compute API’s

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

  • DirectDraw -> Vulkan
    • DD1..DD7 -> D3D9
      • see DXWrapper, it is wrapping DirectDraw 1 to 6 calls into DirectDraw 7 and then to Direct3D 9 (using Dd7to9)
      • Info: DD8 or greater doesn’t exist, this separate 2D graphic library has been integrated into Direct3D 8
  • Direct3D -> Vulkan
    • D3D1,D3D2a,D3D3b,D3D5.2,D3D6.1a -> D3D7
    • D3D7
      • dgVoodoo2 see D3D8. Besides dgVoodoo2 there is no other project to translate D3D7 e.g. to D3D8, D3D9 or D3D10.
      • no open source Vulkan translation available
    • D3D8
      • DXWrapper includes D3D8to9 (license BSD, https://github.com/crosire/d3d8to9) which is converting Direct3D 8 to Direct3D 9. It can be used together with D9VK. Additionally 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-7 plus Direct3D 8.1 to DirextX 10.1. This allows the  combination with DXVK. Would be nice if GOG would support to release this as open source!
      • See GalliumNine, it has a D3D8 to D3D9 codepath
    • D3D9
      • DXVK (see below, previously DXVK)
      • GalliumNine+Zink (refer to OpenGL below). Zink (see below) is available in Mesa for testing and it can be used together with GalliumNine to provide D3D9 support via Gallium3D on Vulkan. NIR was enabled in Mesa 19.1. GalliumNine is based on Gallium3D and provides for Direct3D 9 native API’s for Wine directly.
    • 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.
  • OpenGL -> Vulkan
  • 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
  • Glide -> Vulkan
  • 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
  • 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

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

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.