Skip to content

Commit 7dcae5f

Browse files
cube: Support runtime selection of WSI platform
By changing the selection of a WSI platform from a build time choice to a runtime choice, this allows the removal of vkcube-wayland as a separate binary. Use `--wsi <platform>` to choose the WSI platform that vkcube will render with. The chosen platform must be one that vkcube was compiled with support for, so directfb will be unavailable without changing the build parameters to enable it. These changes have been made to both vkcube and vkcubepp.
1 parent 4c63e84 commit 7dcae5f

File tree

9 files changed

+2121
-881
lines changed

9 files changed

+2121
-881
lines changed

.github/workflows/tools.yml

+5-15
Original file line numberDiff line numberDiff line change
@@ -38,26 +38,17 @@ jobs:
3838
cxx: [ g++ ]
3939
config: [ Debug, Release ]
4040
os: [ ubuntu-20.04, ubuntu-22.04 ]
41-
cube_wsi: [ XCB ]
4241
include:
43-
# Test WAYLAND
44-
- cc: gcc
45-
cxx: g++
46-
config: Release
47-
os: ubuntu-22.04
48-
cube_wsi: WAYLAND
49-
# Test clang on ubuntu 20 with XLIB
42+
# Test clang on ubuntu 20
5043
- cc: clang
5144
cxx: clang++
5245
config: Debug
5346
os: ubuntu-20.04
54-
cube_wsi: XLIB
55-
# Test clang on ubuntu 22 with the DISPLAY option
47+
# Test clang on ubuntu 22
5648
- cc: clang
5749
cxx: clang++
5850
config: Release
5951
os: ubuntu-22.04
60-
cube_wsi: DISPLAY
6152

6253

6354
steps:
@@ -67,19 +58,18 @@ jobs:
6758
python-version: '3.7'
6859
- run: |
6960
sudo apt-get -qq update
70-
sudo apt install libwayland-dev xorg-dev wayland-protocols
61+
sudo apt install --yes libwayland-dev xorg-dev wayland-protocols
7162
- uses: lukka/get-cmake@latest
7263
with:
7364
cmakeVersion: 3.17.2
7465
- name: Setup ccache
7566
uses: hendrikmuhs/ccache-action@v1.2
7667
with:
77-
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.cc }}-${{matrix.cube_wsi}}
68+
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.cc }}
7869
- name: Configure
7970
run: |
8071
cmake -S. -B build -G "Ninja" \
8172
-D CMAKE_BUILD_TYPE=${{matrix.config}} \
82-
-D CUBE_WSI_SELECTION=${{matrix.cube_wsi}} \
8373
-D UPDATE_DEPS=ON \
8474
-D BUILD_WERROR=ON \
8575
-D INSTALL_ICD=ON \
@@ -231,7 +221,7 @@ jobs:
231221
- uses: actions/setup-python@v5
232222
with:
233223
python-version: '3.10'
234-
- run: sudo apt-get -qq update && sudo apt install libwayland-dev xorg-dev wayland-protocols
224+
- run: sudo apt-get -qq update && sudo apt install --yes libwayland-dev xorg-dev wayland-protocols
235225
- run: cmake -S . -B build/ -D UPDATE_DEPS=ON -D UPDATE_DEPS_DIR=external -D TOOLS_CODEGEN=ON
236226
- run: cmake --build build --target tools_codegen
237227
- run: git diff --exit-code

cube/CMakeLists.txt

+110-93
Original file line numberDiff line numberDiff line change
@@ -61,32 +61,52 @@ if(APPLE)
6161
endif()
6262
endif()
6363

64+
option(BUILD_WSI_DISPLAY_SUPPORT "Build DISPLAY WSI support" ON)
65+
6466
if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
6567
option(BUILD_WSI_XCB_SUPPORT "Build XCB WSI support" ON)
6668
option(BUILD_WSI_XLIB_SUPPORT "Build Xlib WSI support" ON)
6769
option(BUILD_WSI_WAYLAND_SUPPORT "Build Wayland WSI support" ON)
6870
option(BUILD_WSI_DIRECTFB_SUPPORT "Build DirectFB WSI support" OFF)
69-
set(CUBE_WSI_SELECTION "XCB" CACHE STRING "Select WSI target for vkcube (XCB, XLIB, WAYLAND, DIRECTFB, DISPLAY)")
7071

7172
find_package(PkgConfig REQUIRED QUIET) # Use PkgConfig to find Linux system libraries
7273

