# Copyright (C) 2018-2019 The ANGLE Project Authors.
# Copyright (C) 2019 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
#
#     https://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.

import("//build_overrides/vulkan_tools.gni")

vulkan_registry_script_files = [
  "$vulkan_headers_dir/registry/cgenerator.py",
  "$vulkan_headers_dir/registry/conventions.py",
  "$vulkan_headers_dir/registry/generator.py",
  "$vulkan_headers_dir/registry/reg.py",
  "$vulkan_headers_dir/registry/vkconventions.py",
  "$vulkan_headers_dir/registry/vk.xml",
]

# Vulkan-tools isn't ported to Fuchsia yet.
# TODO(spang): Port mock ICD to Fuchsia.
assert(!is_fuchsia)

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

raw_vulkan_icd_dir = rebase_path("icd", root_build_dir)
raw_vulkan_headers_dir = rebase_path("$vulkan_headers_dir", root_build_dir)

vulkan_gen_dir = "$target_gen_dir/$vulkan_gen_subdir"
raw_vulkan_gen_dir = rebase_path(vulkan_gen_dir, root_build_dir)

vulkan_data_dir = "$root_out_dir/$vulkan_data_subdir"
raw_vulkan_data_dir = rebase_path(vulkan_data_dir, root_build_dir)

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

helper_script_and_deps = [
  [
    "vulkan_gen_typemap_helper",
    "vk_typemap_helper.h",
    "vulkan_tools_helper_file_generator.py",
  ],
  [
    "vulkan_mock_icd_cpp",
    "mock_icd.cpp",
    "mock_icd_generator.py",
  ],
  [
    "vulkan_mock_icd_h",
    "mock_icd.h",
    "mock_icd_generator.py",
  ],
]

# Python scripts needed for codegen, copy them to a temp dir
# so that all dependencies are together
copy("python_gen_deps") {
  sources = vulkan_registry_script_files + [
              "scripts/common_codegen.py",
              "scripts/kvt_genvk.py",
              "scripts/mock_icd_generator.py",
              "scripts/vulkan_tools_helper_file_generator.py",
            ]
  outputs = [
    "$vulkan_gen_dir/{{source_file_part}}",
  ]
}

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) {
    public_deps = [
      ":python_gen_deps",
    ]
    script = "$vulkan_gen_dir/kvt_genvk.py"
    inputs = [
      "$vulkan_gen_dir/$dep",
      "$vulkan_gen_dir/common_codegen.py",
    ]
    outputs = [
      "$vulkan_gen_dir/$file",
    ]
    args = [
      "-o",
      raw_vulkan_gen_dir,
      "-registry",
      "$raw_vulkan_headers_dir/registry/vk.xml",
      "-scripts",
      "$raw_vulkan_headers_dir/registry",
      "$file",
      "-quiet",
    ]
  }
}

config("vulkan_generated_files_config") {
  include_dirs = [ vulkan_gen_dir ]
}

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

config("vulkan_internal_config") {
  defines = [ "VULKAN_NON_CMAKE_BUILD" ]
  if (is_clang || !is_win) {
    cflags = [ "-Wno-unused-function" ]
  }
  if (is_linux) {
    defines += [
      "SYSCONFDIR=\"/etc\"",
      "FALLBACK_CONFIG_DIRS=\"/etc/xdg\"",
      "FALLBACK_DATA_DIRS=\"/usr/local/share:/usr/share\"",
    ]
  }
}

# Copy icd header to gen dir
copy("icd_header_dep") {
  sources = [
    "$vulkan_headers_dir/include/vulkan/vk_icd.h",
  ]
  outputs = [
    "$vulkan_gen_dir/vk_icd.h",
  ]
}

if (!is_android) {
  # Vulkan Mock ICD
  # ---------------
  group("vulkan_generate_mock_icd_files") {
    public_deps = [
      ":icd_header_dep",
      ":vulkan_generate_helper_files",
      ":vulkan_mock_icd_cpp",
      ":vulkan_mock_icd_h",
    ]
  }

  mock_icd_sources = [
    "$vulkan_gen_dir/mock_icd.cpp",
    "$vulkan_gen_dir/mock_icd.h",
  ]

  shared_library("VkICD_mock_icd") {
    configs -= vulkan_undefine_configs
    deps = [
      ":vulkan_generate_mock_icd_files",
    ]
    data_deps = [
      ":vulkan_gen_icd_json_file",
    ]
    sources = mock_icd_sources
    if (is_win) {
      sources += [ "icd/VkICD_mock_icd.def" ]
    }
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }

  action("vulkan_gen_icd_json_file") {
    script = "build-gn/generate_vulkan_layers_json.py"
    sources = [
      "$vulkan_headers_dir/include/vulkan/vulkan_core.h",
    ]
    args = [ "--icd" ]
    if (is_win) {
      sources += [ "icd/windows/VkICD_mock_icd.json" ]
      args += [ "$raw_vulkan_icd_dir/windows" ]
    }
    if (is_linux) {
      sources += [ "icd/linux/VkICD_mock_icd.json" ]
      args += [ "$raw_vulkan_icd_dir/linux" ]
    }

    # The layer JSON files are part of the necessary data deps.
    outputs = [
      "$vulkan_data_dir/VkICD_mock_icd.json",
    ]
    data = outputs
    args += [ raw_vulkan_data_dir ] + rebase_path(sources, root_build_dir)
  }
}
