| # 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 finally 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 and other shader tools. 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 |
| ``` |
| |
| This can also be done by sourcing the proper `setup-env.sh` from one of the |
| downloaded Vulkan SDKs. |
| |
| ## Vulkan debugging and profiling |
| |
| ### RenderDoc |
| |
| RenderDoc is an awesome tool that one can use to capture and introspect Vulkan |
| applications. It can be downloaded from RenderDoc's |
| [website](https://renderdoc.org/) or compiled from [source][RenderDocSource]. |
| |
| ## Vulkan development environment troubleshooting |
| |
| ### Useful environment variables |
| |
| There are a few environment variables that can alter the default Vulkan loader |
| behavior and print verbose information, notably: |
| |
| * `VK_LOADER_DEBUG`: enable loader debug messages. Setting it to `all` will |
| enable the most verbose logging from the loader. This is especially useful |
| when trying to see what layers/ICDs are searched and used. |
| * `VK_ICD_FILENAMES`: force the loader to use a specific ICD. This is |
| especially useful when you have multiple Vulkan capable devices and want to |
| select which one to use manually. |
| * `VK_INSTANCE_LAYERS`: force the loader to enable the given layers. For |
| example, You can force enable `VK_LAYER_LUNARG_api_dump` to have a detailed |
| dump of all Vulkan API calls made by the application. You can force enable |
| `VK_LAYER_LUNARG_core_validation` to validate the API calls made by the |
| application. |
| * `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. |
| |
| ### Setting environment variables for Bazel test |
| |
| Bazel runs tests in a sandbox and environment variables must be passed through |
| to the test runner. Consider putting environment setup in a `user.bazelrc` to |
| save typing. For example: |
| |
| ``` |
| test --test_env="LD_LIBRARY_PATH=/absolute/path/to/vulkan/sdk/x86_64/lib/" |
| test --test_env="LD_PRELOAD=libvulkan.so.1" |
| test --test_env="VK_LAYER_PATH=/absolute/path/to/additional/layers/:$VK_LAYER_PATH" |
| ``` |
| |
| ### SSH on Linux and X forwarding |
| |
| Physical devices enumerated on NVIDIA drivers can be affected by the `DISPLAY` |
| environment variable. If you are running under an SSH session to Linux or using |
| chrome remote desktop and have problems with physical device enumeration, you |
| probably want to check the `DISPLAY` environment and set it to point to a |
| display at the server side, for example: |
| |
| ``` |
| export DISPLAY=:0 |
| ``` |
| |
| [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 |
| [RenderDocSource]: https://github.com/baldurk/renderdoc |