# 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 = [
    "buffer_validation.cpp",
    "core_validation.cpp",
    "descriptor_sets.cpp",
    "vk_format_utils.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",
    "vk_format_utils.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",
  ]
}
