Revert "[Impeller] add support for specialization constants. (#47432)" (#47651)

This reverts commit f899cc7b43bc5d8e5ccb50a08ea46ee255ac7f6c.

This is the same revert as https://github.com/flutter/engine/pull/47650, but for the 3.17 release branch.
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index 87d04a2..7ed7a51 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -3134,13 +3134,42 @@
 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.frag + ../../../flutter/LICENSE
+ORIGIN: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.glsl + ../../../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/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/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/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
@@ -5888,13 +5917,42 @@
 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.frag
+FILE: ../../../flutter/impeller/entity/shaders/blending/advanced_blend.glsl
 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/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/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/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 08780f7..1937aeb 100644
--- a/impeller/base/comparable.h
+++ b/impeller/base/comparable.h
@@ -8,8 +8,12 @@
 #include <functional>
 #include <map>
 #include <memory>
+#include <string>
 #include <type_traits>
 
+#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
deleted file mode 100644
index 1488bb2..0000000
--- a/impeller/docs/specialization_constants.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# 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.
-
-*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 4e1ce88..fbf674c 100644
--- a/impeller/entity/BUILD.gn
+++ b/impeller/entity/BUILD.gn
@@ -15,7 +15,21 @@
 
   shaders = [
     "shaders/blending/advanced_blend.vert",
-    "shaders/blending/advanced_blend.frag",
+    "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/blend.frag",
     "shaders/blending/blend.vert",
     "shaders/border_mask_blur.frag",
@@ -101,8 +115,22 @@
   }
 
   shaders = [
-    "shaders/blending/framebuffer_blend.vert",
-    "shaders/blending/framebuffer_blend.frag",
+    "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",
   ]
 }
 
diff --git a/impeller/entity/contents/atlas_contents.cc b/impeller/entity/contents/atlas_contents.cc
index f92c3db..34030ac 100644
--- a/impeller/entity/contents/atlas_contents.cc
+++ b/impeller/entity/contents/atlas_contents.cc
@@ -262,6 +262,8 @@
       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 ec47257..560c9d8 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 <memory>
+#include <sstream>
 
 #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,8 +197,6 @@
       .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);
@@ -219,98 +217,53 @@
   }
 
   if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
-    framebuffer_blend_color_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kColor), supports_decal});
-    framebuffer_blend_colorburn_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kColorBurn), supports_decal});
+    framebuffer_blend_color_pipelines_.CreateDefault(*context_,
+                                                     options_trianglestrip);
+    framebuffer_blend_colorburn_pipelines_.CreateDefault(*context_,
+                                                         options_trianglestrip);
     framebuffer_blend_colordodge_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kColorDodge), supports_decal});
-    framebuffer_blend_darken_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kDarken), supports_decal});
+        *context_, options_trianglestrip);
+    framebuffer_blend_darken_pipelines_.CreateDefault(*context_,
+                                                      options_trianglestrip);
     framebuffer_blend_difference_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kDifference), supports_decal});
-    framebuffer_blend_exclusion_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kExclusion), supports_decal});
-    framebuffer_blend_hardlight_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kHardLight), supports_decal});
-    framebuffer_blend_hue_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kHue), supports_decal});
-    framebuffer_blend_lighten_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kLighten), supports_decal});
+        *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);
     framebuffer_blend_luminosity_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kLuminosity), supports_decal});
-    framebuffer_blend_multiply_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kMultiply), supports_decal});
-    framebuffer_blend_overlay_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kOverlay), supports_decal});
+        *context_, options_trianglestrip);
+    framebuffer_blend_multiply_pipelines_.CreateDefault(*context_,
+                                                        options_trianglestrip);
+    framebuffer_blend_overlay_pipelines_.CreateDefault(*context_,
+                                                       options_trianglestrip);
     framebuffer_blend_saturation_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kSaturation), supports_decal});
-    framebuffer_blend_screen_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kScreen), supports_decal});
-    framebuffer_blend_softlight_pipelines_.CreateDefault(
-        *context_, options_trianglestrip,
-        {static_cast<int32_t>(BlendSelectValues::kSoftLight), supports_decal});
+        *context_, options_trianglestrip);
+    framebuffer_blend_screen_pipelines_.CreateDefault(*context_,
+                                                      options_trianglestrip);
+    framebuffer_blend_softlight_pipelines_.CreateDefault(*context_,
+                                                         options_trianglestrip);
   }
 
