【问题标题】:Why does vkCreateInstance return "VK_ERROR_INCOMPATIBLE_DRIVER" on MacOS despite vulkan supported GPU and up to date driver?尽管 vulkan 支持 GPU 和最新驱动程序,为什么 vkCreateInstance 在 MacOS 上返回“VK_ERROR_INCOMPATIBLE_DRIVER”?
【发布时间】:2022-06-29 02:17:10
【问题描述】:

我目前正在尝试在我的笔记本电脑(配备 Intel Iris Pro GPU 的 MacBook Pro)上开发基于 vulkan 的图形引擎。我在我的台式电脑(带有 NVIDIA GTX 1080 ti GPU 的 Windows)上开始了这个项目。这在我的台式电脑上完美运行。但是当我尝试在我的笔记本电脑上构建和执行它时,可执行文件无法尝试创建 vulkan 实例并返回“VK_ERROR_INCOMPATIBLE_DRIVER”作为 VkResult。

免责声明:我是 C++ 新手,我知道以下代码不符合大多数 C++ 编码约定。我正在努力使我的代码尽可能地具有可读性,以便我能学得更好。

我正在尝试使用以下代码创建一个新的 vulkan 实例:

VkApplicationInfo app_info{};                                // APPLICATION INFO
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;         // type of the struct
app_info.pApplicationName = application_name;                // name of the application
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);      // version
app_info.pEngineName = application_engine_name;              // name of the engine
app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0);           // version
app_info.apiVersion = VK_API_VERSION_1_0;                    // API version

// get available GLFW extensions
uint32_t glfw_extension_count = 0;                                            
const char** glfw_extensions = glfwGetRequiredInstanceExtensions(&glfw_extension_count);

// setup create info struct
VkInstanceCreateInfo instance_create_info{};                          // INSTANCE CREATION INFO
instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;  // type of struct
instance_create_info.pApplicationInfo = &app_info;                     // application info from above
instance_create_info.enabledExtensionCount = glfw_extension_count;      // amount of extensions to be enabled
instance_create_info.ppEnabledExtensionNames = glfw_extensions;        // extensions to enable
instance_create_info.enabledLayerCount = enable_validation_layers ? static_cast<uint32_t>(validation_layers.size()) : 0; // validation layer count
instance_create_info.ppEnabledLayerNames = enable_validation_layers ? validation_layers.data() : nullptr;                // validation layer names

// try creating instance, catch potential error code
VkResult creation_result = vkCreateInstance(&instance_create_info, nullptr, &vulkan_instance);

// check result of instance creation, handle errors
if (creation_result != VK_SUCCESS)
{
    string message = "ERROR: Instance creation failed with result '";
    message += get_result_string(creation_result);
    message += "'.";
    throw runtime_error(message);
}

// get extensions available for vulkan instance
uint32_t extension_count = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr);
vector<VkExtensionProperties> extensions(extension_count);
vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, extensions.data());

验证层被禁用,因此可以忽略 CreateInfo 结构的最后两行。 "get_result_string()" 只是根据提供的 VkResult 返回一个更清晰的错误字符串:

string get_result_string (VkResult vulkan_result)
{
    switch (vulkan_result)
    {
        case VK_SUCCESS:
            return "SUCCESS";
        case VK_ERROR_OUT_OF_HOST_MEMORY:
            return "OUT OF HOST MEMORY";
        case VK_ERROR_OUT_OF_DEVICE_MEMORY:
            return "OUT OF DEVICE MEMORY";
        case VK_ERROR_INITIALIZATION_FAILED:
            return "INITIALIZATION FAILED";
        case VK_ERROR_LAYER_NOT_PRESENT:
            return "LAYER NOT PRESENT";
        case VK_ERROR_EXTENSION_NOT_PRESENT:
            return "EXTENSION NOT PRESENT";
        case VK_ERROR_INCOMPATIBLE_DRIVER:
            return "INCOMPATIBLE DRIVER";
        default:
            return "UNKNOWN RESULT '" + vulkan_result;
    }
}

在 VulkanSDK 文件夹的 Applications 文件夹中运行 vkcube 可以正常工作。运行 vulkaninfo 不会返回任何错误,并且可以成功创建实例和物理设备。根据Vulkan Hardware Database,我的笔记本的GPU应该是支持的。操作系统是最新的,这应该意味着驱动程序也是最新的。可执行文件的整体构建命令如下:

g++ -std=c++17 -O2 -g [SRC FILES] -o [OUTPUT FILE] -L /.../VulkanSDK/1.3.216.0/macOS/lib /.../VulkanSDK/1.3.216.0/macOS/lib/libvulkan.1.dylib /.../VulkanSDK/1.3.216.0/macOS/lib/libvulkan.1.3.216.dylib -L /usr/local/Cellar/glfw/3.3.7/lib/ -lglfw -I /.../VulkanSDK/1.3.216.0/macOS/include -I /usr/local/include/glm -I /usr/local/include/GLFW

此时,我不知道为什么我的可执行文件无法创建 vulkan 实例。这里的一些帮助将不胜感激!有人有想法吗?

【问题讨论】:

  • "操作系统是最新的,这意味着驱动程序也是最新的。" 您的操作系统是 MacOS,不支持 Vulkan。除非您使用 MoltenVK 或将 Vulkan 转换为 Metal 的类似工具。
  • @NicolBolas 我认为你必须在 mac 上使用 MoltenVK 的事实不言而喻。在所有官方 Vulkan API 相关网站上都有明确说明。所以是的......我正在使用 MoltenVK。
  • @vandench 不,我已经尝试执行 python 脚本无济于事。正如我已经说过的,我的 GPU 受支持并列在第二个答案中的链接网站上。
  • 您使用的是什么版本的 SDK? SDK 1.3.216 发生了变化,需要对可移植性子集进行一些更改。

标签: c++ macos gpu driver vulkan


【解决方案1】:

SDK 1.3.216 对 MacOSX 上的设备枚举方式进行了更改,您的代码必须使用可移植性子集扩展来(再次)发现您的设备。

为了使用可移植子集扩展:

  • 启用VK_KHR_portability_enumeration 实例扩展
  • 为您的实例创建信息添加(或设置)VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR 标志
  • 启用VK_KHR_portability_subset 设备扩展

通过这些更改,您应该能够在 MacOS 上创建实例和设备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多