# Copyright 2020 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.

import("//build_overrides/swiftshader.gni")
import("../../../gni/angle.gni")

if (angle_use_wayland) {
  import("//build_overrides/wayland.gni")
}

declare_args() {
  angle_use_custom_libvulkan = !is_android && !is_fuchsia

  # On real CrOS devices, we should use the system Vulkan loader. On the
  # ChromeOS-for-Linux build, we should use the built libvulkan because the
  # build is used for MSAN tests. Mixing the non-MSAN system libvulkan with the
  # MSAN ANGLE build can result in false positives.
  if (is_chromeos && is_chromeos_device) {
    angle_use_custom_libvulkan = false
  }
}

config("angle_libvulkan_config") {
  if (angle_use_custom_libvulkan) {
    defines = [ "ANGLE_USE_CUSTOM_LIBVULKAN" ]
  }
}

angle_source_set("angle_libvulkan_loader") {
  public_configs = [ ":angle_libvulkan_config" ]
  sources = [
    "libvulkan_loader.cpp",
    "libvulkan_loader.h",
  ]
  deps = [ "$angle_root:angle_common" ]
}

if (angle_enable_vulkan || angle_build_vulkan_system_info) {
  config("angle_vulkan_headers_config") {
    if (angle_shared_libvulkan) {
      defines = [ "ANGLE_SHARED_LIBVULKAN=1" ]
    }
    if (angle_use_wayland) {
      include_dirs = [ "$wayland_dir/src" ]
    }
    configs = [ "$angle_root:angle_vulkan_wayland_config" ]
  }

  angle_source_set("angle_vulkan_headers") {
    sources = [ "vk_headers.h" ]
    if (angle_shared_libvulkan) {
      public_deps = [ "$angle_root/src/third_party/volk:volk" ]
    } else {
      public_deps = [ "$angle_vulkan_headers_dir:vulkan_headers" ]
    }
    public_configs = [ ":angle_vulkan_headers_config" ]
  }

  angle_source_set("angle_vulkan_icd") {
    sources = [
      "vulkan_icd.cpp",
      "vulkan_icd.h",
    ]

    defines =
        [ "ANGLE_VK_MOCK_ICD_JSON=\"$angle_data_dir/VkICD_mock_icd.json\"" ]

    # On Fuchsia use validation layer provided by the SDK.
    if (!is_fuchsia) {
      defines += [ "ANGLE_VK_LAYERS_DIR=\"$angle_data_dir\"" ]
    }

    data_deps = []

    if (angle_enable_swiftshader) {
      import("$swiftshader_dir/src/Vulkan/vulkan.gni")
      _sws_icd = "./$swiftshader_icd_file_name"
      if (is_win) {
        _sws_icd = ".\\\\$swiftshader_icd_file_name"
      } else if (is_fuchsia) {
        _sws_icd = "/pkg/$swiftshader_icd_file_name"
      }

      defines += [ "ANGLE_VK_SWIFTSHADER_ICD_JSON=\"${_sws_icd}\"" ]

      data_deps += [
        "$swiftshader_dir/src/Vulkan:icd_file",
        "$swiftshader_dir/src/Vulkan:swiftshader_libvulkan",
      ]
    }

    public_deps = [
      ":angle_vulkan_headers",
      "$angle_root:angle_common",
    ]

    configs += [ "$angle_root:angle_no_cfi_icall" ]
  }
}

if (angle_enable_vulkan) {
  group("angle_libvulkan") {
    public_configs = [ ":angle_libvulkan_config" ]
    data_deps = []
    if (angle_use_custom_libvulkan) {
      if (angle_shared_libvulkan) {
        data_deps += [ "$angle_vulkan_loader_dir:libvulkan" ]
      } else {
        public_deps = [ "$angle_vulkan_loader_dir:libvulkan" ]
      }
      data_deps += [ "$angle_vulkan_tools_dir:VkICD_mock_icd" ]
    }
  }

  group("angle_vulkan_entry_points") {
    public_deps = [ ":angle_vulkan_headers" ]
    if (is_fuchsia) {
      public_deps += [
        "$angle_root/src/common/fuchsia_egl",
        "//third_party/fuchsia-sdk/sdk/pkg/vulkan",
      ]
      if (!angle_use_vulkan_null_display) {
        public_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan_layers:VkLayer_image_pipe_swapchain" ]
      }
    } else if (!is_android) {
      if (angle_shared_libvulkan) {
        data_deps = [ "$angle_vulkan_loader_dir:libvulkan" ]
      } else {
        deps = [ "$angle_vulkan_loader_dir:libvulkan" ]
      }
    }
  }

  angle_source_set("vulkan") {
    public_deps = [
      ":angle_libvulkan",
      ":angle_vulkan_entry_points",
      ":angle_vulkan_icd",
    ]
  }

  if (angle_enable_vulkan_validation_layers) {
    group("vulkan_validation_layers") {
      data_deps = []
      if (is_fuchsia) {
        data_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan_layers:VkLayer_khronos_validation" ]
      } else {
        data_deps +=
            [ "$angle_vulkan_validation_layers_dir:vulkan_validation_layers" ]
        if (!is_android) {
          data_deps +=
              [ "$angle_vulkan_validation_layers_dir:vulkan_gen_json_files" ]
        }
      }
    }
  }

  if (angle_enable_vulkan_api_dump_layer) {
    group("lunarg_vulkantools") {
      data_deps = []
      if (!is_fuchsia) {
        data_deps += [ "$angle_lunarg_vulkantools_dir:lunarg_vulkantools" ]
        if (!is_android) {
          data_deps += [ "$angle_lunarg_vulkantools_dir:vulkan_gen_json_files" ]
        }
      }
    }
  }
}
