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 the other the existing graphic and compute API’s like OpenGL, OpenGL ES, OpenCL, WebGL, DirectX and even Glide on top of Vulkan.

Some projects even 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. 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
      • D8VK (license zlib, https://github.com/AlpyneDreams/d8vk) maps D3D8 to D3D9 based on DXVK.
      • WineD3D is used in Wine/Proton to map Direct3D 1..8 to OpenGL and run it with Zink on Vulkan
      • 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!
    • 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.
  • 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.1 OpenGL 4.6 + OpenGL ES 3.1 (Mesa 21.3 offers 3.2), but the max compat profile is still only at 3.0. 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
    • Rusticl (merged to Mesa 22.2) can run OpenCL 3.0 via Gallium on Zink and therefore it is possible to run it on many Vulkan drivers.
    • 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. Work is in progres to switch to OpenCL 3.0. Some applications like Darktable and Blender can work 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.
  • Glide -> Vulkan
  • Mantle -> Vulkan
    • GRVK (license zlib, https://github.com/libcg/grvk) is mapping the predecessor of Vulkan developed by AMD as Mantle to Vulkan. Mantle was used very seldom (Battlefield 4, Battlefield Hardline, Civilization: Beyond Earth, Dragon Age: Inquisition, Sniper Elite III, Star Swarm Stess Test, Thief (2014)) and almost all games do provide anyway a Direct3D 11API besides Mantle.

Vulkan base

  • Vulkan -> CPU fallback (without GPU)
    • Lavapipe (previously Vallium) is a driver to run Vulkan on a regular CPU in case a GPU Vulkan 1.1 (Mesa 21.3 will offer Vulkan 1.2) driver is missing like for nouveau where no open source driver. 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 mostly for Android (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 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 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

Advertisement

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 )

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.