Failed to create Vulkan window surface on macOS

I’ve been making my way through the Vulkan tutorials, but I’m running into trouble trying to create a window surface as per this step. I’ve essentially copied and pasted the example code, so I’m mostly confident that it’s not a transcription issue on my part. I’m running macOS Catalina on a 2016 15’ MBP with an AMD GPU, and the latest stable Vulkan SDK version 1.2.148.0. Here is the code that throws the error:

    if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) {
        throw std::runtime_error("failed to create window surface!");
    }

Here is the terminal output:

2020-08-05 14:46:54.336613+0800 Server[25129:848558] Metal API Validation Enabled
2020-08-05 14:46:54.381875+0800 Server[25129:848972] flock failed to lock maps file: errno = 35
2020-08-05 14:46:54.383147+0800 Server[25129:848972] flock failed to lock maps file: errno = 35
validation layer: ReadDataFilesInSearchPaths: Searching the following paths for manifest files: /Users/myusername/Library/Developer/Xcode/DerivedData/mygame-aqamkhipllkgvfbgrniquerbvgsw/Build/Products/Debug/vulkan/implicit_layer.d:/etc/xdg/vulkan/implicit_layer.d:/tmp/macos-sdk-build/Vulkan-Loader/build/install/etc/vulkan/implicit_layer.d:/etc/vulkan/implicit_layer.d:/usr/local/share/vulkan/implicit_layer.d:/usr/share/vulkan/implicit_layer.d:/Users/myusername/.local/share/vulkan/implicit_layer.d

validation layer: ReadDataFilesInSearchPaths: Searching the following paths for manifest files: /Users/myusername/Library/Developer/Xcode/DerivedData/mygame-aqamkhipllkgvfbgrniquerbvgsw/Build/Products/Debug/vulkan/explicit_layer.d:/etc/xdg/vulkan/explicit_layer.d:/tmp/macos-sdk-build/Vulkan-Loader/build/install/etc/vulkan/explicit_layer.d:/etc/vulkan/explicit_layer.d:/usr/local/share/vulkan/explicit_layer.d:/usr/share/vulkan/explicit_layer.d:/Users/myusername/.local/share/vulkan/explicit_layer.d

validation layer: ReadDataFilesInSearchPaths: Searching the following paths for manifest files: /Users/myusername/Library/Developer/Xcode/DerivedData/mygame-aqamkhipllkgvfbgrniquerbvgsw/Build/Products/Debug/vulkan/icd.d:/etc/xdg/vulkan/icd.d:/tmp/macos-sdk-build/Vulkan-Loader/build/install/etc/vulkan/icd.d:/etc/vulkan/icd.d:/usr/local/share/vulkan/icd.d:/usr/share/vulkan/icd.d:/Users/myusername/.local/share/vulkan/icd.d

validation layer: Searching for ICD drivers named ../../../lib/libMoltenVK.dylib
validation layer: Build ICD instance extension list
validation layer: Instance Extension: VK_KHR_device_group_creation (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_KHR_external_memory_capabilities (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_KHR_get_physical_device_properties2 (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.2
validation layer: Instance Extension: VK_KHR_get_surface_capabilities2 (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_KHR_surface (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.25
validation layer: Instance Extension: VK_EXT_debug_report (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.9
validation layer: Instance Extension: VK_EXT_debug_utils (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.2
validation layer: Instance Extension: VK_EXT_metal_surface (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_EXT_swapchain_colorspace (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.4
validation layer: Instance Extension: VK_MVK_macos_surface (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.2
validation layer: Instance Extension: VK_MVK_moltenvk (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.27
validation layer: Loading layer library /usr/local/share/vulkan/explicit_layer.d/../../../lib/libVkLayer_khronos_validation.dylib
validation layer: Build ICD instance extension list
validation layer: Instance Extension: VK_KHR_device_group_creation (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_KHR_external_memory_capabilities (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_KHR_get_physical_device_properties2 (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.2
validation layer: Instance Extension: VK_KHR_get_surface_capabilities2 (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_KHR_surface (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.25
validation layer: Instance Extension: VK_EXT_debug_report (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.9
validation layer: Instance Extension: VK_EXT_debug_utils (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.2
validation layer: Instance Extension: VK_EXT_metal_surface (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.1
validation layer: Instance Extension: VK_EXT_swapchain_colorspace (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.4
validation layer: Instance Extension: VK_MVK_macos_surface (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.2
validation layer: Instance Extension: VK_MVK_moltenvk (/usr/local/share/vulkan/icd.d/../../../lib/libMoltenVK.dylib) version 0.0.27
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: failed to create window surface!
Program ended with exit code: 9

Have you tried building and running the GLFW triangle-vulkan.c test?

This might help to narrow down your issue. If you build GFLW from source with cmake this should be built by default.

Thanks dougbinks, looking at triangle-vulkan.c helped me fix the problem. I guessed it has some way of finding libvulkan.1.2.148.dylib on my system and linking to that. I was using vulkan.framework before, so I tried linking to libvulkan.1.2.148.dylib instead and my code is now working.

I’m not sure why vulkan.framwork doesn’t work for me. This person had the same experience. I should also probably mention that the VkResult returned by glfwCreateWindowSurface is VK_ERROR_EXTENSION_NOT_PRESENT.

Anyway, if anybody else has this problem, try using libvulkan.1.2.148.dylib or libvulkan.1.dylib (an alias for the latest libvulkan.1.x.xxx.dylib) instead. For me they were installed under /usr/local/bin.