# Copyright 2023 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("../../gni/angle.gni")

declare_args() {
  angle_enable_tracegz = false
}

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

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

    _trace_data = read_file(invoker.json_file_name, "json")
    parsed_json = _trace_data.TraceMetadata

    if (defined(invoker.rebased_path)) {
      sources = rebase_path(_trace_data.TraceFiles, ".", invoker.rebased_path)
    } else {
      sources = _trace_data.TraceFiles
    }

    # Dummy statement to enable the use of defined(parsed_json.IsOpenCL)
    if (parsed_json.IsBinaryDataCompressed) {
    }

    if (defined(parsed_json.IsOpenCL) && parsed_json.IsOpenCL &&
        angle_enable_cl) {
      deps = [ "$angle_root/util:angle_trace_fixture_cl" ]
    } else {
      deps = [ "$angle_root/util:angle_trace_fixture" ]
    }

    deps += [ "$angle_root/util:angle_trace_loader" ]

    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    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:optimize_max",
        "//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_libs") {
  # Uses a short name to work around file path limits on Windows.
  short_names = false
}

template("angle_trace_libs") {
  _trace_list = []
  _trace_targets = []
  _trace_lib_files = []

  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]
    _trace_list += [ _trace ]
    if (defined(invoker.trace_dir)) {
      _trace_dir = invoker.trace_dir
    } else {
      _trace_dir = _trace
    }
    _trace_json_path = "$_trace_dir/$_trace.json"
    json_file_name = _trace_json_path
    rebased_path = _trace_dir

    if (invoker.short_names) {
      _target = "cr_trace_${_trace_counter}"
      _trace_counter += 1
    } else {
      _target = "${target_name}_$_trace"
    }

    if (angle_enable_tracegz) {
      _gen_tracegz_target = "gen${target_name}_$_trace"
      action(_gen_tracegz_target) {
        script = "//scripts/tracegz.py"
        args = [
          _trace,
          rebase_path(_trace_dir, root_build_dir),
        ]
        outputs = [ "$root_gen_dir/tracegz_$_trace.gz" ]
      }
    }

    angle_trace(_target) {
      data = [
        "$_trace_dir/$_trace.json",
        "$_trace_dir/$_trace.angledata.gz",
      ]

      deps = []

      if (angle_enable_cl) {
        deps += [ "$angle_root/src/libOpenCL:OpenCL_ANGLE" ]
      }

      if (angle_enable_tracegz) {
        deps += [ ":$_gen_tracegz_target" ]
        data += [ "$root_gen_dir/tracegz_$_trace.gz" ]
      }

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

    _trace_targets += [ ":$_target" ]
    _trace_lib_files += [ "${root_out_dir}/lib${_target}.so" ]
  }

  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" ]
  }

  if (restricted_traces_outside_of_apk) {
    group("${target_name}__unpacked_libs") {
      testonly = true
      deps = [
        ":angle_restricted_traces",
        "$angle_root/util:angle_trace_interpreter",
      ]

      # Also need files listed as data to be picked up by isolate
      data =
          _trace_lib_files + [ "${root_out_dir}/libangle_trace_interpreter.so" ]
    }
  }

  group("gen_trace_list_json") {
    _output_json_path = "$root_gen_dir/trace_list.json"
    write_file(_output_json_path, _trace_list, "json")

    data = [ _output_json_path ]
  }
}
