# Copyright 2019 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.
#
# This file houses the build configuration for the ANGLE Vulkan back-end.

import("//build/config/dcheck_always_on.gni")
import("//build_overrides/swiftshader.gni")
import("vulkan_backend.gni")

#import("../../../../gni/angle.gni")

assert(angle_enable_vulkan)

declare_args() {
  # Enable custom (cpu-side) secondary command buffers
  angle_enable_custom_vulkan_cmd_buffers = true

  # Enable Vulkan GPU trace event capability
  angle_enable_vulkan_gpu_trace_events = false

  # Enable compute only queue for OpenCL Vulkan backend
  angle_enable_cl_compute_only_pipe = true
}

declare_args() {
  # Enable custom secondary command buffers for outside render pass commands only
  angle_enable_custom_vulkan_outside_render_pass_cmd_buffers =
      angle_enable_custom_vulkan_cmd_buffers

  # Enable custom secondary command buffers for render pass commands only
  angle_enable_custom_vulkan_render_pass_cmd_buffers =
      angle_enable_custom_vulkan_cmd_buffers

  # Enable using CRC for pipeline cache data
  angle_enable_crc_for_pipeline_cache = true
}

angle_source_set("angle_vk_mem_alloc_wrapper") {
  deps = [
    "$angle_root/src/common/vulkan:angle_vulkan_headers",
    "$angle_vulkan_memory_allocator_dir",
  ]
  include_dirs = [ "$angle_vulkan_memory_allocator_dir/include" ]
  configs += [ "$angle_root:angle_no_cfi_unrelated_cast" ]
  sources = [
    "vk_mem_alloc_wrapper.cpp",
    "vk_mem_alloc_wrapper.h",
  ]
  if (is_clang) {
    cflags_cc = [
      "-Wno-extra-semi-stmt",
      "-Wno-missing-field-initializers",
      "-Wno-suggest-destructor-override",
      "-Wno-suggest-override",
      "-Wno-inconsistent-missing-destructor-override",
    ]
  }
}

config("angle_vulkan_backend_config") {
  defines = [ "ANGLE_ENABLE_VULKAN" ]
  if (angle_enable_swiftshader) {
    defines += [ "ANGLE_ENABLE_SWIFTSHADER" ]
  }
  if (angle_enable_vulkan_gpu_trace_events) {
    defines += [ "ANGLE_ENABLE_VULKAN_GPU_TRACE_EVENTS=1" ]
  }
  if (angle_enable_vulkan_validation_layers) {
    defines += [ "ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS" ]
  }
  if (angle_enable_vulkan_api_dump_layer) {
    defines += [ "ANGLE_ENABLE_VULKAN_API_DUMP_LAYER" ]
  }

  # Ensures that the memory allocation logging can only be enabled with debug layers.
  assert(angle_debug_layers_enabled || !angle_enable_memory_alloc_logging)
  if (angle_enable_memory_alloc_logging) {
    defines += [ "ANGLE_ENABLE_MEMORY_ALLOC_LOGGING=1" ]
  }

  if (angle_enable_crc_for_pipeline_cache) {
    defines += [ "ANGLE_ENABLE_CRC_FOR_PIPELINE_CACHE" ]
  }
}

if (is_android) {
  # Used only in generated Android.bp file for DMA-BUF-enabled builds on Android.
  # See b/353262025 for details.
  angle_source_set("angle_android_vulkan_dma_buf") {
    sources = vulkan_backend_dma_buf_sources
    deps = [
      ":angle_vulkan_backend",
      "$angle_root/src/common/linux:angle_dma_buf",
    ]
    defines = [
      "ANGLE_ANDROID_DMA_BUF",
      "ANGLE_USE_VULKAN_DISPLAY",
      "ANGLE_VULKAN_DISPLAY_MODE_OFFSCREEN",
    ]
    if (angle_use_gbm) {
      deps += [ "//third_party/minigbm" ]
    }
  }
}

