Skip to content

Commit 2b30756

Browse files
surface: Better support for linux surface backends (#225)
* surface: Better support for linux surface backends Manually create X surface instead of being tied to the Qt platform in use Don't rely on Qt's wayland/X libraries Don't violate vulkan spec with null wayland surface * Fix Build
1 parent 9b7bfaa commit 2b30756

File tree

3 files changed

+52
-19
lines changed

3 files changed

+52
-19
lines changed

vulkanCapsViewer.pro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ linux:!android {
2727
LIBS += -lvulkan
2828
contains(DEFINES, X11) {
2929
message("Building for X11")
30-
QT += x11extras
30+
LIBS += -lxcb
3131
DEFINES += VK_USE_PLATFORM_XCB_KHR
3232
}
3333
contains(DEFINES, WAYLAND) {
3434
message("Building for Wayland")
35-
QT += waylandclient
35+
LIBS += -lwayland-client
3636
DEFINES += VK_USE_PLATFORM_WAYLAND_KHR
3737
}
3838
target.path = /usr/bin

vulkanDeviceInfo.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@
5151
#include <sys/system_properties.h>
5252
#endif
5353

54-
#ifdef VK_USE_PLATFORM_XCB_KHR
55-
#include <QX11Info>
56-
#endif
57-
5854
#include "vulkanandroid.h"
5955
#if !defined(DISABLE_PROFILES)
6056
#include "vulkan_profiles.hpp"

vulkancapsviewer.cpp

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,6 @@
5656
#include <sys/utsname.h>
5757
#endif
5858

59-
#ifdef VK_USE_PLATFORM_XCB_KHR
60-
#include <QX11Info>
61-
#endif
62-
6359
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
6460
#include <wayland-client.h>
6561
#endif
@@ -785,21 +781,62 @@ bool VulkanCapsViewer::initVulkan()
785781

786782
#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
787783
if (surface_extension == VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) {
788-
VkWaylandSurfaceCreateInfoKHR surfaceCreateInfo = {};
789-
surfaceCreateInfo.pNext = nullptr;
790-
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
791-
surfaceCreateInfo.display = wl_display_connect(NULL);
792-
surfaceCreateInfo.surface = nullptr;
793-
surfaceResult = vkCreateWaylandSurfaceKHR(vulkanContext.instance, &surfaceCreateInfo, nullptr, &vulkanContext.surface);
784+
static const wl_registry_listener WAYLAND_LISTENER {
785+
.global = [](void *data, wl_registry*, uint32_t name, const char* interface, uint32_t){
786+
if (!strcmp(interface, wl_compositor_interface.name)) {
787+
*static_cast<uint32_t *>(data) = name;
788+
}
789+
},
790+
.global_remove = [](void*, wl_registry*, uint32_t){
791+
792+
}
793+
};
794+
795+
const auto wayland_display = wl_display_connect(nullptr);
796+
const auto wayland_registry = wl_display_get_registry(wayland_display);
797+
uint32_t wayland_compositor_name = 0;
798+
wl_registry_add_listener(wayland_registry, &WAYLAND_LISTENER, &wayland_compositor_name);
799+
wl_display_roundtrip(wayland_display);
800+
801+
if (wayland_compositor_name > 0) {
802+
const auto wayland_compositor = static_cast<wl_compositor *>(
803+
wl_registry_bind(wayland_registry, wayland_compositor_name, &wl_compositor_interface, 1)
804+
);
805+
const auto wayland_surface = wl_compositor_create_surface(wayland_compositor);
806+
VkWaylandSurfaceCreateInfoKHR surfaceCreateInfo = {};
807+
surfaceCreateInfo.pNext = nullptr;
808+
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
809+
surfaceCreateInfo.display = wayland_display;
810+
surfaceCreateInfo.surface = wayland_surface;
811+
surfaceResult = vkCreateWaylandSurfaceKHR(vulkanContext.instance, &surfaceCreateInfo, nullptr, &vulkanContext.surface);
812+
}
794813
}
795814
#endif
796-
797815
#if defined(VK_USE_PLATFORM_XCB_KHR)
798816
if (surface_extension == VK_KHR_XCB_SURFACE_EXTENSION_NAME) {
817+
int xcb_screen_idx;
818+
const auto xcb_connection = xcb_connect(nullptr, &xcb_screen_idx);
819+
const auto xcb_setup = xcb_get_setup(xcb_connection);
820+
auto xcb_screen = xcb_setup_roots_iterator(xcb_setup);
821+
for (int i = 0; i < xcb_screen_idx; ++i) {
822+
xcb_screen_next(&xcb_screen);
823+
}
824+
const auto xcb_window = xcb_generate_id(xcb_connection);
825+
xcb_create_window(
826+
xcb_connection,
827+
xcb_screen.data->root_depth,
828+
xcb_window,
829+
xcb_screen.data->root,
830+
0, 0,
831+
800, 600, 0,
832+
XCB_WINDOW_CLASS_INPUT_OUTPUT,
833+
xcb_screen.data->root_visual,
834+
0, nullptr);
835+
799836
VkXcbSurfaceCreateInfoKHR surfaceCreateInfo = {};
800837
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
801-
surfaceCreateInfo.connection = QX11Info::connection();
802-
surfaceCreateInfo.window = static_cast<xcb_window_t>(this->winId());
838+
surfaceCreateInfo.connection = xcb_connection;
839+
surfaceCreateInfo.window = xcb_window;
803840
surfaceResult = vkCreateXcbSurfaceKHR(vulkanContext.instance, &surfaceCreateInfo, nullptr, &vulkanContext.surface);
804841
}
805842
#endif

0 commit comments

Comments
 (0)