尝试获取物理设备时出现 Vulkan 错误 VK_ERROR_INITIALIZATION_FAILED
Vulkan error VK_ERROR_INITIALIZATION_FAILED when trying to get physical devices
情况
我使用 VulkanAPI 编写了一个简单的 C++ 代码,但是当我尝试获取我的物理设备时遇到错误。
Hardware/Software
OS: 初级 OS 5.1.3 赫拉 x86_64
笔记本型号:80Q5 Lenovo G70-35
CPU:AMD A8-6410 APU 与 AMD Radeon R5 显卡 (4) @ 2.000
GPU:AMD Radeon R4/R5 显卡
您可以找到支持的设备列表here(我认为)
代码
#include <iostream>
#include "vulkan/vulkan.h"
VkInstance instance;
void assert(VkResult result) {
if (result != VK_SUCCESS)
std::cout << "error: " << result << std::endl;
}
int main() {
VkApplicationInfo appInfo;
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pNext = nullptr;
appInfo.pApplicationName = "VulkanAPI";
appInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 0);
appInfo.pEngineName = "VulkanAPI Engine";
appInfo.engineVersion = VK_MAKE_VERSION(0, 0, 0);
appInfo.apiVersion = VK_API_VERSION_1_2;
VkInstanceCreateInfo instanceInfo;
instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instanceInfo.pNext = nullptr;
instanceInfo.flags = 0;
instanceInfo.pApplicationInfo = &appInfo;
instanceInfo.enabledLayerCount = 0;
instanceInfo.ppEnabledLayerNames = nullptr;
instanceInfo.enabledExtensionCount = 0;
instanceInfo.ppEnabledExtensionNames = nullptr;
VkResult result = vkCreateInstance(&instanceInfo, nullptr, &instance);
assert(result); // works fine
uint32_t physicalDevicesCount = 0;
result = vkEnumeratePhysicalDevices(instance, &physicalDevicesCount, nullptr);
assert(result); // prints -3, which is equivalent to VK_ERROR_INITIALIZATION_FAILED
std::cout << physicalDevicesCount << std::endl;
return 0;
}
问题
每当我编译 运行 这段代码时 throws/prints 一个错误:
根据互联网,您的 GPU AMD Radeon R5 M330 是 Sea Islands 一代。
radv
vulkan 驱动程序需要新的 amdgpu
内核微型端口驱动程序。但是 Sea Islands 和 Southern Islands GPU 默认情况下仍然 运行 在遗留 radeon
内核驱动程序上。 amdgpu
对它们的驱动程序支持是 "experimental"。
要启用支持,您必须添加使 radeon
驱动程序拒绝 GPU 而 amdgpu
接受它的内核参数。
南部岛屿 radeon.si_support=0 amdgpu.si_support=1
。
对于海岛,它是 radeon.cik_support=0 amdgpu.cik_support=1
。
您可以找到如何添加内核参数,例如在 https://wiki.ubuntu.com/Kernel/KernelBootParameters.
情况
我使用 VulkanAPI 编写了一个简单的 C++ 代码,但是当我尝试获取我的物理设备时遇到错误。
Hardware/Software
OS: 初级 OS 5.1.3 赫拉 x86_64
笔记本型号:80Q5 Lenovo G70-35
CPU:AMD A8-6410 APU 与 AMD Radeon R5 显卡 (4) @ 2.000
GPU:AMD Radeon R4/R5 显卡
您可以找到支持的设备列表here(我认为)
代码
#include <iostream>
#include "vulkan/vulkan.h"
VkInstance instance;
void assert(VkResult result) {
if (result != VK_SUCCESS)
std::cout << "error: " << result << std::endl;
}
int main() {
VkApplicationInfo appInfo;
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pNext = nullptr;
appInfo.pApplicationName = "VulkanAPI";
appInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 0);
appInfo.pEngineName = "VulkanAPI Engine";
appInfo.engineVersion = VK_MAKE_VERSION(0, 0, 0);
appInfo.apiVersion = VK_API_VERSION_1_2;
VkInstanceCreateInfo instanceInfo;
instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instanceInfo.pNext = nullptr;
instanceInfo.flags = 0;
instanceInfo.pApplicationInfo = &appInfo;
instanceInfo.enabledLayerCount = 0;
instanceInfo.ppEnabledLayerNames = nullptr;
instanceInfo.enabledExtensionCount = 0;
instanceInfo.ppEnabledExtensionNames = nullptr;
VkResult result = vkCreateInstance(&instanceInfo, nullptr, &instance);
assert(result); // works fine
uint32_t physicalDevicesCount = 0;
result = vkEnumeratePhysicalDevices(instance, &physicalDevicesCount, nullptr);
assert(result); // prints -3, which is equivalent to VK_ERROR_INITIALIZATION_FAILED
std::cout << physicalDevicesCount << std::endl;
return 0;
}
问题
每当我编译 运行 这段代码时 throws/prints 一个错误:
根据互联网,您的 GPU AMD Radeon R5 M330 是 Sea Islands 一代。
radv
vulkan 驱动程序需要新的 amdgpu
内核微型端口驱动程序。但是 Sea Islands 和 Southern Islands GPU 默认情况下仍然 运行 在遗留 radeon
内核驱动程序上。 amdgpu
对它们的驱动程序支持是 "experimental"。
要启用支持,您必须添加使 radeon
驱动程序拒绝 GPU 而 amdgpu
接受它的内核参数。
南部岛屿 radeon.si_support=0 amdgpu.si_support=1
。
对于海岛,它是 radeon.cik_support=0 amdgpu.cik_support=1
。
您可以找到如何添加内核参数,例如在 https://wiki.ubuntu.com/Kernel/KernelBootParameters.