diff --git a/Source/Core/VideoBackends/Vulkan/SwapChain.cpp b/Source/Core/VideoBackends/Vulkan/SwapChain.cpp index 2759a59283..94cd0ade67 100644 --- a/Source/Core/VideoBackends/Vulkan/SwapChain.cpp +++ b/Source/Core/VideoBackends/Vulkan/SwapChain.cpp @@ -18,16 +18,12 @@ #if defined(VK_USE_PLATFORM_XLIB_KHR) #include -#elif defined(VK_USE_PLATFORM_XCB_KHR) -#include -#include #endif namespace Vulkan { -SwapChain::SwapChain(void* display_handle, void* native_handle, VkSurfaceKHR surface, bool vsync) - : m_display_handle(display_handle), m_native_handle(native_handle), m_surface(surface), - m_vsync_enabled(vsync) +SwapChain::SwapChain(const WindowSystemInfo& wsi, VkSurfaceKHR surface, bool vsync) + : m_wsi(wsi), m_surface(surface), m_vsync_enabled(vsync) { } @@ -39,110 +35,101 @@ SwapChain::~SwapChain() DestroySemaphores(); } -VkSurfaceKHR SwapChain::CreateVulkanSurface(VkInstance instance, void* display_handle, void* hwnd) +VkSurfaceKHR SwapChain::CreateVulkanSurface(VkInstance instance, const WindowSystemInfo& wsi) { #if defined(VK_USE_PLATFORM_WIN32_KHR) - VkWin32SurfaceCreateInfoKHR surface_create_info = { - VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, // VkStructureType sType - nullptr, // const void* pNext - 0, // VkWin32SurfaceCreateFlagsKHR flags - nullptr, // HINSTANCE hinstance - reinterpret_cast(hwnd) // HWND hwnd - }; - - VkSurfaceKHR surface; - VkResult res = vkCreateWin32SurfaceKHR(instance, &surface_create_info, nullptr, &surface); - if (res != VK_SUCCESS) + if (wsi.type == WindowSystemType::Windows) { - LOG_VULKAN_ERROR(res, "vkCreateWin32SurfaceKHR failed: "); - return VK_NULL_HANDLE; + VkWin32SurfaceCreateInfoKHR surface_create_info = { + VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, // VkStructureType sType + nullptr, // const void* pNext + 0, // VkWin32SurfaceCreateFlagsKHR flags + nullptr, // HINSTANCE hinstance + reinterpret_cast(wsi.render_surface) // HWND hwnd + }; + + VkSurfaceKHR surface; + VkResult res = vkCreateWin32SurfaceKHR(instance, &surface_create_info, nullptr, &surface); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkCreateWin32SurfaceKHR failed: "); + return VK_NULL_HANDLE; + } + + return surface; } - - return surface; - -#elif defined(VK_USE_PLATFORM_XLIB_KHR) - VkXlibSurfaceCreateInfoKHR surface_create_info = { - VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, // VkStructureType sType - nullptr, // const void* pNext - 0, // VkXlibSurfaceCreateFlagsKHR flags - static_cast(display_handle), // Display* dpy - reinterpret_cast(hwnd) // Window window - }; - - VkSurfaceKHR surface; - VkResult res = vkCreateXlibSurfaceKHR(instance, &surface_create_info, nullptr, &surface); - if (res != VK_SUCCESS) - { - LOG_VULKAN_ERROR(res, "vkCreateXlibSurfaceKHR failed: "); - return VK_NULL_HANDLE; - } - - return surface; - -#elif defined(VK_USE_PLATFORM_XCB_KHR) - // If we ever switch to using xcb, we should pass the display handle as well. - xcb_connection_t* connection = XGetXCBConnection(display_handle); - - VkXcbSurfaceCreateInfoKHR surface_create_info = { - VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, // VkStructureType sType - nullptr, // const void* pNext - 0, // VkXcbSurfaceCreateFlagsKHR flags - connection, // xcb_connection_t* connection - static_cast(reinterpret_cast(hwnd)) // xcb_window_t window - }; - - VkSurfaceKHR surface; - VkResult res = vkCreateXcbSurfaceKHR(instance, &surface_create_info, nullptr, &surface); - if (res != VK_SUCCESS) - { - LOG_VULKAN_ERROR(res, "vkCreateXcbSurfaceKHR failed: "); - return VK_NULL_HANDLE; - } - - return surface; - -#elif defined(VK_USE_PLATFORM_ANDROID_KHR) - VkAndroidSurfaceCreateInfoKHR surface_create_info = { - VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, // VkStructureType sType - nullptr, // const void* pNext - 0, // VkAndroidSurfaceCreateFlagsKHR flags - reinterpret_cast(hwnd) // ANativeWindow* window - }; - - VkSurfaceKHR surface; - VkResult res = vkCreateAndroidSurfaceKHR(instance, &surface_create_info, nullptr, &surface); - if (res != VK_SUCCESS) - { - LOG_VULKAN_ERROR(res, "vkCreateAndroidSurfaceKHR failed: "); - return VK_NULL_HANDLE; - } - - return surface; - -#elif defined(VK_USE_PLATFORM_MACOS_MVK) - VkMacOSSurfaceCreateInfoMVK surface_create_info = { - VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK, nullptr, 0, hwnd}; - - VkSurfaceKHR surface; - VkResult res = vkCreateMacOSSurfaceMVK(instance, &surface_create_info, nullptr, &surface); - if (res != VK_SUCCESS) - { - LOG_VULKAN_ERROR(res, "vkCreateMacOSSurfaceMVK failed: "); - return VK_NULL_HANDLE; - } - - return surface; -#else - return VK_NULL_HANDLE; #endif + +#if defined(VK_USE_PLATFORM_XLIB_KHR) + if (wsi.type == WindowSystemType::X11) + { + VkXlibSurfaceCreateInfoKHR surface_create_info = { + VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, // VkStructureType sType + nullptr, // const void* pNext + 0, // VkXlibSurfaceCreateFlagsKHR flags + static_cast(wsi.display_connection), // Display* dpy + reinterpret_cast(wsi.render_surface) // Window window + }; + + VkSurfaceKHR surface; + VkResult res = vkCreateXlibSurfaceKHR(instance, &surface_create_info, nullptr, &surface); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkCreateXlibSurfaceKHR failed: "); + return VK_NULL_HANDLE; + } + + return surface; + } +#endif + +#if defined(VK_USE_PLATFORM_ANDROID_KHR) + if (wsi.type == WindowSystemType::Android) + { + VkAndroidSurfaceCreateInfoKHR surface_create_info = { + VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, // VkStructureType sType + nullptr, // const void* pNext + 0, // VkAndroidSurfaceCreateFlagsKHR flags + reinterpret_cast(wsi.render_surface) // ANativeWindow* window + }; + + VkSurfaceKHR surface; + VkResult res = vkCreateAndroidSurfaceKHR(instance, &surface_create_info, nullptr, &surface); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkCreateAndroidSurfaceKHR failed: "); + return VK_NULL_HANDLE; + } + + return surface; + } +#endif + +#if defined(VK_USE_PLATFORM_MACOS_MVK) + if (wsi.type == WindowSystemType::MacOS) + { + VkMacOSSurfaceCreateInfoMVK surface_create_info = { + VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK, nullptr, 0, wsi.render_surface}; + + VkSurfaceKHR surface; + VkResult res = vkCreateMacOSSurfaceMVK(instance, &surface_create_info, nullptr, &surface); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkCreateMacOSSurfaceMVK failed: "); + return VK_NULL_HANDLE; + } + + return surface; + } +#endif + + return VK_NULL_HANDLE; } -std::unique_ptr SwapChain::Create(void* display_handle, void* native_handle, - VkSurfaceKHR surface, bool vsync) +std::unique_ptr SwapChain::Create(const WindowSystemInfo& wsi, VkSurfaceKHR surface, + bool vsync) { - std::unique_ptr swap_chain = - std::make_unique(display_handle, native_handle, surface, vsync); - + std::unique_ptr swap_chain = std::make_unique(wsi, surface, vsync); if (!swap_chain->CreateSemaphores() || !swap_chain->CreateSwapChain() || !swap_chain->SetupSwapChainImages()) { @@ -531,9 +518,8 @@ bool SwapChain::RecreateSurface(void* native_handle) DestroySurface(); // Re-create the surface with the new native handle - m_native_handle = native_handle; - m_surface = - CreateVulkanSurface(g_vulkan_context->GetVulkanInstance(), m_display_handle, native_handle); + m_wsi.render_surface = native_handle; + m_surface = CreateVulkanSurface(g_vulkan_context->GetVulkanInstance(), m_wsi); if (m_surface == VK_NULL_HANDLE) return false; diff --git a/Source/Core/VideoBackends/Vulkan/SwapChain.h b/Source/Core/VideoBackends/Vulkan/SwapChain.h index 11b32c7951..0687249acd 100644 --- a/Source/Core/VideoBackends/Vulkan/SwapChain.h +++ b/Source/Core/VideoBackends/Vulkan/SwapChain.h @@ -8,6 +8,7 @@ #include #include "Common/CommonTypes.h" +#include "Common/WindowSystemInfo.h" #include "VideoBackends/Vulkan/Constants.h" #include "VideoBackends/Vulkan/Texture2D.h" #include "VideoCommon/TextureConfig.h" @@ -20,18 +21,16 @@ class ObjectCache; class SwapChain { public: - SwapChain(void* display_handle, void* native_handle, VkSurfaceKHR surface, bool vsync); + SwapChain(const WindowSystemInfo& wsi, VkSurfaceKHR surface, bool vsync); ~SwapChain(); // Creates a vulkan-renderable surface for the specified window handle. - static VkSurfaceKHR CreateVulkanSurface(VkInstance instance, void* display_handle, void* hwnd); + static VkSurfaceKHR CreateVulkanSurface(VkInstance instance, const WindowSystemInfo& wsi); // Create a new swap chain from a pre-existing surface. - static std::unique_ptr Create(void* display_handle, void* native_handle, - VkSurfaceKHR surface, bool vsync); + static std::unique_ptr Create(const WindowSystemInfo& wsi, VkSurfaceKHR surface, + bool vsync); - void* GetDisplayHandle() const { return m_display_handle; } - void* GetNativeHandle() const { return m_native_handle; } VkSurfaceKHR GetSurface() const { return m_surface; } VkSurfaceFormatKHR GetSurfaceFormat() const { return m_surface_format; } AbstractTextureFormat GetTextureFormat() const { return m_texture_format; } @@ -89,8 +88,7 @@ private: VkFramebuffer framebuffer; }; - void* m_display_handle; - void* m_native_handle; + WindowSystemInfo m_wsi; VkSurfaceKHR m_surface = VK_NULL_HANDLE; VkSurfaceFormatKHR m_surface_format = {}; VkPresentModeKHR m_present_mode = VK_PRESENT_MODE_RANGE_SIZE_KHR; diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp index e38c47eefc..4eaea78865 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp +++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp @@ -84,11 +84,11 @@ bool VulkanContext::CheckValidationLayerAvailablility() }) != layer_list.end()); } -VkInstance VulkanContext::CreateVulkanInstance(bool enable_surface, bool enable_debug_report, +VkInstance VulkanContext::CreateVulkanInstance(WindowSystemType wstype, bool enable_debug_report, bool enable_validation_layer) { ExtensionList enabled_extensions; - if (!SelectInstanceExtensions(&enabled_extensions, enable_surface, enable_debug_report)) + if (!SelectInstanceExtensions(&enabled_extensions, wstype, enable_debug_report)) return VK_NULL_HANDLE; VkApplicationInfo app_info = {}; @@ -129,7 +129,7 @@ VkInstance VulkanContext::CreateVulkanInstance(bool enable_surface, bool enable_ return instance; } -bool VulkanContext::SelectInstanceExtensions(ExtensionList* extension_list, bool enable_surface, +bool VulkanContext::SelectInstanceExtensions(ExtensionList* extension_list, WindowSystemType wstype, bool enable_debug_report) { u32 extension_count = 0; @@ -172,24 +172,39 @@ bool VulkanContext::SelectInstanceExtensions(ExtensionList* extension_list, bool }; // Common extensions - if (enable_surface && !SupportsExtension(VK_KHR_SURFACE_EXTENSION_NAME, true)) + if (wstype != WindowSystemType::Headless && + !SupportsExtension(VK_KHR_SURFACE_EXTENSION_NAME, true)) + { return false; + } #if defined(VK_USE_PLATFORM_WIN32_KHR) - if (enable_surface && !SupportsExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, true)) + if (wstype == WindowSystemType::Windows && + !SupportsExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, true)) + { return false; -#elif defined(VK_USE_PLATFORM_XLIB_KHR) - if (enable_surface && !SupportsExtension(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, true)) + } +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) + if (wstype == WindowSystemType::X11 && + !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_ANDROID_KHR) + if (wstype == WindowSystemType::Android && + !SupportsExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, true)) + { return false; -#elif 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) - if (enable_surface && !SupportsExtension(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, true)) + } +#endif +#if defined(VK_USE_PLATFORM_MACOS_MVK) + if (wstype == WindowSystemType::MacOS && + !SupportsExtension(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, true)) + { return false; + } #endif // VK_EXT_debug_report diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.h b/Source/Core/VideoBackends/Vulkan/VulkanContext.h index ec20ded1c8..6b254e24c0 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanContext.h +++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.h @@ -8,6 +8,7 @@ #include #include "Common/CommonTypes.h" +#include "Common/WindowSystemInfo.h" #include "VideoBackends/Vulkan/Constants.h" #include "VideoCommon/VideoConfig.h" @@ -23,7 +24,7 @@ public: static bool CheckValidationLayerAvailablility(); // Helper method to create a Vulkan instance. - static VkInstance CreateVulkanInstance(bool enable_surface, bool enable_debug_report, + static VkInstance CreateVulkanInstance(WindowSystemType wstype, bool enable_debug_report, bool enable_validation_layer); // Returns a list of Vulkan-compatible GPUs. @@ -109,7 +110,7 @@ public: private: using ExtensionList = std::vector; - static bool SelectInstanceExtensions(ExtensionList* extension_list, bool enable_surface, + static bool SelectInstanceExtensions(ExtensionList* extension_list, WindowSystemType wstype, bool enable_debug_report); bool SelectDeviceExtensions(ExtensionList* extension_list, bool enable_surface); bool SelectDeviceFeatures(); diff --git a/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl b/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl index 54a7f43e24..c40483e10e 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl +++ b/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl @@ -39,28 +39,21 @@ VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceSurfaceFormatsKHR, false) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceSurfacePresentModesKHR, false) #if defined(VK_USE_PLATFORM_WIN32_KHR) - VULKAN_INSTANCE_ENTRY_POINT(vkCreateWin32SurfaceKHR, false) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceWin32PresentationSupportKHR, false) +#endif -#elif defined(VK_USE_PLATFORM_XLIB_KHR) - +#if defined(VK_USE_PLATFORM_XLIB_KHR) VULKAN_INSTANCE_ENTRY_POINT(vkCreateXlibSurfaceKHR, false) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceXlibPresentationSupportKHR, false) +#endif -#elif defined(VK_USE_PLATFORM_XCB_KHR) - -VULKAN_INSTANCE_ENTRY_POINT(vkCreateXcbSurfaceKHR, false) -VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceXcbPresentationSupportKHR, false) - -#elif defined(VK_USE_PLATFORM_ANDROID_KHR) - +#if defined(VK_USE_PLATFORM_ANDROID_KHR) VULKAN_INSTANCE_ENTRY_POINT(vkCreateAndroidSurfaceKHR, false) +#endif -#elif defined(VK_USE_PLATFORM_MACOS_MVK) - +#if defined(VK_USE_PLATFORM_MACOS_MVK) VULKAN_INSTANCE_ENTRY_POINT(vkCreateMacOSSurfaceMVK, false) - #endif VULKAN_INSTANCE_ENTRY_POINT(vkCreateDebugReportCallbackEXT, false) diff --git a/Source/Core/VideoBackends/Vulkan/VulkanLoader.cpp b/Source/Core/VideoBackends/Vulkan/VulkanLoader.cpp index 96f955ce2c..d8d1e99d0c 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanLoader.cpp +++ b/Source/Core/VideoBackends/Vulkan/VulkanLoader.cpp @@ -13,11 +13,9 @@ #include "VideoBackends/Vulkan/VulkanLoader.h" -#if defined(VK_USE_PLATFORM_WIN32_KHR) +#if defined(_WIN32) #include -#elif defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_XCB_KHR) || \ - defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(VK_USE_PLATFORM_MACOS_MVK) || \ - defined(USE_HEADLESS) +#else #include #endif @@ -42,7 +40,7 @@ static void ResetVulkanLibraryFunctionPointers() #undef VULKAN_MODULE_ENTRY_POINT } -#if defined(VK_USE_PLATFORM_WIN32_KHR) +#if defined(_WIN32) static HMODULE vulkan_module; static std::atomic_int vulkan_module_ref_count = {0}; @@ -100,9 +98,7 @@ void UnloadVulkanLibrary() vulkan_module = nullptr; } -#elif defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_XCB_KHR) || \ - defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(VK_USE_PLATFORM_MACOS_MVK) || \ - defined(USE_HEADLESS) +#else static void* vulkan_module; static std::atomic_int vulkan_module_ref_count = {0}; @@ -181,20 +177,6 @@ void UnloadVulkanLibrary() vulkan_module = nullptr; } -#else - -//#warning Unknown platform, not compiling loader. - -bool LoadVulkanLibrary() -{ - return false; -} - -void UnloadVulkanLibrary() -{ - ResetVulkanLibraryFunctionPointers(); -} - #endif bool LoadVulkanInstanceFunctions(VkInstance instance) diff --git a/Source/Core/VideoBackends/Vulkan/VulkanLoader.h b/Source/Core/VideoBackends/Vulkan/VulkanLoader.h index 3ae2584f8b..1bb0cae867 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanLoader.h +++ b/Source/Core/VideoBackends/Vulkan/VulkanLoader.h @@ -8,17 +8,18 @@ #if defined(WIN32) #define VK_USE_PLATFORM_WIN32_KHR -#elif defined(HAVE_X11) -// Currently we're getting xlib handles passed to the backend. -// If this ever changes to xcb, it's a simple change here. +#endif + +#if defined(HAVE_X11) #define VK_USE_PLATFORM_XLIB_KHR -//#define VK_USE_PLATFORM_XCB_KHR -#elif defined(ANDROID) +#endif + +#if defined(ANDROID) #define VK_USE_PLATFORM_ANDROID_KHR -#elif defined(__APPLE__) +#endif + +#if defined(__APPLE__) #define VK_USE_PLATFORM_MACOS_MVK -#else -//#warning Unknown platform #endif #include "vulkan/vulkan.h" diff --git a/Source/Core/VideoBackends/Vulkan/main.cpp b/Source/Core/VideoBackends/Vulkan/main.cpp index b5eeb51da6..8055aab178 100644 --- a/Source/Core/VideoBackends/Vulkan/main.cpp +++ b/Source/Core/VideoBackends/Vulkan/main.cpp @@ -36,7 +36,8 @@ void VideoBackend::InitBackendInfo() if (LoadVulkanLibrary()) { - VkInstance temp_instance = VulkanContext::CreateVulkanInstance(false, false, false); + VkInstance temp_instance = + VulkanContext::CreateVulkanInstance(WindowSystemType::Headless, false, false); if (temp_instance) { if (LoadVulkanInstanceFunctions(temp_instance)) @@ -111,10 +112,10 @@ bool VideoBackend::Initialize(const WindowSystemInfo& wsi) // Create Vulkan instance, needed before we can create a surface, or enumerate devices. // We use this instance to fill in backend info, then re-use it for the actual device. - bool enable_surface = wsi.render_surface != nullptr; + bool enable_surface = wsi.type != WindowSystemType::Headless; bool enable_debug_reports = ShouldEnableDebugReports(enable_validation_layer); - VkInstance instance = VulkanContext::CreateVulkanInstance(enable_surface, enable_debug_reports, - enable_validation_layer); + VkInstance instance = + VulkanContext::CreateVulkanInstance(wsi.type, enable_debug_reports, enable_validation_layer); if (instance == VK_NULL_HANDLE) { PanicAlert("Failed to create Vulkan instance."); @@ -150,7 +151,7 @@ bool VideoBackend::Initialize(const WindowSystemInfo& wsi) VkSurfaceKHR surface = VK_NULL_HANDLE; if (enable_surface) { - surface = SwapChain::CreateVulkanSurface(instance, wsi.display_connection, wsi.render_surface); + surface = SwapChain::CreateVulkanSurface(instance, wsi); if (surface == VK_NULL_HANDLE) { PanicAlert("Failed to create Vulkan surface."); @@ -213,8 +214,7 @@ bool VideoBackend::Initialize(const WindowSystemInfo& wsi) std::unique_ptr swap_chain; if (surface != VK_NULL_HANDLE) { - swap_chain = SwapChain::Create(wsi.display_connection, wsi.render_surface, surface, - g_ActiveConfig.bVSyncActive); + swap_chain = SwapChain::Create(wsi, surface, g_ActiveConfig.bVSyncActive); if (!swap_chain) { PanicAlert("Failed to create Vulkan swap chain.");