blob: 1400c483f2b5c9cfbb80691c636404db2e1e6b4c [file] [log] [blame]
# Copyright 2016 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# TODO(jmadill): Redo the file entirely when we have standalone GN ANGLE.
third_party_dir = "../../../../third_party"
glslang_dir = "$third_party_dir/glslang-angle/src"
spirv_headers_dir = "$third_party_dir/spirv-headers/src"
spirv_tools_dir = "$third_party_dir/spirv-tools-angle/src"
vulkan_layers_dir = "$third_party_dir/vulkan-validation-layers/src"
raw_vulkan_layers_dir = rebase_path(vulkan_layers_dir)
vulkan_gypi =
exec_script("//build/gypi_to_gn.py",
[
rebase_path("vulkan.gypi"),
"--replace=<(angle_gen_path)=$target_gen_dir/angle",
"--replace=<(spirv_headers_path)=../$spirv_headers_dir",
"--replace=<(spirv_tools_path)=../$spirv_tools_dir",
"--replace=<(vulkan_layers_path)=../$vulkan_layers_dir",
],
"scope",
[ "vulkan.gypi" ])
# Vulkan loader
# -------------
config("vulkan_loader_config") {
include_dirs = rebase_path(vulkan_gypi.vulkan_loader_include_dirs, ".", "src")
defines = [
"LAYERS_SOURCE_PATH=\"./gen/third_party/angle/src/vulkan_support/angle/vulkan/json\"",
"DEFAULT_VK_LAYERS_PATH=\".\"",
"API_NAME=\"Vulkan\"",
]
if (is_win) {
defines += [ "VK_USE_PLATFORM_WIN32_KHR" ]
}
}
config("vulkan_loader_internal_config") {
if (is_clang || !is_win) {
cflags = [ "-Wno-unused-function" ]
}
}
vulkan_undefine_configs = []
if (is_win) {
vulkan_undefine_configs += [
"//build/config/win:nominmax",
"//build/config/win:unicode",
]
}
static_library("vulkan_loader") {
sources = rebase_path(vulkan_gypi.vulkan_loader_sources, ".", "src")
if (is_win) {
sources += rebase_path(vulkan_gypi.vulkan_loader_win_sources, ".", "src")
if (!is_clang) {
cflags = vulkan_gypi.vulkan_loader_cflags_win
}
}
configs += [ ":vulkan_loader_internal_config" ]
public_configs = [ ":vulkan_loader_config" ]
configs -= vulkan_undefine_configs
}
# Vulkan layer helpers
# --------------------
vulkan_gen_dir = "$target_gen_dir/angle/vulkan"
raw_vulkan_gen_dir = rebase_path(vulkan_gen_dir)
source_set("vulkan_layer_utils") {
sources = rebase_path(vulkan_gypi.vulkan_layer_utils_sources, ".", "src")
public_configs = [
":vulkan_loader_config",
":vulkan_loader_internal_config",
]
configs -= vulkan_undefine_configs
}
action("vulkan_gen_dispatch_table_helper") {
script = "$vulkan_layers_dir/scripts/lvl_genvk.py"
inputs = [
"$vulkan_layers_dir/scripts/dispatch_table_generator.py",
"$vulkan_layers_dir/scripts/generator.py",
"$vulkan_layers_dir/scripts/reg.py",
"$vulkan_layers_dir/scripts/vk.xml",
"$vulkan_layers_dir/scripts/vulkan.py",
]
outputs = [
"$vulkan_gen_dir/vk_dispatch_table_helper.h",
]
args = [
"-o",
raw_vulkan_gen_dir,
"-registry",
"$raw_vulkan_layers_dir/scripts/vk.xml",
"vk_dispatch_table_helper.h",
"-quiet",
]
}
action("vulkan_gen_struct_wrappers") {
script = "$vulkan_layers_dir/scripts/vk_helper.py"
inputs = [
"$vulkan_layers_dir/include/vulkan/vulkan.h",
]
outputs = vulkan_gypi.vulkan_struct_wrappers_outputs
args = [
"--gen_struct_wrappers",
rebase_path(vulkan_layers_dir) + "/include/vulkan/vulkan.h",
"--abs_out_dir",
raw_vulkan_gen_dir,
"--quiet",
]
}
action("vulkan_gen_enum_string_helper") {
script = "$vulkan_layers_dir/scripts/vk_helper.py"
inputs = [
"$vulkan_layers_dir/include/vulkan/vulkan.h",
]
outputs = [
"$vulkan_gen_dir/vk_enum_string_helper.h",
]
args = [
"--gen_enum_string_helper",
rebase_path(vulkan_layers_dir) + "/include/vulkan/vulkan.h",
"--abs_out_dir",
raw_vulkan_gen_dir,
"--quiet",
]
}
config("vulkan_layer_config") {
include_dirs = [
vulkan_gen_dir,
"$vulkan_layers_dir/layers",
]
}
source_set("vulkan_layer_table") {
configs -= vulkan_undefine_configs
public_deps = [
":vulkan_gen_dispatch_table_helper",
":vulkan_gen_enum_string_helper",
":vulkan_gen_struct_wrappers",
":vulkan_layer_utils",
]
public_configs = [ ":vulkan_layer_config" ]
sources = [
"$target_gen_dir/angle/vulkan/vk_dispatch_table_helper.h",
"$target_gen_dir/angle/vulkan/vk_enum_string_helper.h",
"$vulkan_layers_dir/layers/vk_layer_table.cpp",
"$vulkan_layers_dir/layers/vk_layer_table.h",
]
}
layer_names = [
"core_validation",
"image",
"object_tracker",
"swapchain",
"threading",
"unique_objects",
"parameter_validation",
]
action("vulkan_gen_json_files") {
script = "$third_party_dir/angle/scripts/generate_vulkan_layers_json.py"
sources =
rebase_path(vulkan_gypi.vulkan_gen_json_files_sources_win, ".", "src")
# The layer JSON files are part of the necessary data deps.
data = rebase_path(vulkan_gypi.vulkan_gen_json_files_sources_win, ".", "src")
outputs = vulkan_gypi.vulkan_gen_json_files_outputs
args = [
"$raw_vulkan_layers_dir/layers/windows",
"$raw_vulkan_gen_dir/json",
rebase_path(root_build_dir),
]
}
# SPIRV-tools
# -----------
spirv_source_dir = "$spirv_tools_dir/source"
spirv_include_dir = "$spirv_headers_dir/include/spirv"
raw_spirv_source_dir = rebase_path(spirv_source_dir)
raw_spirv_include_dir = rebase_path(spirv_include_dir)
raw_spirv_headers_dir = rebase_path(spirv_headers_dir)
action("spirv_tools_gen_tables_1_0") {
script = "$spirv_tools_dir/utils/generate_grammar_tables.py"
sources = [
"$spirv_include_dir/1.0/extinst.glsl.std.450.grammar.json",
"$spirv_include_dir/1.0/spirv.core.grammar.json",
"$spirv_source_dir/extinst-1.0.opencl.std.grammar.json",
]
outputs = [
"$vulkan_gen_dir/core.insts-1.0.inc",
"$vulkan_gen_dir/glsl.std.450.insts-1.0.inc",
"$vulkan_gen_dir/opencl.std.insts-1.0.inc",
"$vulkan_gen_dir/operand.kinds-1.0.inc",
]
args = [
"--spirv-core-grammar=$raw_spirv_include_dir/1.0/spirv.core.grammar.json",
"--extinst-glsl-grammar=$raw_spirv_include_dir/1.0/extinst.glsl.std.450.grammar.json",
"--extinst-opencl-grammar=$raw_spirv_source_dir/extinst-1.0.opencl.std.grammar.json",
"--core-insts-output=$raw_vulkan_gen_dir/core.insts-1.0.inc",
"--glsl-insts-output=$raw_vulkan_gen_dir/glsl.std.450.insts-1.0.inc",
"--opencl-insts-output=$raw_vulkan_gen_dir/opencl.std.insts-1.0.inc",
"--operand-kinds-output=$raw_vulkan_gen_dir/operand.kinds-1.0.inc",
]
}
action("spirv_tools_gen_tables_1_1") {
script = "$spirv_tools_dir/utils/generate_grammar_tables.py"
sources = [
"$spirv_include_dir/1.1/spirv.core.grammar.json",
]
outputs = [
"$vulkan_gen_dir/core.insts-1.1.inc",
"$vulkan_gen_dir/operand.kinds-1.1.inc",
]
args = [
"--spirv-core-grammar=$raw_spirv_include_dir/1.1/spirv.core.grammar.json",
"--core-insts-output=$raw_vulkan_gen_dir/core.insts-1.1.inc",
"--operand-kinds-output=$raw_vulkan_gen_dir/operand.kinds-1.1.inc",
]
}
action("spirv_tools_gen_generators_inc") {
script = "$spirv_tools_dir/utils/generate_registry_tables.py"
sources = [
"$spirv_headers_dir/include/spirv/spir-v.xml",
]
outputs = [
"$vulkan_gen_dir/generators.inc",
]
args = [
"--xml=$raw_spirv_headers_dir/include/spirv/spir-v.xml",
"--generator-output=$raw_vulkan_gen_dir/generators.inc",
]
}
config("spirv_tools_config") {
include_dirs = [ "$spirv_tools_dir/include" ]
if (is_win) {
cflags = [
"/wd4706",
# These are triggered in higher optimization levels. Disable for now until
# fixes are landed upstream. See https://crbug.com/677837.
"/wd4701",
"/wd4703",
]
}
}
static_library("spirv_tools") {
deps = [
":spirv_tools_gen_generators_inc",
":spirv_tools_gen_tables_1_0",
":spirv_tools_gen_tables_1_1",
]
include_dirs = [
vulkan_gen_dir,
"$spirv_headers_dir/include",
"$spirv_tools_dir/source",
]
sources = rebase_path(vulkan_gypi.spirv_tools_sources, ".", "src")
public_configs = [ ":spirv_tools_config" ]
}
# The validation layers
# ---------------------
config("vulkan_core_validation_config") {
include_dirs = [ glslang_dir ]
}
source_set("vulkan_core_validation_glslang") {
public_deps = [
":spirv_tools",
]
public_configs = [ ":vulkan_core_validation_config" ]
}
vk_gen_layers = [
[
"threading",
"thread_check.h",
"threading_generator.py",
],
[
"parameter_validation",
"parameter_validation.h",
"parameter_validation_generator.py",
],
[
"unique_objects",
"unique_objects_wrappers.h",
"unique_objects_generator.py",
],
]
foreach(info, vk_gen_layers) {
layer = info[0]
header = info[1]
dep = info[2]
action("vulkan_gen_$layer") {
script = "$vulkan_layers_dir/scripts/lvl_genvk.py"
inputs = [
"$vulkan_layers_dir/scripts/generator.py",
"$vulkan_layers_dir/scripts/lvl_genvk.py",
"$vulkan_layers_dir/scripts/reg.py",
"$vulkan_layers_dir/scripts/vk.xml",
"$vulkan_layers_dir/scripts/$dep",
]
outputs = [
"$vulkan_gen_dir/$header",
]
args = [
"-o",
raw_vulkan_gen_dir,
"-registry",
"$raw_vulkan_layers_dir/scripts/vk.xml",
"$header",
"-quiet",
]
}
}
layer_indexes = [
0,
1,
2,
3,
4,
5,
6,
]
layer_sources = [
vulkan_gypi.VkLayer_core_validation_sources,
vulkan_gypi.VkLayer_image_sources,
vulkan_gypi.VkLayer_swapchain_sources,
vulkan_gypi.VkLayer_object_tracker_sources,
vulkan_gypi.VkLayer_unique_objects_sources,
vulkan_gypi.VkLayer_threading_sources,
vulkan_gypi.VkLayer_parameter_validation_sources,
]
layer_additional_deps = [
[ ":vulkan_core_validation_glslang" ],
[],
[],
[],
[ ":vulkan_gen_unique_objects" ],
[ ":vulkan_gen_threading" ],
[ ":vulkan_gen_parameter_validation" ],
]
foreach(index, layer_indexes) {
layer = layer_names[index]
shared_library("VkLayer_$layer") {
configs -= vulkan_undefine_configs
deps = [
":vulkan_layer_table",
]
deps += layer_additional_deps[index]
sources = rebase_path(layer_sources[index], ".", "src")
if (is_win) {
sources += [ "$vulkan_layers_dir/layers/VKLayer_$layer.def" ]
}
}
}
# Use this target to include everything ANGLE needs for Vulkan.
group("angle_vulkan") {
deps = [
":vulkan_loader",
]
data_deps = [
":vulkan_gen_json_files",
]
foreach(layer, layer_names) {
data_deps += [ ":VkLayer_$layer" ]
}
public_configs = [ ":vulkan_loader_config" ]
}