# 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=<(glslang_path)=../$glslang_dir",
                  "--replace=<(spirv_headers_path)=../$spirv_headers_dir",
                  "--replace=<(spirv_tools_path)=../$spirv_tools_dir",
                  "--replace=<(vulkan_layers_path)=../$vulkan_layers_dir",
                ],
                "scope",
                [ "vulkan.gypi" ])

# Subdirectory to place data files (e.g. layer JSON files).
data_dir = "angledata"

vulkan_gen_json_files_outputs = [
  "$root_out_dir/$data_dir/VkLayer_core_validation.json",
  "$root_out_dir/$data_dir/VkLayer_object_tracker.json",
  "$root_out_dir/$data_dir/VkLayer_parameter_validation.json",
  "$root_out_dir/$data_dir/VkLayer_swapchain.json",
  "$root_out_dir/$data_dir/VkLayer_threading.json",
  "$root_out_dir/$data_dir/VkLayer_unique_objects.json",
]

vulkan_undefine_configs = []
if (is_win) {
  vulkan_undefine_configs += [
    "//build/config/win:nominmax",
    "//build/config/win:unicode",
  ]
}

vulkan_gen_dir = "$target_gen_dir/angle/vulkan"
raw_vulkan_gen_dir = rebase_path(vulkan_gen_dir)

# Vulkan helper scripts
# ---------------------

helper_script_and_deps = [
  [
    "vulkan_gen_dispatch_table_helper_h",
    "vk_dispatch_table_helper.h",
    "dispatch_table_helper_generator.py",
  ],
  [
    "vulkan_gen_enum_string_helper",
    "vk_enum_string_helper.h",
    "helper_file_generator.py",
  ],
  [
    "vulkan_gen_layer_dispatch_table_h",
    "vk_layer_dispatch_table.h",
    "loader_extension_generator.py",
  ],
  [
    "vulkan_gen_loader_extensions_c",
    "vk_loader_extensions.c",
    "loader_extension_generator.py",
  ],
  [
    "vulkan_gen_loader_extensions_h",
    "vk_loader_extensions.h",
    "loader_extension_generator.py",
  ],
  [
    "vulkan_gen_safe_struct_cpp",
    "vk_safe_struct.cpp",
    "helper_file_generator.py",
  ],
  [
    "vulkan_gen_safe_struct_h",
    "vk_safe_struct.h",
    "helper_file_generator.py",
  ],
  [
    "vulkan_gen_struct_size_helper_c",
    "vk_struct_size_helper.c",
    "helper_file_generator.py",
  ],
  [
    "vulkan_gen_struct_size_helper_h",
    "vk_struct_size_helper.h",
    "helper_file_generator.py",
  ],
  [
    "vulkan_gen_thread_check_helper",
    "thread_check.h",
    "threading_generator.py",
  ],
  [
    "vulkan_gen_parameter_validation_helper",
    "parameter_validation.h",
    "parameter_validation_generator.py",
  ],
  [
    "vulkan_gen_unique_objects_wrappers_helper",
    "unique_objects_wrappers.h",
    "unique_objects_generator.py",
  ],
]

foreach(script_and_dep, helper_script_and_deps) {
  target_name = script_and_dep[0]
  file = script_and_dep[1]
  dep = script_and_dep[2]
  target("action", target_name) {
    script = "$vulkan_layers_dir/scripts/lvl_genvk.py"
    inputs = [
      "$vulkan_layers_dir/scripts/$dep",
      "$vulkan_layers_dir/scripts/generator.py",
      "$vulkan_layers_dir/scripts/reg.py",
      "$vulkan_layers_dir/scripts/vk.xml",
    ]
    outputs = [
      "$vulkan_gen_dir/$file",
    ]
    args = [
      "-o",
      raw_vulkan_gen_dir,
      "-registry",
      "$raw_vulkan_layers_dir/scripts/vk.xml",
      "$file",
      "-quiet",
    ]
  }
}

config("vulkan_generate_helper_files_config") {
  include_dirs = [
    vulkan_gen_dir,
    "$vulkan_layers_dir/include",
  ]
}

group("vulkan_generate_helper_files") {
  public_deps = []
  public_configs = [ ":vulkan_generate_helper_files_config" ]
  foreach(script_and_dep, helper_script_and_deps) {
    target_name = script_and_dep[0]
    public_deps += [ ":$target_name" ]
  }
}

config("vulkan_config") {
  if (is_win) {
    defines = [
      "VK_USE_PLATFORM_WIN32_KHR",
      "VK_USE_PLATFORM_WIN32_KHX",
    ]
  }
  if (is_linux) {
    defines = [
      "VK_USE_PLATFORM_XCB_KHR",
      "VK_USE_PLATFORM_XCB_KHX",
    ]
  }
}

config("vulkan_internal_config") {
  defines = [ "VULKAN_NON_CMAKE_BUILD" ]
  if (is_clang || !is_win) {
    cflags = [ "-Wno-unused-function" ]

    # See https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/1649
    # TODO(jmadill): Lift this once github issue is fixed.
    cflags += [ "-Wno-ignored-attributes" ]
  }
  if (is_linux) {
    defines += [
      "SYSCONFDIR=\"/etc\"",
      "FALLBACK_CONFIG_DIRS=\"/etc/xdg\"",
      "FALLBACK_DATA_DIRS=\"/usr/local/share:/usr/share\"",
    ]
  }
}

# Vulkan loader
# -------------

