Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ci/licenses_golden/excluded_files
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@
../../../flutter/impeller/tessellator/tessellator_unittests.cc
../../../flutter/impeller/tools/build_metal_library.py
../../../flutter/impeller/tools/check_licenses.py
../../../flutter/impeller/tools/malioc_cores.py
../../../flutter/impeller/tools/malioc_diff.py
../../../flutter/impeller/tools/xxd.py
../../../flutter/impeller/typographer/typographer_unittests.cc
Expand Down
16 changes: 14 additions & 2 deletions impeller/entity/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import("//flutter/impeller/tools/impeller.gni")
impeller_shaders("entity_shaders") {
name = "entity"

if (impeller_enable_vulkan) {
vulkan_language_version = 130
}

shaders = [
"shaders/blending/advanced_blend.vert",
"shaders/blending/advanced_blend_color.frag",
Expand Down Expand Up @@ -69,7 +73,11 @@ impeller_shaders("modern_entity_shaders") {
name = "modern"

if (impeller_enable_opengles) {
gles_language_version = "460"
gles_language_version = 460
}

if (impeller_enable_vulkan) {
vulkan_language_version = 130
}

shaders = [
Expand All @@ -91,7 +99,11 @@ impeller_shaders("framebuffer_blend_entity_shaders") {

# This version is to disable malioc checks.
if (impeller_enable_opengles) {
gles_language_version = "460"
gles_language_version = 460
}

if (impeller_enable_vulkan) {
vulkan_language_version = 130
}

shaders = [
Expand Down
4 changes: 4 additions & 0 deletions impeller/scene/shaders/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import("//flutter/impeller/tools/impeller.gni")
impeller_shaders("shaders") {
name = "scene"

if (impeller_enable_vulkan) {
vulkan_language_version = 130
}

shaders = [
"skinned.vert",
"unskinned.vert",
Expand Down
76 changes: 68 additions & 8 deletions impeller/tools/impeller.gni
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,7 @@ template("impellerc_reflect") {
}
}

template("impeller_shaders_metal") {
template("_impeller_shaders_metal") {
assert(defined(invoker.shaders), "Impeller shaders must be specified.")
assert(defined(invoker.name), "Name of the shader library must be specified.")

Expand Down Expand Up @@ -478,7 +478,7 @@ template("blobcat_library") {
}
}

template("impeller_shaders_gles") {
template("_impeller_shaders_gles") {
assert(defined(invoker.shaders), "Impeller shaders must be specified.")
assert(defined(invoker.name), "Name of the shader library must be specified.")
assert(defined(invoker.analyze), "Whether to analyze must be specified.")
Expand Down Expand Up @@ -557,9 +557,10 @@ template("impeller_shaders_gles") {
}
}

template("impeller_shaders_vk") {
template("_impeller_shaders_vk") {
assert(defined(invoker.shaders), "Impeller shaders must be specified.")
assert(defined(invoker.name), "Name of the shader library must be specified.")
assert(defined(invoker.analyze), "Whether to analyze must be specified.")

shaders_base_name = string_join("",
[
Expand All @@ -583,10 +584,23 @@ template("impeller_shaders_vk") {
defines = [ "IMPELLER_TARGET_VULKAN" ]
}

vk_shaders =
filter_include(get_target_outputs(":$impellerc_vk"), [ "*.vkspv" ])

if (invoker.analyze) {
analyze_lib = "analyze_$target_name"
malioc_analyze_shaders(analyze_lib) {
shaders = vk_shaders
if (defined(invoker.vulkan_language_version)) {
vulkan_language_version = invoker.vulkan_language_version
}
deps = [ ":$impellerc_vk" ]
}
}

vk_lib = "genlib_$target_name"
blobcat_library(vk_lib) {
shaders =
filter_include(get_target_outputs(":$impellerc_vk"), [ "*.vkspv" ])
shaders = vk_shaders
deps = [ ":$impellerc_vk" ]
}

Expand All @@ -608,12 +622,50 @@ template("impeller_shaders_vk") {
group(target_name) {
public_deps = [ ":$embed_vk_lib" ]

if (invoker.analyze) {
public_deps += [ ":$analyze_lib" ]
}

if (!impeller_enable_metal) {
public_deps += [ ":$reflect_vk" ]
}
}
}

# ------------------------------------------------------------------------------
# @brief A target for precompiled shaders and the associated
# generated reflection library.
#
# @param[required] name
#
# The base name for the reflected C++ library.
#
# @param[required] shaders
#
# A list of GLSL shader files.
#
# @param[optional] analyze
#
# Whether to analyze shaders with malioc. Defaults to false. Shaders will
# only be analyzed if the GN argument "impeller_malioc_path" is defined.
#
# @param[optional] enable_opengles
#
# Whether to compile the shaders for the OpenGL ES backend. Defaults to the
# value of the GN argument "impeller_enable_opengles".
#
# @param[optional] gles_language_version
#
# The GLES version required by the shaders.
#
# @param[optional] metal_version
#
# The version of the Metal API required by the shaders.
#
# @param[optional] vulkan_language_version
#
# The SPIR-V version required by the shaders.
#
template("impeller_shaders") {
metal_version = "1.2"
if (defined(invoker.metal_version)) {
Expand All @@ -628,7 +680,7 @@ template("impeller_shaders") {

if (impeller_enable_metal) {
mtl_shaders = "mtl_$target_name"
impeller_shaders_metal(mtl_shaders) {
_impeller_shaders_metal(mtl_shaders) {
name = invoker.name
shaders = invoker.shaders
metal_version = metal_version
Expand All @@ -641,7 +693,7 @@ template("impeller_shaders") {
analyze = false
}
gles_shaders = "gles_$target_name"
impeller_shaders_gles(gles_shaders) {
_impeller_shaders_gles(gles_shaders) {
name = invoker.name
if (defined(invoker.gles_language_version)) {
gles_language_version = invoker.gles_language_version
Expand All @@ -656,11 +708,19 @@ template("impeller_shaders") {
}

if (impeller_enable_vulkan) {
analyze = true
if (defined(invoker.analyze) && !invoker.analyze) {
analyze = false
}
vk_shaders = "vk_$target_name"
impeller_shaders_vk(vk_shaders) {
_impeller_shaders_vk(vk_shaders) {
name = invoker.name
if (defined(invoker.vulkan_language_version)) {
vulkan_language_version = invoker.vulkan_language_version
}
shaders = invoker.shaders
metal_version = metal_version
analyze = analyze
}
}

Expand Down
167 changes: 86 additions & 81 deletions impeller/tools/malioc.gni
Original file line number Diff line number Diff line change
Expand Up @@ -10,109 +10,114 @@ declare_args() {
# Path to the Mali offline compiler tool 'malioc'.
impeller_malioc_path = ""

impeller_malioc_cores = []
impeller_malioc_core_filter = [
"Mali-G78",
"Mali-T880",
]
}

if (impeller_malioc_path != "" && impeller_malioc_cores == []) {
core_list_file = "$root_build_dir/mali_core_list.json"
exec_script("//build/gn_run_binary.py",
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),
"--list",
"--format",
"json",
"--output",
rebase_path(core_list_file),
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 ]
}
_impeller_malioc_cores = read_file(_core_list_file, "json")
}

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}.")
}
if (impeller_malioc_path == "") {
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",
])
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_binary.py"
pool = "//flutter/impeller/tools:malioc_pool"
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}.${backend_ext}.${core.core}.json"
outputs = [ output_file ]

# 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")

# 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}}")
}

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.core,
"--output",
rebase_path(output_file),
]

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

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

args += [ rebase_path(source) ]
}
}
}
Expand Down
Loading