# 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/compiled_action.gni")
import("//flutter/common/config.gni")
import("//flutter/testing/testing.gni")

declare_args() {
  # Path to the Mali offline compiler tool 'malioc'.
  impeller_malioc_path = ""

  impeller_malioc_cores = []
}

if (impeller_malioc_path != "" && impeller_malioc_cores == []) {
  core_list_file = "$root_build_dir/mali_core_list.json"
  exec_script("//build/gn_run_binary.py",
              [
                rebase_path(impeller_malioc_path, root_build_dir),
                "--list",
                "--format",
                "json",
                "--output",
                rebase_path(core_list_file),
              ])
  _mali_cores = read_file(core_list_file, "json")
  foreach(mali_core, _mali_cores.cores) {
    impeller_malioc_cores += [ mali_core.core ]
  }
}

template("malioc_analyze_shaders") {
  # TODO(zra): Check that gles_language_version is in the supported set. For now
  # assume that if it is set, it is being set to 460, which malioc does not
  # support.
  if (impeller_malioc_path == "" || defined(invoker.gles_language_version)) {
    if (defined(invoker.gles_language_version) &&
        invoker.gles_language_version != "460") {
      print("Disabling analysis for shaders in $target_name due to gles",
            "version explicitly set to ${invoker.gles_language_version}.")
    }
    group(target_name) {
      not_needed(invoker, "*")
    }
  } else {
    target_deps = []
    foreach(core, impeller_malioc_cores) {
      foreach(source, invoker.shaders) {
        shader_file_name = get_path_info(source, "name")
        analysis_target = "${target_name}_${shader_file_name}_${core}_malioc"
        target_deps += [ ":$analysis_target" ]
        action(analysis_target) {
          forward_variables_from(invoker,
                                 "*",
                                 [
                                   "args",
                                   "depfile",
                                   "inputs",
                                   "outputs",
                                   "pool",
                                   "script",
                                 ])

          script = "//build/gn_run_binary.py"
          pool = "//flutter/impeller/tools:malioc_pool"

          # Should be "gles" or "vkspv"
          backend_ext = get_path_info(source, "extension")
          assert(backend_ext == "gles",
                 "Shader for unsupported backend passed to malioc: {{source}}")

          # Nest all malioc output under its own subdirectory of root_gen_dir
          # so that it's easier to diff it against the state before any changes.
          subdir = rebase_path(target_gen_dir, root_gen_dir)
          output_file =
              "$root_gen_dir/malioc/$subdir/${shader_file_name}.$core.json"
          outputs = [ output_file ]

          # Determine the kind of the shader from the file name
          name = get_path_info(source, "name")
          shader_kind_ext = get_path_info(name, "extension")

          if (shader_kind_ext == "comp") {
            shader_kind_flag = "--compute"
          } else if (shader_kind_ext == "frag") {
            shader_kind_flag = "--fragment"
          } else if (shader_kind_ext == "geom") {
            shader_kind_flag = "--geometry"
          } else if (shader_kind_ext == "tesc") {
            shader_kind_flag = "--tessellation_control"
          } else if (shader_kind_ext == "tese") {
            shader_kind_flag = "--tessellation_evaluation"
          } else if (shader_kind_ext == "vert") {
            shader_kind_flag = "--vertex"
          } else {
            assert(false, "Unknown shader kind: {{source}}")
          }

          args = [
            rebase_path(impeller_malioc_path, root_build_dir),
            "--format",
            "json",
            shader_kind_flag,
            "--core",
            core,
            "--output",
            rebase_path(output_file),
          ]

          if (backend_ext == "vkspv") {
            args += [ "--vulkan" ]
          }

          args += [ rebase_path(source) ]
        }
      }
    }

    group(target_name) {
      deps = target_deps
    }
  }
}
