# Copyright 2016 The Fuchsia Authors
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

import("../../../mesa.gni")

declare_args() {
  use_mock_magma = false
}

config("vulkan_internal_config") {
  include_dirs = [
    ".",
    "..",  # because  anv_private.h includes isl/isl.h
    "$mesa_build_root/include/drm-uapi",  # because anv_private.h includes i915_drm.h
    "$mesa_build_root/src",  # because isl.h includes util/macros.h
    "$mesa_build_root/src/vulkan/util",  # because anv_private.h includes vk_alloc.h
    "$root_gen_dir/third_party/mesa/src/intel/vulkan",
  ]
}

config("vulkan_library_flags") {
  ldflags = [
    "-static-libstdc++",
    "-Wl,--build-id=sha1",
  ]
}

shared_library("vulkan_intel") {
  deps = [
    ":vulkan_internal",
  ]

  if (use_mock_magma) {
    deps += [ "$magma_build_root/tests/mock:magma_system" ]
  } else {
    deps += [ "//garnet/lib/magma/src/libmagma" ]
  }

  configs += [ ":vulkan_library_flags" ]
}

# TODO(MA-596): merge ICD target definitions
shared_library("vulkan_intel_linux") {
  deps = [
    ":vulkan_internal",
    "//garnet/lib/magma/src/libmagma_linux",
  ]

  configs += [ ":vulkan_library_flags" ]
}

# Also used by testing targets
mesa_source_set("vulkan_internal") {
  public_deps = [
    "$mesa_build_root/include:vulkan",
    "$mesa_build_root/src/intel/compiler",
    "$mesa_build_root/src/vulkan/wsi",
  ]
  cflags_cc = [ "-Wno-c++11-narrowing" ]

  if (is_linux) {
    # TODO(MA-588): support flexible device path
    defines = [ "DEV_GPU_PATH_OVERRIDE=\"/dev/wl0\"" ]
  }

  public_configs = [ ":vulkan_internal_config" ]

  deps = [
    ":anv_entrypoints",
    ":anv_extensions",
    ":gen",
    "$magma_build_root/include:magma_abi",
    "$magma_build_root/src/magma_util",
    "$magma_build_root/src/magma_util:allocator",
    "$mesa_build_root/include:c_compat",
    "$mesa_build_root/src/compiler/nir",
    "$mesa_build_root/src/compiler/spirv",
    "$mesa_build_root/src/intel:genxml",
    "$mesa_build_root/src/intel:isl",
    "$mesa_build_root/src/intel/blorp",
    "$mesa_build_root/src/intel/common",
    "$mesa_build_root/src/intel/dev",
    "$mesa_build_root/src/magma",
    "$mesa_build_root/src/util",
    "$mesa_build_root/src/vulkan/util",
    "$msd_intel_gen_build_root/include",
  ]

  sources = [
    "$target_gen_dir/anv_entrypoints.c",
    "$target_gen_dir/anv_entrypoints.h",
    "$target_gen_dir/anv_extensions.c",
    "$target_gen_dir/anv_extensions.h",
    "anv_allocator.c",
    "anv_batch_chain.c",
    "anv_blorp.c",
    "anv_cmd_buffer.c",
    "anv_descriptor_set.c",
    "anv_device.c",
    "anv_dump.c",
    "anv_formats.c",
    "anv_genX.h",
    "anv_image.c",
    "anv_intel.c",
    "anv_magma.c",
    "anv_magma_buffer_collection.c",
    "anv_magma_connection.cc",
    "anv_nir.h",
    "anv_nir_add_base_work_group_id.c",
    "anv_nir_apply_pipeline_layout.c",
    "anv_nir_lower_input_attachments.c",
    "anv_nir_lower_multiview.c",
    "anv_nir_lower_push_constants.c",
    "anv_nir_lower_ycbcr_textures.c",
    "anv_pass.c",
    "anv_pipeline.c",
    "anv_pipeline_cache.c",
    "anv_private.h",
    "anv_queue.c",
    "anv_util.c",
    "anv_wsi.c",
    "vk_format_info.h",
  ]
}

