# 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_overrides/swiftshader.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
}

_vulkan_backend_sources = [
  "BufferVk.cpp",
  "BufferVk.h",
  "CompilerVk.cpp",
  "CompilerVk.h",
  "ContextVk.cpp",
  "ContextVk.h",
  "DeviceVk.cpp",
  "DeviceVk.h",
  "DisplayVk.cpp",
  "DisplayVk.h",
  "DisplayVk_api.h",
  "FenceNVVk.cpp",
  "FenceNVVk.h",
  "FramebufferVk.cpp",
  "FramebufferVk.h",
  "GlslangWrapperVk.cpp",
  "GlslangWrapperVk.h",
  "ImageVk.cpp",
  "ImageVk.h",
  "MemoryObjectVk.cpp",
  "MemoryObjectVk.h",
  "OverlayVk.cpp",
  "OverlayVk.h",
  "PersistentCommandPool.cpp",
  "PersistentCommandPool.h",
  "ProgramPipelineVk.cpp",
  "ProgramPipelineVk.h",
  "ProgramVk.cpp",
  "ProgramVk.h",
  "QueryVk.cpp",
  "QueryVk.h",
  "RenderTargetVk.cpp",
  "RenderTargetVk.h",
  "RenderbufferVk.cpp",
  "RenderbufferVk.h",
  "RendererVk.cpp",
  "RendererVk.h",
  "ResourceVk.cpp",
  "ResourceVk.h",
  "SamplerVk.cpp",
  "SamplerVk.h",
  "SecondaryCommandBuffer.cpp",
  "SecondaryCommandBuffer.h",
  "SemaphoreVk.cpp",
  "SemaphoreVk.h",
  "ShaderVk.cpp",
  "ShaderVk.h",
  "SurfaceVk.cpp",
  "SurfaceVk.h",
  "SyncVk.cpp",
  "SyncVk.h",
  "TextureVk.cpp",
  "TextureVk.h",
  "TransformFeedbackVk.cpp",
  "TransformFeedbackVk.h",
  "UtilsVk.cpp",
  "UtilsVk.h",
  "VertexArrayVk.cpp",
  "VertexArrayVk.h",
  "vk_cache_utils.cpp",
  "vk_cache_utils.h",
  "vk_caps_utils.cpp",
  "vk_caps_utils.h",
  "vk_ext_provoking_vertex.h",
  "vk_format_table_autogen.cpp",
  "vk_format_utils.cpp",
  "vk_format_utils.h",
  "vk_helpers.cpp",
  "vk_helpers.h",
  "vk_internal_shaders_autogen.cpp",
  "vk_internal_shaders_autogen.h",
  "vk_mandatory_format_support_table_autogen.cpp",
  "vk_utils.cpp",
  "vk_utils.h",
  "vk_wrapper.h",
]

if (is_android) {
  _vulkan_backend_sources += [
    "android/DisplayVkAndroid.cpp",
    "android/DisplayVkAndroid.h",
    "android/HardwareBufferImageSiblingVkAndroid.cpp",
    "android/HardwareBufferImageSiblingVkAndroid.h",
    "android/WindowSurfaceVkAndroid.cpp",
    "android/WindowSurfaceVkAndroid.h",
  ]
}

if (is_win) {
  _vulkan_backend_sources += [
    "win32/DisplayVkWin32.cpp",
    "win32/DisplayVkWin32.h",
    "win32/WindowSurfaceVkWin32.cpp",
    "win32/WindowSurfaceVkWin32.h",
  ]
}

if (angle_use_x11) {
  _vulkan_backend_sources += [
    "xcb/DisplayVkXcb.cpp",
    "xcb/DisplayVkXcb.h",
    "xcb/WindowSurfaceVkXcb.cpp",
    "xcb/WindowSurfaceVkXcb.h",
  ]
}

if (is_fuchsia) {
  _vulkan_backend_sources += [
    "fuchsia/DisplayVkFuchsia.cpp",
    "fuchsia/DisplayVkFuchsia.h",
    "fuchsia/WindowSurfaceVkFuchsia.cpp",
    "fuchsia/WindowSurfaceVkFuchsia.h",
  ]
}

if (is_ggp) {
  _vulkan_backend_sources += [
    "ggp/DisplayVkGGP.cpp",
    "ggp/DisplayVkGGP.h",
    "ggp/WindowSurfaceVkGGP.cpp",
    "ggp/WindowSurfaceVkGGP.h",
  ]
}

if (is_mac) {
  _vulkan_backend_sources += [
    "mac/DisplayVkMac.h",
    "mac/DisplayVkMac.mm",
    "mac/IOSurfaceSurfaceVkMac.h",
    "mac/IOSurfaceSurfaceVkMac.mm",
    "mac/WindowSurfaceVkMac.h",
    "mac/WindowSurfaceVkMac.mm",
  ]
}

config("angle_vulkan_lib_android") {
  if (is_android) {
    libs = [ "vulkan" ]
  }
}

group("angle_vulkan_entry_points") {
  public_configs = [ ":angle_vulkan_lib_android" ]
  public_deps = [
    "$angle_root/src/third_party/volk:volk",
    "$angle_root/third_party/vulkan-headers/src:vulkan_headers",
  ]
  if (is_fuchsia) {
    public_deps += [
      "$angle_root/src/common/fuchsia_egl",
      "//third_party/fuchsia-sdk:vulkan_base",
      "//third_party/fuchsia-sdk/sdk/pkg/vulkan",
    ]
  } else if (!is_android && !is_ggp) {
    data_deps = [ "$angle_root/third_party/vulkan-loader/src:libvulkan" ]
  }
}

config("angle_vulkan_backend_config") {
  defines = [ "ANGLE_ENABLE_VULKAN" ]
  if (angle_enable_swiftshader) {
    defines += [ "ANGLE_ENABLE_SWIFTSHADER" ]
  }
  if (angle_enable_custom_vulkan_cmd_buffers) {
    defines += [ "ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1" ]
  }

  if (angle_enable_vulkan_gpu_trace_events) {
    defines += [ "ANGLE_ENABLE_VULKAN_GPU_TRACE_EVENTS=1" ]
  }
}

angle_source_set("angle_vulkan_backend") {
  sources = _vulkan_backend_sources
  libs = []
  deps = [
    ":angle_vulkan_entry_points",
    "$angle_root:angle_gpu_info_util",
    "$angle_root:angle_image_util",
    "$angle_root/third_party/vulkan-headers/src:vulkan_headers",
    "$angle_spirv_tools_dir:spvtools_val",
  ]
  public_deps = [
    "$angle_root:angle_glslang_wrapper",
    "$angle_root:libANGLE_headers",
  ]
  public_configs = [ ":angle_vulkan_backend_config" ]

  data_deps = []

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

  if (is_android) {
    libs += [ "vulkan" ]
  }

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

  if (!is_android && !is_fuchsia && !is_ggp) {
    data_deps += [
      "$angle_root/third_party/vulkan-loader/src:libvulkan",
      "$angle_root/third_party/vulkan-tools/src:VkICD_mock_icd",
    ]
  }

  if (angle_enable_vulkan_validation_layers) {
    defines += [ "ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS_BY_DEFAULT" ]
    if (is_fuchsia) {
      data_deps += [ "//third_party/fuchsia-sdk:vulkan_validation" ]
    } else {
      data_deps += [ "$angle_root/third_party/vulkan-validation-layers/src:vulkan_validation_layers" ]
      if (!is_android) {
        data_deps += [ "$angle_root/third_party/vulkan-validation-layers/src:vulkan_gen_json_files" ]
      }
    }
  }

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

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

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