M3 MacBook Pro(macOS)下Vulkan交换链创建触发段错误
交换链创建时触发段错误问题求助
我正在跟随《Vulkan教程 - 绘制三角形》学习,但在创建交换链时遇到问题:调用vkCreateSwapchainKHR()函数触发段错误,运行日志如下:
./PhysicsEngine -r zsh: segmentation fault ./PhysicsEngine -r
错误详情
- 段错误具体发生在以下代码行:
vkCreateSwapchainKHR(P_LogicalDevice, &CreateInfo, nullptr, &P_Swapchain);
- 调用栈:
[Unknown/Just-In-Time compiled code] (Unknown Source:0) PhysicsEngine!App::CreateSwapchain() (/Users/tibecornelis/Documents/Programming/PhysicsEngine/Main/Source/App.cpp:157) PhysicsEngine!App::InitVulkan() (/Users/tibecornelis/Documents/Programming/PhysicsEngine/Main/Source/App.cpp:409) PhysicsEngine!App::run() (/Users/tibecornelis/Documents/Programming/PhysicsEngine/Main/Source/App.cpp:19) PhysicsEngine!RunApp() (/Users/tibecornelis/Documents/Programming/PhysicsEngine/Main/Source/App.cpp:531) PhysicsEngine!main (/Users/tibecornelis/Documents/Programming/PhysicsEngine/Main/Source/main.cpp:104) start (Unknown Source:0)
- 系统配置:
- macOS:M3 MacBook Pro
- OSX:Sonoma 14.6.1版本
补充信息
- 源码中的Vulkan三角形测试可正常运行,说明Vulkan本身已正确安装且可用。
相关代码片段
交换链创建函数
void App::CreateSwapchain() { SwapchainSupportDetails mySwapchainSupportDetails = QuerySwapChainSupport(P_GPU); VkSurfaceFormatKHR mySurfaceFormat = ChooseSwapchainSurfaceFormat(mySwapchainSupportDetails.surfaceFormats); VkPresentModeKHR myPresentMode = ChooseSwapchainPresentMode(mySwapchainSupportDetails.presentModes); VkExtent2D myExtent = ChooseSwapchainExtent(mySwapchainSupportDetails.surfaceCapabilities); uint32_t MinimumImageCount = mySwapchainSupportDetails.surfaceCapabilities.minImageCount + 1; if (mySwapchainSupportDetails.surfaceCapabilities.maxImageCount > 0 && MinimumImageCount > mySwapchainSupportDetails.surfaceCapabilities.maxImageCount) { MinimumImageCount = mySwapchainSupportDetails.surfaceCapabilities.maxImageCount; } VkSwapchainCreateInfoKHR CreateInfo{}; CreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; CreateInfo.surface = P_Surface; CreateInfo.minImageCount = MinimumImageCount; CreateInfo.imageFormat = mySurfaceFormat.format; CreateInfo.imageColorSpace = mySurfaceFormat.colorSpace; CreateInfo.imageExtent = myExtent; CreateInfo.imageArrayLayers = 1; CreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; QueueFamilyIndices myFamilyIndices = FindQueueFamilies(P_GPU); uint32_t QueueFamilyIndices[] = {myFamilyIndices.graphicsFamily.value(), myFamilyIndices.presentFamily.value()}; if (myFamilyIndices.graphicsFamily != myFamilyIndices.presentFamily) { CreateInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT; CreateInfo.queueFamilyIndexCount = 2; CreateInfo.pQueueFamilyIndices = QueueFamilyIndices; } else { CreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; } CreateInfo.preTransform = mySwapchainSupportDetails.surfaceCapabilities.currentTransform; CreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; CreateInfo.presentMode = myPresentMode; CreateInfo.clipped = VK_TRUE; CreateInfo.oldSwapchain = VK_NULL_HANDLE; if (vkCreateSwapchainKHR(P_LogicalDevice, &CreateInfo, nullptr, &P_Swapchain) != VK_SUCCESS) { throw std::runtime_error("Error : Failed to create swapchain"); } }
已执行的排查步骤
- 验证Vulkan安装:检查Vulkan SDK安装情况及glfw的Vulkan支持
- 检查交换链支持:通过
QuerySwapChainSupport()确认GPU支持所需交换链属性 - 确保逻辑设备有效:
vkCreateDevice()无错误返回,且调用vkCreateSwapchainKHR()前P_LogicalDevice有效 - 验证Surface创建:
glfwCreateWindowSurface()执行成功无错误
内容的提问来源于stack exchange,提问作者Tibe Cornelis
相关产品推荐
相关产品推荐