7374
if(BUILD_WSI_XCB_SUPPORT)
7475
pkg_check_modules(XCB REQUIRED QUIET IMPORTED_TARGET xcb)
76+
pkg_get_variable(XCB_INCLUDE_DIRS xcb includedir)
77+
message(DEBUG "XCB_INCLUDE_DIRS = ${XCB_INCLUDE_DIRS}")
7578
endif()
7679

7780
if(BUILD_WSI_XLIB_SUPPORT)
7881
pkg_check_modules(X11 REQUIRED QUIET IMPORTED_TARGET x11)
82+
pkg_get_variable(XLIB_INCLUDE_DIRS x11 includedir)
83+
message(DEBUG "XLIB_INCLUDE_DIRS = ${XLIB_INCLUDE_DIRS}")
7984
endif()
8085

8186
if(BUILD_WSI_WAYLAND_SUPPORT)
8287
pkg_check_modules(WAYLAND_CLIENT REQUIRED IMPORTED_TARGET wayland-client)
88+
pkg_get_variable(WAYLAND_INCLUDE_DIRS wayland-client includedir)
8389

8490
pkg_get_variable(WAYLAND_SCANNER_EXECUTABLE wayland-scanner wayland_scanner)
85-
message(STATUS "WAYLAND_SCANNER_EXECUTABLE = ${WAYLAND_SCANNER_EXECUTABLE}")
91+
message(DEBUG "WAYLAND_SCANNER_EXECUTABLE = ${WAYLAND_SCANNER_EXECUTABLE}")
92+
93+
pkg_get_variable(WAYLAND_CLIENT_PATH wayland-client pkgdatadir)
94+
message(DEBUG "WAYLAND_CLIENT_PATH = ${WAYLAND_CLIENT_PATH}")
95+
set(WAYLAND_CODE_PROTOCOL ${WAYLAND_CLIENT_PATH}/wayland.xml)
8696

