# Copyright 2019 The ANGLE Project 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_overrides/angle.gni")

declare_args() {
  is_ggp = false

  # Extract native libs in ANGLE apk. Useful for flamegraph generation.
  angle_extract_native_libs = false

  # Display mode for ANGLE vulkan display, could be 'simple' or 'headless', default is 'simple'.
  angle_vulkan_display_mode = "simple"

  # Defaults to capture building to $root_out_dir/angle_libs/with_capture.
  # Switch on to build capture to $root_out_dir.
  angle_with_capture_by_default = false

  # Enables OpenCL support, off by default.
  angle_enable_cl = false

  angle_restricted_traces = []

  # Don't build dEQP by default.
  build_angle_deqp_tests = false

  # Enable Desktop GL frontend support.
  angle_enable_gl_desktop_frontend = false
}

declare_args() {
  # Expose WGL entry points, which is necessary for running windows desktop GL applications against ANGLE.
  # TODO(http://anglebug.com/7628): This condition should be `angle_enable_gl_desktop_frontend && is_win`
  # This is disabled by default on Windows because it was causing some test failures. Once the WGL frontend
  # has more functionality implemented, we can re-enable this.
  angle_expose_wgl_entry_points = false

  # Expose GLX entry points by default when using Desktop GL on Linux.
  angle_expose_glx_entry_points = angle_enable_gl_desktop_frontend && is_linux
}

if (angle_has_build) {
  import("//build/config/dcheck_always_on.gni")
  import("//build/config/ozone.gni")  # import the ozone_platform_x11 variable
  import("//build/config/sanitizers/sanitizers.gni")
  import("//build_overrides/build.gni")
  import("//testing/test.gni")
  if (is_android) {
    import("//build/config/android/config.gni")
  }

  if (is_win) {
    import("//build/config/win/visual_studio_version.gni")
  }

  if (is_castos || ozone_platform_headless) {
    angle_vulkan_display_mode = "headless"
  }

  declare_args() {
    angle_use_gbm = ozone_platform_gbm
    angle_use_x11 =
        ozone_platform_x11 && !is_ggp && (is_linux || is_chromeos) && !is_castos
    angle_use_wayland =
        ozone_platform_wayland && !is_ggp && is_linux && !is_castos
    angle_use_vulkan_display = (is_linux || is_chromeos) && !is_ggp
  }
} else {
  declare_args() {
    is_ubsan = false
    is_tsan = false
    is_asan = false
    is_lsan = false
    build_with_chromium = false
    dcheck_always_on = false
    angle_use_x11 = (is_linux || is_chromeos) && !is_ggp
    angle_use_wayland = is_linux && !is_ggp
    use_ozone = false
    ozone_platform_gbm = false
    ozone_platform_wayland = false
    ozone_platform_headless = false
    use_fuzzing_engine = false
    is_apple = is_mac || is_ios
  }

  declare_args() {
    angle_use_vulkan_display = (is_linux || is_chromeos) && !is_ggp
  }
}

# Subdirectory to place data files (e.g. layer JSON files).
angle_data_dir = "angledata"

declare_args() {
  angle_assert_always_on = dcheck_always_on

  if (current_cpu == "arm64" || current_cpu == "x64" ||
      current_cpu == "mips64el" || current_cpu == "s390x" ||
      current_cpu == "ppc64" || current_cpu == "loong64") {
    angle_64bit_current_cpu = true
  } else if (current_cpu == "arm" || current_cpu == "x86" ||
             current_cpu == "mipsel" || current_cpu == "s390" ||
             current_cpu == "ppc" || current_cpu == "loong32") {
    angle_64bit_current_cpu = false
  } else {
    assert(false, "Unknown current CPU: $current_cpu")
  }

  # Indicate if the rapidJSON library is available to build with in third_party/.
  angle_has_rapidjson = angle_has_build
}

