# Copyright (C) 2018-2019 The ANGLE Project Authors.
# Copyright (C) 2019 LunarG, Inc.
#
# 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
#
#     https://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("//build_overrides/vulkan_loader.gni")

if (is_fuchsia) {
  import("//build/cpp/sdk_shared_library.gni")
  import("//build/sdk/sdk_documentation.gni")
}

if (!is_android) {
  vulkan_undefine_configs = []
}
if (is_win) {
  vulkan_undefine_configs += [
    "//build/config/win:nominmax",
    "//build/config/win:unicode",
  ]
}

config("vulkan_internal_config") {
  defines = [ "VULKAN_NON_CMAKE_BUILD" ]
  if (is_clang || !is_win) {
    cflags = [ "-Wno-unused-function" ]
  }
  if (is_fuchsia) {
    defines += [
      "SYSCONFDIR=\"/config\"",
      "EXTRASYSCONFDIR=\"/pkg/data\"",
    ]
  }
  if (is_linux || is_mac) {
    defines += [
      "SYSCONFDIR=\"/etc\"",
      "FALLBACK_CONFIG_DIRS=\"/etc/xdg\"",
      "FALLBACK_DATA_DIRS=\"/usr/local/share:/usr/share\"",
    ]
  }
}

# Vulkan loader
# -------------

config("vulkan_loader_config") {
  include_dirs = [
    "loader/generated",
    "loader",
  ]
  defines = [
    "API_NAME=\"Vulkan\"",
    "USE_UNSAFE_FILE_SEARCH=1"
  ]

  if (is_win) {
    cflags = [ "/wd4201" ]
  }
  if (is_linux) {
    # assume secure_getenv() is available
    defines += [ "HAVE_SECURE_GETENV" ]
  }
}

if (!is_android) {
  if (is_fuchsia) {
    library_type = "sdk_shared_library"
  } else if (vulkan_loader_shared) {
    library_type = "shared_library"
  } else {
    library_type = "static_library"
  }

  target(library_type, "libvulkan") {
    sources = [
      "loader/asm_offset.c",
      "loader/cJSON.c",
      "loader/cJSON.h",
      "loader/debug_utils.c",
      "loader/debug_utils.h",
      "loader/dev_ext_trampoline.c",
      "loader/extension_manual.c",
      "loader/extension_manual.h",
      "loader/gpa_helper.h",
      "loader/loader.c",
      "loader/loader.h",
      "loader/murmurhash.c",
      "loader/murmurhash.h",
      "loader/phys_dev_ext.c",
      "loader/trampoline.c",

      # TODO(jmadill): Use assembler where available.
      "loader/unknown_ext_chain.c",
      "loader/vk_loader_platform.h",
      "loader/wsi.c",
      "loader/wsi.h",
    ]
    if (is_win) {
      output_name = "vulkan-1"
      sources += [
        "loader/dirent_on_windows.c",
        "loader/dirent_on_windows.h",
        "loader/dxgi_loader.c",
        "loader/dxgi_loader.h",
        "loader/vulkan-1.def",
      ]
      if (!is_clang) {
        cflags = [
          "/wd4054",  # Type cast from function pointer
          "/wd4055",  # Type cast from data pointer
          "/wd4100",  # Unreferenced formal parameter
          "/wd4152",  # Nonstandard extension used (pointer conversion)
          "/wd4201",  # Nonstandard extension used: nameless struct/union
          "/wd4214",  # Nonstandard extension used: bit field types other than int
          "/wd4232",  # Nonstandard extension used: address of dllimport is not static
          "/wd4305",  # Type cast truncation
          "/wd4706",  # Assignment within conditional expression
          "/wd4996",  # Unsafe stdlib function
        ]
      }
      if (is_clang) {
          cflags = [ "-Wno-incompatible-pointer-types" ]
      }
      libs = [ "Cfgmgr32.lib" ]
    }
    if (is_mac) {
      libs = [ "CoreFoundation.framework" ]
    }
    if (build_with_chromium) {
      configs -= [ "//build/config/compiler:chromium_code" ]
      configs += [ "//build/config/compiler:no_chromium_code" ]
    }
    public_deps = [
      "$vulkan_headers_dir:vulkan_headers",
    ]
    configs += [ ":vulkan_internal_config" ]
    public_configs = [ ":vulkan_loader_config" ]
    configs -= vulkan_undefine_configs

    if (is_fuchsia) {
      output_name = "vulkan"
      category = "partner"

      # The Vulkan loader's interface is defined by standard Khronos vulkan headers
      # which can be obtained separately from the loader implementation itself.
      no_headers = true

      sources += [ "fuchsia/loader_extensions.c" ]

      deps = [
        ":dlopen_fuchsia",
        "//zircon/public/lib/fdio",
      ]

      # TODO(MA-488) - while these shared libraries are needed by vulkan icd
      # the app must provide them, so we add the deps here.
      deps += [ "//zircon/public/lib/async-default" ]

      libs = [ "zircon" ]

      runtime_deps = [ "//zircon/public/lib/fdio:fdio_sdk" ]

      # TODO(MA-488): remove this too
      runtime_deps += [ "//zircon/public/lib/async-default:async-default_sdk" ]

      # TODO(MA-488): The //zircon/public/lib/async-default dep gives us a dep
      # on //zircon/public/lib/async, which uses the C++ standard library and
      # is linked statically (built from source, though async-default is a
      # prebuilt shared library).  So link in the C++ standard library
      # statically just to satisfy those references.  When the async-default
      # dep is dropped, this can change to "none" (i.e. be removed).
      libcxx_linkage = "static"
    }
  }
}

if (is_fuchsia) {
  config("fuchsia_config") {
    include_dirs = [ "fuchsia" ]
  }

  source_set("dlopen_fuchsia") {
    public_configs = [ ":fuchsia_config" ]

    sources = [
      "fuchsia/dlopen_fuchsia.c",
      "fuchsia/dlopen_fuchsia.h",
    ]

    deps = [
      "//sdk/fidl/fuchsia.vulkan.loader:fuchsia.vulkan.loader_c_client",
      "//zircon/public/lib/fdio",
    ]
  }

  sdk_documentation("vulkan_license") {
    name = "vulkan_license"
    category = "public"

    files = [
      {
        source = "LICENSE.txt"
        dest = "LICENSE.vulkan"
      },
    ]
  }
}

group("tests") {
  # TODO(MA-684)
}
