# Copyright 2016 Google, LLC
#
# 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") {
  defines = [ "ANV_MAGMA=1" ]
  
  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 (is_fuchsia) {
    if (use_mock_magma) {
      deps += [ "$magma_build_root/tests/mock:magma_system" ]
    } else {
      deps += [ "//garnet/lib/magma/src/libmagma" ]
    }
  }

  if (is_linux) {
    deps += [ "//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/magma0\"" ]
  }

  public_configs = [ ":vulkan_internal_config" ]

  deps = [
    ":anv_entrypoints",
    ":anv_extensions",
    ":gen",
    "$magma_build_root/include:magma_abi",
    "$magma_build_root/src/magma_util",
    "$mesa_build_root/src:sha1",
    "$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/os",
    "$mesa_build_root/src/util",
    "$mesa_build_root/src/vulkan/util",
    "$msd_intel_gen_build_root/include",
  ]

  if (is_linux) {
    deps += [ "//third_party/wayland:client" ]
  }

  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_android_stubs.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_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",
  ]

  if (is_linux) {
    sources += [
      "anv_wsi_wayland.c",
    ]
  }
}

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