declare_args() {
  # By default we enable debug layers when asserts are turned on.
  angle_debug_layers_enabled = is_debug || angle_assert_always_on

  if (!is_android) {
    ndk_api_level_at_least_26 = false
  } else {
    ndk_api_level_at_least_26 =
        (!angle_64bit_current_cpu && android32_ndk_api_level >= 26) ||
        (angle_64bit_current_cpu && android64_ndk_api_level >= 26)
  }

  # Vulkan loader is statically linked on Mac. http://anglebug.com/4477
  angle_shared_libvulkan = !is_mac

  # There's no "is_winuwp" helper in BUILDCONFIG.gn, so we define one ourselves
  angle_is_winuwp = is_win && target_os == "winuwp"

  # Default to using "_angle" suffix on Android
  if (is_android) {
    angle_libs_suffix = "_angle"
  } else {
    angle_libs_suffix = ""
  }

  # Currently Windows on Arm doesn't support OpenGL or Vulkan.
  is_win_arm64 = is_win && target_cpu == "arm64"

  # Frame capture code is enabled by default if rapidjson is available.
  angle_has_frame_capture = angle_has_rapidjson

  # By default, include the SPIR-V based MSL translator (in addition to the direct translator)
  angle_enable_msl_through_spirv = is_mac
}

declare_args() {
  # By default, ANGLE is using a thread pool for parallel compilation.
  # Activating the delegate worker results in posting the tasks using the
  # embedder API. In Chromium code base, it results in sending tasks to the
  # worker thread pool.
  angle_delegate_workers = build_with_chromium

  # True if we are building inside an ANGLE checkout.
  angle_standalone = !build_with_chromium

  angle_enable_d3d9 = is_win && !angle_is_winuwp
  angle_enable_d3d11 = is_win
  angle_enable_gl =
      (ozone_platform_gbm || ozone_platform_wayland || !is_linux ||
       ((angle_use_x11 && !is_chromeos) || angle_use_wayland)) && !is_fuchsia &&
      !angle_is_winuwp && !is_ggp && !is_win_arm64

  angle_enable_vulkan =
      angle_has_build &&
      !(is_android && build_with_chromium && is_official_build) &&
      ((is_win && !angle_is_winuwp) ||
       ((is_linux || is_chromeos) &&
        (angle_use_x11 || angle_use_wayland || angle_use_vulkan_display)) ||
       is_android || is_fuchsia || is_ggp || angle_enable_msl_through_spirv)

  # When set to true, ANGLE will not use VK_KHR_surface and VK_KHR_swapchain
  # extensions. Content can be rendered only off-screen.
  angle_use_vulkan_null_display = build_with_chromium && is_fuchsia

  # Disable null backend to save space for official build.
  angle_enable_null = !is_official_build
  angle_enable_gl_desktop_backend = !is_android && !is_ios

  # http://anglebug.com/2634
  angle_enable_metal = is_mac

  # Enables the OpenCL pass-through back end
  angle_enable_cl_passthrough = angle_enable_cl

  # Use glslang to generate SPIR-V
  angle_use_spirv_gen_through_glslang = false
}

declare_args() {
  # ASTC emulation is only built on standalone non-android builds
  angle_has_astc_encoder = angle_has_build && angle_standalone && !is_android
}

declare_args() {
  angle_test_enable_system_egl = false
}

# OpenCL is not supported on Windows UWP, because the CL headers include DX9, which is not
# supported by UWP. A workaround might be possible if CL support on UWP is required.
assert(!angle_is_winuwp || !angle_enable_cl,
       "OpenCL is not supported on Windows UWP")

if (!angle_enable_cl) {
  angle_enable_cl_passthrough = false
}

declare_args() {
  # Currently SwiftShader's Vulkan front-end doesn't build on Android.
  # Disabled by default on MSVC because of compiler warnings/errors.
  angle_enable_swiftshader =
      angle_enable_vulkan && !is_android && !is_ggp && is_clang

  # Translator frontend support:
  angle_enable_desktop_glsl = angle_enable_gl_desktop_frontend

  # Translator backend support:
  angle_enable_hlsl = angle_enable_d3d9 || angle_enable_d3d11
  angle_enable_essl = angle_enable_gl || use_ozone
  angle_enable_glsl = angle_enable_gl || use_ozone
  angle_enable_trace = false
  angle_enable_trace_android_logcat = false
  angle_enable_trace_events = false

  # Disable the layers in ubsan builds because of really slow builds.
  # Vulkan Validation Layers require Android NDK API level 26, i.e. Oreo, due to
  # Vulkan Validation Layers compatibility issues, see http://crrev/c/1405714.
  angle_enable_vulkan_validation_layers =
      angle_enable_vulkan && !is_ubsan && !is_tsan && !is_asan &&
      angle_debug_layers_enabled && (!is_android || ndk_api_level_at_least_26)

  # Support using glslang to generate SPIR-V for the time being for the purpose of debugging
  # the SPIR-V generation path, but leave it disabled on release.  It's still used by the metal
  # backend nevertheless.
  angle_enable_spirv_gen_through_glslang =
      is_debug || angle_assert_always_on || angle_enable_msl_through_spirv ||
      angle_use_spirv_gen_through_glslang

  # ISpriteVisual windows cannot be validated and can lead to crashes if an invalid window is
  # provided to ANGLE. Disable them for non-standalone ANGLE builds. crbug.com/1176118
  angle_enable_d3d11_compositor_native_window =
      angle_enable_d3d11 && angle_standalone

  # Disable performance counter output by default
  angle_enable_perf_counter_output = false

  # We should use EAGL (ES) on iOS except on Mac Catalyst on Intel CPUs, which uses CGL (desktop GL).
  angle_enable_eagl = angle_enable_gl && is_ios &&
                      !(target_environment == "catalyst" &&
                        (target_cpu == "x86" || target_cpu == "x64"))

  # Directory where to find wayland source files
  angle_wayland_dir = "$angle_root/third_party/wayland"

  angle_vulkan_headers_dir =
      "$angle_root/third_party/vulkan-deps/vulkan-headers/src"
  angle_vulkan_loader_dir =
      "$angle_root/third_party/vulkan-deps/vulkan-loader/src"
  angle_vulkan_tools_dir =
      "$angle_root/third_party/vulkan-deps/vulkan-tools/src"
  angle_vulkan_validation_layers_dir =
      "$angle_root/third_party/vulkan-deps/vulkan-validation-layers/src"

  angle_build_vulkan_system_info = angle_has_build && !angle_is_winuwp

  # Enable overlay by default when debug layers are enabled.  This is currently only implemented on
  # Vulkan.
  angle_enable_overlay = angle_enable_vulkan && angle_debug_layers_enabled
}

declare_args() {
  # TODO(jdarpinian): Support enabling CGL and EAGL at the same time using the soft linking code. Also support disabling both for Metal-only builds.
  angle_enable_cgl = angle_enable_gl && !angle_enable_eagl && is_apple

  angle_enable_apple_translator_workarounds =
      is_apple &&
      (angle_enable_glsl || angle_enable_metal || use_fuzzing_engine)

  angle_has_histograms = angle_has_build

  # True if we want to build the ANGLE test suites. On by default in most configs.
  angle_build_tests = angle_has_build
}

declare_args() {
  angle_enable_renderdoc = angle_enable_vulkan_validation_layers
}

if (!defined(angle_zlib_compression_utils_dir)) {
  angle_zlib_compression_utils_dir = "//third_party/zlib/google"
}

angle_common_configs = [
  angle_root + ":angle_asserts_config",
  angle_root + ":constructor_and_destructor_warnings",
  angle_root + ":extra_warnings",
  angle_root + ":internal_config",
  angle_root + ":angle_uwp_env",
]

angle_remove_configs = []

if (angle_has_build) {
  angle_remove_configs += [ "//build/config/compiler:default_include_dirs" ]
}

if (angle_has_build && is_clang) {
  angle_remove_configs += [ "//build/config/clang:find_bad_constructs" ]
}

set_defaults("angle_executable") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
  data_deps = []
}

set_defaults("angle_shared_library") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
}

set_defaults("angle_source_set") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
}

set_defaults("angle_static_library") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
}

set_defaults("angle_test") {
  # Gtest itself can't pass all the strict warning filters.
  configs = angle_common_configs - [
              "$angle_root:constructor_and_destructor_warnings",
              "$angle_root:extra_warnings",
            ] + [ "$angle_root/src/tests:angle_maybe_has_histograms" ] +
            [ "$angle_root/src/tests:angle_enable_renderdoc" ]

  public_configs = []
  public_deps = []
  sources = []
  data = []
  defines = []
  deps = []
  data_deps = []
  suppressed_configs = angle_remove_configs
}

template("angle_executable") {
  executable(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs

    if (angle_has_build && is_win) {
      data_deps += [ "//build/win:runtime_libs" ]
    }

    if (is_ios) {
      check_includes = false
    }
  }
}

template("angle_shared_library") {
  # On ios, define an ios_framework_bundle instead of a shared library.
  # ios_framework_bundle doesn't automatically link, so we have to create
  # a group that links and bundles the framework as well.
  target_type = "shared_library"
  internal_target_name = target_name
  if (is_ios) {
    target_type = "ios_framework_bundle"
    internal_target_name = target_name + "_framework"
  }
  target(target_type, internal_target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs

    public_configs += [ angle_root + ":shared_library_public_config" ]

    if (is_android) {
      configs += [ angle_root + ":build_id_config" ]
      configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
    }
    if (is_ios) {
      info_plist = "$angle_root/util/ios/Info.plist"

      # shared libraries are hidden inside ios_framework_bundle, but we include headers from them
      # Specifically, libGLESv1_CM includes headers from libGLESv2
      check_includes = false
    }
  }
  if (is_ios) {
    group(target_name) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      public_deps = [
        ":${internal_target_name}+bundle",
        ":${internal_target_name}+link",
      ]
    }
  }
}

template("angle_source_set") {
  source_set(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs
  }
}

template("angle_static_library") {
  static_library(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs
  }
}

if (angle_standalone || build_with_chromium) {
  template("angle_test") {
    test(target_name) {
      forward_variables_from(invoker,
                             "*",
                             [
                               "configs",
                               "data",
                               "public_deps",
                             ])

      configs += invoker.configs
      configs -= invoker.suppressed_configs

      if (is_ios) {
        # shared libraries are hidden inside ios_framework_bundle, but we include headers from them
        check_includes = false
      }

      public_deps = invoker.public_deps + [
                      "$angle_root:angle_common",
                      "$angle_root:includes",
                      "$angle_root/src/tests:angle_test_expectations",
                      "$angle_root/third_party/rapidjson:rapidjson",
                      "$angle_root/util:angle_test_utils",
                      "//testing/gmock",
                      "//testing/gtest",
                      "//third_party/googletest:gmock",
                      "//third_party/googletest:gtest",
                    ]

      data = invoker.data + [
               "$angle_root/src/tests/py_utils/android_helper.py",
               "$angle_root/src/tests/py_utils/angle_path_util.py",
               "$angle_root/src/tests/py_utils/angle_test_util.py",
               "//testing/scripts/common.py",
               "//testing/xvfb.py",
             ]

      sources += [
        "$angle_root/src/tests/test_utils/runner/HistogramWriter.h",
        "$angle_root/src/tests/test_utils/runner/TestSuite.cpp",
        "$angle_root/src/tests/test_utils/runner/TestSuite.h",
      ]

      if (angle_has_histograms) {
        sources +=
            [ "$angle_root/src/tests/test_utils/runner/HistogramWriter.cpp" ]
        deps += [
          "//third_party/catapult/tracing/tracing:histogram",
          "//third_party/catapult/tracing/tracing:reserved_infos",
        ]
      }

      if (is_mac) {
        if (angle_enable_metal) {
          # On macOS, compiling Metal shader sometimes takes very long time due to internal caching
          # mechanism. This hooking library is a way to bypass this caching mechanism.
          data_deps += [ "$angle_root/src/libANGLE/renderer/metal/file_hooking:metal_shader_cache_file_hooking" ]
        }
        if (angle_enable_cgl) {
          configs += [ "$angle_root:supports_automatic_graphics_switching" ]
        }
      }

      if ((is_linux && !is_chromeos) ||
          (build_with_chromium && is_chromeos_lacros && !is_chromeos_device)) {
        use_xvfb = true
      }

      if ((is_linux || is_chromeos) && !is_component_build) {
        # Set rpath to find shared libs in a non-component build.
        configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
      }

      if (is_android) {
        public_configs += [ "$angle_root:build_id_config" ]
        configs -= [ "//build/config/android:hide_all_but_jni" ]
        use_default_launcher = false
        generate_final_jni = false
        android_manifest_template = "$angle_root/src/tests/test_utils/runner/android/java/AndroidManifest.xml.jinja2"
        deps += [
          "$angle_root/src/tests:native_test_java",
          "$angle_root/src/tests:native_test_support_android",
        ]
      }
      if (is_ios) {
        # We use a special main function on iOS to initialize UIKit before the normal main runs.
        ldflags = [
          "-e",
          "_ios_main",
        ]
        sources += [ "$angle_root/util/ios/ios_main.mm" ]
      }

      if (angle_has_build && is_win) {
        data_deps += [ "//build/win:runtime_libs" ]
      }
    }
  }
}

template("angle_trace") {
  angle_shared_library(target_name) {
    testonly = true

    # Similar to capture replay sample, use the file index for sources
    sources = invoker.sources

    data = invoker.data
    defines = [ "ANGLE_REPLAY_IMPLEMENTATION" ]
    suppressed_configs += [ "$angle_root:constructor_and_destructor_warnings" ]

    deps = [ "$angle_root:angle_trace_fixture" ]

    if (is_android) {
      libs = [ "log" ]
    }

    # Disable optimization in the trace perf tests to avoid optimizing huge files.
    if (!is_debug && !is_ubsan) {
      suppressed_configs += [
        "//build/config/compiler:afdo",
        "//build/config/compiler:afdo_optimize_size",
        "//build/config/compiler:default_optimization",
        "//build/config/compiler/pgo:default_pgo_flags",
      ]
      configs += [ "//build/config/compiler:no_optimize" ]
    }

    include_dirs = [ "." ]

    if (defined(invoker.output_name)) {
      output_name = invoker.output_name
    }
  }
}

set_defaults("angle_trace_library") {
  # Uses a short name to work around file path limits on Windows.
  short_names = false
}

template("angle_trace_library") {
  _trace_targets = []

  if (invoker.short_names) {
    _trace_counter = 1
  }

  foreach(_trace_and_version, invoker.trace_list) {
    _trace_and_version_arr = []
    _trace_and_version_arr = string_split(_trace_and_version)
    _trace = _trace_and_version_arr[0]
    if (defined(invoker.trace_dir)) {
      _trace_dir = invoker.trace_dir
    } else {
      _trace_dir = _trace
    }
    _trace_json_path = "$_trace_dir/$_trace.json"
    _trace_data = []
    _trace_data = read_file(_trace_json_path, "json")

    if (invoker.short_names) {
      _target = "cr_trace_${_trace_counter}"
      _trace_counter += 1
    } else {
      _target = "${target_name}_$_trace"
    }
    angle_trace(_target) {
      sources = rebase_path(_trace_data.TraceFiles, ".", _trace_dir)

      data = [
        "$_trace_dir/$_trace.json",
        "$_trace_dir/$_trace.angledata.gz",
      ]

      if (invoker.short_names) {
        output_name = _trace
      }
    }

    _trace_targets += [ ":$_target" ]
  }

  angle_shared_library(target_name) {
    testonly = true
    data = [ invoker.json_path ]
    data_deps = _trace_targets
    deps = [ "$angle_root:angle_common" ]
    public_deps = [ "$angle_root/util:angle_trace_loader" ]
  }
}
