# 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/compiler",  # because anv_nir.h includes nir/nir.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",
  ]

  cflags_c = [ "-Wno-switch" ]

  defines = [ "FFS_DEFINED=1" ]
}

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

  ldflags = [ "-static-libstdc++" ]
}

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

  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/platform:futex",
    "$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/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",
    "anv_allocator.c",
    "anv_batch_chain.c",
    "anv_blorp.c",
    "anv_cmd_buffer.c",
    "anv_debug_report.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.cc",
    "anv_nir.h",
    "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_platform.cc",
    "anv_private.h",
    "anv_queue.c",
    "anv_util.c",
    "anv_wsi.c",
    "vk_format_info.h",
  ]
}

group("gen") {
  deps = [
    ":gen10",
    ":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:vulkan",
      "$mesa_build_root/include:c_compat",
      "$mesa_build_root/src/intel:genxml",
      "$mesa_build_root/src/intel:isl",
      "$mesa_build_root/src/intel/blorp",
      "$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"
}

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:vulkan",
      "$mesa_build_root/include:c_compat",
      "$mesa_build_root/src/intel:genxml",
      "$mesa_build_root/src/intel:isl",
      "$mesa_build_root/src/intel/blorp",
      "$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 = "anv_entrypoints_gen.py"

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

  args = [
    "--pythonpath",
    rebase_path("$magma_python_path"),
    "--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" ]
  script = "anv_extensions.py"
  inputs = [ "$mesa_build_root/src/vulkan/registry/vk.xml" ]
  args = [
    "--pythonpath",
    rebase_path("$magma_python_path"),
    "--out",
    rebase_path("$target_gen_dir/anv_extensions.c"),
    "--xml",
    rebase_path("$mesa_build_root") + "/src/vulkan/registry/vk.xml",
    "--xml",
    rebase_path("$mesa_build_root") + "/src/vulkan/registry/vk_android_native_buffer.xml",
  ]
}
