You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apple M2上调用vkCreateInstance出现VK_ERROR_INCOMPATIBLE_DRIVER错误求助

Apple M2设备上Vulkan实例创建失败(VK_ERROR_INCOMPATIBLE_DRIVER)排查方案

在Apple M2设备上运行以下C++ Vulkan代码时,调用vkCreateInstance返回VK_ERROR_INCOMPATIBLE_DRIVER(错误码-9)。已尝试添加VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME、VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME扩展,设置VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR标志,额外添加VK_KHR_portability_subset扩展,但问题仍未解决,寻求技术帮助。

运行代码

#include <vulkan/vulkan.h>

#include <iostream>
#include <stdexcept>
#include <cstdlib>
#include <vector>
class HelloTriangleApplication {

public:
    void run() {
        initWindow();
        initVulkan();
        mainLoop();
        cleanup();
    }
private:
    VkInstance instance;
    
    void initWindow() {
    }
    void initVulkan() {
        createVulkanInstance();
    }
    
    void mainLoop() {
    }
    
    void cleanup() {
        vkDestroyInstance(instance, nullptr);
    }
    
    void createVulkanInstance() {
        VkApplicationInfo appInfo{};
        appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
        appInfo.pApplicationName = "Hello Triangle";
        appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
        appInfo.pEngineName = "No Engine";
        appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
        appInfo.apiVersion = VK_API_VERSION_1_0;
        
        VkInstanceCreateInfo instanceCreateInfo{};
        instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
        instanceCreateInfo.pApplicationInfo = &appInfo;
        setRequiredExtensions(&instanceCreateInfo);
                
        VkResult result = vkCreateInstance(&instanceCreateInfo, nullptr, &instance);
        if (result != VK_SUCCESS) {
            throw std::runtime_error("Failed to create Vulkan instance. Error code: " + std::to_string(static_cast<int>(result)));
        }
        delete [] instanceCreateInfo.ppEnabledExtensionNames;
    }
   
    void setRequiredExtensions(VkInstanceCreateInfo* instanceCreateInfo) {
        std::vector<const char*> requiredExtensions;

        #ifdef __APPLE__
        requiredExtensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
        requiredExtensions.push_back("VK_KHR_portability_subset");
        requiredExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
        instanceCreateInfo->flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
        #endif
       
        
        const char** enabledExtensions = new const char*[requiredExtensions.size()];
        for (size_t i = 0; i < requiredExtensions.size(); i++) {
            enabledExtensions[i] = requiredExtensions[i];
        }
        
        instanceCreateInfo->enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size());
        instanceCreateInfo->ppEnabledExtensionNames = enabledExtensions;
        
        std::cout << "Requesting extensions:" << std::endl;
        for (const auto& ext : requiredExtensions) {
            std::cout << "	" << ext << std::endl;
        }
    }
};

int main() {
    const char* vk_icd = std::getenv("VK_ICD_FILENAMES");
    const char* vk_layer = std::getenv("VK_LAYER_PATH");
    if (!vk_icd) throw std::runtime_error("VK_ICD_FILENAMES environment variable is not set");
    if (!vk_layer) throw std::runtime_error("VK_LAYER_PATH environment variable is not set");
    #ifndef NDEBUG
    std::cout << "VK_ICD_FILENAMES: " << (vk_icd ? vk_icd : "Not set") << std::endl;
    std::cout << "VK_LAYER_PATH: " << (vk_layer ? vk_layer : "Not set") << std::endl;
    #endif
    
    HelloTriangleApplication app;
    
    try {
        app.run();
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    
    return EXIT_SUCCESS;
}

排查建议

  • 检查MoltenVK版本:确保安装最新版MoltenVK,旧版本可能存在M2适配问题。执行moltenvk --version查看当前版本,更新到官方最新版。
  • 验证环境变量路径:确认VK_ICD_FILENAMES指向正确的MoltenVK ICD文件,例如/usr/local/share/vulkan/icd.d/MoltenVK_icd.json;VK_LAYER_PATH指向标准Vulkan层目录,例如/usr/local/share/vulkan/explicit_layer.d。
  • 调整API版本:将代码中的VK_API_VERSION_1_0改为VK_API_VERSION_1_1或VK_API_VERSION_1_2,MoltenVK对高版本API支持更完善。
  • 移除非必要扩展:VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME在实例创建阶段并非必需,可先移除该扩展后重新测试。
  • 检查编译链接参数:编译时确保正确链接MoltenVK库,添加-lMoltenVK参数,并确认头文件路径包含Vulkan和MoltenVK的安装目录。

内容的提问来源于stack exchange,提问作者canersevdiceginibekleyenoglu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:14:51