config("vulkan_loader_config") {
  include_dirs = rebase_path(vulkan_gypi.vulkan_loader_include_dirs, ".", "src")
  include_dirs += [ vulkan_gen_dir ]
  defines = [
    "LAYERS_SOURCE_PATH=\"$data_dir\"",
    "DEFAULT_VK_LAYERS_PATH=\".\"",
    "API_NAME=\"Vulkan\"",
  ]

  if (is_win) {
    cflags = [ "/wd4201" ]
  }
  if (is_linux) {
    # assume secure_getenv() is available
    defines += [ "HAVE_SECURE_GETENV" ]
  }
}

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
    }
  }
  deps = [
    ":vulkan_generate_helper_files",
  ]
  configs += [ ":vulkan_internal_config" ]
  public_configs = [
    ":vulkan_config",
    ":vulkan_loader_config",
  ]
  configs -= vulkan_undefine_configs
}

# 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" ]
}

# glslang
# -------

config("glslang_config") {
  include_dirs = [
    glslang_dir,
    "$glslang_dir/glslang/Public",
  ]
}

config("glslang_internal_config") {
  if (is_clang || !is_win) {
    cflags = [
      "-Wno-ignored-qualifiers",
      "-Wno-reorder",
    ]
  }
}

static_library("glslang") {
  sources = rebase_path(vulkan_gypi.glslang_sources, ".", "src")
  public_configs = [ ":glslang_config" ]
  configs += [ ":glslang_internal_config" ]

  if (is_win) {
    cflags = [
      "/wd4100",  # Unreferenced formal parameter
      "/wd4456",  # Declaration hides previous local declaration
      "/wd4457",  # Declaration hides function parameter
      "/wd4458",  # Declaration hides class member
      "/wd4702",  # Unreachable code (from glslang_tab.cpp)
      "/wd4718",  # Recursive call has no side effects (from PpContext.cpp)
    ]

    sources += rebase_path(vulkan_gypi.glslang_win_sources, ".", "src")
  }
  if (is_linux) {
    sources += rebase_path(vulkan_gypi.glslang_unix_sources, ".", "src")
  }
}

# The validation layers
# ---------------------

config("vulkan_layer_config") {
  include_dirs = [ "$vulkan_layers_dir/layers" ]
}

source_set("vulkan_layer_table") {
  configs -= vulkan_undefine_configs
  public_deps = [
    ":vulkan_generate_helper_files",
  ]
  public_configs = [
    ":vulkan_config",
    ":vulkan_layer_config",
    ":vulkan_internal_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",
  ]
}

layers = [
  [
    "core_validation",
    vulkan_gypi.VkLayer_core_validation_sources,
    ":vulkan_core_validation_glslang",
  ],
  [
    "object_tracker",
    vulkan_gypi.VkLayer_object_tracker_sources,
    "",
  ],
  [
    "unique_objects",
    vulkan_gypi.VkLayer_unique_objects_sources,
    ":vulkan_gen_unique_objects_wrappers_helper",
  ],
  [
    "parameter_validation",
    vulkan_gypi.VkLayer_parameter_validation_sources,
    ":vulkan_gen_parameter_validation_helper",
  ],
  [
    "swapchain",
    vulkan_gypi.VkLayer_swapchain_sources,
    "",
  ],
  [
    "threading",
    vulkan_gypi.VkLayer_threading_sources,
    ":vulkan_gen_thread_check_helper",
  ],
]

action("vulkan_gen_json_files") {
  script = "$third_party_dir/angle/scripts/generate_vulkan_layers_json.py"
  if (is_win) {
    sources =
        rebase_path(vulkan_gypi.vulkan_gen_json_files_sources_win, ".", "src")
    args = [ "$raw_vulkan_layers_dir/layers/windows" ]
  }
  if (is_linux) {
    sources =
        rebase_path(vulkan_gypi.vulkan_gen_json_files_sources_linux, ".", "src")
    args = [ "$raw_vulkan_layers_dir/layers/linux" ]
  }

  # The layer JSON files are part of the necessary data deps.
  outputs = vulkan_gen_json_files_outputs
  data = vulkan_gen_json_files_outputs
  args += [ rebase_path("$root_out_dir/$data_dir") ]
}

source_set("vulkan_layer_utils") {
  sources = rebase_path(vulkan_gypi.vulkan_layer_utils_sources, ".", "src")
  public_configs = [
    ":vulkan_config",
    ":vulkan_loader_config",
    ":vulkan_internal_config",
  ]
  public_deps = [
    ":vulkan_generate_helper_files",
  ]
  configs -= vulkan_undefine_configs
}

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" ]
}

foreach(layer_info, layers) {
  name = layer_info[0]
  shared_library("VkLayer_$name") {
    configs -= vulkan_undefine_configs
    deps = [
      ":vulkan_layer_table",
      ":vulkan_layer_utils",
    ]
    if (layer_info[2] != "") {
      deps += [ layer_info[2] ]
    }
    sources = rebase_path(layer_info[1], ".", "src")
    if (is_win) {
      sources += [ "$vulkan_layers_dir/layers/VKLayer_$name.def" ]
    }
  }
}

# Use this target to include everything ANGLE needs for Vulkan.
group("angle_vulkan") {
  deps = [
    ":glslang",
    ":vulkan_loader",
  ]
  data_deps = [
    ":vulkan_gen_json_files",
  ]
  foreach(layer_info, layers) {
    name = layer_info[0]
    data_deps += [ ":VkLayer_$name" ]
  }
  public_configs = [
    ":vulkan_config",
    ":vulkan_loader_config",
    ":glslang_config",
  ]
}