8797
pkg_get_variable(WAYLAND_PROTOCOLS_PATH wayland-protocols pkgdatadir)
88-
message(STATUS "WAYLAND_PROTOCOLS_PATH = ${WAYLAND_PROTOCOLS_PATH}")
98+
message(DEBUG "WAYLAND_PROTOCOLS_PATH = ${WAYLAND_PROTOCOLS_PATH}")
8999
set(XDG_SHELL_PROTOCOL ${WAYLAND_PROTOCOLS_PATH}/stable/xdg-shell/xdg-shell.xml)
100+
101+
add_custom_command(COMMENT "Generating wayland client protocol dispatch data"
102+
OUTPUT wayland-client.c
103+
COMMAND ${WAYLAND_SCANNER_EXECUTABLE}
104+
private-code
105+
${WAYLAND_CODE_PROTOCOL}
106+
${CMAKE_CURRENT_BINARY_DIR}/wayland-client.c
107+
MAIN_DEPENDENCY ${WAYLAND_CODE_PROTOCOL}
108+
DEPENDS ${WAYLAND_CODE_PROTOCOL} ${WAYLAND_SCANNER_EXECUTABLE})
109+
90110
add_custom_command(COMMENT "Generating xdg-shell protocol dispatch data"
91111
OUTPUT xdg-shell-code.c
92112
COMMAND ${WAYLAND_SCANNER_EXECUTABLE}
@@ -121,66 +141,52 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
121141
${CMAKE_CURRENT_BINARY_DIR}/xdg-decoration-client-header.h
122142
MAIN_DEPENDENCY ${XDG_DECORATION_PROTOCOL}
123143
DEPENDS ${XDG_DECORATION_PROTOCOL} ${WAYLAND_SCANNER_EXECUTABLE})
144+
145+
set(WAYLAND_ADDITIONAL_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/wayland-client.c
146+
${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-code.c
147+
${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-header.h
148+
${CMAKE_CURRENT_BINARY_DIR}/xdg-decoration-code.c
149+
${CMAKE_CURRENT_BINARY_DIR}/xdg-decoration-client-header.h)
124150
endif()
125151

126152
if(BUILD_WSI_DIRECTFB_SUPPORT)
127153
pkg_check_modules(DirectFB REQUIRED QUIET IMPORTED_TARGET directfb)
128154
endif()
129155
endif()
130156

157+
if(BUILD_WSI_DISPLAY_SUPPORT)
158+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_DISPLAY_KHR)
159+
endif()
160+
131161
if(WIN32)
132-
add_definitions(-DVK_USE_PLATFORM_WIN32_KHR -DWIN32_LEAN_AND_MEAN -DNOMINMAX)
162+
add_definitions(-DWIN32_LEAN_AND_MEAN -DNOMINMAX)
163+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_WIN32_KHR)
133164
elseif(ANDROID)
134-
add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR)
165+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_ANDROID_KHR)
135166
elseif(APPLE)
136-
add_definitions(-DVK_USE_PLATFORM_METAL_EXT)
167+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_METAL_EXT)
137168
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
138-
if(NOT CUBE_WSI_SELECTION)
139-
set(CUBE_WSI_SELECTION "XCB")
169+
if(BUILD_WSI_XCB_SUPPORT)
170+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_XCB_KHR)
140171
endif()
141-
142-
if(CUBE_WSI_SELECTION STREQUAL "XCB")
143-
if(NOT BUILD_WSI_XCB_SUPPORT)
144-
message(FATAL_ERROR "Selected XCB for vkcube build but not building Xcb support")
145-
endif()
146-
link_libraries(PkgConfig::XCB)
147-
set(CUBE_PLATFORM VK_USE_PLATFORM_XCB_KHR)
148-
elseif(CUBE_WSI_SELECTION STREQUAL "XLIB")
149-
if(NOT BUILD_WSI_XLIB_SUPPORT)
150-
message(FATAL_ERROR "Selected XLIB for vkcube build but not building Xlib support")
151-
endif()
152-
link_libraries(PkgConfig::X11)
153-
set(CUBE_PLATFORM VK_USE_PLATFORM_XLIB_KHR)
154-
elseif(CUBE_WSI_SELECTION STREQUAL "WAYLAND")
155-
if(NOT BUILD_WSI_WAYLAND_SUPPORT)
156-
message(FATAL_ERROR "Selected Wayland for vkcube build but not building Wayland support")
157-
endif()
158-
link_libraries(PkgConfig::WAYLAND_CLIENT)
159-
set(CUBE_PLATFORM VK_USE_PLATFORM_WAYLAND_KHR)
160-
set(XDG_SHELL_PROTOCOL ${WAYLAND_PROTOCOLS_PATH}/stable/xdg-shell/xdg-shell.xml)
161-
set(OPTIONAL_WAYLAND_DATA_FILES
162-
${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-code.c
163-
${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-header.h
164-
${CMAKE_CURRENT_BINARY_DIR}/xdg-decoration-code.c
165-
${CMAKE_CURRENT_BINARY_DIR}/xdg-decoration-client-header.h)
166-
include_directories(${CMAKE_CURRENT_BINARY_DIR})
167-
elseif(CUBE_WSI_SELECTION STREQUAL "DIRECTFB")
168-
if(NOT BUILD_WSI_DIRECTFB_SUPPORT)
169-
message(FATAL_ERROR "Selected DIRECTFB for vkcube build but not building DirectFB support")
170-
endif()
171-
link_libraries(PkgConfig::DirectFB)
172-
set(CUBE_PLATFORM VK_USE_PLATFORM_DIRECTFB_EXT)
173-
elseif(CUBE_WSI_SELECTION STREQUAL "DISPLAY")
174-
set(CUBE_PLATFORM VK_USE_PLATFORM_DISPLAY_KHR)
175-
else()
176-
message(FATAL_ERROR "Unrecognized value for CUBE_WSI_SELECTION: ${CUBE_WSI_SELECTION}")
172+
if(BUILD_WSI_XLIB_SUPPORT)
173+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_XLIB_KHR)
174+
endif()
175+
if(BUILD_WSI_WAYLAND_SUPPORT)
176+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_WAYLAND_KHR)
177+
endif()
178+
if(BUILD_WSI_DIRECTFB_SUPPORT)
179+
list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_DIRECTFB_EXT)
177180
endif()
178-
179181
link_libraries(${API_LOWERCASE} m)
180182
else()
181183
message(FATAL_ERROR "Unsupported Platform!")
182184
endif()
183185

186+
if(NOT DEFINED ENABLED_CUBE_PLATFORMS)
187+
message(FATAL_ERROR "There are no supported WSI platforms on this system, vkcube requires a WSI platform be available to be able to render its output")
188+
endif()
189+
184190
if (COMPILE_CUBE_SHADERS)
185191
# Try to find glslang in system paths or in an SDK if the VULKAN_SDK env-var is set
186192
find_program(GLSLANG_VALIDATOR names glslang glslangValidator HINTS $ENV{GLSLANG_INSTALL_DIR} $ENV{VULKAN_SDK}/bin $ENV{VULKAN_SDK}/Bin)
@@ -226,7 +232,6 @@ elseif (ANDROID)
226232

