GLFW не может найти VK_KHR_win32_surface в MinGW

#c #mingw #glfw #vulkan

#c #mingw #glfw #vulkan

Вопрос:

Описание

В настоящее время моя программа работает на MSVC без каких-либо проблем, но на MinGW glfwCreateWindowSurface(...) странным образом выдает ошибку о том, что в ней отсутствует VK_KHR_win32_surface расширение.

Поверхностный код

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

Дополнительная информация

  • vkGetInstanceProcAddr(..., "vkCreateWin32SurfaceKHR") и glfwGetInstanceProcAddress(..., "vkCreateWin32SurfaceKHR") : возвращает ненулевой указатель на функцию
  • glfwGetError(...) : возвращает 65542 и Win32: Vulkan instance missing VK_KHR_win32_surface extension
  • vkEnumerateInstanceExtensionProperties(...) : перечисляет VK_KHR_win32_surface расширение
  • glfwCreateWindowSurface(...) : возвращает VK_ERROR_EXTENSION_NOT_PRESENT
  • glfwVulkanSupported() : возвращает 1
  • Это должен быть тот же код, что иhttps://vulkan-tutorial.com/code/26_depth_buffering.cpp

Ответ №1:

Исправлено с использованием встроенного GLFW, поскольку он работает:

 #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, amp;surfaceInfo, nullptr, amp;surface) != VK_SUCCESS) {
    throw std::runtime_error("failed to create window surface!");
}

  

Ответ №2:

Есть ли шанс, что у вас есть более старый glfw?

У меня это glfwCreateWindowSurface присутствует в glfw3.

Я сам создал glfw3 (как статическую, так и разделяемую библиотеку) с помощью MinGW-w64 в оболочке MSYS2 из исходного файла по адресуhttp://downloads.sourceforge.net/project/glfw/glfw/3.3.2/glfw-3.3.2.tar.bz2 используя эти команды:

 cmake.exe -G"MSYS Makefiles" -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLPREFIX -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DGLFW_BUILD_EXAMPLES:BOOL=OFF -DGLFW_BUILD_TESTS:BOOL=OFF -S. -Bbuild_static amp;amp;
cmake.exe -G"MSYS Makefiles" -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLPREFIX -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=ON -DGLFW_BUILD_EXAMPLES:BOOL=OFF -DGLFW_BUILD_TESTS:BOOL=OFF -S. -Bbuild_shared amp;amp;
make -Cbuild_static install/strip amp;amp;
make -Cbuild_shared install/strip amp;amp;
echo Success
  

Ответ №3:

Убедитесь, что ваше приложение использует соответствующую библиотеку Vulkan для вашей целевой платформы. Поэтому, когда MinGW нацелен на Windows, вам может потребоваться выполнить привязку вручную vulkan-1.dll .