From 9f32e039ad90331de88f07c852c85ebdae5ff646 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 8 Nov 2023 13:29:42 -0800 Subject: [PATCH] [Impeller] Add support for specialization constants (III). (#47765) Reland of https://github.com/flutter/engine/pull/47432 Also includes: https://github.com/flutter/engine/pull/47617 https://github.com/flutter/engine/pull/47637 Fixes the performance on iOS by removing blocking on compilation of shaders. From local testing this has identical before/after numbers. Additional, ensures that we don't unecessarily specialize vertex shaders and notes this restriction in the documentation. Adds support for Specialization constants to Impeller for our usage in the engine. A motivating example has been added in the impeller markdown docs. Fixes https://github.com/flutter/flutter/issues/136210 Fixes https://github.com/flutter/flutter/issues/119357 Investigating: https://github.com/flutter/flutter/issues/138028 --- ci/licenses_golden/licenses_flutter | 74 +- impeller/base/comparable.h | 4 - impeller/docs/specialization_constants.md | 94 + impeller/entity/BUILD.gn | 34 +- impeller/entity/contents/atlas_contents.cc | 2 - impeller/entity/contents/content_context.cc | 140 +- impeller/entity/contents/content_context.h | 116 +- .../contents/filters/blend_filter_contents.cc | 6 - .../contents/framebuffer_blend_contents.h | 22 +- impeller/entity/entity_unittests.cc | 20 + ...dvanced_blend.glsl => advanced_blend.frag} | 16 +- .../blending/advanced_blend_color.frag | 14 - .../blending/advanced_blend_colorburn.frag | 14 - .../blending/advanced_blend_colordodge.frag | 14 - .../blending/advanced_blend_darken.frag | 14 - .../blending/advanced_blend_difference.frag | 14 - .../blending/advanced_blend_exclusion.frag | 14 - .../blending/advanced_blend_hardlight.frag | 14 - .../shaders/blending/advanced_blend_hue.frag | 14 - .../blending/advanced_blend_lighten.frag | 14 - .../blending/advanced_blend_luminosity.frag | 14 - .../blending/advanced_blend_multiply.frag | 14 - .../blending/advanced_blend_overlay.frag | 14 - .../blending/advanced_blend_saturation.frag | 14 - .../blending/advanced_blend_screen.frag | 14 - .../blending/advanced_blend_softlight.frag | 14 - .../entity/shaders/blending/blend_select.glsl | 72 + ...ffer_blend.glsl => framebuffer_blend.frag} | 15 +- .../blending/{ios => }/framebuffer_blend.vert | 0 .../blending/ios/framebuffer_blend_color.frag | 14 - .../ios/framebuffer_blend_colorburn.frag | 14 - .../ios/framebuffer_blend_colordodge.frag | 14 - .../ios/framebuffer_blend_darken.frag | 14 - .../ios/framebuffer_blend_difference.frag | 14 - .../ios/framebuffer_blend_exclusion.frag | 14 - .../ios/framebuffer_blend_hardlight.frag | 14 - .../blending/ios/framebuffer_blend_hue.frag | 14 - .../ios/framebuffer_blend_lighten.frag | 14 - .../ios/framebuffer_blend_luminosity.frag | 14 - .../ios/framebuffer_blend_multiply.frag | 14 - .../ios/framebuffer_blend_overlay.frag | 14 - .../ios/framebuffer_blend_saturation.frag | 14 - .../ios/framebuffer_blend_screen.frag | 14 - .../ios/framebuffer_blend_softlight.frag | 14 - .../shaders/blending/porter_duff_blend.frag | 12 +- impeller/renderer/backend/gles/BUILD.gn | 1 + .../backend/gles/pipeline_library_gles.cc | 24 +- .../renderer/backend/gles/proc_table_gles.cc | 48 +- .../renderer/backend/gles/proc_table_gles.h | 15 +- .../backend/gles/shader_library_gles.h | 2 +- .../specialization_constants_unittests.cc | 75 + .../backend/metal/pipeline_library_mtl.h | 2 +- .../backend/metal/pipeline_library_mtl.mm | 66 +- .../backend/metal/shader_function_mtl.h | 7 + .../backend/metal/shader_function_mtl.mm | 26 +- .../backend/metal/shader_library_mtl.h | 2 +- .../backend/metal/shader_library_mtl.mm | 6 +- .../backend/vulkan/pipeline_library_vk.cc | 27 + impeller/renderer/pipeline_builder.h | 4 +- impeller/renderer/pipeline_descriptor.cc | 16 +- impeller/renderer/pipeline_descriptor.h | 12 +- impeller/renderer/shader_function.cc | 4 + impeller/renderer/shader_function.h | 3 + impeller/tools/malioc.json | 3843 +++-------------- 64 files changed, 1247 insertions(+), 3983 deletions(-) create mode 100644 impeller/docs/specialization_constants.md rename impeller/entity/shaders/blending/{advanced_blend.glsl => advanced_blend.frag} (80%) delete mode 100644 impeller/entity/shaders/blending/advanced_blend_color.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_colorburn.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_colordodge.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_darken.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_difference.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_exclusion.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_hardlight.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_hue.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_lighten.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_luminosity.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_multiply.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_overlay.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_saturation.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_screen.frag delete mode 100644 impeller/entity/shaders/blending/advanced_blend_softlight.frag create mode 100644 impeller/entity/shaders/blending/blend_select.glsl rename impeller/entity/shaders/blending/{ios/framebuffer_blend.glsl => framebuffer_blend.frag} (75%) rename impeller/entity/shaders/blending/{ios => }/framebuffer_blend.vert (100%) delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_color.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_colorburn.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_colordodge.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_darken.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_difference.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_exclusion.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_hardlight.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_hue.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_lighten.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_luminosity.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_multiply.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_overlay.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_saturation.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_screen.frag delete mode 100644 impeller/entity/shaders/blending/ios/framebuffer_blend_softlight.frag create mode 100644 impeller/renderer/backend/gles/test/specialization_constants_unittests.cc diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 6acace41ac485..334866eef92fe 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -3136,42 +3136,13 @@ ORIGIN: ../../../flutter/impeller/entity/inline_pass_context.cc + ../../../flutt ORIGIN: ../../../flutter/impeller/entity/inline_pass_context.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/render_target_cache.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/render_target_cache.h + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.glsl + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.vert + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_color.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_colorburn.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_colordodge.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_darken.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_difference.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_exclusion.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_hardlight.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_hue.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_lighten.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_luminosity.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_multiply.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_overlay.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_saturation.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_screen.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_softlight.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/blending/blend.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/blending/blend.vert + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend.glsl + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend.vert + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_color.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_colorburn.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_colordodge.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_darken.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_difference.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_exclusion.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_hardlight.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_hue.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_lighten.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_luminosity.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_multiply.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_overlay.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_saturation.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_screen.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_softlight.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/blending/blend_select.glsl + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/blending/framebuffer_blend.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/blending/framebuffer_blend.vert + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/blending/porter_duff_blend.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/blending/porter_duff_blend.vert + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/border_mask_blur.frag + ../../../flutter/LICENSE @@ -5921,42 +5892,13 @@ FILE: ../../../flutter/impeller/entity/inline_pass_context.cc FILE: ../../../flutter/impeller/entity/inline_pass_context.h FILE: ../../../flutter/impeller/entity/render_target_cache.cc FILE: ../../../flutter/impeller/entity/render_target_cache.h -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.glsl +FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.frag FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.vert -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_color.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_colorburn.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_colordodge.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_darken.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_difference.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_exclusion.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_hardlight.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_hue.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_lighten.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_luminosity.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_multiply.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_overlay.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_saturation.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_screen.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend_softlight.frag FILE: ../../../flutter/impeller/entity/shaders/blending/blend.frag FILE: ../../../flutter/impeller/entity/shaders/blending/blend.vert -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend.glsl -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend.vert -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_color.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_colorburn.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_colordodge.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_darken.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_difference.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_exclusion.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_hardlight.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_hue.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_lighten.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_luminosity.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_multiply.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_overlay.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_saturation.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_screen.frag -FILE: ../../../flutter/impeller/entity/shaders/blending/ios/framebuffer_blend_softlight.frag +FILE: ../../../flutter/impeller/entity/shaders/blending/blend_select.glsl +FILE: ../../../flutter/impeller/entity/shaders/blending/framebuffer_blend.frag +FILE: ../../../flutter/impeller/entity/shaders/blending/framebuffer_blend.vert FILE: ../../../flutter/impeller/entity/shaders/blending/porter_duff_blend.frag FILE: ../../../flutter/impeller/entity/shaders/blending/porter_duff_blend.vert FILE: ../../../flutter/impeller/entity/shaders/border_mask_blur.frag diff --git a/impeller/base/comparable.h b/impeller/base/comparable.h index 1937aebf2e0b3..08780f75c5e66 100644 --- a/impeller/base/comparable.h +++ b/impeller/base/comparable.h @@ -8,12 +8,8 @@ #include #include #include -#include #include -#include "flutter/fml/hash_combine.h" -#include "flutter/fml/macros.h" - namespace impeller { struct UniqueID { diff --git a/impeller/docs/specialization_constants.md b/impeller/docs/specialization_constants.md new file mode 100644 index 0000000000000..ca20f7eacef3d --- /dev/null +++ b/impeller/docs/specialization_constants.md @@ -0,0 +1,94 @@ +# Specialization Constants + +A specialization constant is a named variable that is known to be constant at runtime but not when the shader is authored. These variables are bound to specific values when the shader is compiled on application start up and allow the backend to perform optimizations such as branch elimination and constant folding. + +Specialization constants have two possible benefits when used in a shader: + + * Improving performance, by removing branching and conditional code. + * Code organization/size, by removing the number of shader source files required. + +These goals are related: The number of shaders can be reduce by adding runtime branching to create more generic shaders. Alternatively, branching can be reduced by adding more specialized shader variants. Specialization constants provide a happy medium where the source files can be combined with branching but done so in a way that has no runtime cost. + +## Example Usage + +Consider the case of the "decal" texture sampling mode. This is implement via clamp-to-border with +a border color set to transparent black. While this functionality is well supported on the Metal and +Vulkan backends, the GLES backend needs to support devices that do not have this extension. As a +result, the following code was used to conditionally decal: + +```glsl +// Decal sample if necessary. +vec4 Sample(sampler2D sampler, vec2 coord) { +#ifdef GLES + return IPSampleDecal(sampler, coord) +#else + return texture(sampler, coord); +#endif +} +``` + +This works great as long as we know that the GLES backend can never do the decal sample mode. This is also "free" as the ifdef branch is evaluated in the compiler. But eventually, we added a runtime check for decal mode as we need to support this on GLES. So the code turned into (approximately) the following: + +```glsl +#ifdef GLES +uniform float supports_decal; +#endif + +// Decal sample if necessary. +vec4 Sample(sampler2D sampler, vec2 coord) { +#ifdef GLES + if (supports_decal) { + return texture(sampler, coord); + } + return IPSampleDecal(sampler, coord) +#else + return texture(sampler, coord); +#endif +} +``` + +Now we've got decal support, but we've also got new problems: + +* The code is actually quite messy. We have to track different uniform values depending on the backend. +* The GLES backend is still paying some cost for branching, even though we "know" that decal is or isn't supported when the shader is compiled. + +### Specialization constants to the rescue + +Instead of using a runtime check, we can create a specialization constant that is set when compiling the +shader. This constant will be `1` if decal is supported and `0` otherwise. + +```glsl +layout(constant_id = 0) const int supports_decal = 1; + +vec4 Sample(sampler2D sampler, vec2 coord) { + if (supports_decal) { + return texture(sampler, coord); + } + return IPSampleDecal(sampler, coord) +} + +``` + +Immediately we realize a number of benefits: + +* Code is the same across all backends +* Runtime branching cost is removed as the branch is compiled out. + + +## Implementation + +Only 32bit ints are supported as const values and can be used to represent: + +* true/false via 0/1. +* function selection, such as advanced blends. The specialization value maps to a specific blend function. For example, 0 maps to screen and 1 to overlay via a giant if/else macro. +* Only fragment shaders can be specialized. This limitation could be removed with more investment. + +*AVOID* adding specialization constants for color values or anything more complex. + +Specialization constants are provided to the CreateDefault argument in content_context.cc and aren't a +part of variants. This is intentional: specialization constants shouldn't be used to create (potentially unlimited) runtime variants of a shader. + +Backend specific information: +* In the Metal backend, the specialization constants are mapped to a MTLFunctionConstantValues. See also: https://developer.apple.com/documentation/metal/using_function_specialization_to_build_pipeline_variants?language=objc +* In the Vulkan backend, the specialization constants are mapped to VkSpecializationINfo. See also: https://blogs.igalia.com/itoral/2018/03/20/improving-shader-performance-with-vulkans-specialization-constants/ +* In the GLES backend, the SPIRV Cross compiler will generate defines named `#ifdef SPIRV_CROSS_CONSTANT_i`, where i is the index of constant. The Impeller runtime will insert `#define SPIRV_CROSS_CONSTANT_i` in the header of the shader. \ No newline at end of file diff --git a/impeller/entity/BUILD.gn b/impeller/entity/BUILD.gn index fc575104a4987..2460a19178513 100644 --- a/impeller/entity/BUILD.gn +++ b/impeller/entity/BUILD.gn @@ -15,21 +15,7 @@ impeller_shaders("entity_shaders") { shaders = [ "shaders/blending/advanced_blend.vert", - "shaders/blending/advanced_blend_color.frag", - "shaders/blending/advanced_blend_colorburn.frag", - "shaders/blending/advanced_blend_colordodge.frag", - "shaders/blending/advanced_blend_darken.frag", - "shaders/blending/advanced_blend_difference.frag", - "shaders/blending/advanced_blend_exclusion.frag", - "shaders/blending/advanced_blend_hardlight.frag", - "shaders/blending/advanced_blend_hue.frag", - "shaders/blending/advanced_blend_lighten.frag", - "shaders/blending/advanced_blend_luminosity.frag", - "shaders/blending/advanced_blend_multiply.frag", - "shaders/blending/advanced_blend_overlay.frag", - "shaders/blending/advanced_blend_saturation.frag", - "shaders/blending/advanced_blend_screen.frag", - "shaders/blending/advanced_blend_softlight.frag", + "shaders/blending/advanced_blend.frag", "shaders/blending/blend.frag", "shaders/blending/blend.vert", "shaders/border_mask_blur.frag", @@ -115,22 +101,8 @@ impeller_shaders("framebuffer_blend_entity_shaders") { } shaders = [ - "shaders/blending/ios/framebuffer_blend.vert", - "shaders/blending/ios/framebuffer_blend_color.frag", - "shaders/blending/ios/framebuffer_blend_colorburn.frag", - "shaders/blending/ios/framebuffer_blend_colordodge.frag", - "shaders/blending/ios/framebuffer_blend_darken.frag", - "shaders/blending/ios/framebuffer_blend_difference.frag", - "shaders/blending/ios/framebuffer_blend_exclusion.frag", - "shaders/blending/ios/framebuffer_blend_hardlight.frag", - "shaders/blending/ios/framebuffer_blend_hue.frag", - "shaders/blending/ios/framebuffer_blend_lighten.frag", - "shaders/blending/ios/framebuffer_blend_luminosity.frag", - "shaders/blending/ios/framebuffer_blend_multiply.frag", - "shaders/blending/ios/framebuffer_blend_overlay.frag", - "shaders/blending/ios/framebuffer_blend_saturation.frag", - "shaders/blending/ios/framebuffer_blend_screen.frag", - "shaders/blending/ios/framebuffer_blend_softlight.frag", + "shaders/blending/framebuffer_blend.vert", + "shaders/blending/framebuffer_blend.frag", ] } diff --git a/impeller/entity/contents/atlas_contents.cc b/impeller/entity/contents/atlas_contents.cc index 34030ac95a9f0..f92c3dbd3449b 100644 --- a/impeller/entity/contents/atlas_contents.cc +++ b/impeller/entity/contents/atlas_contents.cc @@ -262,8 +262,6 @@ bool AtlasContents::Render(const ContentContext& renderer, dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } - frag_info.supports_decal_sampler_address_mode = - renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, texture_, dst_sampler); diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index 560c9d804800e..ec4725795eb31 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -5,15 +5,15 @@ #include "impeller/entity/contents/content_context.h" #include -#include #include "impeller/base/strings.h" #include "impeller/core/formats.h" +#include "impeller/entity/contents/framebuffer_blend_contents.h" #include "impeller/entity/entity.h" #include "impeller/entity/render_target_cache.h" #include "impeller/renderer/command_buffer.h" +#include "impeller/renderer/pipeline_descriptor.h" #include "impeller/renderer/pipeline_library.h" -#include "impeller/renderer/render_pass.h" #include "impeller/renderer/render_target.h" #include "impeller/tessellator/tessellator.h" #include "impeller/typographer/typographer_context.h" @@ -197,6 +197,8 @@ ContentContext::ContentContext( .primitive_type = PrimitiveType::kTriangleStrip, .color_attachment_pixel_format = context_->GetCapabilities()->GetDefaultColorFormat()}; + const auto supports_decal = + context_->GetCapabilities()->SupportsDecalSamplerAddressMode(); #ifdef IMPELLER_DEBUG checkerboard_pipelines_.CreateDefault(*context_, options); @@ -217,53 +219,98 @@ ContentContext::ContentContext( } if (context_->GetCapabilities()->SupportsFramebufferFetch()) { - framebuffer_blend_color_pipelines_.CreateDefault(*context_, - options_trianglestrip); - framebuffer_blend_colorburn_pipelines_.CreateDefault(*context_, - options_trianglestrip); + framebuffer_blend_color_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kColor), supports_decal}); + framebuffer_blend_colorburn_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kColorBurn), supports_decal}); framebuffer_blend_colordodge_pipelines_.CreateDefault( - *context_, options_trianglestrip); - framebuffer_blend_darken_pipelines_.CreateDefault(*context_, - options_trianglestrip); + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kColorDodge), supports_decal}); + framebuffer_blend_darken_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kDarken), supports_decal}); framebuffer_blend_difference_pipelines_.CreateDefault( - *context_, options_trianglestrip); - framebuffer_blend_exclusion_pipelines_.CreateDefault(*context_, - options_trianglestrip); - framebuffer_blend_hardlight_pipelines_.CreateDefault(*context_, - options_trianglestrip); - framebuffer_blend_hue_pipelines_.CreateDefault(*context_, - options_trianglestrip); - framebuffer_blend_lighten_pipelines_.CreateDefault(*context_, - options_trianglestrip); + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kDifference), supports_decal}); + framebuffer_blend_exclusion_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kExclusion), supports_decal}); + framebuffer_blend_hardlight_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kHardLight), supports_decal}); + framebuffer_blend_hue_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kHue), supports_decal}); + framebuffer_blend_lighten_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kLighten), supports_decal}); framebuffer_blend_luminosity_pipelines_.CreateDefault( - *context_, options_trianglestrip); - framebuffer_blend_multiply_pipelines_.CreateDefault(*context_, - options_trianglestrip); - framebuffer_blend_overlay_pipelines_.CreateDefault(*context_, - options_trianglestrip); + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kLuminosity), supports_decal}); + framebuffer_blend_multiply_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kMultiply), supports_decal}); + framebuffer_blend_overlay_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kOverlay), supports_decal}); framebuffer_blend_saturation_pipelines_.CreateDefault( - *context_, options_trianglestrip); - framebuffer_blend_screen_pipelines_.CreateDefault(*context_, - options_trianglestrip); - framebuffer_blend_softlight_pipelines_.CreateDefault(*context_, - options_trianglestrip); + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kSaturation), supports_decal}); + framebuffer_blend_screen_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kScreen), supports_decal}); + framebuffer_blend_softlight_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kSoftLight), supports_decal}); } - blend_color_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_colorburn_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_colordodge_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_darken_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_difference_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_exclusion_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_hardlight_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_hue_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_lighten_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_luminosity_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_multiply_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_overlay_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_saturation_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_screen_pipelines_.CreateDefault(*context_, options_trianglestrip); - blend_softlight_pipelines_.CreateDefault(*context_, options_trianglestrip); + blend_color_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kColor), supports_decal}); + blend_colorburn_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kColorBurn), supports_decal}); + blend_colordodge_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kColorDodge), supports_decal}); + blend_darken_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kDarken), supports_decal}); + blend_difference_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kDifference), supports_decal}); + blend_exclusion_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kExclusion), supports_decal}); + blend_hardlight_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kHardLight), supports_decal}); + blend_hue_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kHue), supports_decal}); + blend_lighten_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kLighten), supports_decal}); + blend_luminosity_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kLuminosity), supports_decal}); + blend_multiply_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kMultiply), supports_decal}); + blend_overlay_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kOverlay), supports_decal}); + blend_saturation_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kSaturation), supports_decal}); + blend_screen_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kScreen), supports_decal}); + blend_softlight_pipelines_.CreateDefault( + *context_, options_trianglestrip, + {static_cast(BlendSelectValues::kSoftLight), supports_decal}); rrect_blur_pipelines_.CreateDefault(*context_, options_trianglestrip); texture_blend_pipelines_.CreateDefault(*context_, options); @@ -286,9 +333,10 @@ ContentContext::ContentContext( glyph_atlas_color_pipelines_.CreateDefault(*context_, options); geometry_color_pipelines_.CreateDefault(*context_, options); yuv_to_rgb_filter_pipelines_.CreateDefault(*context_, options_trianglestrip); - porter_duff_blend_pipelines_.CreateDefault(*context_, options_trianglestrip); - // GLES only shader. -#ifdef IMPELLER_ENABLE_OPENGLES + porter_duff_blend_pipelines_.CreateDefault(*context_, options_trianglestrip, + {supports_decal}); + // GLES only shader that is unsupported on macOS. +#if defined(IMPELLER_ENABLE_OPENGLES) && !defined(FML_OS_MACOSX) if (GetContext()->GetBackendType() == Context::BackendType::kOpenGLES) { texture_external_pipelines_.CreateDefault(*context_, options); } diff --git a/impeller/entity/contents/content_context.h b/impeller/entity/contents/content_context.h index de55d92e6838e..7fdcc6cbc74e8 100644 --- a/impeller/entity/contents/content_context.h +++ b/impeller/entity/contents/content_context.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include #include @@ -75,39 +76,11 @@ #include "impeller/entity/radial_gradient_ssbo_fill.frag.h" #include "impeller/entity/sweep_gradient_ssbo_fill.frag.h" +#include "impeller/entity/advanced_blend.frag.h" #include "impeller/entity/advanced_blend.vert.h" -#include "impeller/entity/advanced_blend_color.frag.h" -#include "impeller/entity/advanced_blend_colorburn.frag.h" -#include "impeller/entity/advanced_blend_colordodge.frag.h" -#include "impeller/entity/advanced_blend_darken.frag.h" -#include "impeller/entity/advanced_blend_difference.frag.h" -#include "impeller/entity/advanced_blend_exclusion.frag.h" -#include "impeller/entity/advanced_blend_hardlight.frag.h" -#include "impeller/entity/advanced_blend_hue.frag.h" -#include "impeller/entity/advanced_blend_lighten.frag.h" -#include "impeller/entity/advanced_blend_luminosity.frag.h" -#include "impeller/entity/advanced_blend_multiply.frag.h" -#include "impeller/entity/advanced_blend_overlay.frag.h" -#include "impeller/entity/advanced_blend_saturation.frag.h" -#include "impeller/entity/advanced_blend_screen.frag.h" -#include "impeller/entity/advanced_blend_softlight.frag.h" +#include "impeller/entity/framebuffer_blend.frag.h" #include "impeller/entity/framebuffer_blend.vert.h" -#include "impeller/entity/framebuffer_blend_color.frag.h" -#include "impeller/entity/framebuffer_blend_colorburn.frag.h" -#include "impeller/entity/framebuffer_blend_colordodge.frag.h" -#include "impeller/entity/framebuffer_blend_darken.frag.h" -#include "impeller/entity/framebuffer_blend_difference.frag.h" -#include "impeller/entity/framebuffer_blend_exclusion.frag.h" -#include "impeller/entity/framebuffer_blend_hardlight.frag.h" -#include "impeller/entity/framebuffer_blend_hue.frag.h" -#include "impeller/entity/framebuffer_blend_lighten.frag.h" -#include "impeller/entity/framebuffer_blend_luminosity.frag.h" -#include "impeller/entity/framebuffer_blend_multiply.frag.h" -#include "impeller/entity/framebuffer_blend_overlay.frag.h" -#include "impeller/entity/framebuffer_blend_saturation.frag.h" -#include "impeller/entity/framebuffer_blend_screen.frag.h" -#include "impeller/entity/framebuffer_blend_softlight.frag.h" #ifdef IMPELLER_ENABLE_OPENGLES #include "impeller/entity/texture_fill_external.frag.h" @@ -192,93 +165,82 @@ using YUVToRGBFilterPipeline = RenderPipelineT; // Advanced blends -using BlendColorPipeline = RenderPipelineT; +using BlendColorPipeline = + RenderPipelineT; using BlendColorBurnPipeline = - RenderPipelineT; + RenderPipelineT; using BlendColorDodgePipeline = - RenderPipelineT; -using BlendDarkenPipeline = RenderPipelineT; + RenderPipelineT; +using BlendDarkenPipeline = + RenderPipelineT; using BlendDifferencePipeline = - RenderPipelineT; + RenderPipelineT; using BlendExclusionPipeline = - RenderPipelineT; + RenderPipelineT; using BlendHardLightPipeline = - RenderPipelineT; + RenderPipelineT; using BlendHuePipeline = - RenderPipelineT; + RenderPipelineT; using BlendLightenPipeline = - RenderPipelineT; + RenderPipelineT; using BlendLuminosityPipeline = - RenderPipelineT; + RenderPipelineT; using BlendMultiplyPipeline = - RenderPipelineT; + RenderPipelineT; using BlendOverlayPipeline = - RenderPipelineT; + RenderPipelineT; using BlendSaturationPipeline = - RenderPipelineT; -using BlendScreenPipeline = RenderPipelineT; + RenderPipelineT; +using BlendScreenPipeline = + RenderPipelineT; using BlendSoftLightPipeline = - RenderPipelineT; + RenderPipelineT; // Framebuffer Advanced Blends using FramebufferBlendColorPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendColorBurnPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendColorDodgePipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendDarkenPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendDifferencePipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendExclusionPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendHardLightPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendHuePipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendLightenPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendLuminosityPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendMultiplyPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendOverlayPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendSaturationPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendScreenPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; using FramebufferBlendSoftLightPipeline = RenderPipelineT; + FramebufferBlendFragmentShader>; /// Geometry Pipelines using PointsComputeShaderPipeline = ComputePipelineBuilder; @@ -738,8 +700,10 @@ class ContentContext { } void CreateDefault(const Context& context, - const ContentContextOptions& options) { - auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context); + const ContentContextOptions& options, + const std::initializer_list& constants = {}) { + auto desc = + PipelineT::Builder::MakeDefaultPipelineDescriptor(context, constants); if (!desc.has_value()) { VALIDATION_LOG << "Failed to create default pipeline."; return; diff --git a/impeller/entity/contents/filters/blend_filter_contents.cc b/impeller/entity/contents/filters/blend_filter_contents.cc index 225f915f9aa5e..197b74d998e73 100644 --- a/impeller/entity/contents/filters/blend_filter_contents.cc +++ b/impeller/entity/contents/filters/blend_filter_contents.cc @@ -180,8 +180,6 @@ static std::optional AdvancedBlend( dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } - blend_info.supports_decal_sampler_address_mode = - renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler); @@ -354,8 +352,6 @@ std::optional BlendFilterContents::CreateForegroundAdvancedBlend( dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } - blend_info.supports_decal_sampler_address_mode = - renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler); @@ -478,8 +474,6 @@ std::optional BlendFilterContents::CreateForegroundPorterDuffBlend( dst_sampler_descriptor.width_address_mode = SamplerAddressMode::kDecal; dst_sampler_descriptor.height_address_mode = SamplerAddressMode::kDecal; } - frag_info.supports_decal_sampler_address_mode = - renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode(); auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler( dst_sampler_descriptor); FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler); diff --git a/impeller/entity/contents/framebuffer_blend_contents.h b/impeller/entity/contents/framebuffer_blend_contents.h index db3b2ca628768..ac5b57229f3b0 100644 --- a/impeller/entity/contents/framebuffer_blend_contents.h +++ b/impeller/entity/contents/framebuffer_blend_contents.h @@ -4,17 +4,31 @@ #pragma once -#include #include -#include -#include "flutter/fml/macros.h" -#include "flutter/impeller/core/texture.h" #include "impeller/entity/contents/color_source_contents.h" #include "impeller/entity/entity.h" namespace impeller { +enum class BlendSelectValues { + kScreen = 0, + kOverlay, + kDarken, + kLighten, + kColorDodge, + kColorBurn, + kHardLight, + kSoftLight, + kDifference, + kExclusion, + kMultiply, + kHue, + kSaturation, + kColor, + kLuminosity, +}; + class FramebufferBlendContents final : public ColorSourceContents { public: FramebufferBlendContents(); diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc index bcffed8f0f317..ea564dfa8e029 100644 --- a/impeller/entity/entity_unittests.cc +++ b/impeller/entity/entity_unittests.cc @@ -2526,6 +2526,26 @@ TEST_P(EntityTest, AdvancedBlendCoverageHintIsNotResetByEntityPass) { } } +TEST_P(EntityTest, SpecializationConstantsAreAppliedToVariants) { + auto content_context = + ContentContext(GetContext(), TypographerContextSkia::Make()); + + auto default_color_burn = content_context.GetBlendColorBurnPipeline( + {.has_stencil_attachment = false}); + auto alt_color_burn = content_context.GetBlendColorBurnPipeline( + {.has_stencil_attachment = true}); + + ASSERT_NE(default_color_burn, alt_color_burn); + ASSERT_EQ(default_color_burn->GetDescriptor().GetSpecializationConstants(), + alt_color_burn->GetDescriptor().GetSpecializationConstants()); + + auto decal_supported = static_cast( + GetContext()->GetCapabilities()->SupportsDecalSamplerAddressMode()); + std::vector expected_constants = {5, decal_supported}; + ASSERT_EQ(default_color_burn->GetDescriptor().GetSpecializationConstants(), + expected_constants); +} + } // namespace testing } // namespace impeller diff --git a/impeller/entity/shaders/blending/advanced_blend.glsl b/impeller/entity/shaders/blending/advanced_blend.frag similarity index 80% rename from impeller/entity/shaders/blending/advanced_blend.glsl rename to impeller/entity/shaders/blending/advanced_blend.frag index 9a11dce29f789..199dbbeead6f2 100644 --- a/impeller/entity/shaders/blending/advanced_blend.glsl +++ b/impeller/entity/shaders/blending/advanced_blend.frag @@ -6,6 +6,10 @@ #include #include #include +#include "blend_select.glsl" + +layout(constant_id = 0) const int blend_type = 0; +layout(constant_id = 1) const int supports_decal = 1; uniform BlendInfo { float16_t dst_input_alpha; @@ -25,15 +29,10 @@ in vec2 v_src_texture_coords; out f16vec4 frag_color; f16vec4 Sample(f16sampler2D texture_sampler, vec2 texture_coords) { -#ifdef IMPELLER_TARGET_OPENGLES - if (blend_info.supports_decal_sampler_address_mode > 0.0) { + if (supports_decal > 0.0) { return texture(texture_sampler, texture_coords); - } else { - return IPHalfSampleDecal(texture_sampler, texture_coords); } -#else - return texture(texture_sampler, texture_coords); -#endif + return IPHalfSampleDecal(texture_sampler, texture_coords); } void main() { @@ -50,6 +49,7 @@ void main() { ) * blend_info.src_input_alpha; - f16vec4 blended = mix(src, f16vec4(Blend(dst.rgb, src.rgb), dst.a), dst.a); + f16vec3 blend_result = AdvancedBlend(dst.rgb, src.rgb, blend_type); + f16vec4 blended = mix(src, f16vec4(blend_result, dst.a), dst.a); frag_color = mix(dst_sample, blended, src.a); } diff --git a/impeller/entity/shaders/blending/advanced_blend_color.frag b/impeller/entity/shaders/blending/advanced_blend_color.frag deleted file mode 100644 index 20ca9499bbca5..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_color.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendColor(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_colorburn.frag b/impeller/entity/shaders/blending/advanced_blend_colorburn.frag deleted file mode 100644 index a57d5c550130c..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_colorburn.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendColorBurn(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_colordodge.frag b/impeller/entity/shaders/blending/advanced_blend_colordodge.frag deleted file mode 100644 index 8766c01fd0fbc..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_colordodge.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendColorDodge(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_darken.frag b/impeller/entity/shaders/blending/advanced_blend_darken.frag deleted file mode 100644 index 4f423b55596dc..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_darken.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendDarken(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_difference.frag b/impeller/entity/shaders/blending/advanced_blend_difference.frag deleted file mode 100644 index 9e3a927ddb124..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_difference.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendDifference(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_exclusion.frag b/impeller/entity/shaders/blending/advanced_blend_exclusion.frag deleted file mode 100644 index e8e3911817fbf..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_exclusion.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendExclusion(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_hardlight.frag b/impeller/entity/shaders/blending/advanced_blend_hardlight.frag deleted file mode 100644 index 96a94de56f1c0..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_hardlight.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendHardLight(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_hue.frag b/impeller/entity/shaders/blending/advanced_blend_hue.frag deleted file mode 100644 index 5f2afb6332073..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_hue.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendHue(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_lighten.frag b/impeller/entity/shaders/blending/advanced_blend_lighten.frag deleted file mode 100644 index fa421d7ae1cbc..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_lighten.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendLighten(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_luminosity.frag b/impeller/entity/shaders/blending/advanced_blend_luminosity.frag deleted file mode 100644 index c4ee5598f16c0..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_luminosity.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendLuminosity(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_multiply.frag b/impeller/entity/shaders/blending/advanced_blend_multiply.frag deleted file mode 100644 index bda2e1ed44419..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_multiply.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendMultiply(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_overlay.frag b/impeller/entity/shaders/blending/advanced_blend_overlay.frag deleted file mode 100644 index 5def270326a7c..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_overlay.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendOverlay(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_saturation.frag b/impeller/entity/shaders/blending/advanced_blend_saturation.frag deleted file mode 100644 index 2122b57a0b6a2..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_saturation.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendSaturation(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_screen.frag b/impeller/entity/shaders/blending/advanced_blend_screen.frag deleted file mode 100644 index 98690c3ab5ea8..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_screen.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendScreen(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/advanced_blend_softlight.frag b/impeller/entity/shaders/blending/advanced_blend_softlight.frag deleted file mode 100644 index 130f02807baab..0000000000000 --- a/impeller/entity/shaders/blending/advanced_blend_softlight.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendSoftLight(dst, src); -} - -#include "advanced_blend.glsl" diff --git a/impeller/entity/shaders/blending/blend_select.glsl b/impeller/entity/shaders/blending/blend_select.glsl new file mode 100644 index 0000000000000..17c45c16fdcf4 --- /dev/null +++ b/impeller/entity/shaders/blending/blend_select.glsl @@ -0,0 +1,72 @@ +// 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. + +#include +#include +#include + +// kScreen = 0, +// kOverlay, +// kDarken, +// kLighten, +// kColorDodge, +// kColorBurn, +// kHardLight, +// kSoftLight, +// kDifference, +// kExclusion, +// kMultiply, +// kHue, +// kSaturation, +// kColor, +// kLuminosity, +// Note, this isn't a switch as GLSL ES 1.0 does not support them. +f16vec3 AdvancedBlend(f16vec3 dst, f16vec3 src, int blend_type) { + if (blend_type == 0) { + return IPBlendScreen(dst, src); + } + if (blend_type == 1) { + return IPBlendOverlay(dst, src); + } + if (blend_type == 2) { + return IPBlendDarken(dst, src); + } + if (blend_type == 3) { + return IPBlendLighten(dst, src); + } + if (blend_type == 4) { + return IPBlendColorDodge(dst, src); + } + if (blend_type == 5) { + return IPBlendColorBurn(dst, src); + } + if (blend_type == 6) { + return IPBlendHardLight(dst, src); + } + if (blend_type == 7) { + return IPBlendSoftLight(dst, src); + } + if (blend_type == 8) { + return IPBlendDifference(dst, src); + } + if (blend_type == 9) { + return IPBlendExclusion(dst, src); + } + if (blend_type == 10) { + return IPBlendMultiply(dst, src); + } + if (blend_type == 11) { + return IPBlendHue(dst, src); + } + if (blend_type == 12) { + return IPBlendSaturation(dst, src); + } + if (blend_type == 13) { + return IPBlendColor(dst, src); + } + if (blend_type == 14) { + return IPBlendLuminosity(dst, src); + } + return f16vec3(0.0hf); +} diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend.glsl b/impeller/entity/shaders/blending/framebuffer_blend.frag similarity index 75% rename from impeller/entity/shaders/blending/ios/framebuffer_blend.glsl rename to impeller/entity/shaders/blending/framebuffer_blend.frag index 67bd9cad8370e..e01316924ec8a 100644 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend.glsl +++ b/impeller/entity/shaders/blending/framebuffer_blend.frag @@ -8,6 +8,10 @@ #include #include #include +#include "blend_select.glsl" + +layout(constant_id = 0) const int blend_type = 0; +layout(constant_id = 1) const int supports_decal = 1; layout(set = 0, binding = 0, @@ -29,12 +33,10 @@ in vec2 v_src_texture_coords; out vec4 frag_color; vec4 Sample(sampler2D texture_sampler, vec2 texture_coords) { -// gles 2.0 is the only backend without native decal support. -#ifdef IMPELLER_TARGET_OPENGLES + if (supports_decal > 1) { + return texture(texture_sampler, texture_coords); + } return IPSampleDecal(texture_sampler, texture_coords); -#else - return texture(texture_sampler, texture_coords); -#endif } void main() { @@ -44,6 +46,7 @@ void main() { )) * frag_info.src_input_alpha; - f16vec4 blended = mix(src, f16vec4(Blend(dst.rgb, src.rgb), dst.a), dst.a); + f16vec3 blend_result = AdvancedBlend(dst.rgb, src.rgb, blend_type); + f16vec4 blended = mix(src, f16vec4(blend_result, dst.a), dst.a); frag_color = vec4(mix(dst, blended, src.a)); } diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend.vert b/impeller/entity/shaders/blending/framebuffer_blend.vert similarity index 100% rename from impeller/entity/shaders/blending/ios/framebuffer_blend.vert rename to impeller/entity/shaders/blending/framebuffer_blend.vert diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_color.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_color.frag deleted file mode 100644 index 4798cca350598..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_color.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendColor(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_colorburn.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_colorburn.frag deleted file mode 100644 index 4c53c2b7ab16a..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_colorburn.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendColorBurn(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_colordodge.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_colordodge.frag deleted file mode 100644 index d07de5925d8fb..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_colordodge.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendColorDodge(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_darken.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_darken.frag deleted file mode 100644 index e2e42f238558d..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_darken.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendDarken(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_difference.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_difference.frag deleted file mode 100644 index b2d26ca8e6b0f..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_difference.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendDifference(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_exclusion.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_exclusion.frag deleted file mode 100644 index 6358bcc2acbf6..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_exclusion.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendExclusion(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_hardlight.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_hardlight.frag deleted file mode 100644 index 19a370b7da19d..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_hardlight.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendHardLight(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_hue.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_hue.frag deleted file mode 100644 index 653e570dd7287..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_hue.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendHue(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_lighten.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_lighten.frag deleted file mode 100644 index 93b5bcaa7d4bc..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_lighten.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendLighten(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_luminosity.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_luminosity.frag deleted file mode 100644 index 93cb15f3bba12..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_luminosity.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendLuminosity(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_multiply.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_multiply.frag deleted file mode 100644 index bc6621ae070d3..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_multiply.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendMultiply(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_overlay.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_overlay.frag deleted file mode 100644 index 2238c38b707c0..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_overlay.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendOverlay(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_saturation.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_saturation.frag deleted file mode 100644 index e731de1562031..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_saturation.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendSaturation(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_screen.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_screen.frag deleted file mode 100644 index f8f2d569f0222..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_screen.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendScreen(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/ios/framebuffer_blend_softlight.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend_softlight.frag deleted file mode 100644 index 1902dafa42f0f..0000000000000 --- a/impeller/entity/shaders/blending/ios/framebuffer_blend_softlight.frag +++ /dev/null @@ -1,14 +0,0 @@ -// 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. - -precision mediump float; - -#include -#include - -f16vec3 Blend(f16vec3 dst, f16vec3 src) { - return IPBlendSoftLight(dst, src); -} - -#include "framebuffer_blend.glsl" diff --git a/impeller/entity/shaders/blending/porter_duff_blend.frag b/impeller/entity/shaders/blending/porter_duff_blend.frag index 7e3498ff0d33c..0d140e754e27f 100644 --- a/impeller/entity/shaders/blending/porter_duff_blend.frag +++ b/impeller/entity/shaders/blending/porter_duff_blend.frag @@ -9,6 +9,8 @@ precision mediump float; #include #include +layout(constant_id = 0) const int supports_decal = 1; + uniform f16sampler2D texture_sampler_dst; uniform FragInfo { @@ -19,7 +21,6 @@ uniform FragInfo { float16_t dst_coeff_src_color; float16_t input_alpha; float16_t output_alpha; - float supports_decal_sampler_address_mode; } frag_info; @@ -29,15 +30,10 @@ in f16vec4 v_color; out f16vec4 frag_color; f16vec4 Sample(f16sampler2D texture_sampler, vec2 texture_coords) { -#ifdef IMPELLER_TARGET_OPENGLES - if (frag_info.supports_decal_sampler_address_mode > 0.0) { + if (supports_decal > 0.0) { return texture(texture_sampler, texture_coords); - } else { - return IPHalfSampleDecal(texture_sampler, texture_coords); } -#else - return texture(texture_sampler, texture_coords); -#endif + return IPHalfSampleDecal(texture_sampler, texture_coords); } void main() { diff --git a/impeller/renderer/backend/gles/BUILD.gn b/impeller/renderer/backend/gles/BUILD.gn index f9db5b0313901..edace2b7aab40 100644 --- a/impeller/renderer/backend/gles/BUILD.gn +++ b/impeller/renderer/backend/gles/BUILD.gn @@ -20,6 +20,7 @@ impeller_component("gles_unittests") { "test/mock_gles.cc", "test/mock_gles.h", "test/mock_gles_unittests.cc", + "test/specialization_constants_unittests.cc", ] deps = [ ":gles", diff --git a/impeller/renderer/backend/gles/pipeline_library_gles.cc b/impeller/renderer/backend/gles/pipeline_library_gles.cc index b0190826e5771..85316e386dd12 100644 --- a/impeller/renderer/backend/gles/pipeline_library_gles.cc +++ b/impeller/renderer/backend/gles/pipeline_library_gles.cc @@ -33,6 +33,19 @@ static std::string GetShaderInfoLog(const ProcTableGLES& gl, GLuint shader) { return log_string; } +static std::string GetShaderSource(const ProcTableGLES& gl, GLuint shader) { + // Arbitrarily chosen size that should be larger than most shaders. + // Since this only fires on compilation errors the performance shouldn't + // matter. + auto data = static_cast(malloc(10240)); + GLsizei length; + gl.GetShaderSource(shader, 10240, &length, data); + + auto result = std::string{data, static_cast(length)}; + free(data); + return result; +} + static void LogShaderCompilationFailure(const ProcTableGLES& gl, GLuint shader, const std::string& name, @@ -63,10 +76,7 @@ static void LogShaderCompilationFailure(const ProcTableGLES& gl, stream << " shader for '" << name << "' with error:" << std::endl; stream << GetShaderInfoLog(gl, shader) << std::endl; stream << "Shader source was: " << std::endl; - stream << std::string{reinterpret_cast( - source_mapping.GetMapping()), - source_mapping.GetSize()} - << std::endl; + stream << GetShaderSource(gl, shader) << std::endl; VALIDATION_LOG << stream.str(); } @@ -105,8 +115,10 @@ static bool LinkProgram( fml::ScopedCleanupClosure delete_frag_shader( [&gl, frag_shader]() { gl.DeleteShader(frag_shader); }); - gl.ShaderSourceMapping(vert_shader, *vert_mapping); - gl.ShaderSourceMapping(frag_shader, *frag_mapping); + gl.ShaderSourceMapping(vert_shader, *vert_mapping, + descriptor.GetSpecializationConstants()); + gl.ShaderSourceMapping(frag_shader, *frag_mapping, + descriptor.GetSpecializationConstants()); gl.CompileShader(vert_shader); gl.CompileShader(frag_shader); diff --git a/impeller/renderer/backend/gles/proc_table_gles.cc b/impeller/renderer/backend/gles/proc_table_gles.cc index 2541424ad9439..afdb620163afa 100644 --- a/impeller/renderer/backend/gles/proc_table_gles.cc +++ b/impeller/renderer/backend/gles/proc_table_gles.cc @@ -6,6 +6,7 @@ #include +#include "fml/closure.h" #include "impeller/base/allocation.h" #include "impeller/base/comparable.h" #include "impeller/base/validation.h" @@ -138,14 +139,53 @@ bool ProcTableGLES::IsValid() const { return is_valid_; } -void ProcTableGLES::ShaderSourceMapping(GLuint shader, - const fml::Mapping& mapping) const { +void ProcTableGLES::ShaderSourceMapping( + GLuint shader, + const fml::Mapping& mapping, + const std::vector& defines) const { + if (defines.empty()) { + const GLchar* sources[] = { + reinterpret_cast(mapping.GetMapping())}; + const GLint lengths[] = {static_cast(mapping.GetSize())}; + ShaderSource(shader, 1u, sources, lengths); + return; + } + const auto& shader_source = ComputeShaderWithDefines(mapping, defines); + if (!shader_source.has_value()) { + VALIDATION_LOG << "Failed to append constant data to shader"; + return; + } + const GLchar* sources[] = { - reinterpret_cast(mapping.GetMapping())}; - const GLint lengths[] = {static_cast(mapping.GetSize())}; + reinterpret_cast(shader_source->c_str())}; + const GLint lengths[] = {static_cast(shader_source->size())}; ShaderSource(shader, 1u, sources, lengths); } +// Visible For testing. +std::optional ProcTableGLES::ComputeShaderWithDefines( + const fml::Mapping& mapping, + const std::vector& defines) const { + auto shader_source = std::string{ + reinterpret_cast(mapping.GetMapping()), mapping.GetSize()}; + + // Look for the first newline after the '#version' header, which impellerc + // will always emit as the first line of a compiled shader. + auto index = shader_source.find('\n'); + if (index == std::string::npos) { + VALIDATION_LOG << "Failed to append constant data to shader"; + return std::nullopt; + } + + std::stringstream ss; + for (auto i = 0u; i < defines.size(); i++) { + ss << "#define SPIRV_CROSS_CONSTANT_ID_" << i << " " << defines[i] << '\n'; + } + auto define_string = ss.str(); + shader_source.insert(index + 1, define_string); + return shader_source; +} + const DescriptionGLES* ProcTableGLES::GetDescription() const { return description_.get(); } diff --git a/impeller/renderer/backend/gles/proc_table_gles.h b/impeller/renderer/backend/gles/proc_table_gles.h index 848f3d97052ce..dfe0fd657d6f7 100644 --- a/impeller/renderer/backend/gles/proc_table_gles.h +++ b/impeller/renderer/backend/gles/proc_table_gles.h @@ -184,6 +184,7 @@ struct GLProc { PROC(UseProgram); \ PROC(VertexAttribPointer); \ PROC(Viewport); \ + PROC(GetShaderSource); \ PROC(ReadPixels); #define FOR_EACH_IMPELLER_GLES3_PROC(PROC) PROC(BlitFramebuffer); @@ -231,7 +232,14 @@ class ProcTableGLES { bool IsValid() const; - void ShaderSourceMapping(GLuint shader, const fml::Mapping& mapping) const; + /// @brief Set the source for the attached [shader]. + /// + /// Optionally, [defines] may contain a string value that will be + /// append to the shader source after the version marker. This can be used to + /// support static specialization. For example, setting "#define Foo 1". + void ShaderSourceMapping(GLuint shader, + const fml::Mapping& mapping, + const std::vector& defines = {}) const; const DescriptionGLES* GetDescription() const; @@ -251,6 +259,11 @@ class ProcTableGLES { void PopDebugGroup() const; + // Visible For testing. + std::optional ComputeShaderWithDefines( + const fml::Mapping& mapping, + const std::vector& defines) const; + private: bool is_valid_ = false; std::unique_ptr description_; diff --git a/impeller/renderer/backend/gles/shader_library_gles.h b/impeller/renderer/backend/gles/shader_library_gles.h index cd1ed53a7d416..b2acd2228182f 100644 --- a/impeller/renderer/backend/gles/shader_library_gles.h +++ b/impeller/renderer/backend/gles/shader_library_gles.h @@ -30,7 +30,7 @@ class ShaderLibraryGLES final : public ShaderLibrary { ShaderFunctionMap functions_ IPLR_GUARDED_BY(functions_mutex_); bool is_valid_ = false; - ShaderLibraryGLES( + explicit ShaderLibraryGLES( const std::vector>& shader_libraries); // |ShaderLibrary| diff --git a/impeller/renderer/backend/gles/test/specialization_constants_unittests.cc b/impeller/renderer/backend/gles/test/specialization_constants_unittests.cc new file mode 100644 index 0000000000000..8285c137808a3 --- /dev/null +++ b/impeller/renderer/backend/gles/test/specialization_constants_unittests.cc @@ -0,0 +1,75 @@ +// 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. + +#include "flutter/testing/testing.h" // IWYU pragma: keep +#include "fml/mapping.h" +#include "gtest/gtest.h" +#include "impeller/renderer/backend/gles/proc_table_gles.h" +#include "impeller/renderer/backend/gles/test/mock_gles.h" + +namespace impeller { +namespace testing { + +TEST(SpecConstant, CanCreateShaderWithSpecializationConstant) { + auto mock_gles = MockGLES::Init(); + auto& proc_table = mock_gles->GetProcTable(); + auto shader_source = + "#version 100\n" + "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n" + "#define SPIRV_CROSS_CONSTANT_ID_0 1\n" + "#endif\n" + "void main() { return vec4(0.0); }"; + auto test_shader = std::make_shared(shader_source); + + auto result = proc_table.ComputeShaderWithDefines(*test_shader, {0}); + + auto expected_shader_source = + "#version 100\n" + "#define SPIRV_CROSS_CONSTANT_ID_0 0\n" + "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n" + "#define SPIRV_CROSS_CONSTANT_ID_0 1\n" + "#endif\n" + "void main() { return vec4(0.0); }"; + + if (!result.has_value()) { + GTEST_FAIL() << "Expected shader source"; + } + ASSERT_EQ(result.value(), expected_shader_source); +} + +TEST(SpecConstant, CanCreateShaderWithSpecializationConstantMultipleValues) { + auto mock_gles = MockGLES::Init(); + auto& proc_table = mock_gles->GetProcTable(); + auto shader_source = + "#version 100\n" + "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n" + "#define SPIRV_CROSS_CONSTANT_ID_0 1\n" + "#endif\n" + "void main() { return vec4(0.0); }"; + auto test_shader = std::make_shared(shader_source); + + auto result = + proc_table.ComputeShaderWithDefines(*test_shader, {0, 1, 2, 3, 4, 5}); + + auto expected_shader_source = + "#version 100\n" + "#define SPIRV_CROSS_CONSTANT_ID_0 0\n" + "#define SPIRV_CROSS_CONSTANT_ID_1 1\n" + "#define SPIRV_CROSS_CONSTANT_ID_2 2\n" + "#define SPIRV_CROSS_CONSTANT_ID_3 3\n" + "#define SPIRV_CROSS_CONSTANT_ID_4 4\n" + "#define SPIRV_CROSS_CONSTANT_ID_5 5\n" + "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n" + "#define SPIRV_CROSS_CONSTANT_ID_0 1\n" + "#endif\n" + "void main() { return vec4(0.0); }"; + + if (!result.has_value()) { + GTEST_FAIL() << "Expected shader source"; + } + ASSERT_EQ(result.value(), expected_shader_source); +} + +} // namespace testing +} // namespace impeller diff --git a/impeller/renderer/backend/metal/pipeline_library_mtl.h b/impeller/renderer/backend/metal/pipeline_library_mtl.h index 5b333c22684ac..06489545e9210 100644 --- a/impeller/renderer/backend/metal/pipeline_library_mtl.h +++ b/impeller/renderer/backend/metal/pipeline_library_mtl.h @@ -27,7 +27,7 @@ class PipelineLibraryMTL final : public PipelineLibrary { PipelineMap pipelines_; ComputePipelineMap compute_pipelines_; - PipelineLibraryMTL(id device); + explicit PipelineLibraryMTL(id device); // |PipelineLibrary| bool IsValid() const override; diff --git a/impeller/renderer/backend/metal/pipeline_library_mtl.mm b/impeller/renderer/backend/metal/pipeline_library_mtl.mm index 98895ce336ddd..177c54aa6a8d2 100644 --- a/impeller/renderer/backend/metal/pipeline_library_mtl.mm +++ b/impeller/renderer/backend/metal/pipeline_library_mtl.mm @@ -4,6 +4,7 @@ #include "impeller/renderer/backend/metal/pipeline_library_mtl.h" +#include #include #include "flutter/fml/build_config.h" @@ -22,22 +23,14 @@ PipelineLibraryMTL::~PipelineLibraryMTL() = default; -static MTLRenderPipelineDescriptor* GetMTLRenderPipelineDescriptor( - const PipelineDescriptor& desc) { +using Callback = std::function; + +static void GetMTLRenderPipelineDescriptor(const PipelineDescriptor& desc, + const Callback& callback) { auto descriptor = [[MTLRenderPipelineDescriptor alloc] init]; descriptor.label = @(desc.GetLabel().c_str()); descriptor.rasterSampleCount = static_cast(desc.GetSampleCount()); - - for (const auto& entry : desc.GetStageEntrypoints()) { - if (entry.first == ShaderStage::kVertex) { - descriptor.vertexFunction = - ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction(); - } - if (entry.first == ShaderStage::kFragment) { - descriptor.fragmentFunction = - ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction(); - } - } + bool created_specialized_function = false; if (const auto& vertex_descriptor = desc.GetVertexDescriptor()) { VertexDescriptorMTL vertex_descriptor_mtl; @@ -59,7 +52,33 @@ descriptor.stencilAttachmentPixelFormat = ToMTLPixelFormat(desc.GetStencilPixelFormat()); - return descriptor; + const auto& constants = desc.GetSpecializationConstants(); + for (const auto& entry : desc.GetStageEntrypoints()) { + if (entry.first == ShaderStage::kVertex) { + descriptor.vertexFunction = + ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction(); + } + if (entry.first == ShaderStage::kFragment) { + if (constants.empty()) { + descriptor.fragmentFunction = + ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction(); + } else { + // This code only expects a single specialized function per pipeline. + FML_CHECK(!created_specialized_function); + created_specialized_function = true; + ShaderFunctionMTL::Cast(*entry.second) + .GetMTLFunctionSpecialized( + constants, [callback, descriptor](id function) { + descriptor.fragmentFunction = function; + callback(descriptor); + }); + } + } + } + + if (!created_specialized_function) { + callback(descriptor); + } } static MTLComputePipelineDescriptor* GetMTLComputePipelineDescriptor( @@ -133,19 +152,12 @@ )); promise->set_value(new_pipeline); }; - auto mtl_descriptor = GetMTLRenderPipelineDescriptor(descriptor); -#if FML_OS_IOS - [device_ newRenderPipelineStateWithDescriptor:mtl_descriptor - completionHandler:completion_handler]; -#else // FML_OS_IOS - // TODO(116919): Investigate and revert speculative fix to make MTL pipeline - // state creation use a worker. - NSError* error = nil; - auto render_pipeline_state = - [device_ newRenderPipelineStateWithDescriptor:mtl_descriptor - error:&error]; - completion_handler(render_pipeline_state, error); -#endif // FML_OS_IOS + GetMTLRenderPipelineDescriptor( + descriptor, [device = device_, completion_handler]( + MTLRenderPipelineDescriptor* descriptor) { + [device newRenderPipelineStateWithDescriptor:descriptor + completionHandler:completion_handler]; + }); return pipeline_future; } diff --git a/impeller/renderer/backend/metal/shader_function_mtl.h b/impeller/renderer/backend/metal/shader_function_mtl.h index c47eaf6799fd3..20bf6d05bf988 100644 --- a/impeller/renderer/backend/metal/shader_function_mtl.h +++ b/impeller/renderer/backend/metal/shader_function_mtl.h @@ -21,13 +21,20 @@ class ShaderFunctionMTL final id GetMTLFunction() const; + using CompileCallback = std::function)>; + + void GetMTLFunctionSpecialized(const std::vector& constants, + const CompileCallback& callback) const; + private: friend class ShaderLibraryMTL; id function_ = nullptr; + id library_ = nullptr; ShaderFunctionMTL(UniqueID parent_library_id, id function, + id library, std::string name, ShaderStage stage); diff --git a/impeller/renderer/backend/metal/shader_function_mtl.mm b/impeller/renderer/backend/metal/shader_function_mtl.mm index 04751af1b8f13..b33db5338179a 100644 --- a/impeller/renderer/backend/metal/shader_function_mtl.mm +++ b/impeller/renderer/backend/metal/shader_function_mtl.mm @@ -8,13 +8,37 @@ ShaderFunctionMTL::ShaderFunctionMTL(UniqueID parent_library_id, id function, + id library, std::string name, ShaderStage stage) : ShaderFunction(parent_library_id, std::move(name), stage), - function_(function) {} + function_(function), + library_(library) {} ShaderFunctionMTL::~ShaderFunctionMTL() = default; +void ShaderFunctionMTL::GetMTLFunctionSpecialized( + const std::vector& constants, + const CompileCallback& callback) const { + MTLFunctionConstantValues* constantValues = + [[MTLFunctionConstantValues alloc] init]; + size_t index = 0; + for (const auto value : constants) { + int copied_value = value; + [constantValues setConstantValue:&copied_value + type:MTLDataTypeInt + atIndex:index]; + index++; + } + CompileCallback callback_value = callback; + [library_ newFunctionWithName:@(GetName().data()) + constantValues:constantValues + completionHandler:^(id _Nullable function, + NSError* _Nullable error) { + callback_value(function); + }]; +} + id ShaderFunctionMTL::GetMTLFunction() const { return function_; } diff --git a/impeller/renderer/backend/metal/shader_library_mtl.h b/impeller/renderer/backend/metal/shader_library_mtl.h index 5b1bc7c75cd81..c401696c7ec45 100644 --- a/impeller/renderer/backend/metal/shader_library_mtl.h +++ b/impeller/renderer/backend/metal/shader_library_mtl.h @@ -39,7 +39,7 @@ class ShaderLibraryMTL final : public ShaderLibrary { ShaderFunctionMap functions_; bool is_valid_ = false; - ShaderLibraryMTL(NSArray>* libraries); + explicit ShaderLibraryMTL(NSArray>* libraries); // |ShaderLibrary| std::shared_ptr GetFunction(std::string_view name, diff --git a/impeller/renderer/backend/metal/shader_library_mtl.mm b/impeller/renderer/backend/metal/shader_library_mtl.mm index 94fb1e335b16d..45eb5d5e3c40e 100644 --- a/impeller/renderer/backend/metal/shader_library_mtl.mm +++ b/impeller/renderer/backend/metal/shader_library_mtl.mm @@ -55,6 +55,7 @@ static MTLFunctionType ToMTLFunctionType(ShaderStage stage) { ShaderKey key(name, stage); id function = nil; + id library = nil; { ReaderLock lock(libraries_mutex_); @@ -64,7 +65,8 @@ static MTLFunctionType ToMTLFunctionType(ShaderStage stage) { } for (size_t i = 0, count = [libraries_ count]; i < count; i++) { - function = [libraries_[i] newFunctionWithName:@(name.data())]; + library = libraries_[i]; + function = [library newFunctionWithName:@(name.data())]; if (function) { break; } @@ -81,7 +83,7 @@ static MTLFunctionType ToMTLFunctionType(ShaderStage stage) { } auto func = std::shared_ptr(new ShaderFunctionMTL( - library_id_, function, {name.data(), name.size()}, stage)); + library_id_, function, library, {name.data(), name.size()}, stage)); functions_[key] = func; return func; diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index 8022f7edb4592..8fa14a2e3b35f 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -278,7 +278,15 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( //---------------------------------------------------------------------------- /// Shader Stages /// + const auto& constants = desc.GetSpecializationConstants(); + + std::vector> map_entries( + desc.GetStageEntrypoints().size()); + std::vector specialization_infos( + desc.GetStageEntrypoints().size()); std::vector shader_stages; + + size_t entrypoint_count = 0; for (const auto& entrypoint : desc.GetStageEntrypoints()) { auto stage = ToVKShaderStageFlagBits(entrypoint.first); if (!stage.has_value()) { @@ -286,12 +294,31 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( << desc.GetLabel(); return nullptr; } + + std::vector& entries = + map_entries[entrypoint_count]; + for (auto i = 0u; i < constants.size(); i++) { + vk::SpecializationMapEntry entry; + entry.offset = (i * sizeof(int32_t)); + entry.size = sizeof(int32_t); + entry.constantID = i; + entries.emplace_back(entry); + } + + vk::SpecializationInfo& specialization_info = + specialization_infos[entrypoint_count]; + specialization_info.setMapEntries(map_entries[entrypoint_count]); + specialization_info.setPData(constants.data()); + specialization_info.setDataSize(sizeof(int32_t) * constants.size()); + vk::PipelineShaderStageCreateInfo info; info.setStage(stage.value()); info.setPName("main"); info.setModule( ShaderFunctionVK::Cast(entrypoint.second.get())->GetModule()); + info.setPSpecializationInfo(&specialization_info); shader_stages.push_back(info); + entrypoint_count++; } pipeline_info.setStages(shader_stages); diff --git a/impeller/renderer/pipeline_builder.h b/impeller/renderer/pipeline_builder.h index 593df8057ff75..293a2b7e17aac 100644 --- a/impeller/renderer/pipeline_builder.h +++ b/impeller/renderer/pipeline_builder.h @@ -48,8 +48,10 @@ struct PipelineBuilder { /// context, a pipeline descriptor. /// static std::optional MakeDefaultPipelineDescriptor( - const Context& context) { + const Context& context, + const std::vector& constants = {}) { PipelineDescriptor desc; + desc.SetSpecializationConstants(constants); if (InitializePipelineDescriptorDefaults(context, desc)) { return {std::move(desc)}; } diff --git a/impeller/renderer/pipeline_descriptor.cc b/impeller/renderer/pipeline_descriptor.cc index eef517b30c847..22ee4c30c4945 100644 --- a/impeller/renderer/pipeline_descriptor.cc +++ b/impeller/renderer/pipeline_descriptor.cc @@ -4,6 +4,9 @@ #include "impeller/renderer/pipeline_descriptor.h" +#include + +#include "impeller/base/comparable.h" #include "impeller/core/formats.h" #include "impeller/renderer/shader_function.h" #include "impeller/renderer/shader_library.h" @@ -61,7 +64,8 @@ bool PipelineDescriptor::IsEqual(const PipelineDescriptor& other) const { winding_order_ == other.winding_order_ && cull_mode_ == other.cull_mode_ && primitive_type_ == other.primitive_type_ && - polygon_mode_ == other.polygon_mode_; + polygon_mode_ == other.polygon_mode_ && + specialization_constants_ == other.specialization_constants_; } PipelineDescriptor& PipelineDescriptor::SetLabel(std::string label) { @@ -277,4 +281,14 @@ PolygonMode PipelineDescriptor::GetPolygonMode() const { return polygon_mode_; } +void PipelineDescriptor::SetSpecializationConstants( + std::vector values) { + specialization_constants_ = std::move(values); +} + +const std::vector& PipelineDescriptor::GetSpecializationConstants() + const { + return specialization_constants_; +} + } // namespace impeller diff --git a/impeller/renderer/pipeline_descriptor.h b/impeller/renderer/pipeline_descriptor.h index 3d0eddf880e28..1045ea8fbd3fd 100644 --- a/impeller/renderer/pipeline_descriptor.h +++ b/impeller/renderer/pipeline_descriptor.h @@ -4,17 +4,10 @@ #pragma once -#include -#include #include #include #include -#include -#include -#include -#include "flutter/fml/hash_combine.h" -#include "flutter/fml/macros.h" #include "impeller/base/comparable.h" #include "impeller/core/formats.h" #include "impeller/core/shader_types.h" @@ -131,6 +124,10 @@ class PipelineDescriptor final : public Comparable { PolygonMode GetPolygonMode() const; + void SetSpecializationConstants(std::vector values); + + const std::vector& GetSpecializationConstants() const; + private: std::string label_; SampleCount sample_count_ = SampleCount::kCount1; @@ -149,6 +146,7 @@ class PipelineDescriptor final : public Comparable { back_stencil_attachment_descriptor_; PrimitiveType primitive_type_ = PrimitiveType::kTriangle; PolygonMode polygon_mode_ = PolygonMode::kFill; + std::vector specialization_constants_; }; } // namespace impeller diff --git a/impeller/renderer/shader_function.cc b/impeller/renderer/shader_function.cc index b51a4888d006f..7aa8053bd5e10 100644 --- a/impeller/renderer/shader_function.cc +++ b/impeller/renderer/shader_function.cc @@ -19,6 +19,10 @@ ShaderStage ShaderFunction::GetStage() const { return stage_; } +const std::string& ShaderFunction::GetName() const { + return name_; +} + // |Comparable| std::size_t ShaderFunction::GetHash() const { return fml::HashCombine(parent_library_id_, name_, stage_); diff --git a/impeller/renderer/shader_function.h b/impeller/renderer/shader_function.h index 2a0660884940a..280c64d117fd1 100644 --- a/impeller/renderer/shader_function.h +++ b/impeller/renderer/shader_function.h @@ -4,6 +4,7 @@ #pragma once +#include #include "flutter/fml/hash_combine.h" #include "flutter/fml/macros.h" #include "impeller/base/comparable.h" @@ -18,6 +19,8 @@ class ShaderFunction : public Comparable { ShaderStage GetStage() const; + const std::string& GetName() const; + // |Comparable| std::size_t GetHash() const override; diff --git a/impeller/tools/malioc.json b/impeller/tools/malioc.json index 4e61378f06e5c..1aa9b4e8a8242 100644 --- a/impeller/tools/malioc.json +++ b/impeller/tools/malioc.json @@ -1,4 +1,77 @@ { + "flutter/impeller/entity/advanced_blend.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/advanced_blend.frag.vkspv", + "has_side_effects": false, + "has_uniform_computation": true, + "modifies_coverage": false, + "reads_color_buffer": false, + "type": "Fragment", + "uses_late_zs_test": false, + "uses_late_zs_update": false, + "variants": { + "Main": { + "fp16_arithmetic": 0, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "varying", + "texture" + ], + "longest_path_cycles": [ + 0.46875, + 0.46875, + 0.015625, + 0.0, + 0.0, + 0.5, + 0.5 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_fma" + ], + "shortest_path_cycles": [ + 0.40625, + 0.40625, + 0.09375, + 0.0, + 0.0, + 0.25, + 0.25 + ], + "total_bound_pipelines": [ + "varying", + "texture" + ], + "total_cycles": [ + 0.46875, + 0.46875, + 0.09375, + 0.0, + 0.0, + 0.5, + 0.5 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 10, + "work_registers_used": 16 + } + } + } + }, "flutter/impeller/entity/advanced_blend.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", @@ -111,10 +184,10 @@ } } }, - "flutter/impeller/entity/advanced_blend_color.frag.vkspv": { + "flutter/impeller/entity/blend.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_color.frag.vkspv", + "filename": "flutter/impeller/entity/blend.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -124,21 +197,21 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 87, + "fp16_arithmetic": 100, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "varying", + "texture" ], "longest_path_cycles": [ - 0.609375, - 0.609375, - 0.15625, - 0.125, + 0.03125, + 0.03125, 0.0, - 0.5, - 0.5 + 0.0, + 0.0, + 0.25, + 0.25 ], "pipelines": [ "arith_total", @@ -150,68 +223,61 @@ "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "varying", + "texture" ], "shortest_path_cycles": [ - 0.34375, - 0.34375, - 0.203125, + 0.03125, + 0.03125, + 0.0, 0.0, 0.0, 0.25, 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_fma" + "varying", + "texture" ], "total_cycles": [ - 0.609375, - 0.609375, - 0.203125, - 0.125, + 0.03125, + 0.03125, 0.0, - 0.5, - 0.5 + 0.0, + 0.0, + 0.25, + 0.25 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 12 + "uniform_registers_used": 4, + "work_registers_used": 4 } } } }, - "flutter/impeller/entity/advanced_blend_colorburn.frag.vkspv": { + "flutter/impeller/entity/blend.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_colorburn.frag.vkspv", - "has_side_effects": false, + "filename": "flutter/impeller/entity/blend.vert.vkspv", "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 100, + "Position": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.296875, - 0.28125, - 0.296875, - 0.1875, + 0.125, + 0.125, 0.0, - 0.5, - 0.5 + 0.0, + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -219,72 +285,50 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" + "load_store" ], "shortest_path_cycles": [ - 0.34375, - 0.25, - 0.34375, - 0.1875, + 0.125, + 0.125, 0.0, - 0.25, - 0.25 + 0.0, + 2.0, + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.34375, - 0.28125, - 0.34375, - 0.1875, + 0.125, + 0.125, 0.0, - 0.5, - 0.5 + 0.0, + 2.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 14 - } - } - } - }, - "flutter/impeller/entity/advanced_blend_colordodge.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_colordodge.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, + "uniform_registers_used": 30, + "work_registers_used": 32 + }, + "Varying": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.296875, - 0.25, - 0.296875, - 0.1875, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.5, - 0.5 + 3.0, + 0.0 ], "pipelines": [ "arith_total", @@ -292,48 +336,43 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" + "load_store" ], "shortest_path_cycles": [ - 0.34375, - 0.21875, - 0.34375, - 0.1875, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.25, - 0.25 + 3.0, + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.34375, - 0.25, - 0.34375, - 0.1875, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.5, - 0.5 + 3.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 12 + "uniform_registers_used": 22, + "work_registers_used": 8 } } } }, - "flutter/impeller/entity/advanced_blend_darken.frag.vkspv": { + "flutter/impeller/entity/border_mask_blur.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_darken.frag.vkspv", + "filename": "flutter/impeller/entity/border_mask_blur.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -343,21 +382,21 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 100, + "fp16_arithmetic": 44, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "arith_total", + "arith_fma" ], "longest_path_cycles": [ - 0.1875, - 0.1875, - 0.0625, - 0.0, + 0.875, + 0.875, + 0.203125, + 0.25, 0.0, - 0.5, - 0.5 + 0.25, + 0.25 ], "pipelines": [ "arith_total", @@ -369,68 +408,61 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying", - "texture" + "arith_total", + "arith_fma" ], "shortest_path_cycles": [ - 0.15625, - 0.15625, - 0.109375, - 0.0, + 0.875, + 0.875, + 0.203125, + 0.25, 0.0, 0.25, 0.25 ], "total_bound_pipelines": [ - "varying", - "texture" + "arith_total", + "arith_fma" ], "total_cycles": [ - 0.1875, - 0.1875, - 0.109375, - 0.0, + 0.875, + 0.875, + 0.203125, + 0.25, 0.0, - 0.5, - 0.5 + 0.25, + 0.25 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 11 + "uniform_registers_used": 12, + "work_registers_used": 18 } } } }, - "flutter/impeller/entity/advanced_blend_difference.frag.vkspv": { + "flutter/impeller/entity/border_mask_blur.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_difference.frag.vkspv", - "has_side_effects": false, + "filename": "flutter/impeller/entity/border_mask_blur.vert.vkspv", "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 100, + "Position": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.234375, - 0.234375, - 0.03125, + 0.125, + 0.125, 0.0, 0.0, - 0.5, - 0.5 + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -438,72 +470,50 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "shortest_path_cycles": [ - 0.203125, - 0.203125, - 0.078125, + 0.125, + 0.125, 0.0, 0.0, - 0.25, - 0.25 + 2.0, + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.234375, - 0.234375, - 0.078125, + 0.125, + 0.125, 0.0, 0.0, - 0.5, - 0.5 + 2.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 11 - } - } - } - }, - "flutter/impeller/entity/advanced_blend_exclusion.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_exclusion.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, + "uniform_registers_used": 30, + "work_registers_used": 32 + }, + "Varying": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.296875, - 0.296875, - 0.03125, - 0.0, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.5, - 0.5 + 3.0, + 0.0 ], "pipelines": [ "arith_total", @@ -511,48 +521,43 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "shortest_path_cycles": [ - 0.265625, - 0.265625, - 0.078125, - 0.0, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.25, - 0.25 + 3.0, + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.296875, - 0.296875, - 0.078125, - 0.0, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.5, - 0.5 + 3.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 11 + "uniform_registers_used": 22, + "work_registers_used": 8 } } } }, - "flutter/impeller/entity/advanced_blend_hardlight.frag.vkspv": { + "flutter/impeller/entity/checkerboard.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_hardlight.frag.vkspv", + "filename": "flutter/impeller/entity/checkerboard.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -562,21 +567,20 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 100, + "fp16_arithmetic": 80, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.46875, - 0.46875, - 0.09375, - 0.0, + 0.125, + 0.125, + 0.125, + 0.0625, + 1.0, 0.0, - 0.5, - 0.5 + 0.0 ], "pipelines": [ "arith_total", @@ -588,68 +592,59 @@ "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "shortest_path_cycles": [ - 0.4375, - 0.4375, - 0.140625, - 0.0, + 0.125, + 0.125, + 0.125, + 0.0625, + 1.0, 0.0, - 0.25, - 0.25 + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.46875, - 0.46875, - 0.140625, - 0.0, + 0.125, + 0.125, + 0.125, + 0.0625, + 1.0, 0.0, - 0.5, - 0.5 + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 13 + "uniform_registers_used": 6, + "work_registers_used": 7 } } } }, - "flutter/impeller/entity/advanced_blend_hue.frag.vkspv": { + "flutter/impeller/entity/checkerboard.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_hue.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "filename": "flutter/impeller/entity/checkerboard.vert.vkspv", + "has_uniform_computation": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 90, + "Position": { + "fp16_arithmetic": null, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "longest_path_cycles": [ - 0.71875, - 0.71875, - 0.328125, - 0.1875, 0.0, - 0.5, - 0.5 + 0.0, + 0.0, + 0.0, + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -657,51 +652,45 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt" + "load_store" ], "shortest_path_cycles": [ - 0.34375, - 0.34375, - 0.34375, 0.0, 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "arith_total", - "arith_fma" + 0.0, + 0.0, + 2.0, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" ], "total_cycles": [ - 0.71875, - 0.71875, - 0.40625, - 0.1875, 0.0, - 0.5, - 0.5 + 0.0, + 0.0, + 0.0, + 2.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 12 + "uniform_registers_used": 8, + "work_registers_used": 32 } } } }, - "flutter/impeller/entity/advanced_blend_lighten.frag.vkspv": { + "flutter/impeller/entity/clip.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_lighten.frag.vkspv", + "filename": "flutter/impeller/entity/clip.frag.vkspv", "has_side_effects": false, - "has_uniform_computation": true, + "has_uniform_computation": false, "modifies_coverage": false, "reads_color_buffer": false, "type": "Fragment", @@ -709,21 +698,21 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 100, + "fp16_arithmetic": null, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "arith_total", + "arith_cvt" ], "longest_path_cycles": [ - 0.1875, - 0.1875, - 0.0625, + 0.015625, 0.0, + 0.015625, 0.0, - 0.5, - 0.5 + 0.0, + 0.0, + 0.0 ], "pipelines": [ "arith_total", @@ -735,68 +724,61 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying", - "texture" + "arith_total", + "arith_cvt" ], "shortest_path_cycles": [ - 0.15625, - 0.15625, - 0.109375, + 0.015625, + 0.0, + 0.015625, 0.0, 0.0, - 0.25, - 0.25 + 0.0, + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "arith_total", + "arith_cvt" ], "total_cycles": [ - 0.1875, - 0.1875, - 0.109375, + 0.015625, 0.0, + 0.015625, 0.0, - 0.5, - 0.5 + 0.0, + 0.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 11 + "uniform_registers_used": 0, + "work_registers_used": 0 } } } }, - "flutter/impeller/entity/advanced_blend_luminosity.frag.vkspv": { + "flutter/impeller/entity/clip.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_luminosity.frag.vkspv", - "has_side_effects": false, + "filename": "flutter/impeller/entity/clip.vert.vkspv", "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 87, + "Position": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "longest_path_cycles": [ - 0.609375, - 0.609375, - 0.15625, + 0.125, 0.125, 0.0, - 0.5, - 0.5 + 0.0, + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -804,48 +786,43 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "shortest_path_cycles": [ - 0.34375, - 0.34375, - 0.203125, + 0.125, + 0.125, 0.0, 0.0, - 0.25, - 0.25 + 2.0, + 0.0 ], "total_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "total_cycles": [ - 0.609375, - 0.609375, - 0.203125, + 0.125, 0.125, 0.0, - 0.5, - 0.5 + 0.0, + 2.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 12 + "uniform_registers_used": 28, + "work_registers_used": 32 } } } }, - "flutter/impeller/entity/advanced_blend_multiply.frag.vkspv": { + "flutter/impeller/entity/color_matrix_color_filter.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_multiply.frag.vkspv", + "filename": "flutter/impeller/entity/color_matrix_color_filter.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -859,17 +836,19 @@ "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ + "arith_total", + "arith_fma", "varying", "texture" ], "longest_path_cycles": [ - 0.203125, - 0.203125, - 0.03125, - 0.0, + 0.25, + 0.25, + 0.0625, + 0.0625, 0.0, - 0.5, - 0.5 + 0.25, + 0.25 ], "pipelines": [ "arith_total", @@ -881,68 +860,65 @@ "texture" ], "shortest_path_bound_pipelines": [ + "arith_total", + "arith_fma", "varying", "texture" ], "shortest_path_cycles": [ - 0.171875, - 0.171875, - 0.078125, - 0.0, + 0.25, + 0.25, + 0.0625, + 0.0625, 0.0, 0.25, 0.25 ], "total_bound_pipelines": [ + "arith_total", + "arith_fma", "varying", "texture" ], "total_cycles": [ - 0.203125, - 0.203125, - 0.078125, - 0.0, + 0.25, + 0.25, + 0.0625, + 0.0625, 0.0, - 0.5, - 0.5 + 0.25, + 0.25 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 11 + "uniform_registers_used": 14, + "work_registers_used": 10 } } } }, - "flutter/impeller/entity/advanced_blend_overlay.frag.vkspv": { + "flutter/impeller/entity/color_matrix_color_filter.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_overlay.frag.vkspv", - "has_side_effects": false, + "filename": "flutter/impeller/entity/color_matrix_color_filter.vert.vkspv", "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 100, + "Position": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.46875, - 0.46875, - 0.09375, + 0.125, + 0.125, 0.0, 0.0, - 0.5, - 0.5 + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -950,146 +926,50 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "shortest_path_cycles": [ - 0.4375, - 0.4375, - 0.140625, + 0.125, + 0.125, 0.0, 0.0, - 0.25, - 0.25 + 2.0, + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.46875, - 0.46875, - 0.140625, + 0.125, + 0.125, 0.0, 0.0, - 0.5, - 0.5 + 2.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 13 - } - } - } - }, - "flutter/impeller/entity/advanced_blend_saturation.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_saturation.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 90, + "uniform_registers_used": 30, + "work_registers_used": 32 + }, + "Varying": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "longest_path_cycles": [ - 0.71875, - 0.71875, - 0.328125, - 0.1875, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.34375, - 0.34375, - 0.34375, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "total_cycles": [ - 0.71875, - 0.71875, - 0.40625, - 0.1875, - 0.0, - 0.5, - 0.5 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 12 - } - } - } - }, - "flutter/impeller/entity/advanced_blend_screen.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_screen.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.265625, - 0.265625, - 0.03125, - 0.0, - 0.0, - 0.5, - 0.5 + 3.0, + 0.0 ], "pipelines": [ "arith_total", @@ -1097,48 +977,43 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "shortest_path_cycles": [ - 0.234375, - 0.234375, - 0.078125, - 0.0, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.25, - 0.25 + 3.0, + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.265625, - 0.265625, - 0.078125, - 0.0, + 0.015625, + 0.015625, + 0.015625, 0.0, - 0.5, - 0.5 + 3.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 10 + "uniform_registers_used": 22, + "work_registers_used": 8 } } } }, - "flutter/impeller/entity/advanced_blend_softlight.frag.vkspv": { + "flutter/impeller/entity/conical_gradient_fill.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/advanced_blend_softlight.frag.vkspv", + "filename": "flutter/impeller/entity/conical_gradient_fill.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -1148,21 +1023,21 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 100, + "fp16_arithmetic": 74, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ "arith_total", - "arith_fma" + "arith_cvt" ], "longest_path_cycles": [ 0.800000011920929, + 0.328125, 0.800000011920929, - 0.234375, - 0.1875, + 0.0625, 0.0, - 0.5, - 0.5 + 0.25, + 0.25 ], "pipelines": [ "arith_total", @@ -1174,44 +1049,43 @@ "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "varying" ], "shortest_path_cycles": [ - 0.762499988079071, - 0.762499988079071, - 0.28125, - 0.1875, + 0.15625, + 0.0, + 0.15625, + 0.0, 0.0, 0.25, - 0.25 + 0.0 ], "total_bound_pipelines": [ "arith_total", - "arith_fma" + "arith_cvt" ], "total_cycles": [ - 0.800000011920929, - 0.800000011920929, - 0.28125, - 0.1875, + 1.1375000476837158, + 0.699999988079071, + 1.1375000476837158, + 0.3125, 0.0, - 0.5, - 0.5 + 0.25, + 0.25 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 14, - "work_registers_used": 22 + "uniform_registers_used": 40, + "work_registers_used": 9 } } } }, - "flutter/impeller/entity/blend.frag.vkspv": { + "flutter/impeller/entity/conical_gradient_ssbo_fill.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/blend.frag.vkspv", + "filename": "flutter/impeller/entity/conical_gradient_ssbo_fill.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -1221,21 +1095,20 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 100, + "fp16_arithmetic": 68, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + null ], "longest_path_cycles": [ - 0.03125, - 0.03125, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25 + null, + null, + null, + null, + null, + null, + null ], "pipelines": [ "arith_total", @@ -1247,44 +1120,43 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying", - "texture" + "arith_total", + "arith_sfu" ], "shortest_path_cycles": [ - 0.03125, - 0.03125, - 0.0, - 0.0, + 0.5, + 0.109375, + 0.328125, + 0.5, 0.0, 0.25, - 0.25 + 0.0 ], "total_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "total_cycles": [ - 0.03125, - 0.03125, - 0.0, - 0.0, - 0.0, + 1.4500000476837158, + 0.862500011920929, + 1.4500000476837158, + 0.875, + 4.0, 0.25, - 0.25 + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 4, - "work_registers_used": 4 + "uniform_registers_used": 46, + "work_registers_used": 20 } } } }, - "flutter/impeller/entity/blend.vert.vkspv": { + "flutter/impeller/entity/gaussian_blur.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/blend.vert.vkspv", + "filename": "flutter/impeller/entity/gaussian_blur.vert.vkspv", "has_uniform_computation": true, "type": "Vertex", "variants": { @@ -1393,10 +1265,10 @@ } } }, - "flutter/impeller/entity/border_mask_blur.frag.vkspv": { + "flutter/impeller/entity/gaussian_blur_noalpha_decal.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/border_mask_blur.frag.vkspv", + "filename": "flutter/impeller/entity/gaussian_blur_noalpha_decal.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -1406,21 +1278,20 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 44, + "fp16_arithmetic": 42, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + null ], "longest_path_cycles": [ - 0.875, - 0.875, - 0.203125, - 0.25, - 0.0, - 0.25, - 0.25 + null, + null, + null, + null, + null, + null, + null ], "pipelines": [ "arith_total", @@ -1433,2457 +1304,44 @@ ], "shortest_path_bound_pipelines": [ "arith_total", - "arith_fma" + "arith_cvt" ], "shortest_path_cycles": [ - 0.875, - 0.875, - 0.203125, - 0.25, + 0.109375, + 0.03125, + 0.109375, + 0.0625, 0.0, - 0.25, - 0.25 + 0.0, + 0.0 ], "total_bound_pipelines": [ "arith_total", - "arith_fma" + "arith_cvt", + "arith_sfu" ], "total_cycles": [ - 0.875, - 0.875, + 0.3125, 0.203125, - 0.25, - 0.0, - 0.25, - 0.25 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 18 - } - } - } - }, - "flutter/impeller/entity/border_mask_blur.vert.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/border_mask_blur.vert.vkspv", - "has_uniform_computation": true, - "type": "Vertex", - "variants": { - "Position": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 30, - "work_registers_used": 32 - }, - "Varying": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 22, - "work_registers_used": 8 - } - } - } - }, - "flutter/impeller/entity/checkerboard.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/checkerboard.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 80, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.125, - 0.125, - 0.125, - 0.0625, - 1.0, - 0.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.125, - 0.125, - 0.125, - 0.0625, - 1.0, - 0.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.125, - 0.125, - 0.125, - 0.0625, - 1.0, - 0.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 6, - "work_registers_used": 7 - } - } - } - }, - "flutter/impeller/entity/checkerboard.vert.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/checkerboard.vert.vkspv", - "has_uniform_computation": false, - "type": "Vertex", - "variants": { - "Position": { - "fp16_arithmetic": null, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.0, - 0.0, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.0, - 0.0, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.0, - 0.0, - 0.0, - 0.0, - 2.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 32 - } - } - } - }, - "flutter/impeller/entity/clip.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/clip.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": false, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": null, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "longest_path_cycles": [ - 0.015625, - 0.0, - 0.015625, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.015625, - 0.0, - 0.015625, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "total_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "total_cycles": [ - 0.015625, - 0.0, - 0.015625, - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 0, - "work_registers_used": 0 - } - } - } - }, - "flutter/impeller/entity/clip.vert.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/clip.vert.vkspv", - "has_uniform_computation": true, - "type": "Vertex", - "variants": { - "Position": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 28, - "work_registers_used": 32 - } - } - } - }, - "flutter/impeller/entity/color_matrix_color_filter.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/color_matrix_color_filter.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma", - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.25, - 0.25, - 0.0625, - 0.0625, - 0.0, - 0.25, - 0.25 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma", - "varying", - "texture" - ], - "shortest_path_cycles": [ - 0.25, - 0.25, - 0.0625, - 0.0625, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "arith_total", - "arith_fma", - "varying", - "texture" - ], - "total_cycles": [ - 0.25, - 0.25, - 0.0625, - 0.0625, - 0.0, - 0.25, - 0.25 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 14, - "work_registers_used": 10 - } - } - } - }, - "flutter/impeller/entity/color_matrix_color_filter.vert.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/color_matrix_color_filter.vert.vkspv", - "has_uniform_computation": true, - "type": "Vertex", - "variants": { - "Position": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 30, - "work_registers_used": 32 - }, - "Varying": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 22, - "work_registers_used": 8 - } - } - } - }, - "flutter/impeller/entity/conical_gradient_fill.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/conical_gradient_fill.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 74, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "longest_path_cycles": [ - 0.800000011920929, - 0.328125, - 0.800000011920929, - 0.0625, - 0.0, - 0.25, - 0.25 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "varying" - ], - "shortest_path_cycles": [ - 0.15625, - 0.0, - 0.15625, - 0.0, - 0.0, - 0.25, - 0.0 - ], - "total_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "total_cycles": [ - 1.1375000476837158, - 0.699999988079071, - 1.1375000476837158, - 0.3125, - 0.0, - 0.25, - 0.25 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 40, - "work_registers_used": 9 - } - } - } - }, - "flutter/impeller/entity/conical_gradient_ssbo_fill.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/conical_gradient_ssbo_fill.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 68, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - null - ], - "longest_path_cycles": [ - null, - null, - null, - null, - null, - null, - null - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_sfu" - ], - "shortest_path_cycles": [ - 0.5, - 0.109375, - 0.328125, - 0.5, - 0.0, - 0.25, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 1.4500000476837158, - 0.862500011920929, - 1.4500000476837158, - 0.875, - 4.0, - 0.25, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 46, - "work_registers_used": 20 - } - } - } - }, - "flutter/impeller/entity/gaussian_blur.vert.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gaussian_blur.vert.vkspv", - "has_uniform_computation": true, - "type": "Vertex", - "variants": { - "Position": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.125, - 0.125, - 0.0, - 0.0, - 2.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 30, - "work_registers_used": 32 - }, - "Varying": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.015625, - 0.015625, - 0.015625, - 0.0, - 3.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 22, - "work_registers_used": 8 - } - } - } - }, - "flutter/impeller/entity/gaussian_blur_noalpha_decal.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gaussian_blur_noalpha_decal.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 42, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - null - ], - "longest_path_cycles": [ - null, - null, - null, - null, - null, - null, - null - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.109375, - 0.03125, - 0.109375, - 0.0625, - 0.0, - 0.0, - 0.0 - ], - "total_bound_pipelines": [ - "arith_total", - "arith_cvt", - "arith_sfu" - ], - "total_cycles": [ - 0.3125, - 0.203125, - 0.3125, - 0.3125, - 0.0, - 0.25, - 0.25 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 16 - } - } - } - }, - "flutter/impeller/entity/gaussian_blur_noalpha_nodecal.frag.vkspv": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gaussian_blur_noalpha_nodecal.frag.vkspv", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 35, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - null - ], - "longest_path_cycles": [ - null, - null, - null, - null, - null, - null, - null - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.109375, - 0.03125, - 0.109375, - 0.0625, - 0.0, - 0.0, - 0.0 - ], - "total_bound_pipelines": [ - "varying", - "texture" - ], - "total_cycles": [ - 0.203125, - 0.203125, - 0.203125, - 0.125, - 0.0, - 0.25, - 0.25 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 13 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend.vert.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend.vert.gles", - "has_uniform_computation": true, - "type": "Vertex", - "variants": { - "Position": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.140625, - 0.140625, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.140625, - 0.140625, - 0.0, - 0.0, - 2.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.140625, - 0.140625, - 0.0, - 0.0, - 2.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 22, - "work_registers_used": 32 - }, - "Varying": { - "fp16_arithmetic": 0, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 0.03125, - 0.03125, - 0.03125, - 0.0, - 4.0, - 0.0 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 0.03125, - 0.03125, - 0.03125, - 0.0, - 4.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 0.03125, - 0.03125, - 0.03125, - 0.0, - 4.0, - 0.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 10 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend.vert.gles", - "has_uniform_computation": false, - "type": "Vertex", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "load_store" - ], - "longest_path_cycles": [ - 3.299999952316284, - 7.0, - 0.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "load_store" - ], - "shortest_path_cycles": [ - 3.299999952316284, - 7.0, - 0.0 - ], - "total_bound_pipelines": [ - "load_store" - ], - "total_cycles": [ - 3.3333332538604736, - 7.0, - 0.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 6, - "work_registers_used": 3 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_color.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_color.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "longest_path_cycles": [ - 0.609375, - 0.609375, - 0.46875, - 0.5, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "shortest_path_cycles": [ - 0.34375, - 0.34375, - 0.265625, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.609375, - 0.609375, - 0.578125, - 0.5, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_color.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 9.569999694824219, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 4.949999809265137, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 11.0, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 3 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_colorburn.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_colorburn.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "longest_path_cycles": [ - 0.637499988079071, - 0.28125, - 0.637499988079071, - 0.5625, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.40625, - 0.25, - 0.40625, - 0.1875, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.75, - 0.28125, - 0.75, - 0.5625, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 26 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_colorburn.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 10.229999542236328, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 7.590000152587891, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 11.666666984558105, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_colordodge.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_colordodge.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "longest_path_cycles": [ - 0.625, - 0.25, - 0.625, - 0.5625, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.390625, - 0.21875, - 0.390625, - 0.1875, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.737500011920929, - 0.25, - 0.737500011920929, - 0.5625, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 24 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_colordodge.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 10.229999542236328, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 7.590000152587891, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 11.666666984558105, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_darken.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_darken.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.40625, - 0.1875, - 0.40625, - 0.375, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "varying", - "texture" - ], - "shortest_path_cycles": [ - 0.171875, - 0.15625, - 0.171875, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.515625, - 0.1875, - 0.515625, - 0.375, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_darken.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 5.28000020980835, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 2.309999942779541, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 6.333333492279053, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_difference.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_difference.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.375, - 0.234375, - 0.375, - 0.375, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "varying", - "texture" - ], - "shortest_path_cycles": [ - 0.203125, - 0.203125, - 0.140625, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.484375, - 0.234375, - 0.484375, - 0.375, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_difference.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 5.610000133514404, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 2.640000104904175, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 6.666666507720947, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_exclusion.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_exclusion.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.375, - 0.28125, - 0.375, - 0.375, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma", - "varying", - "texture" - ], - "shortest_path_cycles": [ - 0.25, - 0.25, - 0.140625, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.484375, - 0.28125, - 0.484375, - 0.375, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_exclusion.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 5.610000133514404, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 2.640000104904175, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 6.666666507720947, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_hardlight.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_hardlight.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.453125, - 0.453125, - 0.421875, - 0.375, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "shortest_path_cycles": [ - 0.421875, - 0.421875, - 0.1875, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.53125, - 0.453125, - 0.53125, - 0.375, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 24 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_hardlight.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 6.599999904632568, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 3.9600000381469727, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 8.0, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 4 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_hue.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_hue.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "longest_path_cycles": [ - 0.71875, - 0.71875, - 0.625, - 0.5625, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" - ], - "shortest_path_cycles": [ - 0.40625, - 0.34375, - 0.40625, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.78125, - 0.71875, - 0.78125, - 0.5625, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_hue.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 11.220000267028809, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 5.610000133514404, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 13.0, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 3 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_lighten.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_lighten.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.40625, - 0.1875, - 0.40625, - 0.375, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "varying", - "texture" - ], - "shortest_path_cycles": [ - 0.171875, - 0.15625, - 0.171875, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.515625, - 0.1875, - 0.515625, - 0.375, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_lighten.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 5.28000020980835, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 2.309999942779541, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 6.333333492279053, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_luminosity.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_luminosity.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "longest_path_cycles": [ - 0.609375, - 0.609375, - 0.46875, - 0.5, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "shortest_path_cycles": [ - 0.34375, - 0.34375, - 0.265625, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.609375, - 0.609375, - 0.578125, - 0.5, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 12, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_luminosity.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 9.569999694824219, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 4.949999809265137, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 11.0, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 3 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_multiply.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_multiply.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.375, - 0.203125, - 0.375, - 0.375, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "varying", - "texture" - ], - "shortest_path_cycles": [ - 0.171875, - 0.171875, - 0.140625, - 0.0, + 0.3125, + 0.3125, 0.0, 0.25, 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.484375, - 0.203125, - 0.484375, - 0.375, - 0.0, - 0.5, - 1.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_multiply.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 5.610000133514404, - 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 2.640000104904175, - 1.0, - 0.0 - ], - "total_bound_pipelines": [ - "arithmetic" - ], - "total_cycles": [ - 6.666666507720947, - 2.0, - 4.0 - ] - }, - "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 + "uniform_registers_used": 10, + "work_registers_used": 16 } } } }, - "flutter/impeller/entity/gles/advanced_blend_overlay.frag.gles": { + "flutter/impeller/entity/gaussian_blur_noalpha_nodecal.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_overlay.frag.gles", + "filename": "flutter/impeller/entity/gaussian_blur_noalpha_nodecal.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -3893,114 +1351,69 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 100, - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "varying", - "texture" - ], - "longest_path_cycles": [ - 0.453125, - 0.453125, - 0.4375, - 0.375, - 0.0, - 0.5, - 0.5 - ], - "pipelines": [ - "arith_total", - "arith_fma", - "arith_cvt", - "arith_sfu", - "load_store", - "varying", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" - ], - "shortest_path_cycles": [ - 0.421875, - 0.421875, - 0.203125, - 0.0, - 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.546875, - 0.453125, - 0.546875, - 0.375, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 10, - "work_registers_used": 24 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_overlay.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { + "fp16_arithmetic": 35, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arithmetic" + null ], "longest_path_cycles": [ - 6.929999828338623, - 2.0, - 2.0 + null, + null, + null, + null, + null, + null, + null ], "pipelines": [ - "arithmetic", + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", "load_store", + "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arithmetic" + "arith_total", + "arith_cvt" ], "shortest_path_cycles": [ - 3.9600000381469727, - 1.0, + 0.109375, + 0.03125, + 0.109375, + 0.0625, + 0.0, + 0.0, 0.0 ], "total_bound_pipelines": [ - "arithmetic" + "varying", + "texture" ], "total_cycles": [ - 8.0, - 2.0, - 4.0 + 0.203125, + 0.203125, + 0.203125, + 0.125, + 0.0, + 0.25, + 0.25 ] }, + "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 4 + "uniform_registers_used": 10, + "work_registers_used": 13 } } } }, - "flutter/impeller/entity/gles/advanced_blend_saturation.frag.gles": { + "flutter/impeller/entity/gles/advanced_blend.frag.gles": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_saturation.frag.gles", + "filename": "flutter/impeller/entity/gles/advanced_blend.frag.gles", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -4010,18 +1423,18 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 100, + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "varying", + "texture" ], "longest_path_cycles": [ - 0.71875, - 0.71875, - 0.625, - 0.5625, + 0.46875, + 0.46875, + 0.0625, + 0.0, 0.0, 0.5, 0.5 @@ -4037,40 +1450,41 @@ ], "shortest_path_bound_pipelines": [ "arith_total", - "arith_cvt" + "arith_fma" ], "shortest_path_cycles": [ 0.40625, - 0.34375, 0.40625, + 0.109375, 0.0, 0.0, 0.25, 0.25 ], "total_bound_pipelines": [ + "varying", "texture" ], "total_cycles": [ - 0.78125, - 0.71875, - 0.78125, - 0.5625, + 0.46875, + 0.46875, + 0.140625, + 0.0, 0.0, 0.5, - 1.0 + 0.5 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, "uniform_registers_used": 12, - "work_registers_used": 20 + "work_registers_used": 24 } } }, "Mali-T880": { "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_saturation.frag.gles", + "filename": "flutter/impeller/entity/gles/advanced_blend.frag.gles", "has_uniform_computation": false, "type": "Fragment", "variants": { @@ -4081,7 +1495,7 @@ "arithmetic" ], "longest_path_cycles": [ - 11.550000190734863, + 2.9700000286102295, 2.0, 2.0 ], @@ -4094,54 +1508,47 @@ "arithmetic" ], "shortest_path_cycles": [ - 5.610000133514404, + 2.640000104904175, 1.0, - 0.0 + 1.0 ], "total_bound_pipelines": [ "arithmetic" ], "total_cycles": [ - 13.0, + 3.3333332538604736, 2.0, - 4.0 + 2.0 ] }, "thread_occupancy": 100, "uniform_registers_used": 2, - "work_registers_used": 3 + "work_registers_used": 4 } } } }, - "flutter/impeller/entity/gles/advanced_blend_screen.frag.gles": { + "flutter/impeller/entity/gles/advanced_blend.vert.gles": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_screen.frag.gles", - "has_side_effects": false, + "filename": "flutter/impeller/entity/gles/advanced_blend.vert.gles", "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 100, + "Position": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.375, - 0.25, - 0.375, - 0.375, + 0.140625, + 0.140625, 0.0, - 0.5, - 0.5 + 0.0, + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -4149,116 +1556,50 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "varying", - "texture" + "load_store" ], "shortest_path_cycles": [ - 0.21875, - 0.21875, + 0.140625, 0.140625, 0.0, 0.0, - 0.25, - 0.25 - ], - "total_bound_pipelines": [ - "texture" - ], - "total_cycles": [ - 0.484375, - 0.25, - 0.484375, - 0.375, - 0.0, - 0.5, - 1.0 - ] - }, - "stack_spill_bytes": 0, - "thread_occupancy": 100, - "uniform_registers_used": 8, - "work_registers_used": 20 - } - } - }, - "Mali-T880": { - "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_screen.frag.gles", - "has_uniform_computation": false, - "type": "Fragment", - "variants": { - "Main": { - "has_stack_spilling": false, - "performance": { - "longest_path_bound_pipelines": [ - "arithmetic" - ], - "longest_path_cycles": [ - 5.610000133514404, 2.0, - 2.0 - ], - "pipelines": [ - "arithmetic", - "load_store", - "texture" - ], - "shortest_path_bound_pipelines": [ - "arithmetic" - ], - "shortest_path_cycles": [ - 2.640000104904175, - 1.0, 0.0 ], "total_bound_pipelines": [ - "arithmetic" + "load_store" ], "total_cycles": [ - 6.666666507720947, + 0.140625, + 0.140625, + 0.0, + 0.0, 2.0, - 4.0 + 0.0 ] }, + "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 2 - } - } - } - }, - "flutter/impeller/entity/gles/advanced_blend_softlight.frag.gles": { - "Mali-G78": { - "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/advanced_blend_softlight.frag.gles", - "has_side_effects": false, - "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, - "variants": { - "Main": { - "fp16_arithmetic": 100, + "uniform_registers_used": 22, + "work_registers_used": 32 + }, + "Varying": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "longest_path_cycles": [ - 0.75, - 0.75, - 0.578125, - 0.5625, + 0.03125, + 0.03125, + 0.03125, 0.0, - 0.5, - 0.5 + 4.0, + 0.0 ], "pipelines": [ "arith_total", @@ -4266,58 +1607,54 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_fma" + "load_store" ], "shortest_path_cycles": [ - 0.71875, - 0.71875, - 0.34375, - 0.1875, + 0.03125, + 0.03125, + 0.03125, 0.0, - 0.25, - 0.25 + 4.0, + 0.0 ], "total_bound_pipelines": [ - "texture" + "load_store" ], "total_cycles": [ - 0.75, - 0.75, - 0.6875, - 0.5625, + 0.03125, + 0.03125, + 0.03125, 0.0, - 0.5, - 1.0 + 4.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 14, - "work_registers_used": 30 + "uniform_registers_used": 10, + "work_registers_used": 10 } } }, "Mali-T880": { "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/advanced_blend_softlight.frag.gles", + "filename": "flutter/impeller/entity/gles/advanced_blend.vert.gles", "has_uniform_computation": false, - "type": "Fragment", + "type": "Vertex", "variants": { "Main": { "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arithmetic" + "load_store" ], "longest_path_cycles": [ - 9.569999694824219, - 2.0, - 2.0 + 3.299999952316284, + 7.0, + 0.0 ], "pipelines": [ "arithmetic", @@ -4325,25 +1662,25 @@ "texture" ], "shortest_path_bound_pipelines": [ - "arithmetic" + "load_store" ], "shortest_path_cycles": [ - 6.599999904632568, - 1.0, + 3.299999952316284, + 7.0, 0.0 ], "total_bound_pipelines": [ - "arithmetic" + "load_store" ], "total_cycles": [ - 10.666666984558105, - 2.0, - 4.0 + 3.3333332538604736, + 7.0, + 0.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 2, - "work_registers_used": 4 + "uniform_registers_used": 6, + "work_registers_used": 3 } } }