227233
add_subdirectory(android)
228234

229-
target_link_libraries(vkcube PRIVATE Vulkan::Headers volk::volk_headers)
230235
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
231236
add_executable(vkcube)
232237
target_sources(vkcube PRIVATE
@@ -235,15 +240,28 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
235240
${PROJECT_SOURCE_DIR}/cube/cube.frag
236241
cube.vert.inc
237242
cube.frag.inc
238-
${OPTIONAL_WAYLAND_DATA_FILES}
239243
)
240-
target_compile_definitions(vkcube PUBLIC ${CUBE_PLATFORM})
244+
target_link_libraries(vkcube PRIVATE Threads::Threads)
245+
if(BUILD_WSI_XCB_SUPPORT)
246+
target_sources(vkcube PRIVATE xcb_loader.h)
247+
target_include_directories(vkcube PRIVATE ${xcb_INCLUDE_DIRS})
248+
endif()
249+
if(BUILD_WSI_XLIB_SUPPORT)
250+
target_sources(vkcube PRIVATE xlib_loader.h)
251+
target_include_directories(vkcube PRIVATE ${XLIB_INCLUDE_DIRS})
252+
endif()
253+
if(BUILD_WSI_WAYLAND_SUPPORT)
254+
target_include_directories(vkcube PRIVATE ${WAYLAND_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
255+
target_sources(vkcube PRIVATE PRIVATE ${WAYLAND_ADDITIONAL_SOURCES})
256+
endif()
257+
if(BUILD_WSI_DIRECTFB_SUPPORT)
258+
target_link_libraries(vkcube PRIVATE PkgConfig::DirectFB)
259+
endif()
241260
include(CheckLibraryExists)
242261
CHECK_LIBRARY_EXISTS("rt" clock_gettime "" NEED_RT)
243262
if (NEED_RT)
244263
target_link_libraries(vkcube PRIVATE rt)
245264
endif()
246-
target_link_libraries(vkcube PRIVATE Vulkan::Headers volk::volk_headers Threads::Threads)
247265
elseif(WIN32)
248266
add_executable(vkcube WIN32)
249267
target_sources(vkcube PRIVATE
@@ -253,12 +271,13 @@ elseif(WIN32)
253271
cube.vert.inc
254272
cube.frag.inc
255273
)
256-
target_link_libraries(vkcube PRIVATE Vulkan::Headers volk::volk_headers)
257274
else()
258275
message(FATAL_ERROR "Unsupported Platform!")
259276
endif()
260277

278+
target_compile_definitions(vkcube PRIVATE ${ENABLED_CUBE_PLATFORMS})
261279
target_include_directories(vkcube PRIVATE .)
280+
target_link_libraries(vkcube PRIVATE Vulkan::Headers volk::volk_headers)
262281

263282
if (ANDROID)
264283
install(TARGETS vkcube DESTINATION ${CMAKE_INSTALL_LIBDIR})
@@ -280,6 +299,16 @@ if (ANDROID)
280299
return()
281300
endif()
282301

302+
if (XCB_LINK_LIBRARIES)
303+
target_compile_definitions(vkcube PRIVATE "XCB_LIBRARY=\"${XCB_LINK_LIBRARIES}\"")
304+
endif()
305+
if (X11_LINK_LIBRARIES)
306+
target_compile_definitions(vkcube PRIVATE "XLIB_LIBRARY=\"${X11_LINK_LIBRARIES}\"")
307+
endif()
308+
if (WAYLAND_CLIENT_LINK_LIBRARIES)
309+
target_compile_definitions(vkcube PRIVATE "WAYLAND_LIBRARY=\"${WAYLAND_CLIENT_LINK_LIBRARIES}\"")
310+
endif()
311+
283312
# ----------------------------------------------------------------------------
284313
# vkcubepp
285314

@@ -291,10 +320,24 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
291320
${PROJECT_SOURCE_DIR}/cube/cube.vert
292321
${PROJECT_SOURCE_DIR}/cube/cube.frag
293322
cube.vert.inc
294-
cube.frag.inc
295-
${OPTIONAL_WAYLAND_DATA_FILES})
296-
target_link_libraries(vkcubepp Vulkan::Headers volk::volk_headers Threads::Threads)
297-
target_compile_definitions(vkcubepp PUBLIC ${CUBE_PLATFORM})
323+
cube.frag.inc)
324+
target_link_libraries(vkcubepp PRIVATE Threads::Threads)
325+
326+
if(BUILD_WSI_XCB_SUPPORT)
327+
target_sources(vkcubepp PRIVATE xcb_loader.h)
328+
target_include_directories(vkcubepp PRIVATE ${xcb_INCLUDE_DIRS})
329+
endif()
330+
if(BUILD_WSI_XLIB_SUPPORT)
331+
target_sources(vkcubepp PRIVATE xlib_loader.h)
332+
target_include_directories(vkcubepp PRIVATE ${XLIB_INCLUDE_DIRS})
333+
endif()
334+
if(BUILD_WSI_WAYLAND_SUPPORT)
335+
target_include_directories(vkcubepp PRIVATE ${WAYLAND_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
336+
target_sources(vkcubepp PRIVATE ${WAYLAND_ADDITIONAL_SOURCES})
337+
endif()
338+
if(BUILD_WSI_DIRECTFB_SUPPORT)
339+
target_link_libraries(vkcubepp PRIVATE PkgConfig::DirectFB)
340+
endif()
298341
else()
299342
add_executable(vkcubepp
300343
WIN32
@@ -303,9 +346,21 @@ else()
303346
${PROJECT_SOURCE_DIR}/cube/cube.frag
304347
cube.vert.inc
305348
cube.frag.inc)
306-
target_link_libraries(vkcubepp Vulkan::Headers volk::volk_headers)
307349
endif()
350+
308351
target_include_directories(vkcubepp PRIVATE .)
352+
target_compile_definitions(vkcubepp PRIVATE ${ENABLED_CUBE_PLATFORMS})
353+
target_link_libraries(vkcubepp PRIVATE Vulkan::Headers volk::volk_headers)
354+
355+
if (XCB_LINK_LIBRARIES )
356+
target_compile_definitions(vkcubepp PUBLIC "XCB_LIBRARY=\"${XCB_LINK_LIBRARIES}\"")
357+
endif()
358+
if (X11_LINK_LIBRARIES)
359+
target_compile_definitions(vkcubepp PUBLIC "XLIB_LIBRARY=\"${X11_LINK_LIBRARIES}\"")
360+
endif()
361+
if (WAYLAND_CLIENT_LINK_LIBRARIES)
362+
target_compile_definitions(vkcubepp PUBLIC "WAYLAND_LIBRARY=\"${WAYLAND_CLIENT_LINK_LIBRARIES}\"")
363+
endif()
309364

310365
if(APPLE)
311366
install(
@@ -320,41 +375,3 @@ if(APPLE)
320375
else()
321376
install(TARGETS vkcubepp)
322377
endif()
323-
324-
# ----------------------------------------------------------------------------
325-
# vkcube-wayland
326-
327-
if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD")
328-
if(BUILD_WSI_WAYLAND_SUPPORT AND EXISTS ${WAYLAND_PROTOCOLS_PATH}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml)
329-
add_executable(vkcube-wayland)
330-
331-
target_sources(vkcube-wayland PRIVATE
332-
cube.c
333-
${PROJECT_SOURCE_DIR}/cube/cube.vert
334-
${PROJECT_SOURCE_DIR}/cube/cube.frag
335-
cube.vert.inc
336-
cube.frag.inc
337-
${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-code.c
338-
${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-header.h
339-
${CMAKE_CURRENT_BINARY_DIR}/xdg-decoration-code.c
340-
${CMAKE_CURRENT_BINARY_DIR}/xdg-decoration-client-header.h
341-
)
342-
target_include_directories(vkcube-wayland PRIVATE
343-
${CMAKE_CURRENT_BINARY_DIR}
344-
.
345-
)
346-
target_link_libraries(vkcube-wayland PRIVATE
347-
Vulkan::Headers
348-
volk::volk_headers
349-
Threads::Threads
350-
PkgConfig::WAYLAND_CLIENT
351-
)
352-
target_compile_definitions(vkcube-wayland PRIVATE VK_USE_PLATFORM_WAYLAND_KHR)
353-
include(CheckLibraryExists)
354-
CHECK_LIBRARY_EXISTS("rt" clock_gettime "" NEED_RT)
355-
if (NEED_RT)
356-
target_link_libraries(vkcube-wayland PRIVATE rt)
357-
endif()
358-
install(TARGETS vkcube-wayland)
359-
endif()
360-
endif()

0 commit comments

Comments
 (0)