# 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/testing/testing.gni")

source_set("display_list") {
  sources = [
    "display_list.cc",
    "display_list.h",
    "display_list_attributes.h",
    "display_list_builder.cc",
    "display_list_builder.h",
    "display_list_canvas_dispatcher.cc",
    "display_list_canvas_dispatcher.h",
    "display_list_canvas_recorder.cc",
    "display_list_canvas_recorder.h",
    "display_list_color_filter.cc",
    "display_list_color_filter.h",
    "display_list_complexity.cc",
    "display_list_complexity.h",
    "display_list_complexity_gl.cc",
    "display_list_complexity_gl.h",
    "display_list_complexity_metal.cc",
    "display_list_complexity_metal.h",
    "display_list_dispatcher.cc",
    "display_list_dispatcher.h",
    "display_list_flags.cc",
    "display_list_flags.h",
    "display_list_mask_filter.cc",
    "display_list_mask_filter.h",
    "display_list_ops.cc",
    "display_list_ops.h",
    "display_list_utils.cc",
    "display_list_utils.h",
    "types.h",
  ]

  public_deps = [
    "//flutter/fml",
    "//third_party/skia",
  ]
}

# Instead of creating a new test harness for display lists, the flow_unittests
# harness includes these in its own.
source_set("unittests") {
  testonly = true

  sources = [
    "display_list_canvas_unittests.cc",
    "display_list_color_filter_unittests.cc",
    "display_list_complexity_unittests.cc",
    "display_list_mask_filter_unittests.cc",
    "display_list_test_utils.cc",
    "display_list_test_utils.h",
    "display_list_unittests.cc",
  ]

  deps = [
    "//flutter/testing:testing_lib",
    "//third_party/skia",
  ]

  public_deps = [ ":display_list" ]
}

fixtures_location("display_list_benchmarks_fixtures") {
  assets_dir = "$target_gen_dir/"
}

source_set("display_list_benchmarks_source") {
  testonly = true

  sources = [
    "display_list_benchmarks.cc",
    "display_list_benchmarks.h",
  ]

  deps = [
    ":display_list",
    ":display_list_benchmarks_fixtures",
    "//flutter/benchmarking",
    "//flutter/common/graphics",
    "//flutter/fml",
    "//flutter/testing:skia",
    "//flutter/testing:testing_lib",
    "//third_party/dart/runtime:libdart_jit",  # for tracing
    "//third_party/skia",
  ]

  defines = []

  if (is_android) {
    libs = [
      "android",
      "EGL",
      "GLESv2",
    ]
  }

  # We only do software benchmarks on non-mobile platforms
  if (!is_android && !is_ios) {
    sources += [
      "display_list_benchmarks_software.cc",
      "display_list_benchmarks_software.h",
    ]
    defines += [ "ENABLE_SOFTWARE_BENCHMARKS" ]
  }

  # iOS and Fuchsia don't support OpenGL
  if (!is_fuchsia && !is_ios) {
    defines += [ "ENABLE_OPENGL_BENCHMARKS" ]
    sources += [
      "display_list_benchmarks_gl.cc",
      "display_list_benchmarks_gl.h",
    ]
    deps += [ "//flutter/testing:opengl" ]
  }

  if (is_mac || is_ios) {
    defines += [ "ENABLE_METAL_BENCHMARKS" ]
    sources += [
      "display_list_benchmarks_metal.cc",
      "display_list_benchmarks_metal.h",
    ]
    deps += [ "//flutter/testing:metal" ]
  }

  # Don't snapshot test results on mobile platforms
  if (is_android || is_ios) {
    defines += [ "BENCHMARKS_NO_SNAPSHOT" ]
  }
}

executable("display_list_benchmarks") {
  testonly = true

  deps = [ ":display_list_benchmarks_source" ]
}

if (is_ios) {
  shared_library("ios_display_list_benchmarks") {
    testonly = true
    visibility = [ ":*" ]

    configs -= [
      "//build/config/gcc:symbol_visibility_hidden",
      "//build/config:symbol_visibility_hidden",
    ]
    configs += [ "//flutter/benchmarking:benchmark_library_config" ]
    cflags = [
      "-fobjc-arc",
      "-mios-simulator-version-min=$ios_testing_deployment_target",
    ]
    ldflags =
        [ "-Wl,-install_name,@rpath/libios_display_list_benchmarks.dylib" ]
    deps = [
      ":display_list_benchmarks_source",
      "//flutter/benchmarking:benchmarking_library",
    ]
  }
}
