# 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

  # Currently SwiftShader's Vulkan front-end doesn't build on Android.
  # SwiftShader is not needed on Fuchsia because Vulkan is supported on all
  # devices that run Fuchsia.
  angle_swiftshader = !is_android && !is_fuchsia && !is_ggp
}

_vulkan_backend_sources = [
  "BufferVk.cpp",
  "BufferVk.h",
  "CommandGraph.cpp",
  "CommandGraph.h",
  "CompilerVk.cpp",
  "CompilerVk.h",
  "ContextVk.cpp",
  "ContextVk.h",
  "DeviceVk.cpp",
  "DeviceVk.h",
  "DisplayVk.cpp",
  "DisplayVk.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",
  "ProgramVk.cpp",
  "ProgramVk.h",
  "ProgramPipelineVk.cpp",
  "ProgramPipelineVk.h",
  "QueryVk.cpp",
  "QueryVk.h",
  "RenderbufferVk.cpp",
  "RenderbufferVk.h",
  "RendererVk.cpp",
  "RendererVk.h",
  "RenderTargetVk.cpp",
  "RenderTargetVk.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.h",
  "vk_format_utils.cpp",
  "vk_helpers.cpp",
  "vk_helpers.h",
  "vk_internal_shaders_autogen.h",
  "vk_internal_shaders_autogen.cpp",
  "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",
  ]
}

config("vulkan_config") {
  _sws_icd = "./libvk_swiftshader_icd.json"
  if (is_win) {
    _sws_icd = ".\\\\libvk_swiftshader_icd.json"
  }

  defines = [
    "ANGLE_VK_LAYERS_DIR=\"$angle_data_dir\"",
    "ANGLE_VK_MOCK_ICD_JSON=\"$angle_data_dir/VkICD_mock_icd.json\"",
    "ANGLE_VK_SWIFTSHADER_ICD_JSON=\"${_sws_icd}\"",
  ]
  if (is_android) {
    libs = [ "vulkan" ]
  }
  if (angle_enable_vulkan_validation_layers) {
    defines += [ "ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS_BY_DEFAULT" ]
  }
}

if (angle_swiftshader) {
  copy("angle_swiftshader_icd_rename") {
    sources = [
      "$swiftshader_dir/src/Vulkan/vk_swiftshader_icd.json",
    ]
    outputs = [
      "$root_gen_dir/angle/libvk_swiftshader_icd.json",
    ]
  }

  action("angle_swiftshader_icd") {
    deps = [
      ":angle_swiftshader_icd_rename",
      "$angle_root/third_party/vulkan-headers/src:vulkan_headers",
    ]
    script = "$angle_root/scripts/generate_vulkan_layers_json.py"
    sources = [
      "$angle_root/third_party/vulkan-headers/src/include/vulkan/vulkan_core.h",
    ]

    # Must be listed after vulkan_core.h. git cl format sorts them if they
    # are in one list. So split up the sources manually.
    sources += [ "$root_gen_dir/angle/libvk_swiftshader_icd.json" ]

    outputs = [
      "$root_out_dir/libvk_swiftshader_icd.json",
    ]
    data = outputs

    _raw_sws_in = rebase_path("$root_gen_dir/angle", root_build_dir)
    _raw_sws_out = rebase_path("$root_out_dir", root_build_dir)

    _sws_output = ""
    if (is_win) {
      _sws_output += ".\\vk_swiftshader.dll"
    } else if (is_mac) {
      _sws_output += "./libvk_swiftshader.dylib"
    } else {
      _sws_output += "./libvk_swiftshader.so"
    }

    args = [
             "--icd",
             "--replacement",
             _sws_output,
             _raw_sws_in,
             _raw_sws_out,
           ] + rebase_path(sources, root_build_dir)
  }
}

# Use this target to include everything ANGLE needs for Vulkan.
group("angle_vulkan") {
  public_deps = [
    "$angle_root/third_party/vulkan-headers/src:vulkan_headers",
  ]
  public_configs = [ ":vulkan_config" ]
  deps = []
  data_deps = []
  if (!is_android && !is_fuchsia) {
    deps += [ "$angle_root/third_party/vulkan-loader/src:libvulkan" ]
    data_deps += [ "$angle_root/third_party/vulkan-tools/src:VkICD_mock_icd" ]
    public_configs +=
        [ "$angle_root/third_party/vulkan-loader/src:vulkan_loader_config" ]
  }
  if (is_fuchsia) {
    public_deps += [
      "$angle_root/src/common/fuchsia_egl",
      "//third_party/fuchsia-sdk:vulkan_base",
      "//third_party/fuchsia-sdk/sdk:vulkan",
    ]
  }

  if (angle_enable_vulkan_validation_layers) {
    if (is_fuchsia) {
      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_swiftshader) {
    data_deps += [
      ":angle_swiftshader_icd",
      "$swiftshader_dir/src/Vulkan:swiftshader_libvulkan",
    ]
  }
}

config("angle_vulkan_backend_config") {
  defines = [ "ANGLE_ENABLE_VULKAN" ]
  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",
    "$angle_root:angle_image_util",
    "$angle_spirv_tools_dir:spvtools_val",
  ]
  public_deps = [
    "$angle_root:angle_glslang_wrapper",
    "$angle_root:libANGLE_headers",
    "$angle_root/third_party/vulkan-headers/src:vulkan_headers",
  ]
  public_configs = [ ":angle_vulkan_backend_config" ]
  if (is_fuchsia) {
    deps += [
      "$angle_root/src/common/fuchsia_egl",
      "$angle_root/src/common/fuchsia_egl:backend",
    ]
  }
  if (is_android) {
    libs += [ "vulkan" ]
  }

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