diff --git a/dep/vulkan-loader/CMakeLists.txt b/dep/vulkan-loader/CMakeLists.txt index 8ce9b7fed..7341af2aa 100644 --- a/dep/vulkan-loader/CMakeLists.txt +++ b/dep/vulkan-loader/CMakeLists.txt @@ -30,3 +30,6 @@ if(USE_X11) target_compile_definitions(vulkan-loader PUBLIC "VULKAN_USE_X11=1") endif() +if(USE_WAYLAND) + target_compile_definitions(vulkan-loader PUBLIC "VULKAN_USE_WAYLAND=1") +endif() diff --git a/dep/vulkan-loader/include/vulkan_entry_points.inl b/dep/vulkan-loader/include/vulkan_entry_points.inl index 42ae6ab28..155710f05 100644 --- a/dep/vulkan-loader/include/vulkan_entry_points.inl +++ b/dep/vulkan-loader/include/vulkan_entry_points.inl @@ -50,6 +50,10 @@ VULKAN_INSTANCE_ENTRY_POINT(vkCreateXlibSurfaceKHR, false) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceXlibPresentationSupportKHR, false) #endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) +VULKAN_INSTANCE_ENTRY_POINT(vkCreateWaylandSurfaceKHR, false) +#endif + #if defined(VK_USE_PLATFORM_ANDROID_KHR) VULKAN_INSTANCE_ENTRY_POINT(vkCreateAndroidSurfaceKHR, false) #endif diff --git a/dep/vulkan-loader/include/vulkan_loader.h b/dep/vulkan-loader/include/vulkan_loader.h index 999039d80..1da06fe46 100644 --- a/dep/vulkan-loader/include/vulkan_loader.h +++ b/dep/vulkan-loader/include/vulkan_loader.h @@ -33,6 +33,10 @@ #define VK_USE_PLATFORM_XLIB_KHR #endif +#if defined(VULKAN_USE_WAYLAND) +#define VK_USE_PLATFORM_WAYLAND_KHR +#endif + #if defined(ANDROID) #define VK_USE_PLATFORM_ANDROID_KHR #endif diff --git a/src/common/vulkan/context.cpp b/src/common/vulkan/context.cpp index f827574b9..505c7bf31 100644 --- a/src/common/vulkan/context.cpp +++ b/src/common/vulkan/context.cpp @@ -186,19 +186,24 @@ bool Context::SelectInstanceExtensions(ExtensionList* extension_list, bool enabl #if defined(VK_USE_PLATFORM_WIN32_KHR) if (enable_surface && !SupportsExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, true)) return false; -#elif defined(VK_USE_PLATFORM_XLIB_KHR) +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) if (enable_surface && !SupportsExtension(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, true)) return false; -#elif defined(VK_USE_PLATFORM_XCB_KHR) - if (enable_surface && !SupportsExtension(VK_KHR_XCB_SURFACE_EXTENSION_NAME, true)) +#endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + if (enable_surface && !SupportsExtension(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, true)) return false; -#elif defined(VK_USE_PLATFORM_ANDROID_KHR) +#endif +#if defined(VK_USE_PLATFORM_ANDROID_KHR) if (enable_surface && !SupportsExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, true)) return false; -#elif defined(VK_USE_PLATFORM_MACOS_MVK) +#endif +#if defined(VK_USE_PLATFORM_MACOS_MVK) if (enable_surface && !SupportsExtension(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, true)) return false; -#elif defined(VK_USE_PLATFORM_METAL_EXT) +#endif +#if defined(VK_USE_PLATFORM_METAL_EXT) if (enable_surface && !SupportsExtension(VK_EXT_METAL_SURFACE_EXTENSION_NAME, true)) return false; #endif diff --git a/src/common/vulkan/swap_chain.cpp b/src/common/vulkan/swap_chain.cpp index c7c0f686b..cb06a386a 100644 --- a/src/common/vulkan/swap_chain.cpp +++ b/src/common/vulkan/swap_chain.cpp @@ -135,6 +135,25 @@ VkSurfaceKHR SwapChain::CreateVulkanSurface(VkInstance instance, WindowInfo& wi) } #endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + if (wi.type == WindowInfo::Type::Wayland) + { + VkWaylandSurfaceCreateInfoKHR surface_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0, + static_cast<struct wl_display*>(wi.display_connection), + static_cast<struct wl_surface*>(wi.window_handle)}; + + VkSurfaceKHR surface; + VkResult res = vkCreateWaylandSurfaceKHR(instance, &surface_create_info, nullptr, &surface); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkCreateWaylandSurfaceEXT failed: "); + return VK_NULL_HANDLE; + } + + return surface; + } +#endif + #if defined(VK_USE_PLATFORM_ANDROID_KHR) if (wi.type == WindowInfo::Type::Android) {