blob: 88a7e86e1b09249d4e381b69c06104da5f2da53b [file] [log] [blame]
Mike Schuchardt0c56b412019-04-18 08:55:13 -07001# Copyright (C) 2018-2019 The ANGLE Project Authors.
2# Copyright (C) 2019 LunarG, Inc.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# https://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16import("//build_overrides/vulkan_validation_layers.gni")
17
18# Fuchsia has non-upstream changes to the vulkan layers, so we don't want
19# to build it from upstream sources.
20assert(!is_fuchsia)
21
22vulkan_registry_script_files = [
23 "$vulkan_headers_dir/registry/cgenerator.py",
24 "$vulkan_headers_dir/registry/conventions.py",
25 "$vulkan_headers_dir/registry/generator.py",
26 "$vulkan_headers_dir/registry/reg.py",
27 "$vulkan_headers_dir/registry/vkconventions.py",
28 "$vulkan_headers_dir/registry/vk.xml",
29]
30
31vulkan_undefine_configs = []
32if (is_win) {
33 vulkan_undefine_configs += [
34 "//build/config/win:nominmax",
35 "//build/config/win:unicode",
36 ]
37}
38
39raw_vulkan_headers_dir = rebase_path("$vulkan_headers_dir", root_build_dir)
40
41vulkan_gen_dir = "$target_gen_dir/$vulkan_gen_subdir"
42raw_vulkan_gen_dir = rebase_path(vulkan_gen_dir, root_build_dir)
43
44vulkan_data_dir = "$root_out_dir/$vulkan_data_subdir"
45raw_vulkan_data_dir = rebase_path(vulkan_data_dir, root_build_dir)
46
47raw_root_out_dir = rebase_path(root_out_dir, root_build_dir)
48
49# Vulkan helper scripts
50# ---------------------
51
52helper_script_and_deps = [
53 [
54 "vulkan_gen_dispatch_table_helper_h",
55 "vk_dispatch_table_helper.h",
56 "dispatch_table_helper_generator.py",
57 ],
58 [
59 "vulkan_gen_enum_string_helper",
60 "vk_enum_string_helper.h",
61 "helper_file_generator.py",
62 ],
63 [
64 "vulkan_gen_extension_helper",
65 "vk_extension_helper.h",
66 "helper_file_generator.py",
67 ],
68 [
69 "vulkan_gen_layer_dispatch_table_h",
70 "vk_layer_dispatch_table.h",
71 "layer_dispatch_table_generator.py",
72 ],
73 [
74 "vulkan_gen_object_types_h",
75 "vk_object_types.h",
76 "helper_file_generator.py",
77 ],
78 [
79 "vulkan_gen_safe_struct_cpp",
80 "vk_safe_struct.cpp",
81 "helper_file_generator.py",
82 ],
83 [
84 "vulkan_gen_safe_struct_h",
85 "vk_safe_struct.h",
86 "helper_file_generator.py",
87 ],
88 [
89 "vulkan_gen_thread_safety_h",
90 "thread_safety.h",
91 "thread_safety_generator.py",
92 ],
93 [
94 "vulkan_gen_thread_safety_cpp",
95 "thread_safety.cpp",
96 "thread_safety_generator.py",
97 ],
98 [
99 "vulkan_gen_typemap_helper",
100 "vk_typemap_helper.h",
101 "helper_file_generator.py",
102 ],
103 [
104 "vulkan_gen_object_tracker_h",
105 "object_tracker.h",
106 "object_tracker_generator.py",
107 ],
108 [
109 "vulkan_gen_object_tracker_cpp",
110 "object_tracker.cpp",
111 "object_tracker_generator.py",
112 ],
113 [
114 "vulkan_gen_parameter_validation_cpp",
115 "parameter_validation.cpp",
116 "parameter_validation_generator.py",
117 ],
118 [
119 "vulkan_gen_parameter_validation_h",
120 "parameter_validation.h",
121 "parameter_validation_generator.py",
122 ],
123 [
124 "vulkan_gen_layer_chassis_h",
125 "chassis.h",
126 "layer_chassis_generator.py",
127 ],
128 [
129 "vulkan_gen_layer_chassis_cpp",
130 "chassis.cpp",
131 "layer_chassis_generator.py",
132 ],
133 [
134 "vulkan_gen_layer_chassis_dispatch_h",
135 "layer_chassis_dispatch.h",
136 "layer_chassis_dispatch_generator.py",
137 ],
138 [
139 "vulkan_gen_layer_chassis_dispatch_cpp",
140 "layer_chassis_dispatch.cpp",
141 "layer_chassis_dispatch_generator.py",
142 ],
143]
144
145# Python scripts needed for codegen, copy them to a temp dir
146# so that all dependencies are together
147copy("python_gen_deps") {
148 sources = vulkan_registry_script_files + [
149 "scripts/common_codegen.py",
150 "scripts/dispatch_table_helper_generator.py",
151 "scripts/helper_file_generator.py",
152 "scripts/layer_dispatch_table_generator.py",
153 "scripts/lvl_genvk.py",
154 "scripts/object_tracker_generator.py",
155 "scripts/parameter_validation_generator.py",
156 "scripts/thread_safety_generator.py",
157 "scripts/layer_chassis_generator.py",
158 "scripts/layer_chassis_dispatch_generator.py",
159 ]
160 outputs = [
161 "$vulkan_gen_dir/{{source_file_part}}",
162 ]
163}
164
165# This special action is needed to remove previously-generated header files.
166# Otherwise the cpp files can pick up the old header files and cause build
167# failures.
168action("vulkan_clean_gen_headers") {
169 script = "build-gn/remove_files.py"
170 deps = [
171 ":python_gen_deps",
172 ]
173 outputs = [
174 "$vulkan_gen_dir/vk_validation_error_messages_h_is_removed",
175 ]
176 args = [
177 "$raw_vulkan_gen_dir/vk_validation_error_messages_h_is_removed",
178 "$raw_vulkan_gen_dir/vk_validation_error_messages.h",
179 ]
180}
181
182# This special action is needed to remove old VVL objects that are now renamed.
183action("vulkan_clean_old_validation_layer_objects") {
184 script = "build-gn/remove_files.py"
185
186 # inputs is a (random) new file since the vvl roll, used to ensure the cleanup is done only once
187 inputs = [
188 "layers/gpu_validation.cpp",
189 ]
190 outputs = [
191 "$vulkan_gen_dir/old_vvl_files_are_removed",
192 ]
193 args = [
194 "$raw_vulkan_gen_dir/old_vvl_files_are_removed",
195 "$raw_root_out_dir/libVkLayer*",
196 "$raw_root_out_dir/VkLayer*",
197 "$raw_vulkan_data_dir/VkLayer*.json",
198 ]
199}
200
201foreach(script_and_dep, helper_script_and_deps) {
202 target_name = script_and_dep[0]
203 file = script_and_dep[1]
204 dep = script_and_dep[2]
205 target("action", target_name) {
206 public_deps = [
207 ":python_gen_deps",
208 ":vulkan_clean_gen_headers",
209 ":vulkan_clean_old_validation_layer_objects",
210 ]
211 script = "$vulkan_gen_dir/lvl_genvk.py"
212 inputs = [
213 "$vulkan_gen_dir/$dep",
214 "$vulkan_gen_dir/common_codegen.py",
215 "layers/vk_validation_error_messages.h",
216 ]
217 outputs = [
218 "$vulkan_gen_dir/$file",
219 ]
220 args = [
221 "-o",
222 raw_vulkan_gen_dir,
223 "-registry",
224 "$raw_vulkan_headers_dir/registry/vk.xml",
225 "-scripts",
226 "$raw_vulkan_headers_dir/registry",
227 "$file",
228 "-quiet",
229 ]
230 }
231}
232
233raw_spirv_tools_dir = rebase_path("${spirv_tools_dir}", root_build_dir)
234
235spirv_git_is_present = exec_script("build-gn/commit_id.py",
236 [
237 "check",
238 raw_spirv_tools_dir,
239 ],
240 "value")
241
242# This could be generalized to a foreach if other revisions are added.
243action("spirv_tools_external_revision_generate") {
244 script = "scripts/external_revision_generator.py"
245 public_deps = [
246 "${spirv_tools_dir}:spvtools",
247 "${spirv_tools_dir}:spvtools_opt",
248 "${spirv_tools_dir}:spvtools_val",
249 ]
250 outputs = [
251 "$vulkan_gen_dir/spirv_tools_commit_id.h",
252 ]
253 args = [
254 "-s",
255 "SPIRV_TOOLS_COMMIT_ID",
256 "-o",
257 "$raw_vulkan_gen_dir/spirv_tools_commit_id.h",
258 ]
259 if (spirv_git_is_present == 1) {
260 args += [
261 "--git_dir",
262 "$raw_spirv_tools_dir",
263 ]
264 } else {
265 args += [ "--from_uuid" ]
266 }
267}
268
269config("vulkan_generated_files_config") {
270 include_dirs = [ vulkan_gen_dir ]
271}
272
273group("vulkan_generate_helper_files") {
274 public_deps = [
275 ":spirv_tools_external_revision_generate",
276 "$vulkan_headers_dir:vulkan_headers",
277 ]
278 public_configs = [ ":vulkan_generated_files_config" ]
279 foreach(script_and_dep, helper_script_and_deps) {
280 target_name = script_and_dep[0]
281 public_deps += [ ":$target_name" ]
282 }
283}
284
285config("vulkan_internal_config") {
286 defines = [
287 "VULKAN_NON_CMAKE_BUILD",
288 "API_NAME=\"Vulkan\"",
289 ]
290 if (is_clang || !is_win) {
291 cflags = [ "-Wno-unused-function" ]
292 }
293 if (is_linux) {
294 defines += [
295 "SYSCONFDIR=\"/etc\"",
296 "FALLBACK_CONFIG_DIRS=\"/etc/xdg\"",
297 "FALLBACK_DATA_DIRS=\"/usr/local/share:/usr/share\"",
298 ]
299 }
300}
301
302# The validation layers
303# ---------------------
304
305config("vulkan_layer_config") {
306 include_dirs = [ "layers" ]
307}
308
309core_validation_sources = [
310 # This file is manually included in the layer
311 # "$vulkan_gen_dir/vk_safe_struct.cpp",
312 "$vulkan_gen_dir/vk_safe_struct.h",
313 "layers/buffer_validation.cpp",
314 "layers/buffer_validation.h",
315 "layers/core_validation.cpp",
316 "layers/core_validation.h",
317 "layers/convert_to_renderpass2.cpp",
318 "layers/descriptor_sets.cpp",
319 "layers/descriptor_sets.h",
320 "layers/drawdispatch.cpp",
321 "layers/gpu_validation.cpp",
322 "layers/gpu_validation.h",
323 "layers/shader_validation.cpp",
324 "layers/shader_validation.h",
325 "layers/xxhash.c",
326 "layers/xxhash.h",
327]
328
329object_lifetimes_sources = [
330 "$vulkan_gen_dir/object_tracker.cpp",
331 "$vulkan_gen_dir/object_tracker.h",
332 "layers/object_tracker_utils.cpp",
333]
334
335stateless_validation_sources = [
336 "$vulkan_gen_dir/parameter_validation.cpp",
337 "$vulkan_gen_dir/parameter_validation.h",
338 "layers/parameter_validation_utils.cpp",
339]
340
341thread_safety_sources = [
342 "$vulkan_gen_dir/thread_safety.cpp",
343 "$vulkan_gen_dir/thread_safety.h",
344]
345
346unique_objects_sources = []
347
348chassis_sources = [
349 "$vulkan_gen_dir/chassis.cpp",
350 "$vulkan_gen_dir/chassis.h",
351 "$vulkan_gen_dir/layer_chassis_dispatch.cpp",
352 "$vulkan_gen_dir/layer_chassis_dispatch.h",
353]
354
355core_validation_deps = [ ":vulkan_core_validation_glslang" ]
356
357object_lifetimes_deps = [
358 ":vulkan_gen_object_tracker_cpp",
359 ":vulkan_gen_object_tracker_h",
360]
361
362stateless_validation_deps = [ ":vulkan_gen_stateless_validation" ]
363
364thread_safety_deps = [
365 ":vulkan_gen_thread_safety_cpp",
366 ":vulkan_gen_thread_safety_h",
367]
368
369unique_objects_deps = []
370
371chassis_deps = [
372 ":vulkan_gen_layer_chassis_cpp",
373 ":vulkan_gen_layer_chassis_h",
374 ":vulkan_gen_layer_chassis_dispatch_cpp",
375 ":vulkan_gen_layer_chassis_dispatch_h",
376]
377
378layers = [
379 [
380 "core_validation",
381 core_validation_sources + chassis_sources,
382 core_validation_deps + chassis_deps,
383 [ "BUILD_CORE_VALIDATION" ],
384 ],
385 [
386 "object_lifetimes",
387 object_lifetimes_sources + chassis_sources,
388 object_lifetimes_deps + chassis_deps,
389 [ "BUILD_OBJECT_TRACKER" ],
390 ],
391 [
392 "stateless_validation",
393 stateless_validation_sources + chassis_sources,
394 stateless_validation_deps + chassis_deps,
395 [ "BUILD_PARAMETER_VALIDATION" ],
396 ],
397 [
398 "thread_safety",
399 thread_safety_sources + chassis_sources,
400 thread_safety_deps + chassis_deps,
401 [ "BUILD_THREAD_SAFETY" ],
402 ],
403 [
404 "unique_objects",
405 unique_objects_sources + chassis_sources,
406 unique_objects_deps + chassis_deps,
407 [ "LAYER_CHASSIS_CAN_WRAP_HANDLES" ],
408 ],
409 [
410 "khronos_validation",
411 core_validation_sources + object_lifetimes_sources +
412 stateless_validation_sources + thread_safety_sources +
413 unique_objects_sources + chassis_sources,
414 core_validation_deps + object_lifetimes_deps + stateless_validation_deps +
415 thread_safety_deps + unique_objects_deps + chassis_deps,
416 [
417 "BUILD_KHRONOS_VALIDATION",
418 "BUILD_CORE_VALIDATION",
419 "BUILD_OBJECT_TRACKER",
420 "BUILD_THREAD_SAFETY",
421 "BUILD_PARAMETER_VALIDATION",
422 "LAYER_CHASSIS_CAN_WRAP_HANDLES",
423 ],
424 ],
425]
426
427if (!is_android) {
428 action("vulkan_gen_json_files") {
429 script = "build-gn/generate_vulkan_layers_json.py"
430 public_deps = [
431 ":vulkan_clean_old_validation_layer_objects",
432 ]
433 json_names = [
434 "VkLayer_core_validation.json",
435 "VkLayer_object_lifetimes.json",
436 "VkLayer_stateless_validation.json",
437 "VkLayer_standard_validation.json",
438 "VkLayer_thread_safety.json",
439 "VkLayer_unique_objects.json",
440 "VkLayer_khronos_validation.json",
441 ]
442 sources = [
443 "$vulkan_headers_dir/include/vulkan/vulkan_core.h",
444 ]
445 outputs = []
446 foreach(json_name, json_names) {
447 sources += [ "layers/json/$json_name.in" ]
448 outputs += [ "$vulkan_data_dir/$json_name" ]
449 }
450 args = [
451 rebase_path("layers/json", root_build_dir),
452 rebase_path(vulkan_data_dir, root_build_dir),
453 ] + rebase_path(sources, root_build_dir)
454
455 # The layer JSON files are part of the necessary data deps.
456 data = outputs
457 }
458}
459
460source_set("vulkan_layer_utils") {
461 sources = [
462 "layers/vk_format_utils.cpp",
463 "layers/vk_format_utils.h",
464 "layers/vk_layer_config.cpp",
465 "layers/vk_layer_config.h",
466 "layers/vk_layer_extension_utils.cpp",
467 "layers/vk_layer_extension_utils.h",
468 "layers/vk_layer_utils.cpp",
469 "layers/vk_layer_utils.h",
470 ]
471 public_configs = [
472 "$vulkan_headers_dir:vulkan_headers_config",
473 ":vulkan_internal_config",
474 ]
475 configs -= [ "//build/config/compiler:chromium_code" ]
476 configs += [ "//build/config/compiler:no_chromium_code" ]
477 public_deps = [
478 ":vulkan_generate_helper_files",
479 ]
480 configs -= vulkan_undefine_configs
481}
482
483config("vulkan_core_validation_config") {
484 include_dirs = [ "$glslang_dir" ]
485}
486
487source_set("vulkan_core_validation_glslang") {
488 public_deps = [
489 "${spirv_tools_dir}:spvtools",
490 "${spirv_tools_dir}:spvtools_opt",
491 "${spirv_tools_dir}:spvtools_val",
492 ]
493 public_configs = [
494 "$vulkan_headers_dir:vulkan_headers_config",
495 ":vulkan_core_validation_config",
496 ]
497}
498
499config("vulkan_stateless_validation_config") {
500 if (is_clang) {
501 cflags_cc = [ "-Wno-unused-const-variable" ]
502 }
503}
504
505source_set("vulkan_gen_stateless_validation") {
506 deps = [
507 ":vulkan_gen_parameter_validation_cpp",
508 ":vulkan_gen_parameter_validation_h",
509 ]
510 public_configs = [ ":vulkan_stateless_validation_config" ]
511}
512
513foreach(layer_info, layers) {
514 name = layer_info[0]
515 shared_library("VkLayer_$name") {
516 configs -= [ "//build/config/compiler:chromium_code" ]
517 configs += [ "//build/config/compiler:no_chromium_code" ]
518 configs -= vulkan_undefine_configs
519 public_configs = [ ":vulkan_layer_config" ]
520 deps = [
521 ":vulkan_layer_utils",
522 ]
523 if (layer_info[2] != "") {
524 deps += layer_info[2]
525 }
526 sources = layer_info[1]
527 if (is_win) {
528 sources += [ "layers/VkLayer_$name.def" ]
529 }
530 if (is_linux || is_android) {
531 ldflags = [ "-Wl,-Bsymbolic,--exclude-libs,ALL" ]
532 }
533 if (is_android) {
534 libs = [
535 "log",
536 "nativewindow",
537 ]
538 configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
539 }
540 defines = layer_info[3]
541 }
542}
543
544group("vulkan_validation_layers") {
545 data_deps = []
546 foreach(layer_info, layers) {
547 name = layer_info[0]
548 data_deps += [ ":VkLayer_$name" ]
549 }
550}