blob: 356fcdcbaea1cabd360d37b4623e101d0747a6e8 [file] [log] [blame]
# 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_core_filter = [
"Mali-G78",
"Mali-T880",
]
}
if (impeller_malioc_path != "") {
_core_list_file = "$root_build_dir/mali_core_list.json"
exec_script("//flutter/impeller/tools/malioc_cores.py",
[
"--malioc",
rebase_path(impeller_malioc_path, root_build_dir),
"--output",
rebase_path(_core_list_file),
])
_impeller_malioc_cores = read_file(_core_list_file, "json")
}
template("malioc_analyze_shaders") {
if (impeller_malioc_path == "") {
group(target_name) {
not_needed(invoker, "*")
}
} else {
target_deps = []
foreach(core, _impeller_malioc_cores) {
foreach(filter_core, impeller_malioc_core_filter) {
if (core.core == filter_core) {
foreach(source, invoker.shaders) {
# Should be "gles" or "vkspv"
backend_ext = get_path_info(source, "extension")
assert(
backend_ext == "gles" || backend_ext == "vkspv",
"Shader for unsupported backend passed to malioc: {{source}}")
shader_file_name = get_path_info(source, "name")
analysis_target =
"${target_name}_${shader_file_name}_${core.core}_malioc"
if ((backend_ext == "gles" &&
defined(invoker.gles_language_version) &&
core.opengles_max_version < invoker.gles_language_version) ||
(backend_ext == "vkspv" &&
defined(invoker.vulkan_language_version) &&
core.vulkan_max_version < invoker.vulkan_language_version)) {
group(analysis_target) {
not_needed(invoker, "*")
}
} else {
target_deps += [ ":$analysis_target" ]
action(analysis_target) {
forward_variables_from(invoker,
"*",
[
"args",
"depfile",
"inputs",
"outputs",
"pool",
"script",
])
script = "//build/gn_run_malioc.py"
pool = "//build/toolchain:toolchain_pool"
# 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}.${backend_ext}.${core.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),
rebase_path(output_file),
"--format",
"json",
shader_kind_flag,
"--core",
core.core,
]
if (backend_ext == "vkspv") {
args += [ "--vulkan" ]
}
args += [ rebase_path(source) ]
}
}
}
}
}
}
group(target_name) {
deps = target_deps
}
}
}