-  blend_color_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kColor), supports_decal});
-  blend_colorburn_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kColorBurn), supports_decal});
-  blend_colordodge_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kColorDodge), supports_decal});
-  blend_darken_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kDarken), supports_decal});
-  blend_difference_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kDifference), supports_decal});
-  blend_exclusion_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kExclusion), supports_decal});
-  blend_hardlight_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kHardLight), supports_decal});
-  blend_hue_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kHue), supports_decal});
-  blend_lighten_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kLighten), supports_decal});
-  blend_luminosity_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kLuminosity), supports_decal});
-  blend_multiply_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kMultiply), supports_decal});
-  blend_overlay_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kOverlay), supports_decal});
-  blend_saturation_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kSaturation), supports_decal});
-  blend_screen_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(BlendSelectValues::kScreen), supports_decal});
-  blend_softlight_pipelines_.CreateDefault(
-      *context_, options_trianglestrip,
-      {static_cast<int32_t>(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);
 
   rrect_blur_pipelines_.CreateDefault(*context_, options_trianglestrip);
   texture_blend_pipelines_.CreateDefault(*context_, options);
@@ -333,10 +286,9 @@
   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,
-                                             {supports_decal});
-  // GLES only shader that is unsupported on macOS.
-#if defined(IMPELLER_ENABLE_OPENGLES) && !defined(FML_OS_MACOSX)
+  porter_duff_blend_pipelines_.CreateDefault(*context_, options_trianglestrip);
+  // GLES only shader.
+#ifdef IMPELLER_ENABLE_OPENGLES
   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 7fdcc6c..de55d92 100644
--- a/impeller/entity/contents/content_context.h
+++ b/impeller/entity/contents/content_context.h
@@ -4,7 +4,6 @@
 
 #pragma once
 
-#include <initializer_list>
 #include <memory>
 #include <optional>
 #include <unordered_map>
@@ -76,11 +75,39 @@
 #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"
@@ -165,82 +192,93 @@
     RenderPipelineT<YuvToRgbFilterVertexShader, YuvToRgbFilterFragmentShader>;
 
 // Advanced blends
-using BlendColorPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+using BlendColorPipeline = RenderPipelineT<AdvancedBlendVertexShader,
+                                           AdvancedBlendColorFragmentShader>;
 using BlendColorBurnPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendColorburnFragmentShader>;
 using BlendColorDodgePipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
-using BlendDarkenPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendColordodgeFragmentShader>;
+using BlendDarkenPipeline = RenderPipelineT<AdvancedBlendVertexShader,
+                                            AdvancedBlendDarkenFragmentShader>;
 using BlendDifferencePipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendDifferenceFragmentShader>;
 using BlendExclusionPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendExclusionFragmentShader>;
 using BlendHardLightPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendHardlightFragmentShader>;
 using BlendHuePipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendHueFragmentShader>;
 using BlendLightenPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendLightenFragmentShader>;
 using BlendLuminosityPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendLuminosityFragmentShader>;
 using BlendMultiplyPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendMultiplyFragmentShader>;
 using BlendOverlayPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendOverlayFragmentShader>;
 using BlendSaturationPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
-using BlendScreenPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendSaturationFragmentShader>;
+using BlendScreenPipeline = RenderPipelineT<AdvancedBlendVertexShader,
+                                            AdvancedBlendScreenFragmentShader>;
 using BlendSoftLightPipeline =
-    RenderPipelineT<AdvancedBlendVertexShader, AdvancedBlendFragmentShader>;
+    RenderPipelineT<AdvancedBlendVertexShader,
+                    AdvancedBlendSoftlightFragmentShader>;
 // Framebuffer Advanced Blends
 using FramebufferBlendColorPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendColorFragmentShader>;
 using FramebufferBlendColorBurnPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendColorburnFragmentShader>;
 using FramebufferBlendColorDodgePipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendColordodgeFragmentShader>;
 using FramebufferBlendDarkenPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendDarkenFragmentShader>;
 using FramebufferBlendDifferencePipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendDifferenceFragmentShader>;
 using FramebufferBlendExclusionPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendExclusionFragmentShader>;
 using FramebufferBlendHardLightPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendHardlightFragmentShader>;
 using FramebufferBlendHuePipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendHueFragmentShader>;
 using FramebufferBlendLightenPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendLightenFragmentShader>;
 using FramebufferBlendLuminosityPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendLuminosityFragmentShader>;
 using FramebufferBlendMultiplyPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendMultiplyFragmentShader>;
 using FramebufferBlendOverlayPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendOverlayFragmentShader>;
 using FramebufferBlendSaturationPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendSaturationFragmentShader>;
 using FramebufferBlendScreenPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendScreenFragmentShader>;
 using FramebufferBlendSoftLightPipeline =
     RenderPipelineT<FramebufferBlendVertexShader,
-                    FramebufferBlendFragmentShader>;
+                    FramebufferBlendSoftlightFragmentShader>;
 
 /// Geometry Pipelines
 using PointsComputeShaderPipeline = ComputePipelineBuilder<PointsComputeShader>;
@@ -700,10 +738,8 @@
     }
 
     void CreateDefault(const Context& context,
-                       const ContentContextOptions& options,
-                       const std::initializer_list<int32_t>& constants = {}) {
-      auto desc =
-          PipelineT::Builder::MakeDefaultPipelineDescriptor(context, constants);
+                       const ContentContextOptions& options) {
+      auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
       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 197b74d..225f915 100644
--- a/impeller/entity/contents/filters/blend_filter_contents.cc
+++ b/impeller/entity/contents/filters/blend_filter_contents.cc
@@ -180,6 +180,8 @@
       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);
@@ -352,6 +354,8 @@
       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);
@@ -474,6 +478,8 @@
       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 ac5b572..db3b2ca 100644
--- a/impeller/entity/contents/framebuffer_blend_contents.h
+++ b/impeller/entity/contents/framebuffer_blend_contents.h
@@ -4,31 +4,17 @@
 
 #pragma once
 
+#include <functional>
 #include <memory>
+#include <vector>
 
+#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 1eb9cf1..dff54d1 100644
--- a/impeller/entity/entity_unittests.cc
+++ b/impeller/entity/entity_unittests.cc
@@ -2536,26 +2536,6 @@
   }
 }
 
-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<int32_t>(
-      GetContext()->GetCapabilities()->SupportsDecalSamplerAddressMode());
-  std::vector<int32_t> 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.frag b/impeller/entity/shaders/blending/advanced_blend.glsl
similarity index 79%
rename from impeller/entity/shaders/blending/advanced_blend.frag
rename to impeller/entity/shaders/blending/advanced_blend.glsl
index 258ab66..9a11dce 100644
--- a/impeller/entity/shaders/blending/advanced_blend.frag
+++ b/impeller/entity/shaders/blending/advanced_blend.glsl
@@ -6,10 +6,6 @@
 #include <impeller/color.glsl>
 #include <impeller/texture.glsl>
 #include <impeller/types.glsl>
-#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;
@@ -29,14 +25,17 @@
 out f16vec4 frag_color;
 
 f16vec4 Sample(f16sampler2D texture_sampler, vec2 texture_coords) {
-  if (supports_decal > 0.0) {
+#ifdef IMPELLER_TARGET_OPENGLES
+  if (blend_info.supports_decal_sampler_address_mode > 0.0) {
     return texture(texture_sampler, texture_coords);
+  } else {
+    return IPHalfSampleDecal(texture_sampler, texture_coords);
   }
-  return IPHalfSampleDecal(texture_sampler, texture_coords);
+#else
+  return texture(texture_sampler, texture_coords);
+#endif
 }
 
-AdvancedBlend(blend_type);
-
 void main() {
   f16vec4 dst_sample = Sample(texture_sampler_dst,  // sampler
                               v_dst_texture_coords  // texture coordinates
@@ -51,7 +50,6 @@
                              ) *
                           blend_info.src_input_alpha;
 
-  f16vec3 blend_result = Blend(dst.rgb, src.rgb);
-  f16vec4 blended = mix(src, f16vec4(blend_result, dst.a), dst.a);
+  f16vec4 blended = mix(src, f16vec4(Blend(dst.rgb, src.rgb), 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
new file mode 100644
index 0000000..20ca949
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_color.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..a57d5c5
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_colorburn.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..8766c01
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_colordodge.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..4f423b5
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_darken.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..9e3a927
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_difference.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..e8e3911
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_exclusion.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..96a94de
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_hardlight.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..5f2afb6
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_hue.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..fa421d7
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_lighten.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..c4ee559
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_luminosity.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..bda2e1e
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_multiply.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..5def270
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_overlay.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..2122b57
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_saturation.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..98690c3
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_screen.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..130f028
--- /dev/null
+++ b/impeller/entity/shaders/blending/advanced_blend_softlight.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
deleted file mode 100644
index 3040382..0000000
--- a/impeller/entity/shaders/blending/blend_select.glsl
+++ /dev/null
@@ -1,60 +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.
-
-#include <impeller/blending.glsl>
-#include <impeller/color.glsl>
-#include <impeller/types.glsl>
-
-// 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.
-#define AdvancedBlend(blend_type)           \
-  f16vec3 Blend(f16vec3 dst, f16vec3 src) { \
-    if (blend_type == 0) {                  \
-      return IPBlendScreen(dst, src);       \
-    } else if (blend_type == 1) {           \
-      return IPBlendOverlay(dst, src);      \
-    } else if (blend_type == 2) {           \
-      return IPBlendDarken(dst, src);       \
-    } else if (blend_type == 3) {           \
-      return IPBlendLighten(dst, src);      \
-    } else if (blend_type == 4) {           \
-      return IPBlendColorDodge(dst, src);   \
-    } else if (blend_type == 5) {           \
-      return IPBlendColorBurn(dst, src);    \
-    } else if (blend_type == 6) {           \
-      return IPBlendHardLight(dst, src);    \
-    } else if (blend_type == 7) {           \
-      return IPBlendSoftLight(dst, src);    \
-    } else if (blend_type == 8) {           \
-      return IPBlendDifference(dst, src);   \
-    } else if (blend_type == 9) {           \
-      return IPBlendExclusion(dst, src);    \
-    } else if (blend_type == 10) {          \
-      return IPBlendMultiply(dst, src);     \
-    } else if (blend_type == 11) {          \
-      return IPBlendHue(dst, src);          \
-    } else if (blend_type == 12) {          \
-      return IPBlendSaturation(dst, src);   \
-    } else if (blend_type == 13) {          \
-      return IPBlendColor(dst, src);        \
-    } else if (blend_type == 14) {          \
-      return IPBlendLuminosity(dst, src);   \
-    } else {                                \
-      return f16vec3(0.0hf);                \
-    }                                       \
-  }
diff --git a/impeller/entity/shaders/blending/framebuffer_blend.frag b/impeller/entity/shaders/blending/ios/framebuffer_blend.glsl
similarity index 74%
rename from impeller/entity/shaders/blending/framebuffer_blend.frag
rename to impeller/entity/shaders/blending/ios/framebuffer_blend.glsl
index 076a4d7..67bd9ca 100644
--- a/impeller/entity/shaders/blending/framebuffer_blend.frag
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend.glsl
@@ -8,10 +8,6 @@
 #include <impeller/color.glsl>
 #include <impeller/texture.glsl>
 #include <impeller/types.glsl>
-#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,
@@ -33,14 +29,14 @@
 out vec4 frag_color;
 
 vec4 Sample(sampler2D texture_sampler, vec2 texture_coords) {
-  if (supports_decal > 1) {
-    return texture(texture_sampler, texture_coords);
-  }
+// gles 2.0 is the only backend without native decal support.
+#ifdef IMPELLER_TARGET_OPENGLES
   return IPSampleDecal(texture_sampler, texture_coords);
+#else
+  return texture(texture_sampler, texture_coords);
+#endif
 }
 
-AdvancedBlend(blend_type);
-
 void main() {
   f16vec4 dst = f16vec4(ReadDestination());
   f16vec4 src = f16vec4(Sample(texture_sampler_src,  // sampler
@@ -48,7 +44,6 @@
                                )) *
                 frag_info.src_input_alpha;
 
-  f16vec3 blend_result = Blend(dst.rgb, src.rgb);
-  f16vec4 blended = mix(src, f16vec4(blend_result, dst.a), dst.a);
+  f16vec4 blended = mix(src, f16vec4(Blend(dst.rgb, src.rgb), dst.a), dst.a);
   frag_color = vec4(mix(dst, blended, src.a));
 }
diff --git a/impeller/entity/shaders/blending/framebuffer_blend.vert b/impeller/entity/shaders/blending/ios/framebuffer_blend.vert
similarity index 100%
rename from impeller/entity/shaders/blending/framebuffer_blend.vert
rename to impeller/entity/shaders/blending/ios/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
new file mode 100644
index 0000000..4798cca
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_color.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..4c53c2b
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_colorburn.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..d07de59
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_colordodge.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..e2e42f2
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_darken.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..b2d26ca
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_difference.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..6358bcc
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_exclusion.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..19a370b
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_hardlight.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..653e570
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_hue.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..93b5bca
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_lighten.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..93cb15f
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_luminosity.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..bc6621a
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_multiply.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..2238c38
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_overlay.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..e731de1
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_saturation.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..f8f2d56
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_screen.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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
new file mode 100644
index 0000000..1902daf
--- /dev/null
+++ b/impeller/entity/shaders/blending/ios/framebuffer_blend_softlight.frag
@@ -0,0 +1,14 @@
+// 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 <impeller/blending.glsl>
+#include <impeller/types.glsl>
+
+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 0d140e7..7e3498f 100644
--- a/impeller/entity/shaders/blending/porter_duff_blend.frag
+++ b/impeller/entity/shaders/blending/porter_duff_blend.frag
@@ -9,8 +9,6 @@
 #include <impeller/texture.glsl>
 #include <impeller/types.glsl>
 
-layout(constant_id = 0) const int supports_decal = 1;
-
 uniform f16sampler2D texture_sampler_dst;
 
 uniform FragInfo {
@@ -21,6 +19,7 @@
   float16_t dst_coeff_src_color;
   float16_t input_alpha;
   float16_t output_alpha;
+  float supports_decal_sampler_address_mode;
 }
 frag_info;
 
@@ -30,10 +29,15 @@
 out f16vec4 frag_color;
 
 f16vec4 Sample(f16sampler2D texture_sampler, vec2 texture_coords) {
-  if (supports_decal > 0.0) {
+#ifdef IMPELLER_TARGET_OPENGLES
+  if (frag_info.supports_decal_sampler_address_mode > 0.0) {
     return texture(texture_sampler, texture_coords);
+  } else {
+    return IPHalfSampleDecal(texture_sampler, texture_coords);
   }
-  return IPHalfSampleDecal(texture_sampler, texture_coords);
+#else
+  return texture(texture_sampler, texture_coords);
+#endif
 }
 
 void main() {
diff --git a/impeller/renderer/backend/gles/BUILD.gn b/impeller/renderer/backend/gles/BUILD.gn
index edace2b..f9db5b0 100644
--- a/impeller/renderer/backend/gles/BUILD.gn
+++ b/impeller/renderer/backend/gles/BUILD.gn
@@ -20,7 +20,6 @@
     "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 85316e3..b019082 100644
--- a/impeller/renderer/backend/gles/pipeline_library_gles.cc
+++ b/impeller/renderer/backend/gles/pipeline_library_gles.cc
@@ -33,19 +33,6 @@
   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<char*>(malloc(10240));
-  GLsizei length;
-  gl.GetShaderSource(shader, 10240, &length, data);
-
-  auto result = std::string{data, static_cast<size_t>(length)};
-  free(data);
-  return result;
-}
-
 static void LogShaderCompilationFailure(const ProcTableGLES& gl,
                                         GLuint shader,
                                         const std::string& name,
@@ -76,7 +63,10 @@
   stream << " shader for '" << name << "' with error:" << std::endl;
   stream << GetShaderInfoLog(gl, shader) << std::endl;
   stream << "Shader source was: " << std::endl;
-  stream << GetShaderSource(gl, shader) << std::endl;
+  stream << std::string{reinterpret_cast<const char*>(
+                            source_mapping.GetMapping()),
+                        source_mapping.GetSize()}
+         << std::endl;
   VALIDATION_LOG << stream.str();
 }
 
@@ -115,10 +105,8 @@
   fml::ScopedCleanupClosure delete_frag_shader(
       [&gl, frag_shader]() { gl.DeleteShader(frag_shader); });
 
-  gl.ShaderSourceMapping(vert_shader, *vert_mapping,
-                         descriptor.GetSpecializationConstants());
-  gl.ShaderSourceMapping(frag_shader, *frag_mapping,
-                         descriptor.GetSpecializationConstants());
+  gl.ShaderSourceMapping(vert_shader, *vert_mapping);
+  gl.ShaderSourceMapping(frag_shader, *frag_mapping);
 
   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 afdb620..2541424 100644
--- a/impeller/renderer/backend/gles/proc_table_gles.cc
+++ b/impeller/renderer/backend/gles/proc_table_gles.cc
@@ -6,7 +6,6 @@
 
 #include <sstream>
 
-#include "fml/closure.h"
 #include "impeller/base/allocation.h"
 #include "impeller/base/comparable.h"
 #include "impeller/base/validation.h"
@@ -139,53 +138,14 @@
   return is_valid_;
 }
 
-void ProcTableGLES::ShaderSourceMapping(
-    GLuint shader,
-    const fml::Mapping& mapping,
-    const std::vector<int32_t>& defines) const {
-  if (defines.empty()) {
-    const GLchar* sources[] = {
-        reinterpret_cast<const GLchar*>(mapping.GetMapping())};
-    const GLint lengths[] = {static_cast<GLint>(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;
-  }
-
+void ProcTableGLES::ShaderSourceMapping(GLuint shader,
+                                        const fml::Mapping& mapping) const {
   const GLchar* sources[] = {
-      reinterpret_cast<const GLchar*>(shader_source->c_str())};
-  const GLint lengths[] = {static_cast<GLint>(shader_source->size())};
+      reinterpret_cast<const GLchar*>(mapping.GetMapping())};
+  const GLint lengths[] = {static_cast<GLint>(mapping.GetSize())};
   ShaderSource(shader, 1u, sources, lengths);
 }
 
-// Visible For testing.
-std::optional<std::string> ProcTableGLES::ComputeShaderWithDefines(
-    const fml::Mapping& mapping,
-    const std::vector<int32_t>& defines) const {
-  auto shader_source = std::string{
-      reinterpret_cast<const char*>(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 dfe0fd6..848f3d9 100644
--- a/impeller/renderer/backend/gles/proc_table_gles.h
+++ b/impeller/renderer/backend/gles/proc_table_gles.h
@@ -184,7 +184,6 @@
   PROC(UseProgram);                          \
   PROC(VertexAttribPointer);                 \
   PROC(Viewport);                            \
-  PROC(GetShaderSource);                     \
   PROC(ReadPixels);
 
 #define FOR_EACH_IMPELLER_GLES3_PROC(PROC) PROC(BlitFramebuffer);
@@ -232,14 +231,7 @@
 
   bool IsValid() 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<int32_t>& defines = {}) const;
+  void ShaderSourceMapping(GLuint shader, const fml::Mapping& mapping) const;
 
   const DescriptionGLES* GetDescription() const;
 
@@ -259,11 +251,6 @@
 
   void PopDebugGroup() const;
 
-  // Visible For testing.
-  std::optional<std::string> ComputeShaderWithDefines(
-      const fml::Mapping& mapping,
-      const std::vector<int32_t>& defines) const;
-
  private:
   bool is_valid_ = false;
   std::unique_ptr<DescriptionGLES> description_;
diff --git a/impeller/renderer/backend/gles/shader_library_gles.h b/impeller/renderer/backend/gles/shader_library_gles.h
index b2acd22..cd1ed53 100644
--- a/impeller/renderer/backend/gles/shader_library_gles.h
+++ b/impeller/renderer/backend/gles/shader_library_gles.h
@@ -30,7 +30,7 @@
   ShaderFunctionMap functions_ IPLR_GUARDED_BY(functions_mutex_);
   bool is_valid_ = false;
 
-  explicit ShaderLibraryGLES(
+  ShaderLibraryGLES(
       const std::vector<std::shared_ptr<fml::Mapping>>& 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
deleted file mode 100644
index 8285c13..0000000
--- a/impeller/renderer/backend/gles/test/specialization_constants_unittests.cc
+++ /dev/null
@@ -1,75 +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.
-
-#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<fml::DataMapping>(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<fml::DataMapping>(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 0648954..5b333c2 100644
--- a/impeller/renderer/backend/metal/pipeline_library_mtl.h
+++ b/impeller/renderer/backend/metal/pipeline_library_mtl.h
@@ -27,7 +27,7 @@
   PipelineMap pipelines_;
   ComputePipelineMap compute_pipelines_;
 
-  explicit PipelineLibraryMTL(id<MTLDevice> device);
+  PipelineLibraryMTL(id<MTLDevice> 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 c7c180a..98895ce 100644
--- a/impeller/renderer/backend/metal/pipeline_library_mtl.mm
+++ b/impeller/renderer/backend/metal/pipeline_library_mtl.mm
@@ -4,7 +4,6 @@
 
 #include "impeller/renderer/backend/metal/pipeline_library_mtl.h"
 
-#include <Foundation/Foundation.h>
 #include <Metal/Metal.h>
 
 #include "flutter/fml/build_config.h"
@@ -29,25 +28,14 @@
   descriptor.label = @(desc.GetLabel().c_str());
   descriptor.rasterSampleCount = static_cast<NSUInteger>(desc.GetSampleCount());
 
-  const auto& constants = desc.GetSpecializationConstants();
   for (const auto& entry : desc.GetStageEntrypoints()) {
     if (entry.first == ShaderStage::kVertex) {
-      if (constants.empty()) {
-        descriptor.vertexFunction =
-            ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction();
-      } else {
-        descriptor.vertexFunction = ShaderFunctionMTL::Cast(*entry.second)
-                                        .GetMTLFunctionSpecialized(constants);
-      }
+      descriptor.vertexFunction =
+          ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction();
     }
     if (entry.first == ShaderStage::kFragment) {
-      if (constants.empty()) {
-        descriptor.fragmentFunction =
-            ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction();
-      } else {
-        descriptor.fragmentFunction = ShaderFunctionMTL::Cast(*entry.second)
-                                          .GetMTLFunctionSpecialized(constants);
-      }
+      descriptor.fragmentFunction =
+          ShaderFunctionMTL::Cast(*entry.second).GetMTLFunction();
     }
   }
 
diff --git a/impeller/renderer/backend/metal/shader_function_mtl.h b/impeller/renderer/backend/metal/shader_function_mtl.h
index 9ed1fff..c47eaf6 100644
--- a/impeller/renderer/backend/metal/shader_function_mtl.h
+++ b/impeller/renderer/backend/metal/shader_function_mtl.h
@@ -21,18 +21,13 @@
 
   id<MTLFunction> GetMTLFunction() const;
 
-  id<MTLFunction> GetMTLFunctionSpecialized(
-      const std::vector<int>& constants) const;
-
  private:
   friend class ShaderLibraryMTL;
 
   id<MTLFunction> function_ = nullptr;
-  id<MTLLibrary> library_ = nullptr;
 
   ShaderFunctionMTL(UniqueID parent_library_id,
                     id<MTLFunction> function,
-                    id<MTLLibrary> 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 589c0ff..04751af 100644
--- a/impeller/renderer/backend/metal/shader_function_mtl.mm
+++ b/impeller/renderer/backend/metal/shader_function_mtl.mm
@@ -8,37 +8,13 @@
 
 ShaderFunctionMTL::ShaderFunctionMTL(UniqueID parent_library_id,
                                      id<MTLFunction> function,
-                                     id<MTLLibrary> library,
                                      std::string name,
                                      ShaderStage stage)
     : ShaderFunction(parent_library_id, std::move(name), stage),
-      function_(function),
-      library_(library) {}
+      function_(function) {}
 
 ShaderFunctionMTL::~ShaderFunctionMTL() = default;
 
-id<MTLFunction> ShaderFunctionMTL::GetMTLFunctionSpecialized(
-    const std::vector<int>& constants) 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++;
-  }
-  NSError* error = nil;
-  auto result = [library_ newFunctionWithName:@(GetName().data())
-                               constantValues:constantValues
-                                        error:&error];
-  if (error != nil) {
-    return nil;
-  }
-  return result;
-}
-
 id<MTLFunction> 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 c401696..5b1bc7c 100644
--- a/impeller/renderer/backend/metal/shader_library_mtl.h
+++ b/impeller/renderer/backend/metal/shader_library_mtl.h
@@ -39,7 +39,7 @@
   ShaderFunctionMap functions_;
   bool is_valid_ = false;
 
-  explicit ShaderLibraryMTL(NSArray<id<MTLLibrary>>* libraries);
+  ShaderLibraryMTL(NSArray<id<MTLLibrary>>* libraries);
 
   // |ShaderLibrary|
   std::shared_ptr<const ShaderFunction> 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 45eb5d5..94fb1e3 100644
--- a/impeller/renderer/backend/metal/shader_library_mtl.mm
+++ b/impeller/renderer/backend/metal/shader_library_mtl.mm
@@ -55,7 +55,6 @@
   ShaderKey key(name, stage);
 
   id<MTLFunction> function = nil;
-  id<MTLLibrary> library = nil;
 
   {
     ReaderLock lock(libraries_mutex_);
@@ -65,8 +64,7 @@
     }
 
     for (size_t i = 0, count = [libraries_ count]; i < count; i++) {
-      library = libraries_[i];
-      function = [library newFunctionWithName:@(name.data())];
+      function = [libraries_[i] newFunctionWithName:@(name.data())];
       if (function) {
         break;
       }
@@ -83,7 +81,7 @@
     }
 
     auto func = std::shared_ptr<ShaderFunctionMTL>(new ShaderFunctionMTL(
-        library_id_, function, library, {name.data(), name.size()}, stage));
+        library_id_, function, {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 8fa14a2..8022f7e 100644
--- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc
+++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc
@@ -278,15 +278,7 @@
   //----------------------------------------------------------------------------
   /// Shader Stages
   ///
-  const auto& constants = desc.GetSpecializationConstants();
-
-  std::vector<std::vector<vk::SpecializationMapEntry>> map_entries(
-      desc.GetStageEntrypoints().size());
-  std::vector<vk::SpecializationInfo> specialization_infos(
-      desc.GetStageEntrypoints().size());
   std::vector<vk::PipelineShaderStageCreateInfo> shader_stages;
-
-  size_t entrypoint_count = 0;
   for (const auto& entrypoint : desc.GetStageEntrypoints()) {
     auto stage = ToVKShaderStageFlagBits(entrypoint.first);
     if (!stage.has_value()) {
@@ -294,31 +286,12 @@
                      << desc.GetLabel();
       return nullptr;
     }
-
-    std::vector<vk::SpecializationMapEntry>& 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 293a2b7..593df80 100644
--- a/impeller/renderer/pipeline_builder.h
+++ b/impeller/renderer/pipeline_builder.h
@@ -48,10 +48,8 @@
   ///             context, a pipeline descriptor.
   ///
   static std::optional<PipelineDescriptor> MakeDefaultPipelineDescriptor(
-      const Context& context,
-      const std::vector<int>& constants = {}) {
+      const Context& context) {
     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 22ee4c3..eef517b 100644
--- a/impeller/renderer/pipeline_descriptor.cc
+++ b/impeller/renderer/pipeline_descriptor.cc
@@ -4,9 +4,6 @@
 
 #include "impeller/renderer/pipeline_descriptor.h"
 
-#include <utility>
-
-#include "impeller/base/comparable.h"
 #include "impeller/core/formats.h"
 #include "impeller/renderer/shader_function.h"
 #include "impeller/renderer/shader_library.h"
@@ -64,8 +61,7 @@
          winding_order_ == other.winding_order_ &&
          cull_mode_ == other.cull_mode_ &&
          primitive_type_ == other.primitive_type_ &&
-         polygon_mode_ == other.polygon_mode_ &&
-         specialization_constants_ == other.specialization_constants_;
+         polygon_mode_ == other.polygon_mode_;
 }
 
 PipelineDescriptor& PipelineDescriptor::SetLabel(std::string label) {
@@ -281,14 +277,4 @@
   return polygon_mode_;
 }
 
-void PipelineDescriptor::SetSpecializationConstants(
-    std::vector<int32_t> values) {
-  specialization_constants_ = std::move(values);
-}
-
-const std::vector<int32_t>& PipelineDescriptor::GetSpecializationConstants()
-    const {
-  return specialization_constants_;
-}
-
 }  // namespace impeller
diff --git a/impeller/renderer/pipeline_descriptor.h b/impeller/renderer/pipeline_descriptor.h
index 1045ea8..3d0eddf 100644
--- a/impeller/renderer/pipeline_descriptor.h
+++ b/impeller/renderer/pipeline_descriptor.h
@@ -4,10 +4,17 @@
 
 #pragma once
 
+#include <functional>
+#include <future>
 #include <map>
 #include <memory>
 #include <string>
+#include <string_view>
+#include <type_traits>
+#include <unordered_map>
 
+#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"
@@ -124,10 +131,6 @@
 
   PolygonMode GetPolygonMode() const;
 
-  void SetSpecializationConstants(std::vector<int32_t> values);
-
-  const std::vector<int32_t>& GetSpecializationConstants() const;
-
  private:
   std::string label_;
   SampleCount sample_count_ = SampleCount::kCount1;
@@ -146,7 +149,6 @@
       back_stencil_attachment_descriptor_;
   PrimitiveType primitive_type_ = PrimitiveType::kTriangle;
   PolygonMode polygon_mode_ = PolygonMode::kFill;
-  std::vector<int32_t> specialization_constants_;
 };
 
 }  // namespace impeller
diff --git a/impeller/renderer/shader_function.cc b/impeller/renderer/shader_function.cc
index 7aa8053..b51a488 100644
--- a/impeller/renderer/shader_function.cc
+++ b/impeller/renderer/shader_function.cc
@@ -19,10 +19,6 @@
   return stage_;
 }
 
-const std::string& ShaderFunction::GetName() const {
-  return name_;
-}
-
 // |Comparable<ShaderFunction>|
 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 280c64d..2a06608 100644
--- a/impeller/renderer/shader_function.h
+++ b/impeller/renderer/shader_function.h
@@ -4,7 +4,6 @@
 
 #pragma once
 
-#include <string>
 #include "flutter/fml/hash_combine.h"
 #include "flutter/fml/macros.h"
 #include "impeller/base/comparable.h"
@@ -19,8 +18,6 @@
 
   ShaderStage GetStage() const;
 
-  const std::string& GetName() const;
-
   // |Comparable<ShaderFunction>|
   std::size_t GetHash() const override;
 
diff --git a/impeller/tools/malioc.json b/impeller/tools/malioc.json
index 1aa9b4e..4e61378 100644
--- a/impeller/tools/malioc.json
+++ b/impeller/tools/malioc.json
@@ -1,77 +1,4 @@
 {
-  "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",
@@ -184,6 +111,1103 @@
       }
     }
   },
+  "flutter/impeller/entity/advanced_blend_color.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_color.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": 87,
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "longest_path_cycles": [
+              0.609375,
+              0.609375,
+              0.15625,
+              0.125,
+              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.203125,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "total_cycles": [
+              0.609375,
+              0.609375,
+              0.203125,
+              0.125,
+              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_colorburn.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_colorburn.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.296875,
+              0.28125,
+              0.296875,
+              0.1875,
+              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.34375,
+              0.25,
+              0.34375,
+              0.1875,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.34375,
+              0.28125,
+              0.34375,
+              0.1875,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "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,
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "longest_path_cycles": [
+              0.296875,
+              0.25,
+              0.296875,
+              0.1875,
+              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.34375,
+              0.21875,
+              0.34375,
+              0.1875,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.34375,
+              0.25,
+              0.34375,
+              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_darken.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_darken.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.1875,
+              0.1875,
+              0.0625,
+              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": [
+              "varying",
+              "texture"
+            ],
+            "shortest_path_cycles": [
+              0.15625,
+              0.15625,
+              0.109375,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.1875,
+              0.1875,
+              0.109375,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 8,
+          "work_registers_used": 11
+        }
+      }
+    }
+  },
+  "flutter/impeller/entity/advanced_blend_difference.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_difference.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.234375,
+              0.234375,
+              0.03125,
+              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": [
+              "varying",
+              "texture"
+            ],
+            "shortest_path_cycles": [
+              0.203125,
+              0.203125,
+              0.078125,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.234375,
+              0.234375,
+              0.078125,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "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,
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "longest_path_cycles": [
+              0.296875,
+              0.296875,
+              0.03125,
+              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.265625,
+              0.265625,
+              0.078125,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.296875,
+              0.296875,
+              0.078125,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 8,
+          "work_registers_used": 11
+        }
+      }
+    }
+  },
+  "flutter/impeller/entity/advanced_blend_hardlight.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_hardlight.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.46875,
+              0.46875,
+              0.09375,
+              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.4375,
+              0.4375,
+              0.140625,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.46875,
+              0.46875,
+              0.140625,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 10,
+          "work_registers_used": 13
+        }
+      }
+    }
+  },
+  "flutter/impeller/entity/advanced_blend_hue.frag.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,
+      "variants": {
+        "Main": {
+          "fp16_arithmetic": 90,
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "longest_path_cycles": [
+              0.71875,
+              0.71875,
+              0.328125,
+              0.1875,
+              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_lighten.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_lighten.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.1875,
+              0.1875,
+              0.0625,
+              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": [
+              "varying",
+              "texture"
+            ],
+            "shortest_path_cycles": [
+              0.15625,
+              0.15625,
+              0.109375,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.1875,
+              0.1875,
+              0.109375,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 8,
+          "work_registers_used": 11
+        }
+      }
+    }
+  },
+  "flutter/impeller/entity/advanced_blend_luminosity.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_luminosity.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": 87,
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "longest_path_cycles": [
+              0.609375,
+              0.609375,
+              0.15625,
+              0.125,
+              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.203125,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "total_cycles": [
+              0.609375,
+              0.609375,
+              0.203125,
+              0.125,
+              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_multiply.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_multiply.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.203125,
+              0.203125,
+              0.03125,
+              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": [
+              "varying",
+              "texture"
+            ],
+            "shortest_path_cycles": [
+              0.171875,
+              0.171875,
+              0.078125,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.203125,
+              0.203125,
+              0.078125,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 8,
+          "work_registers_used": 11
+        }
+      }
+    }
+  },
+  "flutter/impeller/entity/advanced_blend_overlay.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_overlay.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.46875,
+              0.46875,
+              0.09375,
+              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.4375,
+              0.4375,
+              0.140625,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.46875,
+              0.46875,
+              0.140625,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "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,
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "longest_path_cycles": [
+              0.71875,
+              0.71875,
+              0.328125,
+              0.1875,
+              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
+            ],
+            "pipelines": [
+              "arith_total",
+              "arith_fma",
+              "arith_cvt",
+              "arith_sfu",
+              "load_store",
+              "varying",
+              "texture"
+            ],
+            "shortest_path_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "shortest_path_cycles": [
+              0.234375,
+              0.234375,
+              0.078125,
+              0.0,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "varying",
+              "texture"
+            ],
+            "total_cycles": [
+              0.265625,
+              0.265625,
+              0.078125,
+              0.0,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 8,
+          "work_registers_used": 10
+        }
+      }
+    }
+  },
+  "flutter/impeller/entity/advanced_blend_softlight.frag.vkspv": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/advanced_blend_softlight.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"
+            ],
+            "longest_path_cycles": [
+              0.800000011920929,
+              0.800000011920929,
+              0.234375,
+              0.1875,
+              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.762499988079071,
+              0.762499988079071,
+              0.28125,
+              0.1875,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "total_cycles": [
+              0.800000011920929,
+              0.800000011920929,
+              0.28125,
+              0.1875,
+              0.0,
+              0.5,
+              0.5
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 14,
+          "work_registers_used": 22
+        }
+      }
+    }
+  },
   "flutter/impeller/entity/blend.frag.vkspv": {
     "Mali-G78": {
       "core": "Mali-G78",
@@ -1410,124 +2434,6 @@
       }
     }
   },
