Vulkan platforms
Information common for all platforms with Vulkan support.
See also Vulkan on macOS.
Do I need the Vulkan SDK?
A common misconception is that one needs the huge several-hundred-megabyte LunarG SDK in order to use Vulkan. No, not necessarily. Magnum has its own standalone Vulkan headers, so the only thing needed is the actual Vulkan loader library:
- On Linux distributions it's a system package (
libvulkan-dev
on Ubuntu,vulkan-icd-loader
on ArchLinux) - On macOS easiest is to get MoltenVK (
molten-vk
in Homebrew), but using the loader is also possible - On Windows you can either build the loader yourself, get it as a package from MinGW, or you have to install the SDK, sorry.
Apart from the loader library, the SDK contains also various layers, extra tools and shader compilers. While layers are useful for validation and shader compiler libraries can be useful for building the GlslangShaderConverter and SpirvToolsShaderConverter plugins, these are commonly available in package managers as well:
- Validation layers are
vulkan-validationlayers
on Ubuntu andvulkan-validation-layers
on ArchLinux. On macOS you'll need to either build them yourself or get the SDK, Homebrew provides neither the loader (to have the layers loadable) nor the layers. Same on Windows. - For shader compilers, on Ubuntu, ArchLinux, Homebrew, Vcpkg and MinGW you can get the
glslang
andspirv-tools
packages - The SDK additionally ships with the shaderc library that wraps Glslang and SPIRV-Tools in an arguably better interface, but all its extra features, especially
#include
support, are provided by the GlslangShaderConverter and SpirvToolsShaderConverter plugins already anyway.
If you only need to build against some Vulkan library without running anything (for example for CI compilation tests), the following is sufficient. Build as a static library and supply to CMake via Vulkan_LIBRARY
:
/* Yes. I know what I am doing. Yes. Really. */ extern "C" { int vkCreateInstance(const void*, const void*, void*) { return -9; } int vkEnumerateInstanceExtensionProperties(const void*, void*, void*) { return -9; } int vkEnumerateInstanceLayerProperties(void*, void*) { return -9; } void(*vkGetInstanceProcAddr(void*, const void*))() { return nullptr; } }
Vulkan tutorials and best practices
Khronos wiki:
NVidia tutorials and tips:
- Engaging the Voyage to Vulkan
- Vulkan Shader Resource Binding
- Vulkan Memory Management
- Transitioning from OpenGL to Vulkan
- OpenGL like Vulkan
- What’s your Vulkan Memory Type?
- Tips and Tricks: Vulkan Dos and Don’ts
- Vulkan Device Generated Commands
Intel tutorials:
ARM best practices:
Qualcomm best practices:
Various useful links: