# Copyright 2013 The Flutter 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("//flutter/common/config.gni")
import("//flutter/shell/gpu/gpu.gni")
import("//flutter/testing/testing.gni")

if (is_fuchsia) {
  import("//build/fuchsia/sdk.gni")
  import("//flutter/tools/fuchsia/fuchsia_archive.gni")
}

config("vulkan_config") {
  if (is_fuchsia) {
    include_dirs = [ "$fuchsia_sdk_root/vulkan/include" ]
  } else {
    include_dirs = [ "//third_party/vulkan/src" ]
  }

  if (is_fuchsia) {
    defines = [ "VK_USE_PLATFORM_FUCHSIA=1" ]
  }
}

# Template to generate a dart embedder resource.cc file.
# Required invoker inputs:
#   String output (name of output file)
#   List inputs (list of input files to be included)
#   String table_name (name of symbol for resource table)
#   String root_prefix (base directory of resources)
# Optional invoker inputs:
#   String input_directory (directory of resources that are recursively added)
#   List deps
#   List datadeps
template("dart_embedder_resources") {
  action(target_name) {
    script = "//third_party/dart/runtime/tools/create_resources.py"
    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    datadeps = []
    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }

    output = invoker.output
    outputs = [
      output,
    ]

    inputs = [ script ] + invoker.inputs

    root_prefix = rebase_path(invoker.root_prefix)

    args = [
      "--output",
      rebase_path(output),
      "--outer_namespace",
      "flutter",
      "--inner_namespace",
      "runtime",
      "--table_name",
      invoker.table_name,
      "--root_prefix",
      root_prefix,
    ]
    if (defined(invoker.input_directory)) {
      args += [
        "--client_root",
        rebase_path(invoker.input_directory),
      ]
    }
    args += rebase_path(invoker.inputs)
  }
}

source_set("common") {
  sources = [
    "animator.cc",
    "animator.h",
    "canvas_spy.cc",
    "canvas_spy.h",
    "engine.cc",
    "engine.h",
    "isolate_configuration.cc",
    "isolate_configuration.h",
    "persistent_cache.cc",
    "persistent_cache.h",
    "pipeline.cc",
    "pipeline.h",
    "platform_view.cc",
    "platform_view.h",
    "pointer_data_dispatcher.cc",
    "pointer_data_dispatcher.h",
    "rasterizer.cc",
    "rasterizer.h",
    "run_configuration.cc",
    "run_configuration.h",
    "shell.cc",
    "shell.h",
    "shell_io_manager.cc",
    "shell_io_manager.h",
    "skia_event_tracer_impl.cc",
    "skia_event_tracer_impl.h",
    "surface.cc",
    "surface.h",
    "switches.cc",
    "switches.h",
    "thread_host.cc",
    "thread_host.h",
    "vsync_waiter.cc",
    "vsync_waiter.h",
    "vsync_waiter_fallback.cc",
    "vsync_waiter_fallback.h",
  ]

  deps = [
    "//flutter/assets",
    "//flutter/common",
    "//flutter/flow",
    "//flutter/fml",
    "//flutter/lib/ui",
    "//flutter/runtime",
    "//third_party/dart/runtime:dart_api",
    "//third_party/skia",
  ]

  public_deps = [
    "//flutter/shell/version",
    "//flutter/third_party/tonic",
    "//flutter/third_party/txt",
    "//third_party/rapidjson",
  ]

  public_configs = [ "//flutter:config" ]
}

template("shell_host_executable") {
  executable(target_name) {
    testonly = true

    deps = []

    ldflags = []

    forward_variables_from(invoker, "*")

    deps += [
      ":common",
      "//flutter/fml",
      "//flutter/lib/snapshot",
      "//flutter/runtime",
      "//flutter/runtime:libdart",
      "//flutter/third_party/tonic",
      "//third_party/skia",
    ]

    public_configs = [ "//flutter:export_dynamic_symbols" ]
  }
}

if (enable_unittests) {
  declare_args() {
    test_enable_vulkan = is_fuchsia
    test_enable_gl = !is_fuchsia
    test_enable_software = true
    test_enable_metal = false
  }

  shell_gpu_configuration("shell_unittests_gpu_configuration") {
    enable_software = test_enable_software
    enable_vulkan = test_enable_vulkan
    enable_gl = test_enable_gl
    enable_metal = test_enable_metal
  }

  test_fixtures("shell_unittests_fixtures") {
    dart_main = "fixtures/shell_test.dart"

    fixtures = [ "fixtures/shelltest_screenshot.png" ]
  }

  shell_host_executable("shell_unittests") {
    sources = [
      "animator_unittests.cc",
      "canvas_spy_unittests.cc",
      "input_events_unittests.cc",
      "persistent_cache_unittests.cc",
      "pipeline_unittests.cc",
      "shell_test.cc",
      "shell_test.h",
      "shell_test_platform_view.cc",
      "shell_test_platform_view.h",
      "shell_unittests.cc",
      "vsync_waiters_test.cc",
      "vsync_waiters_test.h",
    ]

    deps = [
      ":shell_unittests_fixtures",
      ":shell_unittests_gpu_configuration",
      "//flutter/common",
      "//flutter/flow",
      "//flutter/fml/dart",
      "//flutter/lib/ui:ui",
      "//flutter/shell",
      "//flutter/testing",
      "//flutter/testing:dart",
    ]

    if (!defined(defines)) {
      defines = []
    }

    # SwiftShader only supports x86/x64_64
    if (target_cpu == "x86" || target_cpu == "x64") {
      if (test_enable_gl) {
        sources += [
          "shell_test_platform_view_gl.cc",
          "shell_test_platform_view_gl.h",
        ]

        deps += [ "//flutter/testing:opengl" ]

        defines += [ "SHELL_ENABLE_GL" ]
      }

      if (test_enable_vulkan) {
        sources += [
          "shell_test_platform_view_vulkan.cc",
          "shell_test_platform_view_vulkan.h",
        ]

        deps += [
          "//flutter/testing:vulkan",
          "//flutter/vulkan",
        ]

        defines += [ "SHELL_ENABLE_VULKAN" ]
      }
    }
  }

  if (is_fuchsia) {
    fuchsia_test_archive("shell_tests") {
      deps = [
        ":shell_unittests",
        ":shell_unittests_fixtures",
      ]

      binary = "shell_unittests"

      # TODO(gw280): https://github.com/flutter/flutter/issues/50294
      # Right now we need to manually specify all the fixtures that are
      # declared in the test_fixtures() call above.
      resources = [
        {
          path = "$target_gen_dir/assets/kernel_blob.bin"
          dest = "assets/kernel_blob.bin"
        },
        {
          path = "$target_gen_dir/assets/shelltest_screenshot.png"
          dest = "assets/shelltest_screenshot.png"
        },
      ]
    }
  }

  shell_host_executable("shell_benchmarks") {
    sources = [
      "shell_benchmarks.cc",
    ]

    deps = [
      ":shell_unittests_fixtures",
      "//flutter/benchmarking",
      "//flutter/testing:dart",
      "//flutter/testing:testing_lib",
    ]
  }
}
