diff options
Diffstat (limited to 'src/video_core/vulkan_common')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan.h | 5 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_instance.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_surface.cpp | 20 |
3 files changed, 29 insertions, 0 deletions
diff --git a/src/video_core/vulkan_common/vulkan.h b/src/video_core/vulkan_common/vulkan.h index 62aa132915..13f679ff54 100644 --- a/src/video_core/vulkan_common/vulkan.h +++ b/src/video_core/vulkan_common/vulkan.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,6 +13,8 @@ #define VK_USE_PLATFORM_METAL_EXT #elif defined(__ANDROID__) #define VK_USE_PLATFORM_ANDROID_KHR +#elif defined(__HAIKU__) +#define VK_USE_PLATFORM_XCB_KHR #else #define VK_USE_PLATFORM_XLIB_KHR #define VK_USE_PLATFORM_WAYLAND_KHR diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index 1948e0030a..d9404933cd 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp @@ -59,6 +59,10 @@ namespace { case Core::Frontend::WindowSystemType::Android: extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); break; +#elif defined(__HAIKU__) + case Core::Frontend::WindowSystemType::Xcb: + extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); + break; #else case Core::Frontend::WindowSystemType::X11: extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); diff --git a/src/video_core/vulkan_common/vulkan_surface.cpp b/src/video_core/vulkan_common/vulkan_surface.cpp index e45f8e43fb..f1b56cc0a8 100644 --- a/src/video_core/vulkan_common/vulkan_surface.cpp +++ b/src/video_core/vulkan_common/vulkan_surface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -54,6 +57,23 @@ vk::SurfaceKHR CreateSurface( throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); } } +#elif defined(__HAIKU__) + if (window_info.type == Core::Frontend::WindowSystemType::Xcb) { + const VkXcbSurfaceCreateInfoKHR xcb_ci{ + .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, + .pNext = nullptr, + .flags = 0, + .connection = static_cast<xcb_connection_t*>(window_info.display_connection), + .window = xcb_window_t(uintptr_t(window_info.render_surface)) + }; + const auto vkCreateXcbSurfaceKHR = reinterpret_cast<PFN_vkCreateXcbSurfaceKHR>( + dld.vkGetInstanceProcAddr(*instance, "vkCreateXcbSurfaceKHR")); + if (!vkCreateXcbSurfaceKHR || + vkCreateXcbSurfaceKHR(*instance, &xcb_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { + LOG_ERROR(Render_Vulkan, "Failed to initialize Xcb surface"); + throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); + } + } #else if (window_info.type == Core::Frontend::WindowSystemType::X11) { const VkXlibSurfaceCreateInfoKHR xlib_ci{ |