-  "flutter/impeller/entity/gles/advanced_blend.frag.gles": {
-    "Mali-G78": {
-      "core": "Mali-G78",
-      "filename": "flutter/impeller/entity/gles/advanced_blend.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": 0,
-          "has_stack_spilling": false,
-          "performance": {
-            "longest_path_bound_pipelines": [
-              "varying",
-              "texture"
-            ],
-            "longest_path_cycles": [
-              0.46875,
-              0.46875,
-              0.0625,
-              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.109375,
-              0.0,
-              0.0,
-              0.25,
-              0.25
-            ],
-            "total_bound_pipelines": [
-              "varying",
-              "texture"
-            ],
-            "total_cycles": [
-              0.46875,
-              0.46875,
-              0.140625,
-              0.0,
-              0.0,
-              0.5,
-              0.5
-            ]
-          },
-          "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.frag.gles",
-      "has_uniform_computation": false,
-      "type": "Fragment",
-      "variants": {
-        "Main": {
-          "has_stack_spilling": false,
-          "performance": {
-            "longest_path_bound_pipelines": [
-              "arithmetic"
-            ],
-            "longest_path_cycles": [
-              2.9700000286102295,
-              2.0,
-              2.0
-            ],
-            "pipelines": [
-              "arithmetic",
-              "load_store",
-              "texture"
-            ],
-            "shortest_path_bound_pipelines": [
-              "arithmetic"
-            ],
-            "shortest_path_cycles": [
-              2.640000104904175,
-              1.0,
-              1.0
-            ],
-            "total_bound_pipelines": [
-              "arithmetic"
-            ],
-            "total_cycles": [
-              3.3333332538604736,
-              2.0,
-              2.0
-            ]
-          },
-          "thread_occupancy": 100,
-          "uniform_registers_used": 2,
-          "work_registers_used": 4
-        }
-      }
-    }
-  },
   "flutter/impeller/entity/gles/advanced_blend.vert.gles": {
     "Mali-G78": {
       "core": "Mali-G78",
@@ -1685,6 +2591,1763 @@
       }
     }
   },
