@@ -61,32 +61,52 @@ if(APPLE)
61
61
endif ()
62
62
endif ()
63
63
64
+ option (BUILD_WSI_DISPLAY_SUPPORT "Build DISPLAY WSI support" ON )
65
+
64
66
if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU" )
65
67
option (BUILD_WSI_XCB_SUPPORT "Build XCB WSI support" ON )
66
68
option (BUILD_WSI_XLIB_SUPPORT "Build Xlib WSI support" ON )
67
69
option (BUILD_WSI_WAYLAND_SUPPORT "Build Wayland WSI support" ON )
68
70
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)" )
70
71
71
72
find_package (PkgConfig REQUIRED QUIET ) # Use PkgConfig to find Linux system libraries
72
73
73
74
if (BUILD_WSI_XCB_SUPPORT)
74
75
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} " )
75
78
endif ()
76
79
77
80
if (BUILD_WSI_XLIB_SUPPORT)
78
81
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} " )
79
84
endif ()
80
85
81
86
if (BUILD_WSI_WAYLAND_SUPPORT)
82
87
pkg_check_modules(WAYLAND_CLIENT REQUIRED IMPORTED_TARGET wayland-client)
88
+ pkg_get_variable(WAYLAND_INCLUDE_DIRS wayland-client includedir)
83
89
84
90
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)
86
96
87
97
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} " )
89
99
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
+
90
110
add_custom_command (COMMENT "Generating xdg-shell protocol dispatch data"
91
111
OUTPUT xdg-shell-code.c
92
112
COMMAND ${WAYLAND_SCANNER_EXECUTABLE}
@@ -121,66 +141,52 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
121
141
${CMAKE_CURRENT_BINARY_DIR} /xdg-decoration-client-header.h
122
142
MAIN_DEPENDENCY ${XDG_DECORATION_PROTOCOL}
123
143
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)
124
150
endif ()
125
151
126
152
if (BUILD_WSI_DIRECTFB_SUPPORT)
127
153
pkg_check_modules(DirectFB REQUIRED QUIET IMPORTED_TARGET directfb)
128
154
endif ()
129
155
endif ()
130
156
157
+ if (BUILD_WSI_DISPLAY_SUPPORT)
158
+ list (APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_DISPLAY_KHR)
159
+ endif ()
160
+
131
161
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)
133
164
elseif (ANDROID)
134
- add_definitions (-DVK_USE_PLATFORM_ANDROID_KHR )
165
+ list ( APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_ANDROID_KHR )
135
166
elseif (APPLE )
136
- add_definitions (-DVK_USE_PLATFORM_METAL_EXT )
167
+ list ( APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_METAL_EXT )
137
168
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 )
140
171
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)
177
180
endif ()
178
-
179
181
link_libraries (${API_LOWERCASE} m)
180
182
else ()
181
183
message (FATAL_ERROR "Unsupported Platform!" )
182
184
endif ()
183
185
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
+
184
190
if (COMPILE_CUBE_SHADERS)
185
191
# Try to find glslang in system paths or in an SDK if the VULKAN_SDK env-var is set
186
192
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)
226
232
227
233
add_subdirectory (android)
228
234
229
- target_link_libraries (vkcube PRIVATE Vulkan::Headers volk::volk_headers)
230
235
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU" )
231
236
add_executable (vkcube)
232
237
target_sources (vkcube PRIVATE
@@ -235,15 +240,28 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
235
240
${PROJECT_SOURCE_DIR} /cube/cube.frag
236
241
cube.vert.inc
237
242
cube.frag.inc
238
- ${OPTIONAL_WAYLAND_DATA_FILES}
239
243
)
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 ()
241
260
include (CheckLibraryExists)
242
261
CHECK_LIBRARY_EXISTS("rt" clock_gettime "" NEED_RT)
243
262
if (NEED_RT)
244
263
target_link_libraries (vkcube PRIVATE rt)
245
264
endif ()
246
- target_link_libraries (vkcube PRIVATE Vulkan::Headers volk::volk_headers Threads::Threads)
247
265
elseif (WIN32 )
248
266
add_executable (vkcube WIN32 )
249
267
target_sources (vkcube PRIVATE
@@ -253,12 +271,13 @@ elseif(WIN32)
253
271
cube.vert.inc
254
272
cube.frag.inc
255
273
)
256
- target_link_libraries (vkcube PRIVATE Vulkan::Headers volk::volk_headers)
257
274
else ()
258
275
message (FATAL_ERROR "Unsupported Platform!" )
259
276
endif ()
260
277
278
+ target_compile_definitions (vkcube PRIVATE ${ENABLED_CUBE_PLATFORMS} )
261
279
target_include_directories (vkcube PRIVATE .)
280
+ target_link_libraries (vkcube PRIVATE Vulkan::Headers volk::volk_headers)
262
281
263
282
if (ANDROID)
264
283
install (TARGETS vkcube DESTINATION ${CMAKE_INSTALL_LIBDIR} )
@@ -280,6 +299,16 @@ if (ANDROID)
280
299
return ()
281
300
endif ()
282
301
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
+
283
312
# ----------------------------------------------------------------------------
284
313
# vkcubepp
285
314
@@ -291,10 +320,24 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
291
320
${PROJECT_SOURCE_DIR} /cube/cube.vert
292
321
${PROJECT_SOURCE_DIR} /cube/cube.frag
293
322
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 ()
298
341
else ()
299
342
add_executable (vkcubepp
300
343
WIN32
@@ -303,9 +346,21 @@ else()
303
346
${PROJECT_SOURCE_DIR} /cube/cube.frag
304
347
cube.vert.inc
305
348
cube.frag.inc)
306
- target_link_libraries (vkcubepp Vulkan::Headers volk::volk_headers)
307
349
endif ()
350
+
308
351
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 ()
309
364
310
365
if (APPLE )
311
366
install (
@@ -320,41 +375,3 @@ if(APPLE)
320
375
else ()
321
376
install (TARGETS vkcubepp)
322
377
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