diff --git a/rpcs3/Emu/RSX/VK/vkutils/instance.cpp b/rpcs3/Emu/RSX/VK/vkutils/instance.cpp index 76cd29243f..d28b90b338 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/instance.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/instance.cpp @@ -251,56 +251,7 @@ namespace vk swapchain_base* instance::create_swapchain(display_handle_t window_handle, vk::physical_device& dev) { bool force_wm_reporting_off = false; -#ifdef _WIN32 - HINSTANCE hInstance = NULL; - - VkWin32SurfaceCreateInfoKHR createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; - createInfo.hinstance = hInstance; - createInfo.hwnd = window_handle; - - CHECK_RESULT(vkCreateWin32SurfaceKHR(m_instance, &createInfo, NULL, &m_surface)); - -#elif defined(__APPLE__) - VkMacOSSurfaceCreateInfoMVK createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK; - createInfo.pView = window_handle; - - CHECK_RESULT(vkCreateMacOSSurfaceMVK(m_instance, &createInfo, NULL, &m_surface)); -#else - - std::visit([&](auto&& p) - { - using T = std::decay_t; - -#ifdef HAVE_X11 - if constexpr (std::is_same_v>) - { - VkXlibSurfaceCreateInfoKHR createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; - createInfo.dpy = p.first; - createInfo.window = p.second; - CHECK_RESULT(vkCreateXlibSurfaceKHR(this->m_instance, &createInfo, nullptr, &m_surface)); - } - else -#endif -#ifdef HAVE_WAYLAND - if constexpr (std::is_same_v>) - { - VkWaylandSurfaceCreateInfoKHR createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; - createInfo.display = p.first; - createInfo.surface = p.second; - CHECK_RESULT(vkCreateWaylandSurfaceKHR(this->m_instance, &createInfo, nullptr, &m_surface)); - force_wm_reporting_off = true; - } - else -#endif - { - static_assert(std::conditional_t::value, "Unhandled window_handle type in std::variant"); - } - }, window_handle); -#endif + m_surface = make_WSI_surface(m_instance, window_handle); u32 device_queues = dev.get_queue_count(); std::vector supports_present(device_queues, VK_FALSE); diff --git a/rpcs3/Emu/RSX/VK/vkutils/swapchain_android.hpp b/rpcs3/Emu/RSX/VK/vkutils/swapchain_android.hpp index a4d8b613de..6e6d0cada5 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/swapchain_android.hpp +++ b/rpcs3/Emu/RSX/VK/vkutils/swapchain_android.hpp @@ -52,6 +52,13 @@ namespace vk }; using swapchain_NATIVE = swapchain_ANDROID; + + // TODO: Implement this + static + VkSurfaceKHR make_WSI_surface(VkInstance vk_instance, display_handle_t window_handle) + { + return VK_NULL_HANDLE; + } #endif } diff --git a/rpcs3/Emu/RSX/VK/vkutils/swapchain_macos.hpp b/rpcs3/Emu/RSX/VK/vkutils/swapchain_macos.hpp index a9daf7718d..7b06a854dd 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/swapchain_macos.hpp +++ b/rpcs3/Emu/RSX/VK/vkutils/swapchain_macos.hpp @@ -52,5 +52,17 @@ namespace vk }; using swapchain_NATIVE = swapchain_MacOS; + + static + VkSurfaceKHR make_WSI_surface(VkInstance vk_instance, display_handle_t handle) + { + VkSurfaceKHR result = VK_NULL_HANDLE; + VkMacOSSurfaceCreateInfoMVK createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK; + createInfo.pView = window_handle; + + CHECK_RESULT(vkCreateMacOSSurfaceMVK(vk_instance, &createInfo, NULL, &result)); + return result; + } #endif } diff --git a/rpcs3/Emu/RSX/VK/vkutils/swapchain_unix.hpp b/rpcs3/Emu/RSX/VK/vkutils/swapchain_unix.hpp index c9d005045a..7431054936 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/swapchain_unix.hpp +++ b/rpcs3/Emu/RSX/VK/vkutils/swapchain_unix.hpp @@ -158,4 +158,44 @@ namespace vk #endif #endif + + static + VkSurfaceKHR make_WSI_surface(VkInstance vk_instance, display_handle_t window_handle) + { + VkSurfaceKHR result = VK_NULL_HANDLE; + + std::visit([&](auto&& p) + { + using T = std::decay_t; + +#ifdef HAVE_X11 + if constexpr (std::is_same_v>) + { + VkXlibSurfaceCreateInfoKHR createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; + createInfo.dpy = p.first; + createInfo.window = p.second; + CHECK_RESULT(vkCreateXlibSurfaceKHR(vk_instance, &createInfo, nullptr, &result)); + } + else +#endif +#ifdef HAVE_WAYLAND + if constexpr (std::is_same_v>) + { + VkWaylandSurfaceCreateInfoKHR createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; + createInfo.display = p.first; + createInfo.surface = p.second; + CHECK_RESULT(vkCreateWaylandSurfaceKHR(vk_instance, &createInfo, nullptr, &result)); + force_wm_reporting_off = true; + } + else +#endif + { + static_assert(std::conditional_t::value, "Unhandled window_handle type in std::variant"); + } + }, window_handle); + + return ensure(result, "Failed to initialize Vulkan display surface"); + } } diff --git a/rpcs3/Emu/RSX/VK/vkutils/swapchain_win32.hpp b/rpcs3/Emu/RSX/VK/vkutils/swapchain_win32.hpp index 005a09d988..de7f45c5c4 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/swapchain_win32.hpp +++ b/rpcs3/Emu/RSX/VK/vkutils/swapchain_win32.hpp @@ -93,6 +93,18 @@ namespace vk using swapchain_NATIVE = swapchain_WIN32; + static + VkSurfaceKHR make_WSI_surface(VkInstance vk_instance, display_handle_t window_handle) + { + HINSTANCE hInstance = NULL; + VkSurfaceKHR result = VK_NULL_HANDLE; + VkWin32SurfaceCreateInfoKHR createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; + createInfo.hinstance = hInstance; + createInfo.hwnd = window_handle; + CHECK_RESULT(vkCreateWin32SurfaceKHR(vk_instance, &createInfo, NULL, &result)); + return result; + } #endif }