blob: fa2b6a2766cdf1c4e2eab7c668fec2031b2077ae [file] [log] [blame] [view]
# Generic Vulkan Development Environment Setup and Troubleshooting
[Vulkan](https://www.khronos.org/vulkan/) is a new generation graphics and
compute API that provides high-efficiency, cross-platform access to modern GPUs
used in a wide variety of devices from PCs and consoles to mobile phones and
embedded platforms.
This page lists steps and tips for setting up and trouble shooting a Vulkan
development envirnoment. The information here is meant to be generic.
## Vulkan architecture
Vulkan adopts a layered architecture, which aims to better support extensiblity.
There are four components involved in this architecture:
* The Vulkan Application
* [The Vulkan Loader][VulkanLoader]
* [Vulkan Layers][VulkanLayer]
* [Installable Client Drivers (ICDs)][VulkanICD]
![High Level View of Loader][VulkanArchPicture]
The Vulkan loader sits between the Vulkan application, which calls Vulkan APIs,
and the ICDs, which implements these Vulkan APIs. Vulkan layers agument the
Vulkan system to provide optional features like validation and debugging. The
Vulkan loader composes a chain of requested layers, which processes the Vulkan
application's API calls one by one and finallly redirects the API calls made by
the Vulkan application to one or more ICDs.
It's highly recommned to read the
[Architecture of the Vulkan Loader Interfaces Overview][VulkanArchOverview] to
get a general understanding of what these components are and how they interact
with one another.
## Vulkan development environment setup
### Windows
You need to install the [Vulkan SDK][VulkanSDK] from LunarG to get the Vulkan
loader.
Typically the Vulkan SDK will be installed at ``C:\VulkanSDK\<version>\` and
there will be an environment variable``VULKAN_SDK`pointing to it. You can run
the`vulkancube`executable under the`Bin\` subdirectory of the Vulkan SDK to make
sure everything works properly. If not, you probably need to check whether the
graphics card is Vulkan capable or update the driver.
### Debian/Ubuntu
The following packages should be installed for a proper Vulkan runtime to test
the runtime functions properly:
* [libvulkan1][PackageLibVulkan1] for the Vulkan loader `libvulkan.so`.
* (AMD) [mesa-vulkan-drivers][PackageMesaVulkan] for Mesa AMD Vulkan ICD.
* (NVIDIA) [nvidia-vulkan-icd][PackageNvidiaVulkan] for NVIDIA Vulkan ICD.
The above packages provide the Vulkan loader and ICDs. With them an Vulkan
application should be able to run. You may additionally want to install
* [vulkan-tools][PackageVulkanTools] for command-line tools like `vulkaninfo`
(dumping available ICDs and their capabilities) and GUI application like
`vulkancube` (rendering a rotating cube).
In order to develop Vulkan applications, you additionally need the following
pacages:
* [libvulkan-dev][PackageVulkanDev] for various Vulkan header files.
* [vulkan-validationlayers][PackageVulkanValidation] for Vulkan validation
layers like `VkLayer_standard_validation`.
### Linux
For other Linux distros, please consult the corresponding package managment
tools for the packages needed. (And please feel free to update this doc
regarding them.)
You can also download and install the [Vulkan SDK][VulkanSDK] from LunarG. It
packages the loader with many useful layers. The source code of the SDK
component projects are included, allowing you to recompile the artifacts if
needed.
You can also build the Vulkan SDK component projects like
[Vulkan-Loader][VulkanLoaderSource] and
[Vulkan-ValidationLayers][VulkanValidationLayersSource] from source. But note
that building these components separately you need to make sure they are
consistent with one another (e.g., using the same version of Vulkan headers) to
function together.
If you have multiple versions of Vulkan loaders exist, you may also need to set
`LD_LIBRARY_PATH` and `LD_PRELOAD` to load the desired version of the loader.
For example:
```shell
$ LD_LIBRARY_PATH={PATH_TO_VULKAN_SDK}/x86_64/lib/
$ LD_PRELOAD=libvulkan.so.1
```
## Vulkan development environment troubleshooting
### Useful environment variables
There are a few environmet variables that can alter the default Vulkan loader
behavior and print verbose information, notably:
* `VK_LOADER_DEBUG`: enable loader debug messages.
* `VK_ICD_FILENAMES`: force the loader to use a specific ICD.
* `VK_INSTANCE_LAYERS`: force the loader to enable the given layers.
* `VK_LAYER_PATH`: override the loader's standard layer libary search folders.
Please see the [Vulkan loader's documentation][VulkanLoaderEnvVars] for detailed
explanation for these variables.
[VulkanArchOverview]: https://github.com/KhronosGroup/Vulkan-Loader/blob/master/loader/LoaderAndLayerInterface.md#overview
[VulkanArchPicture]: https://raw.githubusercontent.com/KhronosGroup/Vulkan-Loader/master/loader/images/high_level_loader.png
[VulkanICD]: https://github.com/KhronosGroup/Vulkan-Loader/blob/master/loader/LoaderAndLayerInterface.md#installable-client-drivers
[VulkanLayer]: https://github.com/KhronosGroup/Vulkan-Loader/blob/master/loader/LoaderAndLayerInterface.md#layers
[VulkanLoader]: https://github.com/KhronosGroup/Vulkan-Loader/blob/master/loader/LoaderAndLayerInterface.md#the-loader
[VulkanLoaderEnvVars]: https://github.com/KhronosGroup/Vulkan-Loader/blob/master/loader/LoaderAndLayerInterface.md#table-of-debug-environment-variables
[VulkanLoaderSource]: https://github.com/KhronosGroup/Vulkan-Loader
[VulkanSDK]: https://www.lunarg.com/vulkan-sdk/
[VulkanValidationLayersSource]: https://github.com/KhronosGroup/Vulkan-ValidationLayers
[PackageLibVulkan1]: https://packages.ubuntu.com/focal/libvulkan1
[PackageMesaVulkan]: https://packages.ubuntu.com/focal/mesa-vulkan-drivers
[PackageNvidiaVulkan]: https://packages.debian.org/buster/nvidia-vulkan-icd
[PackageVulkanDev]: https://packages.ubuntu.com/focal/libvulkan-dev
[PackageVulkanTools]: https://packages.ubuntu.com/focal/vulkan-tools
[PackageVulkanValidation]: https://packages.ubuntu.com/eoan/vulkan-validationlayers