# 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_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_dispatcher.cc",
    "display_list_dispatcher.h",
    "display_list_flags.cc",
    "display_list_flags.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_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/"
}

if (enable_unittests) {
  executable("display_list_benchmarks") {
    testonly = true

    sources = [
      "display_list_benchmarks.cc",
      "display_list_benchmarks.h",
      "display_list_benchmarks_software.cc",
      "display_list_benchmarks_software.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 = [ "ENABLE_SOFTWARE_BENCHMARKS" ]

    if (!is_fuchsia) {
      defines += [ "ENABLE_OPENGL_BENCHMARKS" ]
      sources += [
        "display_list_benchmarks_gl.cc",
        "display_list_benchmarks_gl.h",
      ]
      deps += [ "//flutter/testing:opengl" ]
    }

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

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" ]
    defines = [
      "BENCHMARKS_NO_SNAPSHOT",
      "ENABLE_METAL_BENCHMARKS",
    ]
    sources = [
      "display_list_benchmarks.cc",
      "display_list_benchmarks.h",
      "display_list_benchmarks_metal.cc",
      "display_list_benchmarks_metal.h",
    ]

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