# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/package.gni")
import("//build/sdk/sdk_atom.gni")
import("//build/test/test_package.gni")
import("//garnet/lib/magma/gnbuild/magma.gni")
import("//garnet/lib/vulkan/image_pipe_swapchain.gni")
import("//third_party/vulkan_loader_and_validation_layers/layers/layers.gni")

group("image_pipe_swapchain") {
  public_deps = [
    "src/swapchain",
  ]
}

sdk_atom("vulkan_layers") {
  id = "sdk://pkg/vulkan_layers"

  category = "partner"

  files = []

  resources =
      vulkan_validation_layers.resources + image_pipe_swapchain.resources
  loadable_modules = vulkan_validation_layers.loadable_modules +
                     image_pipe_swapchain.loadable_modules
  non_sdk_deps =
      vulkan_validation_layers.public_deps + image_pipe_swapchain.public_deps

  sdk_resources = []
  foreach(resource, resources) {
    destination = "pkg/vulkan_layers/data/" + resource.dest
    files += [
      {
        source = resource.path
        dest = destination
      },
    ]
    sdk_resources += [ destination ]
  }

  sdk_binaries = []
  foreach(loadable_module, loadable_modules) {
    destination = "arch/$target_cpu/dist/" + loadable_module.name
    files += [
      {
        source = "$root_out_dir/" + loadable_module.name
        dest = destination
      },
    ]
    sdk_binaries += [ destination ]
  }

  meta = {
    dest = "pkg/vulkan_layers/meta.json"
    schema = "loadable_module"
    value = {
      type = "loadable_module"
      name = "vulkan_layers"
      resources = []
      resources = sdk_resources
      binaries = {
      }
      if (target_cpu == "arm64") {
        binaries.arm64 = sdk_binaries
      } else if (target_cpu == "x64") {
        binaries.x64 = sdk_binaries
      } else {
        assert(false, "Unknown CPU type: %target_cpu")
      }
    }
  }
}

test_package("image-pipe-swapchain-tests") {
  deps = [
    ":image_pipe_swapchain",
    "tests/unit:test_image_pipe_swapchain",
    "//third_party/vulkan_loader_and_validation_layers/layers",
  ]

  tests = [
    {
      name = "test_image_pipe_swapchain"
      dest = "image-pipe-swapchain-tests"
      environments = magma_hardware_envs
    },
  ]
  public_deps =
      vulkan_validation_layers.public_deps + image_pipe_swapchain.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules +
                     image_pipe_swapchain.loadable_modules
  resources =
      vulkan_validation_layers.resources + image_pipe_swapchain.resources
}

package("vklatency_on_scenic") {
  testonly = true

  deps = [
    "tests/vklatency:vklatency_on_scenic",
    "//third_party/vulkan_loader_and_validation_layers/layers",
  ]
  binary = "vklatency_on_scenic"

  meta = [
    {
      path = rebase_path("meta/vklatency_on_scenic.cmx")
      dest = "vklatency_on_scenic.cmx"
    },
  ]

  public_deps =
      vulkan_validation_layers.public_deps + image_pipe_swapchain.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules +
                     image_pipe_swapchain.loadable_modules
  resources =
      vulkan_validation_layers.resources + image_pipe_swapchain.resources
}

package("vklatency_on_fb") {
  testonly = true

  deps = [
    "tests/vklatency:vklatency_on_fb",
    "//third_party/vulkan_loader_and_validation_layers/layers",
  ]
  binary = "vklatency_on_fb"

  meta = [
    {
      path = rebase_path("meta/vklatency_on_fb.cmx")
      dest = "vklatency_on_fb.cmx"
    },
  ]

  public_deps =
      vulkan_validation_layers.public_deps + image_pipe_swapchain_fb.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules +
                     image_pipe_swapchain_fb.loadable_modules
  resources =
      vulkan_validation_layers.resources + image_pipe_swapchain_fb.resources
}

package("vkcube_on_scenic") {
  testonly = true

  deps = [
    "tests/vkcube:vkcube_on_scenic",
    "//third_party/vulkan_loader_and_validation_layers/layers",
  ]
  binary = "vkcube_on_scenic"

  meta = [
    {
      path = rebase_path("meta/vkcube_on_scenic.cmx")
      dest = "vkcube_on_scenic.cmx"
    },
  ]

  public_deps =
      vulkan_validation_layers.public_deps + image_pipe_swapchain.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules +
                     image_pipe_swapchain.loadable_modules
  resources =
      [
        {
          path = rebase_path("tests/vkcube/bbb_frame.yuv")
          dest = "bbb_frame.yuv"
        },
      ] + vulkan_validation_layers.resources + image_pipe_swapchain.resources
}

package("vkcube_on_fb") {
  testonly = true

  deps = [
    "tests/vkcube:vkcube_on_fb",
    "//third_party/vulkan_loader_and_validation_layers/layers",
  ]
  binary = "vkcube_on_fb"

  meta = [
    {
      path = rebase_path("meta/vkcube_on_fb.cmx")
      dest = "vkcube_on_fb.cmx"
    },
  ]

  public_deps =
      vulkan_validation_layers.public_deps + image_pipe_swapchain_fb.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules +
                     image_pipe_swapchain_fb.loadable_modules
  resources =
      [
        {
          path = rebase_path("tests/vkcube/bbb_frame.yuv")
          dest = "bbb_frame.yuv"
        },
      ] + vulkan_validation_layers.resources + image_pipe_swapchain_fb.resources
}

package("vulkaninfo") {
  deps = [
    ":image_pipe_swapchain",
    "//third_party/vulkan_loader_and_validation_layers/demos:vulkaninfo_bin",
    "//third_party/vulkan_loader_and_validation_layers/layers",
  ]

  meta = [
    {
      path = rebase_path("meta/vulkaninfo.cmx")
      dest = "vulkaninfo.cmx"
    },
  ]

  binary = "vulkaninfo"

  public_deps =
      vulkan_validation_layers.public_deps + image_pipe_swapchain.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules +
                     image_pipe_swapchain.loadable_modules
  resources =
      vulkan_validation_layers.resources + image_pipe_swapchain.resources
}
