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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:36:15