#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
.