Vulkan

出自 ArchWiki

出自 Wikipedia

Vulkan 是一个低开销、跨平台的 3D 图形和计算 API。它于 2016 年首次发布,是 OpenGL 的继任者。

Vulkan 网站了解更多。

安装

注意: 关于混合图形 (NVIDIA Optimus/AMD Dynamic Switchable Graphics)

要运行 Vulkan 应用程序,您需要安装 vulkan-icd-loader 软件包(如果您还想运行 32 位应用程序,则还需要 lib32-vulkan-icd-loader),以及适用于您的显卡的 Vulkan 驱动程序。有几个软件包提供 vulkan-driverlib32-vulkan-driver

以下是软件光栅化器,因此您可以在不提供 Vulkan 支持的设备上使用它。

对于 Vulkan 应用程序开发,安装 vulkan-headers,可选安装 vulkan-validation-layersvulkan-man-pagesAURvulkan-tools(您可以在其中找到 vulkaninfo 和 vkcube 工具)。

验证

要查看系统上当前安装的 Vulkan 实现,请使用以下命令

$ ls /usr/share/vulkan/icd.d/

为了确保 Vulkan 在您的硬件上正常工作,安装 vulkan-tools 并使用 vulkaninfo 命令来获取有关您系统的相关信息。如果您获得有关您的显卡的信息,您将知道 Vulkan 正在工作。

$ vulkaninfo

切换

在设备之间切换

在具有多个 GPU 的系统上,您可能需要强制使用特定的 GPU。vulkan-mesa-layers 是使其工作的必要条件。通过将 MESA_VK_DEVICE_SELECT 设置为 vendorID:deviceID,您可以选择所需的 GPU。

要列出候选设备,请使用

$ MESA_VK_DEVICE_SELECT=list vulkaninfo

在指定值的末尾附加一个 ! 可以强制执行此行为。有关更多信息,请参阅 Vulkan mesa 设备选择层环境变量

在 AMD 驱动之间切换

在 AMD 系统上,同时安装多个 Vulkan 驱动程序是有效的,并且可能需要在其间切换。

通过环境变量选择

注意: 此方法不支持选择 AMDVLK Closed 驱动程序。

amdvlk 2021.Q3.4 开始,实施了一种新的切换逻辑,该逻辑强制 AMDVLK 作为默认驱动程序,并要求您执行以下操作之一

  • 设置 AMD_VULKAN_ICD=RADV 以从 AMDVLK 默认驱动程序切换,
  • 或全局设置 DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1 以重新启用下面的 ICD 加载器方法。

DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1 时,您可以通过设置 环境变量 VK_DRIVER_FILES 来选择首选驱动程序。例如,使用 RADV 驱动程序运行 Steam 可以通过

$ VK_DRIVER_FILES=/usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json steam

为了避免 32 位游戏崩溃,可以将 32 位变体和 64 位变体都分配给环境变量。

通过 AMD Vulkan 前缀选择

AMD Vulkan 前缀是一个用于在所有三个 Vulkan 实现之间切换的脚本。安装 amd-vulkan-prefixesAUR,并在您的应用程序前加上您想要的前缀。提供的可执行文件是 vk_radvvk_amdvlkvk_pro。例如,要使用 AMDVLK Closed 驱动程序

$ vk_pro command

软件渲染

您可以安装称为 lavapipe 的软件 Vulkan 光栅化器,例如用于调试硬件问题:vulkan-swrast(或 lib32-vulkan-swrast 用于 32 位版本)。

以下示例显示了如何使用必需的环境变量运行 vulkaninfo,以强制 Vulkan 和 OpenGL 进行完全软件渲染(使用 __GLX_VENDOR_LIBRARY_NAME=mesa 确保该命令也适用于 PRIME 用户)

$ LIBGL_ALWAYS_SOFTWARE=1 __GLX_VENDOR_LIBRARY_NAME=mesa VK_DRIVER_FILES=/usr/share/vulkan/icd.d/lvp_icd.i686.json:/usr/share/vulkan/icd.d/lvp_icd.x86_64.json vulkaninfo

Vulkan 硬件数据库

Vulkan 硬件数据库提供了用户报告的 GPU/驱动程序组合。通过使用 vulkan-caps-viewer-waylandAURvulkan-caps-viewer-x11AUR 可以提供自己的信息。

故障排除

NVIDIA - Vulkan 无法工作且无法初始化

环境变量

无效或矛盾的 环境变量 值可能会导致 Vulkan 失败,而不适当的值可能会导致在具有多个 GPU 的机器上使用与预期不同的 GPU。正确设置变量还可以帮助 在不需要时保持辅助 GPU 处于断电状态

GPU 切换

如果您的机器有多个 GPU,并且 Vulkan 无法看到或使用其中一个 GPU,请确保它当前未被 BIOS/UEFI 或内核禁用。请参阅 NVIDIA Optimus 以了解在 GPU 之间切换的不同方法概述。

此文章或章节需要扩充。

原因: 是否有更简单的方法来检查此信息,而无需安装 AUR 软件包?(在 Talk:Vulkan 中讨论)

使用 optimus-manager-gitAUR 检查当前状态的示例命令

$ optimus-manager --status
Optimus Manager (Client) version 1.4

Current GPU mode : nvidia
GPU mode requested for next login : no change
GPU at startup : integrated
Temporary config path: no

