forked from KhronosGroup/Vulkan-ValidationLayers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
362 lines (332 loc) · 15.6 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# ~~~
# Copyright (c) 2014-2021 Valve Corporation
# Copyright (c) 2014-2021 LunarG, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ~~~
if(WIN32)
add_definitions(-DVK_USE_PLATFORM_WIN32_KHR -DVK_USE_PLATFORM_WIN32_KHX -DWIN32_LEAN_AND_MEAN)
add_custom_target(mk_layer_config_dir ALL
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
set_target_properties(mk_layer_config_dir PROPERTIES FOLDER ${LAYERS_HELPER_FOLDER})
elseif(ANDROID)
add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR -DVK_USE_PLATFORM_ANDROID_KHX)
elseif(APPLE)
add_definitions(-DVK_USE_PLATFORM_MACOS_MVK -DVK_USE_PLATFORM_METAL_EXT)
if(CMAKE_GENERATOR MATCHES "^Xcode.*")
add_custom_target(mk_layer_config_dir ALL
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
endif()
elseif(UNIX AND NOT APPLE) # i.e. Linux
if(BUILD_WSI_XCB_SUPPORT)
add_definitions(-DVK_USE_PLATFORM_XCB_KHR -DVK_USE_PLATFORM_XCB_KHX)
endif()
if(BUILD_WSI_XLIB_SUPPORT)
add_definitions(-DVK_USE_PLATFORM_XLIB_KHR -DVK_USE_PLATFORM_XLIB_KHX -DVK_USE_PLATFORM_XLIB_XRANDR_EXT)
endif()
if(BUILD_WSI_WAYLAND_SUPPORT)
add_definitions(-DVK_USE_PLATFORM_WAYLAND_KHR -DVK_USE_PLATFORM_WAYLAND_KHX)
endif()
else()
message(FATAL_ERROR "Unsupported Platform!")
endif()
# Configure installation of source files that are dependencies of other repos.
if(BUILD_LAYER_SUPPORT_FILES)
set(LAYER_UTIL_FILES
cast_utils.h
hash_util.h
hash_vk_types.h
vk_format_utils.h
vk_format_utils.cpp
vk_layer_config.h
vk_layer_config.cpp
vk_layer_data.h
vk_layer_extension_utils.h
vk_layer_extension_utils.cpp
vk_layer_logging.h
vk_layer_utils.h
vk_layer_utils.cpp
vk_loader_platform.h
xxhash.h
xxhash.c
generated/vk_validation_error_messages.h
generated/vk_layer_dispatch_table.h
generated/vk_dispatch_table_helper.h
generated/vk_safe_struct.h
generated/vk_safe_struct.cpp
generated/vk_enum_string_helper.h
generated/vk_object_types.h
generated/vk_extension_helper.h
generated/vk_typemap_helper.h)
install(FILES ${LAYER_UTIL_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/vulkan)
endif()
set(TARGET_NAMES
VkLayer_khronos_validation)
if(BUILD_LAYERS)
# Install the layer json files
if(WIN32)
if(CMAKE_GENERATOR MATCHES "^Visual Studio.*")
foreach(TARGET_NAME ${TARGET_NAMES})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${TARGET_NAME}.json DESTINATION ${CMAKE_INSTALL_LIBDIR})
endforeach()
else()
foreach(TARGET_NAME ${TARGET_NAMES})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.json DESTINATION ${CMAKE_INSTALL_LIBDIR})
endforeach()
endif()
elseif(UNIX) # UNIX includes APPLE
foreach(TARGET_NAME ${TARGET_NAMES})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/staging-json/${TARGET_NAME}.json
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/vulkan/explicit_layer.d)
endforeach()
endif()
endif()
# System-specific macros to create a library target.
if(WIN32)
macro(AddVkLayer target LAYER_COMPILE_DEFINITIONS)
file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/VkLayer_${target}.def DEF_FILE)
add_custom_target(copy-${target}-def-file ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DEF_FILE} VkLayer_${target}.def
VERBATIM)
set_target_properties(copy-${target}-def-file PROPERTIES FOLDER ${LAYERS_HELPER_FOLDER})
add_library(VkLayer_${target} SHARED ${ARGN} VkLayer_${target}.def)
set_target_properties(VkLayer_${target} PROPERTIES CXX_STANDARD ${VVL_CPP_STANDARD})
target_compile_definitions(VkLayer_${target} PUBLIC ${LAYER_COMPILE_DEFINITIONS} NOMINMAX)
target_link_libraries(VkLayer_${target} PRIVATE VkLayer_utils)
add_dependencies(VkLayer_${target} VkLayer_utils)
install(TARGETS VkLayer_${target} DESTINATION ${CMAKE_INSTALL_LIBDIR})
endmacro()
elseif(APPLE)
macro(AddVkLayer target LAYER_COMPILE_DEFINITIONS)
add_library(VkLayer_${target} SHARED ${ARGN})
set_target_properties(VkLayer_${target} PROPERTIES CXX_STANDARD ${VVL_CPP_STANDARD})
target_compile_definitions(VkLayer_${target} PUBLIC ${LAYER_COMPILE_DEFINITIONS})
target_link_libraries(VkLayer_${target} PRIVATE VkLayer_utils)
add_dependencies(VkLayer_${target} VkLayer_utils)
set_target_properties(VkLayer_${target}
PROPERTIES LINK_FLAGS
"-Wl"
INSTALL_RPATH
"@loader_path/")
install(TARGETS VkLayer_${target} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
endmacro()
else(UNIX AND NOT APPLE) # i.e.: Linux
macro(AddVkLayer target LAYER_COMPILE_DEFINITIONS)
add_library(VkLayer_${target} SHARED ${ARGN})
set_target_properties(VkLayer_${target} PROPERTIES CXX_STANDARD ${VVL_CPP_STANDARD})
target_compile_definitions(VkLayer_${target} PUBLIC ${LAYER_COMPILE_DEFINITIONS})
target_link_libraries(VkLayer_${target} PRIVATE VkLayer_utils)
add_dependencies(VkLayer_${target} VkLayer_utils)
set_target_properties(VkLayer_${target} PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libVkLayer_${target}.map,-Bsymbolic,--exclude-libs,ALL")
install(TARGETS VkLayer_${target} DESTINATION ${CMAKE_INSTALL_LIBDIR})
endmacro()
endif()
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/generated ${VulkanHeaders_INCLUDE_DIR})
if(MSVC)
# Applies to all configurations
add_definitions(-D_CRT_SECURE_NO_WARNINGS -DNOMINMAX)
# Avoid: fatal error C1128: number of sections exceeded object file format limit: compile with /bigobj
add_compile_options("/bigobj")
# Allow Windows to use multiprocessor compilation
add_compile_options(/MP)
# Turn off transitional "changed behavior" warning message for Visual Studio versions prior to 2015. The changed behavior is
# that constructor initializers are now fixed to clear the struct members.
add_compile_options("$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,19>>:/wd4351>")
else()
if(MINGW)
add_compile_options("-Wa,-mbig-obj")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpointer-arith -Wno-unused-function -Wno-sign-compare")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith -Wno-unused-function -Wno-sign-compare")
endif()
if(ANNOTATED_SPEC_LINK)
message("-- ANNOTATED_SPEC_LINK is ${ANNOTATED_SPEC_LINK}")
add_definitions(-DANNOTATED_SPEC_LINK=${ANNOTATED_SPEC_LINK})
endif()
# Clang warns about unused const variables. Generated files may purposely contain unused consts, so silence this warning in Clang
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set_source_files_properties(parameter_validation.cpp PROPERTIES COMPILE_FLAGS "-Wno-unused-const-variable")
endif()
set(CHASSIS_LIBRARY_FILES
generated/chassis.cpp
generated/layer_chassis_dispatch.cpp
generated/command_counter_helper.cpp
generated/vk_safe_struct.cpp
generated/vk_safe_struct.h
layer_options.cpp
state_tracker.cpp
state_tracker.h
image_layout_map.cpp
image_layout_map.h
range_vector.h
vk_layer_settings_ext.h
subresource_adapter.cpp
subresource_adapter.h
sync_utils.cpp
sync_utils.h)
set(CORE_VALIDATION_LIBRARY_FILES
core_validation.cpp
core_validation.h
core_validation_error_enums.h
core_error_location.h
core_error_location.cpp
core_validation_types.h
drawdispatch.cpp
convert_to_renderpass2.cpp
descriptor_sets.cpp
descriptor_sets.h
buffer_validation.cpp
buffer_validation.h
shader_validation.cpp
shader_validation.h
sync_vuid_maps.cpp
sync_vuid_maps.h
generated/spirv_validation_helper.cpp
generated/synchronization_validation_types.cpp
gpu_validation.cpp
generated/corechecks_optick_instrumentation.cpp
xxhash.c)
set(OBJECT_LIFETIMES_LIBRARY_FILES
generated/object_tracker.cpp
generated/object_tracker.h
object_tracker_utils.cpp
object_lifetime_validation.h)
set(THREAD_SAFETY_LIBRARY_FILES
generated/thread_safety.cpp
generated/thread_safety.h)
set(STATELESS_VALIDATION_LIBRARY_FILES
generated/parameter_validation.cpp
generated/parameter_validation.h
parameter_validation_utils.cpp
stateless_validation.h)
set(BEST_PRACTICES_LIBRARY_FILES
best_practices_utils.cpp
generated/best_practices.cpp
generated/best_practices.h
best_practices_validation.h
best_practices_error_enums.h)
set(GPU_ASSISTED_LIBRARY_FILES
gpu_validation.cpp
gpu_validation.h)
set(DEBUG_PRINTF_LIBRARY_FILES
debug_printf.cpp
debug_printf.h)
set(GPU_UTILITY_LIBRARY_FILES
gpu_utils.cpp
gpu_utils.h)
set(SYNC_VALIDATION_LIBRARY_FILES
synchronization_validation.cpp
synchronization_validation.h)
# Validation Layer performance instrumentation support using Optick.
# https://optick.dev/ https://github.com/bombomby/optick
# To include Optick instrumentation:
# 1) Download the Optick 1.3.1 release: https://github.com/bombomby/optick/releases/tag/1.3.1.0
# 2) Copy the files from the src directory to external/optick.
# 3) Run CMake configure with -DINSTRUMENT_OPTICK.
set(OPTICK_SOURCE_DIR "${PROJECT_SOURCE_DIR}/external/optick")
if(INSTRUMENT_OPTICK)
# Optick Instrumentation currently supported only on Microsoft toolchain.
if(MSVC)
if(IS_DIRECTORY "${OPTICK_SOURCE_DIR}")
file(GLOB OPTICK_SOURCE_FILES "${OPTICK_SOURCE_DIR}/*.*")
source_group("Optick Lib" FILES ${OPTICK_SOURCE_FILES})
# Disable GPU performance measurements (timestamp queries).
# Not needed for CPU Validation Layer measurements, but would be interesting to try someday.
# We'll need to map Vulkan API calls into the layer stack API entry points in order to build.
set(KHRONOS_LAYER_COMPILE_DEFINITIONS
-DINSTRUMENT_OPTICK
-DOPTICK_ENABLE_GPU_D3D12=0
-DOPTICK_ENABLE_GPU_VULKAN=0)
else()
message(WARNING "Optick sources not found at ${OPTICK_SOURCE_DIR} - continuing without instrumentation.")
set(INSTRUMENT_OPTICK OFF)
endif()
else()
message(WARNING "Optick instrumentation not supported on this platform - continuing without instrumentation.")
set(INSTRUMENT_OPTICK OFF)
endif()
endif()
if(BUILD_LAYERS)
AddVkLayer(khronos_validation "${KHRONOS_LAYER_COMPILE_DEFINITIONS}"
${CHASSIS_LIBRARY_FILES}
${CORE_VALIDATION_LIBRARY_FILES}
${OBJECT_LIFETIMES_LIBRARY_FILES}
${THREAD_SAFETY_LIBRARY_FILES}
${STATELESS_VALIDATION_LIBRARY_FILES}
${BEST_PRACTICES_LIBRARY_FILES}
${GPU_UTILITY_LIBRARY_FILES}
${GPU_ASSISTED_LIBRARY_FILES}
${DEBUG_PRINTF_LIBRARY_FILES}
${SYNC_VALIDATION_LIBRARY_FILES}
${OPTICK_SOURCE_FILES})
# Force generation of the PDB file for Release builds.
# Note that CMake reduces inlining optimization levels for RelWithDebInfo builds.
if(MSVC)
target_compile_options(VkLayer_khronos_validation PRIVATE "$<$<CONFIG:Release>:/Zi>")
# Need to use this instead of target_link_options() for older versions of CMake.
target_link_libraries(VkLayer_khronos_validation PRIVATE "$<$<CONFIG:Release>:-DEBUG:FULL>")
endif()
# Khronos validation additional dependencies
target_include_directories(VkLayer_khronos_validation PRIVATE ${GLSLANG_SPIRV_INCLUDE_DIR})
target_include_directories(VkLayer_khronos_validation PRIVATE ${SPIRV_TOOLS_INCLUDE_DIR})
target_include_directories(VkLayer_khronos_validation PRIVATE ${SPIRV_HEADERS_INCLUDE_DIR})
if(INSTRUMENT_OPTICK)
target_include_directories(VkLayer_khronos_validation PRIVATE ${OPTICK_SOURCE_DIR})
endif()
target_link_libraries(VkLayer_khronos_validation PRIVATE ${SPIRV_TOOLS_LIBRARIES})
# The output file needs Unix "/" separators or Windows "\" separators On top of that, Windows separators actually need to be doubled
# because the json format uses backslash escapes
file(TO_NATIVE_PATH "./" RELATIVE_PATH_PREFIX)
string(REPLACE "\\"
"\\\\"
RELATIVE_PATH_PREFIX
"${RELATIVE_PATH_PREFIX}")
# Run each .json.in file through the generator We need to create the generator.cmake script so that the generator can be run at
# compile time, instead of configure time Running at compile time lets us use cmake generator expressions (TARGET_FILE_NAME and
# TARGET_FILE_DIR, specifically)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/generator.cmake" "configure_file(\"\${INPUT_FILE}\" \"\${OUTPUT_FILE}\")")
foreach(TARGET_NAME ${TARGET_NAMES})
set(CONFIG_DEFINES -DINPUT_FILE="${CMAKE_CURRENT_SOURCE_DIR}/json/${TARGET_NAME}.json.in" -DVK_VERSION=1.2.${vk_header_version})
# If this json file is not a metalayer, get the needed properties from that target
if(TARGET ${TARGET_NAME})
set(CONFIG_DEFINES
${CONFIG_DEFINES}
-DOUTPUT_FILE="$<TARGET_FILE_DIR:${TARGET_NAME}>/${TARGET_NAME}.json"
-DRELATIVE_LAYER_BINARY="${RELATIVE_PATH_PREFIX}$<TARGET_FILE_NAME:${TARGET_NAME}>")
# If this json file is a metalayer, make the output path match core validation, and there is no layer binary file
else()
set(CONFIG_DEFINES ${CONFIG_DEFINES} -DOUTPUT_FILE="$<TARGET_FILE_DIR:VkLayer_khronos_validation>/${TARGET_NAME}.json")
endif()
add_custom_target(${TARGET_NAME}-json ALL
COMMAND ${CMAKE_COMMAND} ${CONFIG_DEFINES} -P "${CMAKE_CURRENT_BINARY_DIR}/generator.cmake")
if(CMAKE_GENERATOR MATCHES "^Visual Studio.*")
set_target_properties(${TARGET_NAME}-json PROPERTIES FOLDER ${LAYERS_HELPER_FOLDER})
endif()
endforeach()
# For UNIX-based systems, `library_path` should not contain a relative path (indicated by "./") before installing to system
# directories, so we do not include it in the staging-json files which are used for installation
if(UNIX)
foreach(TARGET_NAME ${TARGET_NAMES})
set(INSTALL_DEFINES
-DINPUT_FILE="${CMAKE_CURRENT_SOURCE_DIR}/json/${TARGET_NAME}.json.in"
-DOUTPUT_FILE="${CMAKE_CURRENT_BINARY_DIR}/staging-json/${TARGET_NAME}.json"
-DVK_VERSION=1.2.${vk_header_version})
# If this json file is not a metalayer, get the needed properties from that target
if(TARGET ${TARGET_NAME})
set(INSTALL_DEFINES ${INSTALL_DEFINES} -DRELATIVE_LAYER_BINARY="$<TARGET_FILE_NAME:${TARGET_NAME}>")
endif()
add_custom_target(${TARGET_NAME}-staging-json ALL
COMMAND ${CMAKE_COMMAND} ${INSTALL_DEFINES} -P "${CMAKE_CURRENT_BINARY_DIR}/generator.cmake")
endforeach()
endif()
endif()