template("angle_vulkan_backend_template") {
  config("${target_name}_internal_config") {
    defines = []
    if (invoker.enable_custom_outside_render_pass_cmd_buffers) {
      defines += [ "ANGLE_USE_CUSTOM_VULKAN_OUTSIDE_RENDER_PASS_CMD_BUFFERS=1" ]
    }
    if (invoker.enable_custom_render_pass_cmd_buffers) {
      defines += [ "ANGLE_USE_CUSTOM_VULKAN_RENDER_PASS_CMD_BUFFERS=1" ]
    }
  }

  angle_source_set(target_name) {
    sources = vulkan_backend_sources
    libs = []
    defines = []
    deps = [
      ":angle_vk_mem_alloc_wrapper",
      "$angle_root:angle_abseil",
      "$angle_root:angle_compression",
      "$angle_root:angle_gpu_info_util",
      "$angle_root:angle_image_util",
      "$angle_root/src/common/spirv:angle_spirv_base",
      "$angle_root/src/common/spirv:angle_spirv_builder",
      "$angle_root/src/common/spirv:angle_spirv_headers",
      "$angle_root/src/common/spirv:angle_spirv_parser",
      "$angle_spirv_headers_dir:spv_headers",
    ]

    if (angle_enable_cl || is_android) {
      deps += [ "$angle_root:angle_version_info" ]
    }

    # OpenCL on ANGLE needs both spirv-tools and clspv for compiler
    if (angle_enable_cl) {
      deps += [
        "$angle_root/third_party/clspv/:clspv_core_shared",
        "$angle_root/third_party/spirv-tools/src/:spvtools",
        "$angle_root/third_party/spirv-tools/src/:spvtools_opt",
      ]
      include_dirs = [
        "$angle_root/third_party/spirv-tools/src/include",
        "$angle_root/third_party/clspv/src/include",
      ]
      if (angle_enable_cl_compute_only_pipe) {
        defines += [ "ANGLE_OPENCL_COMPUTE_ONLY_PIPE" ]
      }
    }

    public_deps = [
      "$angle_root:libANGLE_headers",
      "$angle_root/src/common/vulkan",
      "$angle_root/src/common/vulkan:angle_libvulkan_loader",
      "$angle_root/src/common/vulkan:angle_vulkan_entry_points",
      "$angle_root/src/common/vulkan:angle_vulkan_headers",
    ]
    public_configs = [
      ":angle_vulkan_backend_config",
      ":${target_name}_internal_config",
    ]

    if (angle_use_wayland) {
      public_configs += [ "$angle_root:angle_wayland_config" ]
    }

    data_deps = []

    if (angle_enable_vulkan_validation_layers) {
      defines += [ "ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS_BY_DEFAULT" ]
      data_deps += [ "$angle_root/src/common/vulkan:vulkan_validation_layers" ]
    }

    if (angle_enable_vulkan_api_dump_layer &&
        current_toolchain == default_toolchain) {
      data_deps += [ "$angle_root/src/common/vulkan:lunarg_vulkantools" ]
    }

    if (is_linux || is_chromeos) {
      deps += [ "$angle_root/src/common/linux:angle_dma_buf" ]
      if (angle_use_gbm) {
        deps += [ "//third_party/minigbm" ]
      }
    }

    if (is_fuchsia) {
      public_deps += [ "$angle_root/src/common/fuchsia_egl:backend" ]
    }

    # Include generated shaders.
    import("vk_internal_shaders_autogen.gni")
    sources += angle_vulkan_internal_shaders
  }
}

angle_vulkan_backend_template("angle_vulkan_backend") {
  enable_custom_outside_render_pass_cmd_buffers =
      angle_enable_custom_vulkan_outside_render_pass_cmd_buffers
  enable_custom_render_pass_cmd_buffers =
      angle_enable_custom_vulkan_render_pass_cmd_buffers
}

angle_vulkan_backend_template("angle_vulkan_secondaries_backend") {
  enable_custom_outside_render_pass_cmd_buffers = false
  enable_custom_render_pass_cmd_buffers = false
}