+  "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.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
+        }
+      }
+    }
+  },
+  "flutter/impeller/entity/gles/advanced_blend_overlay.frag.gles": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/gles/advanced_blend_overlay.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.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": {
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "arithmetic"
+            ],
+            "longest_path_cycles": [
+              6.929999828338623,
+              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_saturation.frag.gles": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/gles/advanced_blend_saturation.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_saturation.frag.gles",
+      "has_uniform_computation": false,
+      "type": "Fragment",
+      "variants": {
+        "Main": {
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "arithmetic"
+            ],
+            "longest_path_cycles": [
+              11.550000190734863,
+              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_screen.frag.gles": {
+    "Mali-G78": {
+      "core": "Mali-G78",
+      "filename": "flutter/impeller/entity/gles/advanced_blend_screen.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.25,
+              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.21875,
+              0.21875,
+              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"
+            ],
+            "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_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,
+          "has_stack_spilling": false,
+          "performance": {
+            "longest_path_bound_pipelines": [
+              "arith_total",
+              "arith_fma"
+            ],
+            "longest_path_cycles": [
+              0.75,
+              0.75,
+              0.578125,
+              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_fma"
+            ],
+            "shortest_path_cycles": [
+              0.71875,
+              0.71875,
+              0.34375,
+              0.1875,
+              0.0,
+              0.25,
+              0.25
+            ],
+            "total_bound_pipelines": [
+              "texture"
+            ],
+            "total_cycles": [
+              0.75,
+              0.75,
+              0.6875,
+              0.5625,
+              0.0,
+              0.5,
+              1.0
+            ]
+          },
+          "stack_spill_bytes": 0,
+          "thread_occupancy": 100,
+          "uniform_registers_used": 14,
+          "work_registers_used": 30
+        }
+      }
+    },
+    "Mali-T880": {
+      "core": "Mali-T880",
+      "filename": "flutter/impeller/entity/gles/advanced_blend_softlight.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": [
+              6.599999904632568,
+              1.0,
+              0.0
+            ],
+            "total_bound_pipelines": [
+              "arithmetic"
+            ],
+            "total_cycles": [
+              10.666666984558105,
+              2.0,
+              4.0
+            ]
+          },
+          "thread_occupancy": 100,
+          "uniform_registers_used": 2,
+          "work_registers_used": 4
+        }
+      }
+    }
+  },
   "flutter/impeller/entity/gles/blend.frag.gles": {
     "Mali-G78": {
       "core": "Mali-G78",