# Copyright 2019 The SwiftShader Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build_overrides/build.gni")
import("../swiftshader.gni")
import("vulkan.gni")

# Need a separate config to ensure the warnings are added to the end.
config("swiftshader_libvulkan_private_config") {
  if (is_linux || is_chromeos) {
    defines = [
      "VK_USE_PLATFORM_XLIB_KHR",
      "VK_USE_PLATFORM_XCB_KHR",
      "VK_EXPORT=__attribute__((visibility(\"default\")))",
    ]
  } else if (is_fuchsia) {
    defines = [
      "VK_USE_PLATFORM_FUCHSIA=1",
      "VK_EXPORT=__attribute__((visibility(\"default\")))",
    ]
  } else if (is_win) {
    defines = [
      "VK_USE_PLATFORM_WIN32_KHR=1",
      "VK_EXPORT=",
    ]
  } else if (is_mac) {
    defines = [
      "VK_USE_PLATFORM_MACOS_MVK=1",
      "VK_USE_PLATFORM_METAL_EXT=1",
      "VK_EXPORT=__attribute__((visibility(\"default\")))",
    ]
  } else {
    defines = [ "VK_EXPORT=" ]
  }

  if (is_clang) {
    cflags = [
      "-Wno-unused-private-field",
      "-Wno-switch",
    ]
  }

  defines += [
     "SWIFTSHADER_ENABLE_ASTC",  # TODO(b/150130101)
  ]
}

swiftshader_source_set("swiftshader_libvulkan_headers") {
  sources = [
    "Version.hpp",
    "VkBuffer.hpp",
    "VkBufferView.hpp",
    "VkCommandBuffer.hpp",
    "VkCommandPool.hpp",
    "VkConfig.hpp",
    "VkDebugUtilsMessenger.hpp",
    "VkDescriptorPool.hpp",
    "VkDescriptorSet.hpp",
    "VkDescriptorSetLayout.hpp",
    "VkDescriptorUpdateTemplate.hpp",
    "VkDestroy.hpp",
    "VkDevice.hpp",
    "VkDeviceMemory.hpp",
    "VkDeviceMemoryExternalHost.hpp",
    "VkEvent.hpp",
    "VkFence.hpp",
    "VkFormat.hpp",
    "VkFramebuffer.hpp",
    "VkGetProcAddress.hpp",
    "VkImage.hpp",
    "VkImageView.hpp",
    "VkInstance.hpp",
    "VkMemory.hpp",
    "VkObject.hpp",
    "VkPhysicalDevice.hpp",
    "VkPipeline.hpp",
    "VkPipelineCache.hpp",
    "VkPipelineLayout.hpp",
    "VkQueryPool.hpp",
    "VkQueue.hpp",
    "VkRenderPass.hpp",
    "VkSampler.hpp",
    "VkSemaphore.hpp",
    "VkShaderModule.hpp",
    "VkSpecializationInfo.hpp",
    "VkStringify.hpp",
    "VkStructConversion.hpp",
    "VkTimelineSemaphore.hpp",
    "VulkanPlatform.hpp",
  ]
  if (is_linux || is_chromeos || is_android) {
    sources += [
      "VkDeviceMemoryExternalLinux.hpp",
      "VkSemaphoreExternalLinux.hpp",
    ]
  } else if (is_mac) {
    sources += [
      "VkDeviceMemoryExternalMac.hpp",
    ]
  } else if (is_fuchsia) {
    sources += [ "VkSemaphoreExternalFuchsia.hpp" ]
  }
}

swiftshader_shared_library("swiftshader_libvulkan") {
  sources = [
    "VkBuffer.cpp",
    "VkBufferView.cpp",
    "VkCommandBuffer.cpp",
    "VkCommandPool.cpp",
    "VkDebugUtilsMessenger.cpp",
    "VkDescriptorPool.cpp",
    "VkDescriptorSet.cpp",
    "VkDescriptorSetLayout.cpp",
    "VkDescriptorUpdateTemplate.cpp",
    "VkDevice.cpp",
    "VkDeviceMemory.cpp",
    "VkDeviceMemoryExternalHost.cpp",
    "VkFormat.cpp",
    "VkFramebuffer.cpp",
    "VkGetProcAddress.cpp",
    "VkImage.cpp",
    "VkImageView.cpp",
    "VkInstance.cpp",
    "VkMemory.cpp",
    "VkPhysicalDevice.cpp",
    "VkPipeline.cpp",
    "VkPipelineCache.cpp",
    "VkPipelineLayout.cpp",
    "VkPromotedExtensions.cpp",
    "VkQueryPool.cpp",
    "VkQueue.cpp",
    "VkRenderPass.cpp",
    "VkSampler.cpp",
    "VkSemaphore.cpp",
    "VkShaderModule.cpp",
    "VkSpecializationInfo.cpp",
    "VkStringify.cpp",
    "VkTimelineSemaphore.cpp",
    "libVulkan.cpp",
    "main.cpp",
    "resource.h",
  ]

  configs = [ ":swiftshader_libvulkan_private_config" ]

  # TODO(capn): Use the same ICD name on both Windows and non-Windows.
  if (is_win) {
    output_name = "vk_swiftshader"
  } else {
    output_name = "libvk_swiftshader"
  }

  if (is_win) {
    sources += [
      "Vulkan.rc",
      "vk_swiftshader.def",
    ]
  }

  if (is_mac) {
    ldflags = [
      "-Wl,-install_name,@rpath/libvk_swiftshader.dylib",
      "-Wl,-exported_symbols_list," +
          rebase_path("vk_swiftshader.exports", root_build_dir),
    ]
  } else if (is_linux || is_chromeos || is_fuchsia) {
    inputs = [
      "vk_swiftshader.lds",
    ]
    ldflags = [
      # -Bsymbolic binds symbol references to their global definitions within
      # a shared object, thereby preventing symbol preemption.
      "-Wl,-Bsymbolic",
      "-Wl,--version-script=" +
          rebase_path("vk_swiftshader.lds", root_build_dir) ]
  }

  deps = [
    "${swiftshader_spirv_tools_dir}:SPIRV-Tools",
    "../../third_party/marl:Marl",
    "../Device",
    "../Pipeline",
    "../Reactor:swiftshader_reactor",
    "../System",
    "../WSI",
  ]

  include_dirs = [
    "..",
    "../../include",
    "$swiftshader_spirv_tools_dir/include",
    "$spirv_tools_spirv_headers_dir/include",
  ]

  public_deps = [
    ":swiftshader_libvulkan_headers",
  ]
}

# Generates an ICD JSON file that can be used by all targets in this GN build
# (ANGLE, Dawn, Chromium).
action("icd_file") {
  output_icd_file = "${root_out_dir}/${swiftshader_icd_file_name}"
  input_file = swiftshader_icd_file_name

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

  script = "write_icd_json.py"
  args = [
    "--input",
    rebase_path(input_file, root_build_dir),
    "--output",
    rebase_path(output_icd_file, root_build_dir),
    "--library_path",
    library_path,
  ]

  inputs = [
    input_file,
  ]
  outputs = [
    output_icd_file,
  ]

  deps = [
    ":swiftshader_libvulkan",
  ]
}
