# 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("//build/fuchsia/sdk.gni")
import("//flutter/common/config.gni")
import("//flutter/impeller/tools/impeller.gni")
import("//flutter/testing/testing.gni")

source_set("display_list") {
  sources = [
    "display_list.cc",
    "display_list.h",
    "display_list_attributes.h",
    "display_list_blend_mode.cc",
    "display_list_blend_mode.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.h",
    "display_list_color_filter.cc",
    "display_list_color_filter.h",
    "display_list_color_source.cc",
    "display_list_color_source.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_image.cc",
    "display_list_image.h",
    "display_list_image_filter.cc",
    "display_list_image_filter.h",
    "display_list_image_skia.cc",
    "display_list_image_skia.h",
    "display_list_mask_filter.cc",
    "display_list_mask_filter.h",
    "display_list_ops.cc",
    "display_list_ops.h",
    "display_list_paint.cc",
    "display_list_paint.h",
    "display_list_path_effect.cc",
    "display_list_path_effect.h",
    "display_list_rtree.cc",
    "display_list_rtree.h",
    "display_list_sampling_options.h",
    "display_list_tile_mode.h",
    "display_list_utils.cc",
    "display_list_utils.h",
    "display_list_vertices.cc",
    "display_list_vertices.h",
    "types.h",
  ]

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

if (enable_unittests) {
  test_fixtures("display_list_fixtures") {
    fixtures = []
  }

  source_set("display_list_testing") {
    testonly = true

    sources = [
      "display_list_attributes_testing.h",
      "display_list_test_utils.cc",
      "display_list_test_utils.h",
    ]

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

    public_deps = [ ":display_list" ]
  }

  executable("display_list_unittests") {
    testonly = true

    sources = [
      "display_list_color_filter_unittests.cc",
      "display_list_color_source_unittests.cc",
      "display_list_color_unittests.cc",
      "display_list_complexity_unittests.cc",
      "display_list_enum_unittests.cc",
      "display_list_image_filter_unittests.cc",
      "display_list_mask_filter_unittests.cc",
      "display_list_paint_unittests.cc",
      "display_list_path_effect_unittests.cc",
      "display_list_unittests.cc",
      "display_list_utils_unittests.cc",
      "display_list_vertices_unittests.cc",
    ]

    deps = [
      ":display_list",
      ":display_list_fixtures",
      ":display_list_testing",
      "//flutter/testing",
    ]

    if (!defined(defines)) {
      defines = []
    }
    if (is_win) {
      # Required for M_PI and others.
      defines += [ "_USE_MATH_DEFINES" ]
    }

    # This is needed for //third_party/googletest for linking zircon symbols.
    if (is_fuchsia) {
      libs =
          [ "${fuchsia_sdk_path}/arch/${target_cpu}/sysroot/lib/libzircon.so" ]
    }
  }

  executable("display_list_rendertests") {
    testonly = true

    sources = [ "display_list_canvas_unittests.cc" ]

    deps = [
      ":display_list",
      ":display_list_fixtures",
      ":display_list_testing",
      "//flutter/testing",
    ]

    if (!defined(defines)) {
      defines = []
    }
    if (is_win) {
      # Required for M_PI and others.
      defines += [ "_USE_MATH_DEFINES" ]
    }

    # This is needed for //third_party/googletest for linking zircon symbols.
    if (is_fuchsia) {
      libs =
          [ "${fuchsia_sdk_path}/arch/${target_cpu}/sysroot/lib/libzircon.so" ]
    }
  }

  executable("display_list_builder_benchmarks") {
    testonly = true

    sources = [ "display_list_builder_benchmarks.cc" ]

    deps = [
      ":display_list",
      ":display_list_fixtures",
      ":display_list_testing",
      "//flutter/benchmarking",
      "//flutter/testing:testing_lib",
    ]
  }
}

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
  _enable_gl_benchmarks = !is_fuchsia && !is_ios

  # TODO (https://github.com/flutter/flutter/issues/107357):
  # impeller_enable_vulkan currently requires skia to not use VMA, which inturn
  # causes linkage problems with swiftshader.
  if (impeller_enable_vulkan) {
    _enable_gl_benchmarks = false
  }

  if (_enable_gl_benchmarks) {
    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",
    ]
  }
}