group("gen") {
  deps = [
    ":gen10",
    ":gen11",
    ":gen7",
    ":gen75",
    ":gen8",
    ":gen9",
  ]
}

template("vulkan_gen8") {
  mesa_source_set(target_name) {
    defines = [ invoker.defines ]

    configs = [ ":vulkan_internal_config" ]

    sources = [
      "gen8_cmd_buffer.c",
      "genX_blorp_exec.c",
      "genX_cmd_buffer.c",
      "genX_gpu_memcpy.c",
      "genX_pipeline.c",
      "genX_query.c",
      "genX_state.c",
    ]

    deps = [
      ":anv_entrypoints",
      "$magma_build_root/include:magma_abi",
      "$mesa_build_root/include:c_compat",
      "$mesa_build_root/include:vulkan",
      "$mesa_build_root/src/intel:genxml",
      "$mesa_build_root/src/intel:isl",
      "$mesa_build_root/src/intel/blorp",
      "$mesa_build_root/src/intel/compiler",
      "$mesa_build_root/src/vulkan/wsi",
    ]
  }
}

vulkan_gen8("gen8") {
  defines = "GEN_VERSIONx10=80"
}

vulkan_gen8("gen9") {
  defines = "GEN_VERSIONx10=90"
}

vulkan_gen8("gen10") {
  defines = "GEN_VERSIONx10=100"
}

vulkan_gen8("gen11") {
  defines = "GEN_VERSIONx10=110"
}

template("vulkan_gen7") {
  mesa_source_set(target_name) {
    defines = [ invoker.defines ]

    configs = [ ":vulkan_internal_config" ]

    sources = [
      "gen7_cmd_buffer.c",
      "genX_blorp_exec.c",
      "genX_cmd_buffer.c",
      "genX_gpu_memcpy.c",
      "genX_pipeline.c",
      "genX_query.c",
      "genX_state.c",
    ]

    deps = [
      ":anv_entrypoints",
      "$magma_build_root/include:magma_abi",
      "$mesa_build_root/include:c_compat",
      "$mesa_build_root/include:vulkan",
      "$mesa_build_root/src/intel:genxml",
      "$mesa_build_root/src/intel:isl",
      "$mesa_build_root/src/intel/blorp",
      "$mesa_build_root/src/intel/compiler",
      "$mesa_build_root/src/vulkan/wsi",
    ]
  }
}

vulkan_gen7("gen7") {
  defines = "GEN_VERSIONx10=70"
}

vulkan_gen7("gen75") {
  defines = "GEN_VERSIONx10=75"
}

action("anv_entrypoints") {
  outputs = [
    "$target_gen_dir/anv_entrypoints.h",
    "$target_gen_dir/anv_entrypoints.c",
  ]

  script = "$mesa_build_root/scripts/python_exec.py"

  inputs = [
    "anv_entrypoints_gen.py",
    "anv_extensions.py",
    "$mesa_build_root/src/vulkan/registry/vk.xml",
  ]

  args = [
    rebase_path("$magma_python_path"),
    rebase_path("anv_entrypoints_gen.py"),
    "--xml",
    rebase_path("$mesa_build_root") + "/src/vulkan/registry/vk.xml",
    "--outdir",
    rebase_path("$target_gen_dir"),
  ]
}

action("anv_extensions") {
  outputs = [
    "$target_gen_dir/anv_extensions.c",
    "$target_gen_dir/anv_extensions.h",
  ]

  script = "$mesa_build_root/scripts/python_exec.py"

  inputs = [
    "anv_extensions_gen.py",
    "$mesa_build_root/src/vulkan/registry/vk.xml",
    "anv_extensions.py",
  ]

  args = [
    rebase_path("$magma_python_path"),
    rebase_path("anv_extensions_gen.py"),
    "--out-c",
    rebase_path("$target_gen_dir/anv_extensions.c"),
    "--out-h",
    rebase_path("$target_gen_dir/anv_extensions.h"),
    "--xml",
    rebase_path("$mesa_build_root") + "/src/vulkan/registry/vk.xml",
  ]
}
