mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-05 22:41:25 +12: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)
|
swapchain_base* instance::create_swapchain(display_handle_t window_handle, vk::physical_device& dev)
|
||||||
{
|
{
|
||||||
bool force_wm_reporting_off = false;
|
bool force_wm_reporting_off = false;
|
||||||
#ifdef _WIN32
|
m_surface = make_WSI_surface(m_instance, window_handle);
|
||||||
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
|
|
||||||
|
|
||||||
u32 device_queues = dev.get_queue_count();
|
u32 device_queues = dev.get_queue_count();
|
||||||
std::vector<VkBool32> supports_present(device_queues, VK_FALSE);
|
std::vector<VkBool32> supports_present(device_queues, VK_FALSE);
|
||||||
|
|
|
@ -52,6 +52,13 @@ namespace vk
|
||||||
};
|
};
|
||||||
|
|
||||||
using swapchain_NATIVE = swapchain_ANDROID;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,5 +52,17 @@ namespace vk
|
||||||
};
|
};
|
||||||
|
|
||||||
using swapchain_NATIVE = swapchain_MacOS;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,4 +158,44 @@ namespace vk
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#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;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue