# 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/third_party/glfw/glfw_args.gni")
import("tools/impeller.gni")

config("impeller_public_config") {
  include_dirs = [ ".." ]

  defines = []

  if (impeller_debug) {
    defines += [ "IMPELLER_DEBUG=1" ]
  }

  if (impeller_capture) {
    defines += [ "IMPELLER_ENABLE_CAPTURE=1" ]
  }

  if (impeller_supports_rendering) {
    defines += [ "IMPELLER_SUPPORTS_RENDERING=1" ]
  }

  if (impeller_enable_metal) {
    defines += [ "IMPELLER_ENABLE_METAL=1" ]
  }

  if (impeller_enable_opengles) {
    defines += [ "IMPELLER_ENABLE_OPENGLES=1" ]
  }

  if (impeller_enable_vulkan) {
    defines += [ "IMPELLER_ENABLE_VULKAN=1" ]
  }

  if (impeller_enable_vulkan_playgrounds) {
    defines += [ "IMPELLER_ENABLE_VULKAN_PLAYGROUNDS=1" ]
  }

  if (impeller_trace_all_gl_calls) {
    defines += [ "IMPELLER_TRACE_ALL_GL_CALLS" ]
  }

  if (is_win) {
    defines += [
      # TODO(dnfield): https://github.com/flutter/flutter/issues/50053
      "_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING",
    ]
  }

  if (impeller_enable_3d) {
    defines += [ "IMPELLER_ENABLE_3D" ]
  }
}

group("impeller") {
  public_deps = [
    "base",
    "geometry",
    "tessellator",
  ]

  if (impeller_supports_rendering) {
    public_deps += [
      "aiks",
      "display_list",
      "entity",
      "renderer",
      "renderer/backend",
      "typographer/backends/skia:typographer_skia_backend",
    ]
  }
}

impeller_component("impeller_unittests") {
  target_type = "executable"

  testonly = true

  deps = [
    "base:base_unittests",
    "compiler:compiler_unittests",
    "core:allocator_unittests",
    "display_list:skia_conversions_unittests",
    "geometry:geometry_unittests",
    "renderer/backend/metal:metal_unittests",
    "runtime_stage:runtime_stage_unittests",
    "scene/importer:importer_unittests",
    "shader_archive:shader_archive_unittests",
    "tessellator:tessellator_unittests",
  ]

  if (impeller_supports_rendering) {
    deps += [
      "aiks:aiks_unittests",
      "display_list:display_list_unittests",
      "entity:entity_unittests",
      "fixtures",
      "geometry:geometry_unittests",
      "playground",
      "renderer:renderer_unittests",
      "scene:scene_unittests",
      "typographer:typographer_unittests",
    ]
  }

  if (impeller_enable_vulkan) {
    deps += [ "//flutter/impeller/renderer/backend/vulkan:vulkan_unittests" ]
  }

  if (impeller_enable_opengles) {
    deps += [ "//flutter/impeller/renderer/backend/gles:gles_unittests" ]
  }

  if (glfw_vulkan_library != "") {
    deps += [
      "//flutter/third_party/swiftshader",
      "//flutter/third_party/vulkan-deps/vulkan-loader/src:libvulkan",
      "//third_party/vulkan_validation_layers",
      "//third_party/vulkan_validation_layers:vulkan_gen_json_files",
    ]
  }

  if (impeller_enable_compute) {
    deps += [ "renderer:compute_tessellation_unittests" ]
  }
}

if (impeller_supports_rendering) {
  impeller_component("impeller_dart_unittests") {
    target_type = "executable"

    testonly = true

    deps = [ "renderer:renderer_dart_unittests" ]
  }
}
