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
相关产品推荐
相关产品推荐