GSP 固件

此文章或章节是与 NVIDIA/Troubleshooting#Crashes and hangs 合并的候选。

注释: 这不仅仅修复了 Vulkan 问题。我们应该留下一个指向那里的存根。(在 Talk:Vulkan 中讨论)

自 2024 年 6 月发布的 NVIDIA 驱动程序 555 版本以来默认启用的 GSP 固件,已知会导致一系列问题,包括 Vulkan 故障和系统崩溃。

要禁用它,请为 nvidia 内核模块使用 NVreg_EnableGpuFirmware=0 模块参数。这仅适用于 NVIDIA 专有驱动程序:如果从开源驱动程序切换,请参阅 NVIDIA#安装

如果需要,不要忘记重新生成 initramfs。要使此新的内核模块选项生效,请重启。

未找到显示 GPU 设备。是否安装了 intel-mesa 驱动?

尝试在 VK_DRIVER_FILES 中列出 intel_icd 和 primus_vk_wrapper 配置

export VK_DRIVER_FILES=/usr/share/vulkan/icd.d/intel_icd.x86_64.json:/usr/share/vulkan/icd.d/nv_vulkan_wrapper.json

AMDGPU - vulkaninfo 后出现 ERROR_INITIALIZATION_FAILED 错误

如果在 GCN1 或 GCN2 系列的 AMD 显卡上运行 vulkaninfo 后,您收到类似以下的错误消息

ERROR at /build/vulkan-tools/src/Vulkan-Tools-1.2.135/vulkaninfo/vulkaninfo.h:240:vkEnumerateInstanceExtensionProperties failed with ERROR_INITIALIZATION_FAILED

然后检查您是否已正确启用对此型号显卡的支持 (AMDGPU#启用 Southern Islands (SI) 和 Sea Islands (CIK) 支持)。

检查 GPU 驱动程序是否正确加载的一种方法是 lspci -k,运行此命令后检查您的 GPU 的内核驱动程序。它应该是 amdgpu

$ lspci -k
...
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Curacao PRO [Radeon R7 370 / R9 270/370 OEM]
	Subsystem: Gigabyte Technology Co., Ltd Device 226c
	Kernel driver in use: amdgpu
	Kernel modules: radeon, amdgpu
...

关于此问题的一些论坛帖子:[3] [4]

AMDGPU - 玩 DirectX Vulkan 游戏时卡死

Radeon-Vulkan 似乎在使用 DirectX Vulkan 玩某些游戏时会导致驱动程序和/或 GPU 卡死。

kernel: [drm:amdgpu_dm_atomic_commit_tail [amdgpu]] *ERROR* Waiting for fences timed out!
kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* ring gfx_0.0.0 timeout, signaled ..., emitted ...
kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* Process information: process ... pid ... thread dxvk-submit pid
...

切换到或启用 AMDVLK 似乎可以解决问题,如 BBS#275991 中发现的那样。

AMDGPU - DirectX Vulkan 游戏崩溃

据多位用户报告,AMDVLK 导致崩溃(参见 BBS#284118BBS#283008BBS#274737):切换到或启用 Radeon-Vulkan 驱动程序可以解决此问题。

AMDGPU - Vulkan 应用启动缓慢

如果您安装了 cuda,您可能会发现 Vulkan 应用程序(例如 Chromium)启动缓慢。这是因为 nvidia-utils 提供了 Vulkan 驱动程序,Vulkan 会先尝试 nvidia 驱动程序,然后再尝试 radeon 驱动程序。要解决此问题,请将环境变量 VK_DRIVER_FILES 设置为 /usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json

AMDGPU - 未找到驱动!

当遇到 Found no drivers!

$ vulkaninfo
WARNING: [Loader Message] Code 0 : terminator_CreateInstance: Failed to CreateInstance in ICD 0.  Skipping ICD.
ERROR: [Loader Message] Code 0 : terminator_CreateInstance: Found no drivers!
Cannot create Vulkan instance.
This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU that does not support Vulkan.
ERROR at /usr/src/debug/vulkan-tools/Vulkan-Tools-1.3.269/vulkaninfo/./vulkaninfo.h:688:vkCreateInstance failed with ERROR_INCOMPATIBLE_DRIVER

AMD 已定期停止对 Polaris 之前和高达 Vega 的 GPU 的支持。如果您的 GPU 支持已从 amdvlk 中移除,请卸载它并安装 vulkan-radeon

32 位应用在 Bcachefs 根目录下找不到驱动

Bcachefs 在 32 位程序上存在不兼容的错误,当此文件系统用作根目录时,该错误会阻止 Vulkan ICD 加载器找到驱动程序。(Bcachefs#32 位程序无法查看目录内容)。

可以通过在搜索路径之一上挂载不同的文件系统并将数据复制到那里来解决此问题。

警告: 挂载的文件系统将覆盖其所在的目录,阻止您或 Pacman 读取或修改其原始内容。不要挂载到 /usr/share/vulkan 之上,因为软件包更改或更新只会修改挂载文件系统中的文件,因此在卸载时可能会导致损坏。
# mkdir -p /usr/local/share/vulkan
# mount -t tmpfs foo /usr/local/share/vulkan
# cp -r /usr/share/vulkan/* /usr/local/share/vulkan