mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-20 03:25:16 +00:00
vk/swapchain: Move platform-specific code to appropriate headers
This commit is contained in:
parent
8b2e792d31
commit
602fe15641
5 changed files with 72 additions and 50 deletions
|
@ -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<decltype(p)>;
|
||||
|
||||
#ifdef HAVE_X11
|
||||
if constexpr (std::is_same_v<T, std::pair<Display*, Window>>)
|
||||
{
|
||||
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<T, std::pair<wl_display*, wl_surface*>>)
|
||||
{
|
||||
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<true, std::false_type, 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<VkBool32> supports_present(device_queues, VK_FALSE);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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<decltype(p)>;
|
||||
|
||||
#ifdef HAVE_X11
|
||||
if constexpr (std::is_same_v<T, std::pair<Display*, Window>>)
|
||||
{
|
||||
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<T, std::pair<wl_display*, wl_surface*>>)
|
||||
{
|
||||
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<true, std::false_type, T>::value, "Unhandled window_handle type in std::variant");
|
||||
}
|
||||
}, window_handle);
|
||||
|
||||
return ensure(result, "Failed to initialize Vulkan display surface");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue