@@ -61,32 +61,58 @@ if(APPLE)
61
61
endif ()
62
62
endif ()
63
63
64
+ if (ANDROID)
65
+ set (WSI_DISPLAY_DEFAULT_SETTING "OFF" )
66
+ else ()
67
+ set (WSI_DISPLAY_DEFAULT_SETTING "ON" )
68
+ endif ()
69
+
70
+ option (BUILD_WSI_DISPLAY_SUPPORT "Build DISPLAY WSI support" ${WSI_DISPLAY_DEFAULT_SETTING} )
71
+
64
72
if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU" )
65
73
option (BUILD_WSI_XCB_SUPPORT "Build XCB WSI support" ON )
66
74
option (BUILD_WSI_XLIB_SUPPORT "Build Xlib WSI support" ON )
67
75
option (BUILD_WSI_WAYLAND_SUPPORT "Build Wayland WSI support" ON )
68
76
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
77
71
78
find_package (PkgConfig REQUIRED QUIET ) # Use PkgConfig to find Linux system libraries
72
79
73
80
if (BUILD_WSI_XCB_SUPPORT)
74
81
pkg_check_modules(XCB REQUIRED QUIET IMPORTED_TARGET xcb)
82
+ pkg_get_variable(XCB_INCLUDE_DIRS xcb includedir)
83
+ message (DEBUG "XCB_INCLUDE_DIRS = ${XCB_INCLUDE_DIRS} " )
75
84
endif ()
76
85
77
86
if (BUILD_WSI_XLIB_SUPPORT)
78
87
pkg_check_modules(X11 REQUIRED QUIET IMPORTED_TARGET x11)
88
+ pkg_get_variable(XLIB_INCLUDE_DIRS x11 includedir)
89
+ message (DEBUG "XLIB_INCLUDE_DIRS = ${XLIB_INCLUDE_DIRS} " )
79
90
endif ()
80
91
81
92
if (BUILD_WSI_WAYLAND_SUPPORT)
82
93
pkg_check_modules(WAYLAND_CLIENT REQUIRED IMPORTED_TARGET wayland-client)
94
+ pkg_get_variable(WAYLAND_INCLUDE_DIRS wayland-client includedir)
83
95
84
96
pkg_get_variable(WAYLAND_SCANNER_EXECUTABLE wayland-scanner wayland_scanner)
85
- message (STATUS "WAYLAND_SCANNER_EXECUTABLE = ${WAYLAND_SCANNER_EXECUTABLE} " )
97
+ message (DEBUG "WAYLAND_SCANNER_EXECUTABLE = ${WAYLAND_SCANNER_EXECUTABLE} " )
98
+
99
+ pkg_get_variable(WAYLAND_CLIENT_PATH wayland-client pkgdatadir)
100
+ message (DEBUG "WAYLAND_CLIENT_PATH = ${WAYLAND_CLIENT_PATH} " )
101
+ set (WAYLAND_CODE_PROTOCOL ${WAYLAND_CLIENT_PATH} /wayland.xml)
86
102
87
103
pkg_get_variable(WAYLAND_PROTOCOLS_PATH wayland-protocols pkgdatadir)
88
- message (STATUS "WAYLAND_PROTOCOLS_PATH = ${WAYLAND_PROTOCOLS_PATH} " )
104
+ message (DEBUG "WAYLAND_PROTOCOLS_PATH = ${WAYLAND_PROTOCOLS_PATH} " )
89
105
set (XDG_SHELL_PROTOCOL ${WAYLAND_PROTOCOLS_PATH} /stable/xdg-shell/xdg-shell.xml)
106
+
107
+ add_custom_command (COMMENT "Generating wayland client protocol dispatch data"
108
+ OUTPUT wayland-client.c
109
+ COMMAND ${WAYLAND_SCANNER_EXECUTABLE}
110
+ private -code
111
+ ${WAYLAND_CODE_PROTOCOL}
112
+ ${CMAKE_CURRENT_BINARY_DIR} /wayland-client.c
113
+ MAIN_DEPENDENCY ${WAYLAND_CODE_PROTOCOL}
114
+ DEPENDS ${WAYLAND_CODE_PROTOCOL} ${WAYLAND_SCANNER_EXECUTABLE} )
115
+
90
116
add_custom_command (COMMENT "Generating xdg-shell protocol dispatch data"
91
117
OUTPUT xdg-shell-code.c
92
118
COMMAND ${WAYLAND_SCANNER_EXECUTABLE}
@@ -121,66 +147,52 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
121
147
${CMAKE_CURRENT_BINARY_DIR} /xdg-decoration-client-header.h
122
148
MAIN_DEPENDENCY ${XDG_DECORATION_PROTOCOL}
123
149
DEPENDS ${XDG_DECORATION_PROTOCOL} ${WAYLAND_SCANNER_EXECUTABLE} )
150
+
151
+ set (WAYLAND_ADDITIONAL_SOURCES ${CMAKE_CURRENT_BINARY_DIR} /wayland-client.c
152
+ ${CMAKE_CURRENT_BINARY_DIR} /xdg-shell-code.c
153
+ ${CMAKE_CURRENT_BINARY_DIR} /xdg-shell-client-header.h
154
+ ${CMAKE_CURRENT_BINARY_DIR} /xdg-decoration-code.c
155
+ ${CMAKE_CURRENT_BINARY_DIR} /xdg-decoration-client-header.h)
124
156
endif ()
125
157
126
158
if (BUILD_WSI_DIRECTFB_SUPPORT)
127
159
pkg_check_modules(DirectFB REQUIRED QUIET IMPORTED_TARGET directfb)
128
160
endif ()
129
161
endif ()
130
162
163
+ if (BUILD_WSI_DISPLAY_SUPPORT)
164
+ list (APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_DISPLAY_KHR)
165
+ endif ()
166
+
131
167
if (WIN32 )
132
- add_definitions (-DVK_USE_PLATFORM_WIN32_KHR -DWIN32_LEAN_AND_MEAN -DNOMINMAX)
168
+ add_definitions (-DWIN32_LEAN_AND_MEAN -DNOMINMAX)
169
+ list (APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_WIN32_KHR)
133
170
elseif (ANDROID)
134
- add_definitions (-DVK_USE_PLATFORM_ANDROID_KHR )
171
+ list ( APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_ANDROID_KHR )
135
172
elseif (APPLE )
136
- add_definitions (-DVK_USE_PLATFORM_METAL_EXT )
173
+ list ( APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_METAL_EXT )
137
174
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU" )
138
- if (NOT CUBE_WSI_SELECTION )
139
- set (CUBE_WSI_SELECTION "XCB" )
175
+ if (BUILD_WSI_XCB_SUPPORT )
176
+ list ( APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_XCB_KHR )
140
177
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} " )
178
+ if (BUILD_WSI_XLIB_SUPPORT)
179
+ list (APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_XLIB_KHR)
180
+ endif ()
181
+ if (BUILD_WSI_WAYLAND_SUPPORT)
182
+ list (APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_WAYLAND_KHR)
183
+ endif ()
184
+ if (BUILD_WSI_DIRECTFB_SUPPORT)
185
+ list (APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_DIRECTFB_EXT)
177
186
endif ()
178
-
179
187
link_libraries (${API_LOWERCASE} m)
180
188
else ()
181
189
message (FATAL_ERROR "Unsupported Platform!" )
182
190
endif ()
183
191
192
+ if (NOT DEFINED ENABLED_CUBE_PLATFORMS)
193
+ 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" )
194
+ endif ()
195
+
184
196
if (COMPILE_CUBE_SHADERS)
185
197
# Try to find glslang in system paths or in an SDK if the VULKAN_SDK env-var is set
186
198
find_program (GLSLANG_VALIDATOR names glslang glslangValidator HINTS $ENV{GLSLANG_INSTALL_DIR} $ENV{VULKAN_SDK} /bin $ENV{VULKAN_SDK} /Bin)
@@ -226,7 +238,6 @@ elseif (ANDROID)
226
238
227
239
add_subdirectory (android)
228
240
229
- target_link_libraries (vkcube PRIVATE Vulkan::Headers volk::volk_headers)
230
241
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU" )
231
242
add_executable (vkcube)
232
243
target_sources (vkcube PRIVATE
@@ -235,15 +246,28 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
235
246
${PROJECT_SOURCE_DIR} /cube/cube.frag
236
247
cube.vert.inc
237
248
cube.frag.inc
238
- ${OPTIONAL_WAYLAND_DATA_FILES}
239
249
)
240
- target_compile_definitions (vkcube PUBLIC ${CUBE_PLATFORM} )
250
+ target_link_libraries (vkcube Threads::Threads)
251
+ if (BUILD_WSI_XCB_SUPPORT)
252
+ target_sources (vkcube PRIVATE xcb_loader.h)
253
+ target_include_directories (vkcube PRIVATE ${xcb_INCLUDE_DIRS} )
254
+ endif ()
255
+ if (BUILD_WSI_XLIB_SUPPORT)
256
+ target_sources (vkcube PRIVATE xlib_loader.h)
257
+ target_include_directories (vkcube PRIVATE ${XLIB_INCLUDE_DIRS} )
258
+ endif ()
259
+ if (BUILD_WSI_WAYLAND_SUPPORT)
260
+ target_include_directories (vkcube PRIVATE ${WAYLAND_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} )
261
+ target_sources (vkcube PRIVATE PRIVATE ${WAYLAND_ADDITIONAL_SOURCES} )
262
+ endif ()
263
+ if (BUILD_WSI_DIRECTFB_SUPPORT)
264
+ target_link_libraries (vkcube PkgConfig::DirectFB)
265
+ endif ()
241
266
include (CheckLibraryExists)
242
267
CHECK_LIBRARY_EXISTS("rt" clock_gettime "" NEED_RT)
243
268
if (NEED_RT)
244
- target_link_libraries (vkcube PRIVATE rt)
269
+ target_link_libraries (vkcube rt)
245
270
endif ()
246
- target_link_libraries (vkcube PRIVATE Vulkan::Headers volk::volk_headers Threads::Threads)
247
271
elseif (WIN32 )
248
272
add_executable (vkcube WIN32 )
249
273
target_sources (vkcube PRIVATE
@@ -253,12 +277,13 @@ elseif(WIN32)
253
277
cube.vert.inc
254
278
cube.frag.inc
255
279
)
256
- target_link_libraries (vkcube PRIVATE Vulkan::Headers volk::volk_headers)
257
280
else ()
258
281
message (FATAL_ERROR "Unsupported Platform!" )
259
282
endif ()
260
283
284
+ target_compile_definitions (vkcube PRIVATE ${ENABLED_CUBE_PLATFORMS} )
261
285
target_include_directories (vkcube PRIVATE .)
286
+ target_link_libraries (vkcube Vulkan::Headers volk::volk_headers)
262
287
263
288
if (ANDROID)
264
289
install (TARGETS vkcube DESTINATION ${CMAKE_INSTALL_LIBDIR} )
@@ -280,6 +305,16 @@ if (ANDROID)
280
305
return ()
281
306
endif ()
282
307
308
+ if (XCB_LINK_LIBRARIES)
309
+ target_compile_definitions (vkcube PRIVATE "XCB_LIBRARY=\" ${XCB_LINK_LIBRARIES} \" " )
310
+ endif ()
311
+ if (X11_LINK_LIBRARIES)
312
+ target_compile_definitions (vkcube PRIVATE "XLIB_LIBRARY=\" ${X11_LINK_LIBRARIES} \" " )
313
+ endif ()
314
+ if (WAYLAND_CLIENT_LINK_LIBRARIES)
315
+ target_compile_definitions (vkcube PRIVATE "WAYLAND_LIBRARY=\" ${WAYLAND_CLIENT_LINK_LIBRARIES} \" " )
316
+ endif ()
317
+
283
318
# ----------------------------------------------------------------------------
284
319
# vkcubepp
285
320
@@ -291,10 +326,24 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU")
291
326
${PROJECT_SOURCE_DIR} /cube/cube.vert
292
327
${PROJECT_SOURCE_DIR} /cube/cube.frag
293
328
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} )
329
+ cube.frag.inc)
330
+ target_link_libraries (vkcubepp Threads::Threads)
331
+
332
+ if (BUILD_WSI_XCB_SUPPORT)
333
+ target_sources (vkcubepp PRIVATE xcb_loader.h)
334
+ target_include_directories (vkcubepp PRIVATE ${xcb_INCLUDE_DIRS} )
335
+ endif ()
336
+ if (BUILD_WSI_XLIB_SUPPORT)
337
+ target_sources (vkcubepp PRIVATE xlib_loader.h)
338
+ target_include_directories (vkcubepp PRIVATE ${XLIB_INCLUDE_DIRS} )
339
+ endif ()
340
+ if (BUILD_WSI_WAYLAND_SUPPORT)
341
+ target_include_directories (vkcubepp PRIVATE ${WAYLAND_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} )
342
+ target_sources (vkcubepp PRIVATE ${WAYLAND_ADDITIONAL_SOURCES} )
343
+ endif ()
344
+ if (BUILD_WSI_DIRECTFB_SUPPORT)
345
+ target_link_libraries (vkcubepp PkgConfig::DirectFB)
346
+ endif ()
298
347
else ()
299
348
add_executable (vkcubepp
300
349
WIN32
@@ -303,9 +352,21 @@ else()
303
352
${PROJECT_SOURCE_DIR} /cube/cube.frag
304
353
cube.vert.inc
305
354
cube.frag.inc)
306
- target_link_libraries (vkcubepp Vulkan::Headers volk::volk_headers)
307
355
endif ()
356
+
308
357
target_include_directories (vkcubepp PRIVATE .)
358
+ target_compile_definitions (vkcubepp PRIVATE ${ENABLED_CUBE_PLATFORMS} )
359
+ target_link_libraries (vkcubepp Vulkan::Headers volk::volk_headers)
360
+
361
+ if (XCB_LINK_LIBRARIES )
362
+ target_compile_definitions (vkcubepp PUBLIC "XCB_LIBRARY=\" ${XCB_LINK_LIBRARIES} \" " )
363
+ endif ()
364
+ if (X11_LINK_LIBRARIES)
365
+ target_compile_definitions (vkcubepp PUBLIC "XLIB_LIBRARY=\" ${X11_LINK_LIBRARIES} \" " )
366
+ endif ()
367
+ if (WAYLAND_CLIENT_LINK_LIBRARIES)
368
+ target_compile_definitions (vkcubepp PUBLIC "WAYLAND_LIBRARY=\" ${WAYLAND_CLIENT_LINK_LIBRARIES} \" " )
369
+ endif ()
309
370
310
371
if (APPLE )
311
372
install (
@@ -320,41 +381,3 @@ if(APPLE)
320
381
else ()
321
382
install (TARGETS vkcubepp)
322
383
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