# Copyright 2016 The Fuchsia Authors
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

import("//magma/gnbuild/magma.gni")

group("layers") {
  deps = [
    ":VkLayer_core_validation",
    ":VkLayer_object_tracker",
    ":VkLayer_parameter_validation",
    ":VkLayer_swapchain",
    ":VkLayer_threading",
    ":VkLayer_unique_objects",
  ]
}

config("layer_include_config") {
  cflags_cc = [ "-Wno-unused-function" ]
  include_dirs = [
    ".",
    "../include",
    "../loader",
  ]
}

source_set("layer_common") {
  public_configs = [ ":layer_include_config" ]
  sources = [
    "vk_layer_config.cpp",
    "vk_layer_extension_utils.cpp",
    "vk_layer_table.cpp",
    "vk_layer_utils.cpp",
  ]
  public_deps = [
    "../:vulkan",
    "../:extra_vulkan_headers"
  ]
}

shared_library("VkLayer_object_tracker") {
  deps = [
    ":VkLayer_object_tracker_src($magma_shared_toolchain)",
  ]
}

source_set("VkLayer_object_tracker_src") {
  sources = [
    "object_tracker.cpp",
  ]
  deps = [
    ":layer_common",
  ]
}

shared_library("VkLayer_core_validation") {
  deps = [
    ":VkLayer_core_validation_src($magma_shared_toolchain)",
  ]
}

source_set("VkLayer_core_validation_src") {
  cflags_cc = [ "-Wno-missing-field-initializers" ]
  include_dirs = [
    "//third_party/shaderc/third_party/spirv-tools/include",
    "//third_party/shaderc/third_party/glslang",
  ]
  sources = [
    "core_validation.cpp",
    "descriptor_sets.cpp",
  ]
  deps = [
    ":layer_common",
    "//third_party/shaderc/third_party/spirv-tools",
    "//third_party/shaderc/third_party/glslang",
  ]
}

shared_library("VkLayer_parameter_validation") {
  deps = [
    ":VkLayer_parameter_validation_src($magma_shared_toolchain)",
  ]
}

source_set("VkLayer_parameter_validation_src") {
  sources = [
    "parameter_validation.cpp",
  ]
  deps = [
    ":layer_common",
  ]
}

shared_library("VkLayer_swapchain") {
  deps = [
    ":VkLayer_swapchain_src($magma_shared_toolchain)",
  ]
}

source_set("VkLayer_swapchain_src") {
  sources = [
    "swapchain.cpp",
  ]
  deps = [
    ":layer_common",
  ]
}

shared_library("VkLayer_threading") {
  cflags_cc = [ "-Wno-unused-function" ]
  deps = [
    ":VkLayer_threading_src($magma_shared_toolchain)",
  ]
}

source_set("VkLayer_threading_src") {
  sources = [
    "threading.cpp",
  ]
  deps = [
    ":layer_common",
  ]
}

shared_library("VkLayer_unique_objects") {
  deps = [
    ":VkLayer_unique_objects_src($magma_shared_toolchain)",
  ]
}

source_set("VkLayer_unique_objects_src") {
  sources = [
    "unique_objects.cpp",
  ]
  deps = [
    ":layer_common",
  ]
}
