Search code examples
c++mingwglfwvulkan

GLFW can't find VK_KHR_win32_surface in MinGW


Description

Currently my program runs on MSVC without any problems but on MinGW glfwCreateWindowSurface(...) strangely throws an error that it's missing the VK_KHR_win32_surface extension.

Surface Code

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

Additional Info

  • vkGetInstanceProcAddr(..., "vkCreateWin32SurfaceKHR") and glfwGetInstanceProcAddress(..., "vkCreateWin32SurfaceKHR"): return a non-null function pointer
  • glfwGetError(...): returns 65542 and Win32: Vulkan instance missing VK_KHR_win32_surface extension
  • vkEnumerateInstanceExtensionProperties(...): lists the VK_KHR_win32_surface extension
  • glfwCreateWindowSurface(...): returns VK_ERROR_EXTENSION_NOT_PRESENT
  • glfwVulkanSupported(): returns 1
  • It should be the same code as https://vulkan-tutorial.com/code/26_depth_buffering.cpp

Solution

  • Fixed by using GLFW Native since it works:

    #define GLFW_EXPOSE_NATIVE_WIN32
    #include <GLFW/glfw3native.h>
    
    // ...
    
    VkWin32SurfaceCreateInfoKHR surfaceInfo {};
    surfaceInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
    surfaceInfo.hinstance = GetModuleHandle(nullptr);
    surfaceInfo.hwnd = glfwGetWin32Window(window);
    
    if (vkCreateWin32SurfaceKHR(instance, &surfaceInfo, nullptr, &surface) != VK_SUCCESS) {
        throw std::runtime_error("failed to create window surface!");
    }