Vulkan ошибка VK_ERROR_INITIALIZATION_FAILED при попытке получить физические устройства - PullRequest
1 голос
/ 19 апреля 2020

Ситуация

Я написал простой код на C ++ с VulkanAPI, но, тем не менее, я получаю ошибки, когда пытаюсь получить свои физические устройства.

Аппаратное / программное обеспечение

ОС: элементарная ОС 5.1.3 Hera x86_64

Модель ноутбука: 80Q5 Lenovo G70-35

Процессор: AMD A8-6410 APU с графикой AMD Radeon R5 (4) @ 2.000

GPU: Графика AMD Radeon R4 / R5

Вы можете найти список поддерживаемых устройств здесь (я думаю)

Код

#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;
}

Проблема

Всякий раз, когда я компилирую и запускаю этот код, он выдает / печатает ошибку:

-3 (то есть VK_ERROR_INITIALIZATION_FAILED )

1 Ответ

1 голос
/ 03 мая 2020

За целую rnet Ваш графический процессор AMD Radeon R5 M330 относится к поколению Sea Islands.

Для драйвера radv vulkan требуется новый драйвер amdgpu ядра минипорта. Но графические процессоры Sea Islands и Southern Islands по умолчанию все еще работают на устаревшем драйвере ядра radeon. Поддержка драйверов amdgpu для них является «экспериментальной».

Чтобы включить поддержку, вы должны добавить параметры ядра, которые заставляют драйвер 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.

...