From f3783bdb44eb2cd40e69846d104df35fc5ccc661 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 26 Dec 2017 02:55:37 +0300 Subject: [PATCH] Add support for Vulkan on Wayland --- CMakeLists.txt | 1 + Common/Vulkan/VulkanContext.cpp | 33 ++++++++++++++++++++++++--------- Common/Vulkan/VulkanContext.h | 3 +++ Common/Vulkan/VulkanLoader.cpp | 12 ++++++++++-- Common/Vulkan/VulkanLoader.h | 8 +++++--- SDL/SDLMain.cpp | 26 +++++++++++++------------- 6 files changed, 56 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df8dbd2078..7ca7543fe1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,6 +109,7 @@ endif() if(LINUX AND VULKAN) message("Using XCB extension...") add_definitions(-DVK_USE_PLATFORM_XLIB_KHR) + add_definitions(-DVK_USE_PLATFORM_WAYLAND_KHR) # add_definitions(-DVK_USE_PLATFORM_XCB_KHR) endif() diff --git a/Common/Vulkan/VulkanContext.cpp b/Common/Vulkan/VulkanContext.cpp index c0f7f5f6ba..41a9880826 100644 --- a/Common/Vulkan/VulkanContext.cpp +++ b/Common/Vulkan/VulkanContext.cpp @@ -109,16 +109,19 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { instance_extensions_enabled_.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #elif defined(__ANDROID__) instance_extensions_enabled_.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); -#elif defined(VK_USE_PLATFORM_XLIB_KHR) - instance_extensions_enabled_.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); -#elif defined(VK_USE_PLATFORM_XCB_KHR) - instance_extensions_enabled_.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); -#elif defined(VK_USE_PLATFORM_MIR_KHR) - instance_extensions_enabled_.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME); -#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) - instance_extensions.enabled_.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); #else - //... +#if defined(VK_USE_PLATFORM_XLIB_KHR) + instance_extensions_enabled_.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); +#endif +//#if defined(VK_USE_PLATFORM_XCB_KHR) +// instance_extensions_enabled_.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); +//#endif +//#if defined(VK_USE_PLATFORM_MIR_KHR) +// instance_extensions_enabled_.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME); +//#endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + instance_extensions_enabled_.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); +#endif #endif if (flags_ & VULKAN_FLAG_VALIDATE) { @@ -667,6 +670,18 @@ void VulkanContext::ReinitSurface(int width, int height) { break; } #endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + case WINDOWSYSTEM_WAYLAND: + { + VkWaylandSurfaceCreateInfoKHR wayland = { VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR }; + wayland.flags = 0; + wayland.display = (wl_display *)winsysData1_; + wayland.surface = (wl_surface *)winsysData2_; + VkResult res = vkCreateWaylandSurfaceKHR(instance_, &wayland, nullptr, &surface_); + assert(res == VK_SUCCESS); + break; + } +#endif default: _assert_msg_(G3D, false, "Vulkan support for chosen window system not implemented"); diff --git a/Common/Vulkan/VulkanContext.h b/Common/Vulkan/VulkanContext.h index 0c60a3bef2..03b9f1b21a 100644 --- a/Common/Vulkan/VulkanContext.h +++ b/Common/Vulkan/VulkanContext.h @@ -43,6 +43,9 @@ enum WindowSystem { #ifdef VK_USE_PLATFORM_XCB_KHR WINDOWSYSTEM_XCB, #endif +#ifdef VK_USE_PLATFORM_WAYLAND_KHR + WINDOWSYSTEM_WAYLAND, +#endif }; struct VulkanPhysicalDeviceInfo { diff --git a/Common/Vulkan/VulkanLoader.cpp b/Common/Vulkan/VulkanLoader.cpp index e40c3ec6bf..fe651b7bf4 100644 --- a/Common/Vulkan/VulkanLoader.cpp +++ b/Common/Vulkan/VulkanLoader.cpp @@ -167,9 +167,13 @@ PFN_vkCmdExecuteCommands vkCmdExecuteCommands; PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #elif defined(_WIN32) PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; -#elif defined(VK_USE_PLATFORM_XLIB_KHR) +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) +PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; +#endif PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; @@ -415,9 +419,13 @@ void VulkanLoadInstanceFunctions(VkInstance instance) { LOAD_INSTANCE_FUNC(instance, vkCreateWin32SurfaceKHR); #elif defined(__ANDROID__) LOAD_INSTANCE_FUNC(instance, vkCreateAndroidSurfaceKHR); -#elif defined(VK_USE_PLATFORM_XLIB_KHR) +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) LOAD_INSTANCE_FUNC(instance, vkCreateXlibSurfaceKHR); #endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + LOAD_INSTANCE_FUNC(instance, vkCreateWaylandSurfaceKHR); +#endif LOAD_INSTANCE_FUNC(instance, vkDestroySurfaceKHR); #endif diff --git a/Common/Vulkan/VulkanLoader.h b/Common/Vulkan/VulkanLoader.h index 16fbe1fd2e..752f3587a4 100644 --- a/Common/Vulkan/VulkanLoader.h +++ b/Common/Vulkan/VulkanLoader.h @@ -174,9 +174,13 @@ extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands; extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #elif defined(_WIN32) extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; -#elif defined(VK_USE_PLATFORM_XLIB_KHR) +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #endif +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) +extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; +#endif extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; @@ -192,8 +196,6 @@ extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; extern PFN_vkQueuePresentKHR vkQueuePresentKHR; -#endif - // And the DEBUG_REPORT extension. Since we load this dynamically even in static // linked mode, we have to rename it :( extern PFN_vkCreateDebugReportCallbackEXT dyn_vkCreateDebugReportCallbackEXT; diff --git a/SDL/SDLMain.cpp b/SDL/SDLMain.cpp index 04e011e314..c614fb7e1c 100644 --- a/SDL/SDLMain.cpp +++ b/SDL/SDLMain.cpp @@ -438,27 +438,27 @@ bool SDLVulkanGraphicsContext::Init(SDL_Window *&window, int x, int y, int mode, fprintf(stderr, "Error getting SDL window wm info: %s\n", SDL_GetError()); exit(1); } - Display *display = sys_info.info.x11.display; - Window x11_window = sys_info.info.x11.window; switch (sys_info.subsystem) { case SDL_SYSWM_X11: +#if defined(VK_USE_PLATFORM_XLIB_KHR) + vulkan_->InitSurface(WINDOWSYSTEM_XLIB, (void*)sys_info.info.x11.display, + (void *)(intptr_t)sys_info.info.x11.window, pixel_xres, pixel_yres); +#elif defined(VK_USE_PLATFORM_XCB_KHR) + vulkan_->InitSurface(WINDOWSYSTEM_XCB, (void*)XGetXCBConnection(sys_info.info.x11.display), + (void *)(intptr_t)sys_info.info.x11.window, pixel_xres, pixel_yres); +#endif break; +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + case SDL_SYSWM_WAYLAND: + vulkan_->InitSurface(WINDOWSYSTEM_WAYLAND, (void*)sys_info.info.wl.display, + (void *)sys_info.info.wl.surface, pixel_xres, pixel_yres); + break; +#endif default: fprintf(stderr, "Vulkan subsystem %d not supported\n", sys_info.subsystem); exit(1); break; } -#else - // Fake to make it build on Apple. This code won't run there though. - void *display = nullptr; - int x11_window = 0; -#endif - ILOG("Display: %p", display); - -#if defined(VK_USE_PLATFORM_XLIB_KHR) - vulkan_->InitSurface(WINDOWSYSTEM_XLIB, (void*)display, (void *)(intptr_t)x11_window, pixel_xres, pixel_yres); -#elif defined(VK_USE_PLATFORM_XCB_KHR) - vulkan_->InitSurface(WINDOWSYSTEM_XCB, (void*)XGetXCBConnection(display), (void *)(intptr_t)x11_window, pixel_xres, pixel_yres); #endif if (!vulkan_->InitObjects()) {