diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index ad8c4eb52b..b3650f2d5f 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -41648,6 +41648,8 @@ ORIGIN: ../../../flutter/impeller/compiler/shader_lib/flutter/runtime_effect.gls ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/blending.glsl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/branching.glsl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/color.glsl + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/conical_gradient_fill.glsl + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/conical_gradient_uniform_fill.glsl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/constants.glsl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/conversions.glsl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/compiler/shader_lib/impeller/dithering.glsl + ../../../flutter/LICENSE @@ -41874,9 +41876,15 @@ ORIGIN: ../../../flutter/impeller/entity/shaders/filters/srgb_to_linear_filter.f ORIGIN: ../../../flutter/impeller/entity/shaders/filters/yuv_to_rgb_filter.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/glyph_atlas.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/glyph_atlas.vert + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_conical.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_radial.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip_radial.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_ssbo_fill.frag + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_conical.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_radial.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip_radial.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/fast_gradient.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/fast_gradient.vert + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/gradients/gradient_fill.vert + ../../../flutter/LICENSE @@ -44567,6 +44575,8 @@ FILE: ../../../flutter/impeller/compiler/shader_lib/flutter/runtime_effect.glsl FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/blending.glsl FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/branching.glsl FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/color.glsl +FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/conical_gradient_fill.glsl +FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/conical_gradient_uniform_fill.glsl FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/constants.glsl FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/conversions.glsl FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/dithering.glsl @@ -44793,9 +44803,15 @@ FILE: ../../../flutter/impeller/entity/shaders/filters/srgb_to_linear_filter.fra FILE: ../../../flutter/impeller/entity/shaders/filters/yuv_to_rgb_filter.frag FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas.frag FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas.vert -FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_conical.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_radial.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip_radial.frag FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_ssbo_fill.frag -FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_conical.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_radial.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip.frag +FILE: ../../../flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip_radial.frag FILE: ../../../flutter/impeller/entity/shaders/gradients/fast_gradient.frag FILE: ../../../flutter/impeller/entity/shaders/gradients/fast_gradient.vert FILE: ../../../flutter/impeller/entity/shaders/gradients/gradient_fill.vert diff --git a/engine/src/flutter/impeller/compiler/shader_lib/impeller/BUILD.gn b/engine/src/flutter/impeller/compiler/shader_lib/impeller/BUILD.gn index 1fc19bf293..5609ce4d3a 100644 --- a/engine/src/flutter/impeller/compiler/shader_lib/impeller/BUILD.gn +++ b/engine/src/flutter/impeller/compiler/shader_lib/impeller/BUILD.gn @@ -7,6 +7,7 @@ copy("impeller") { "blending.glsl", "branching.glsl", "color.glsl", + "conical_gradient_uniform_fill.glsl", "constants.glsl", "conversions.glsl", "dithering.glsl", diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill.frag b/engine/src/flutter/impeller/compiler/shader_lib/impeller/conical_gradient_fill.glsl similarity index 68% rename from engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill.frag rename to engine/src/flutter/impeller/compiler/shader_lib/impeller/conical_gradient_fill.glsl index 8a1cbcdd79..3c6cb7b966 100644 --- a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill.frag +++ b/engine/src/flutter/impeller/compiler/shader_lib/impeller/conical_gradient_fill.glsl @@ -2,12 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -precision highp float; +#ifndef CONICAL_GRADIENT_UNIFORM_FILL_GLSL_ +#define CONICAL_GRADIENT_UNIFORM_FILL_GLSL_ -#include -#include #include -#include uniform sampler2D texture_sampler; @@ -24,25 +22,21 @@ uniform FragInfo { } frag_info; -highp in vec2 v_position; - -out vec4 frag_color; - -void main() { - vec2 res = IPComputeConicalT(frag_info.focus, frag_info.focus_radius, - frag_info.center, frag_info.radius, v_position); +vec4 DoConicalGradientTextureFill(vec2 res) { if (res.y < 0.0) { - frag_color = vec4(0); - return; + return vec4(0); } float t = res.x; - frag_color = + vec4 result = IPSampleLinearWithTileMode(texture_sampler, // vec2(t, 0.5), // frag_info.texture_sampler_y_coord_scale, // frag_info.half_texel, // frag_info.tile_mode, // frag_info.decal_border_color); - frag_color = IPPremultiply(frag_color) * frag_info.alpha; + result = IPPremultiply(result) * frag_info.alpha; + return result; } + +#endif // CONICAL_GRADIENT_UNIFORM_FILL_GLSL_ diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill.frag b/engine/src/flutter/impeller/compiler/shader_lib/impeller/conical_gradient_uniform_fill.glsl similarity index 78% rename from engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill.frag rename to engine/src/flutter/impeller/compiler/shader_lib/impeller/conical_gradient_uniform_fill.glsl index 0fe636e8b5..776ac784e2 100644 --- a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill.frag +++ b/engine/src/flutter/impeller/compiler/shader_lib/impeller/conical_gradient_uniform_fill.glsl @@ -2,13 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifndef CONICAL_GRADIENT_UNIFORM_FILL_GLSL_ +#define CONICAL_GRADIENT_UNIFORM_FILL_GLSL_ + precision highp float; -#include -#include -#include #include -#include uniform FragInfo { highp vec2 center; @@ -24,14 +23,7 @@ uniform FragInfo { } frag_info; -highp in vec2 v_position; - -out vec4 frag_color; - -void main() { - vec2 res = IPComputeConicalT(frag_info.focus, frag_info.focus_radius, - frag_info.center, frag_info.radius, v_position); - +vec4 DoConicalGradientUniformFill(vec2 res) { float t = res.x; vec4 result_color = vec4(0); if (res.y < 0.0 || @@ -64,5 +56,8 @@ void main() { } } - frag_color = IPPremultiply(result_color) * frag_info.alpha; + result_color = IPPremultiply(result_color) * frag_info.alpha; + return result_color; } + +#endif // CONICAL_GRADIENT_UNIFORM_FILL_GLSL_ diff --git a/engine/src/flutter/impeller/compiler/shader_lib/impeller/gradient.glsl b/engine/src/flutter/impeller/compiler/shader_lib/impeller/gradient.glsl index 15647aee5f..6f2b87f24a 100644 --- a/engine/src/flutter/impeller/compiler/shader_lib/impeller/gradient.glsl +++ b/engine/src/flutter/impeller/compiler/shader_lib/impeller/gradient.glsl @@ -16,6 +16,101 @@ mat3 IPMapToUnitX(vec2 p0, vec2 p1) { p1.y - p0.y, 0.0, p0.x, p0.y, 1.0)); } +vec2 IPComputeConicalTRadial(vec2 c0, float r0, vec2 c1, float r1, vec2 pos) { + float d_radius = r1 - r0; + float scale = 1.0 / d_radius; + float scale_sign = sign(d_radius); + float bias = r0 / d_radius; + + vec2 pt = (pos - c0) * scale; + float t = length(pt) * scale_sign - bias; + return vec2(t, 1.0); +} + +vec2 IPComputeConicalTStrip(vec2 c0, float r0, vec2 c1, float r1, vec2 pos) { + float d_center = distance(c0, c1); + mat3 transform = IPMapToUnitX(c0, c1); + float r = r0 / d_center; + float r_2 = r * r; + + vec2 pt = (transform * vec3(pos.xy, 1.0)).xy; + float t = r_2 - pt.y * pt.y; + if (t < 0.0) { + return vec2(0.0, -1.0); + } + t = pt.x + sqrt(t); + return vec2(t, 1.0); +} + +vec2 IPComputeConicalTConical(vec2 c0, float r0, vec2 c1, float r1, vec2 pos) { + const float scalar_nearly_zero = 1.0 / float(1 << 12); + float d_center = distance(c0, c1); + // See https://skia.org/docs/dev/design/conical/ for details on how this + // algorithm works. Calculate f and swap inputs if necessary (steps 1 and + // 2). + float f = r0 / (r0 - r1); + + bool is_swapped = abs(f - 1.0) < scalar_nearly_zero; + if (is_swapped) { + vec2 tmp_pt = c0; + c0 = c1; + c1 = tmp_pt; + f = 0.0; + } + + // Apply mapping from [Cf, C1] to unit x, and apply the precalculations from + // steps 3 and 4, all in the same transform. + vec2 cf = c0 * (1.0 - f) + c1 * f; + mat3 transform = IPMapToUnitX(cf, c1); + + float scale_x = abs(1.0 - f); + float scale_y = scale_x; + float local_r1 = abs(r1 - r0) / d_center; + bool is_focal_on_circle = abs(local_r1 - 1.0) < scalar_nearly_zero; + if (is_focal_on_circle) { + scale_x *= 0.5; + scale_y *= 0.5; + } else { + scale_x *= local_r1 / (local_r1 * local_r1 - 1.0); + scale_y /= sqrt(abs(local_r1 * local_r1 - 1.0)); + } + transform = + mat3(scale_x, 0.0, 0.0, 0.0, scale_y, 0.0, 0.0, 0.0, 1.0) * transform; + + vec2 pt = (transform * vec3(pos.xy, 1.0)).xy; + + // Continue with step 5 onward. + float inv_r1 = 1.0 / local_r1; + float d_radius_sign = sign(1.0 - f); + bool is_well_behaved = !is_focal_on_circle && local_r1 > 1.0; + + float x_t = -1.0; + if (is_focal_on_circle) { + x_t = dot(pt, pt) / pt.x; + } else if (is_well_behaved) { + x_t = length(pt) - pt.x * inv_r1; + } else { + float temp = pt.x * pt.x - pt.y * pt.y; + if (temp >= 0.0) { + if (is_swapped || d_radius_sign < 0.0) { + x_t = -sqrt(temp) - pt.x * inv_r1; + } else { + x_t = sqrt(temp) - pt.x * inv_r1; + } + } + } + + if (!is_well_behaved && x_t < 0.0) { + return vec2(0.0, -1.0); + } + + float t = f + d_radius_sign * x_t; + if (is_swapped) { + t = 1.0 - t; + } + return vec2(t, 1.0); +} + /// Compute the t value for a conical gradient at point `p` between the 2 /// circles defined by (c0, r0) and (c1, r1). The returned vec2 encapsulates 't' /// as its x component and validity status as its y component, with positive y @@ -23,111 +118,20 @@ mat3 IPMapToUnitX(vec2 p0, vec2 p1) { /// /// The code is migrated from Skia Graphite. See /// https://github.com/google/skia/blob/ddf987d2ab3314ee0e80ac1ae7dbffb44a87d394/src/sksl/sksl_graphite_frag.sksl#L541-L666. -vec2 IPComputeConicalT(vec2 c0, float r0, vec2 c1, float r1, vec2 pos) { - const float scalar_nearly_zero = 1.0 / float(1 << 12); - float d_center = distance(c0, c1); - float d_radius = r1 - r0; - - // Degenerate case: a radial gradient (p0 = p1). - bool radial = d_center < scalar_nearly_zero; - - // Degenerate case: a strip with bandwidth 2r (r0 = r1). - bool strip = abs(d_radius) < scalar_nearly_zero; - - if (radial) { - if (strip) { - // The start and end inputs are the same in both position and radius. - // We don't expect to see this input, but just in case we avoid dividing - // by zero. - return vec2(0.0, -1.0); - } - - float scale = 1.0 / d_radius; - float scale_sign = sign(d_radius); - float bias = r0 / d_radius; - - vec2 pt = (pos - c0) * scale; - float t = length(pt) * scale_sign - bias; - return vec2(t, 1.0); - - } else if (strip) { - mat3 transform = IPMapToUnitX(c0, c1); - float r = r0 / d_center; - float r_2 = r * r; - - vec2 pt = (transform * vec3(pos.xy, 1.0)).xy; - float t = r_2 - pt.y * pt.y; - if (t < 0.0) { - return vec2(0.0, -1.0); - } - t = pt.x + sqrt(t); - return vec2(t, 1.0); - +vec2 IPComputeConicalT(float kind, + vec2 c0, + float r0, + vec2 c1, + float r1, + vec2 pos) { + if (kind == 0.0) { + return vec2(0.0, -1.0); + } else if (kind == 1.0) { + return IPComputeConicalTRadial(c0, r0, c1, r1, pos); + } else if (kind == 2.0) { + return IPComputeConicalTStrip(c0, r0, c1, r1, pos); } else { - // See https://skia.org/docs/dev/design/conical/ for details on how this - // algorithm works. Calculate f and swap inputs if necessary (steps 1 and - // 2). - float f = r0 / (r0 - r1); - - bool is_swapped = abs(f - 1.0) < scalar_nearly_zero; - if (is_swapped) { - vec2 tmp_pt = c0; - c0 = c1; - c1 = tmp_pt; - f = 0.0; - } - - // Apply mapping from [Cf, C1] to unit x, and apply the precalculations from - // steps 3 and 4, all in the same transform. - vec2 cf = c0 * (1.0 - f) + c1 * f; - mat3 transform = IPMapToUnitX(cf, c1); - - float scale_x = abs(1.0 - f); - float scale_y = scale_x; - float r1 = abs(r1 - r0) / d_center; - bool is_focal_on_circle = abs(r1 - 1.0) < scalar_nearly_zero; - if (is_focal_on_circle) { - scale_x *= 0.5; - scale_y *= 0.5; - } else { - scale_x *= r1 / (r1 * r1 - 1.0); - scale_y /= sqrt(abs(r1 * r1 - 1.0)); - } - transform = - mat3(scale_x, 0.0, 0.0, 0.0, scale_y, 0.0, 0.0, 0.0, 1.0) * transform; - - vec2 pt = (transform * vec3(pos.xy, 1.0)).xy; - - // Continue with step 5 onward. - float inv_r1 = 1.0 / r1; - float d_radius_sign = sign(1.0 - f); - bool is_well_behaved = !is_focal_on_circle && r1 > 1.0; - - float x_t = -1.0; - if (is_focal_on_circle) { - x_t = dot(pt, pt) / pt.x; - } else if (is_well_behaved) { - x_t = length(pt) - pt.x * inv_r1; - } else { - float temp = pt.x * pt.x - pt.y * pt.y; - if (temp >= 0.0) { - if (is_swapped || d_radius_sign < 0.0) { - x_t = -sqrt(temp) - pt.x * inv_r1; - } else { - x_t = sqrt(temp) - pt.x * inv_r1; - } - } - } - - if (!is_well_behaved && x_t < 0.0) { - return vec2(0.0, -1.0); - } - - float t = f + d_radius_sign * x_t; - if (is_swapped) { - t = 1.0 - t; - } - return vec2(t, 1.0); + return IPComputeConicalTConical(c0, r0, c1, r1, pos); } } diff --git a/engine/src/flutter/impeller/display_list/aiks_dl_gradient_unittests.cc b/engine/src/flutter/impeller/display_list/aiks_dl_gradient_unittests.cc index f07ad6a7dc..26a053d58b 100644 --- a/engine/src/flutter/impeller/display_list/aiks_dl_gradient_unittests.cc +++ b/engine/src/flutter/impeller/display_list/aiks_dl_gradient_unittests.cc @@ -685,9 +685,14 @@ TEST_P(AiksTest, CanRenderConicalGradient) { builder.Save(); builder.Translate((i % 3) * size, i / 3 * size); paint.setColorSource(DlColorSource::MakeConical( - std::get<2>(array[i]), std::get<3>(array[i]), std::get<0>(array[i]), - std::get<1>(array[i]), stops.size(), colors.data(), stops.data(), - DlTileMode::kClamp)); + /*start_center=*/std::get<2>(array[i]), + /*start_radius=*/std::get<3>(array[i]), + /*end_center=*/std::get<0>(array[i]), + /*end_radius=*/std::get<1>(array[i]), + /*stop_count=*/stops.size(), + /*colors=*/colors.data(), + /*stops=*/stops.data(), + /*tile_mode=*/DlTileMode::kClamp)); builder.DrawRect(DlRect::MakeXYWH(0, 0, size, size), paint); builder.Restore(); } diff --git a/engine/src/flutter/impeller/entity/BUILD.gn b/engine/src/flutter/impeller/entity/BUILD.gn index 0f256bb678..b696b112c5 100644 --- a/engine/src/flutter/impeller/entity/BUILD.gn +++ b/engine/src/flutter/impeller/entity/BUILD.gn @@ -21,8 +21,14 @@ impeller_shaders("entity_shaders") { "shaders/glyph_atlas.frag", "shaders/glyph_atlas.vert", "shaders/gradients/gradient_fill.vert", - "shaders/gradients/conical_gradient_fill.frag", - "shaders/gradients/conical_gradient_uniform_fill.frag", + "shaders/gradients/conical_gradient_fill_conical.frag", + "shaders/gradients/conical_gradient_fill_strip.frag", + "shaders/gradients/conical_gradient_fill_radial.frag", + "shaders/gradients/conical_gradient_fill_strip_radial.frag", + "shaders/gradients/conical_gradient_uniform_fill_conical.frag", + "shaders/gradients/conical_gradient_uniform_fill_strip.frag", + "shaders/gradients/conical_gradient_uniform_fill_radial.frag", + "shaders/gradients/conical_gradient_uniform_fill_strip_radial.frag", "shaders/gradients/linear_gradient_fill.frag", "shaders/gradients/linear_gradient_uniform_fill.frag", "shaders/gradients/radial_gradient_fill.frag", diff --git a/engine/src/flutter/impeller/entity/contents/conical_gradient_contents.cc b/engine/src/flutter/impeller/entity/contents/conical_gradient_contents.cc index 85c2b62403..c14fe8eabf 100644 --- a/engine/src/flutter/impeller/entity/contents/conical_gradient_contents.cc +++ b/engine/src/flutter/impeller/entity/contents/conical_gradient_contents.cc @@ -14,6 +14,28 @@ namespace impeller { +namespace { +ConicalKind GetConicalKind(Point center, + Scalar radius, + std::optional focus, + Scalar focus_radius) { + ConicalKind kind = ConicalKind::kConical; + if (!focus.has_value() || + center.GetDistance(focus.value()) < kEhCloseEnough) { + kind = ConicalKind::kRadial; + } + if (focus.has_value() && std::fabsf(radius - focus_radius) < kEhCloseEnough) { + if (kind == ConicalKind::kRadial) { + kind = ConicalKind::kStripAndRadial; + } else { + kind = ConicalKind::kStrip; + } + } + return kind; +} + +} // namespace + ConicalGradientContents::ConicalGradientContents() = default; ConicalGradientContents::~ConicalGradientContents() = default; @@ -51,7 +73,7 @@ void ConicalGradientContents::SetFocus(std::optional focus, #define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) #define UNIFORM_FRAG_INFO(t) \ - t##GradientUniformFillPipeline::FragmentShader::FragInfo + t##GradientUniformFillConicalPipeline::FragmentShader::FragInfo #define UNIFORM_COLOR_SIZE ARRAY_LEN(UNIFORM_FRAG_INFO(Conical)::colors) #define UNIFORM_STOP_SIZE ARRAY_LEN(UNIFORM_FRAG_INFO(Conical)::stop_pairs) static_assert(UNIFORM_COLOR_SIZE == kMaxUniformGradientStops); @@ -79,9 +101,10 @@ bool ConicalGradientContents::RenderSSBO(const ContentContext& renderer, VS::FrameInfo frame_info; frame_info.matrix = GetInverseEffectTransform(); + ConicalKind kind = GetConicalKind(center_, radius_, focus_, focus_radius_); PipelineBuilderCallback pipeline_callback = - [&renderer](ContentContextOptions options) { - return renderer.GetConicalGradientSSBOFillPipeline(options); + [&renderer, kind](ContentContextOptions options) { + return renderer.GetConicalGradientSSBOFillPipeline(options, kind); }; return ColorSourceContents::DrawGeometry( renderer, entity, pass, pipeline_callback, frame_info, @@ -122,15 +145,16 @@ bool ConicalGradientContents::RenderSSBO(const ContentContext& renderer, bool ConicalGradientContents::RenderUniform(const ContentContext& renderer, const Entity& entity, RenderPass& pass) const { - using VS = ConicalGradientUniformFillPipeline::VertexShader; - using FS = ConicalGradientUniformFillPipeline::FragmentShader; + using VS = ConicalGradientUniformFillConicalPipeline::VertexShader; + using FS = ConicalGradientUniformFillConicalPipeline::FragmentShader; VS::FrameInfo frame_info; frame_info.matrix = GetInverseEffectTransform(); + ConicalKind kind = GetConicalKind(center_, radius_, focus_, focus_radius_); PipelineBuilderCallback pipeline_callback = - [&renderer](ContentContextOptions options) { - return renderer.GetConicalGradientUniformFillPipeline(options); + [&renderer, kind](ContentContextOptions options) { + return renderer.GetConicalGradientUniformFillPipeline(options, kind); }; return ColorSourceContents::DrawGeometry( renderer, entity, pass, pipeline_callback, frame_info, @@ -165,8 +189,8 @@ bool ConicalGradientContents::RenderUniform(const ContentContext& renderer, bool ConicalGradientContents::RenderTexture(const ContentContext& renderer, const Entity& entity, RenderPass& pass) const { - using VS = ConicalGradientFillPipeline::VertexShader; - using FS = ConicalGradientFillPipeline::FragmentShader; + using VS = ConicalGradientFillConicalPipeline::VertexShader; + using FS = ConicalGradientFillConicalPipeline::FragmentShader; auto gradient_data = CreateGradientBuffer(colors_, stops_); auto gradient_texture = @@ -178,9 +202,10 @@ bool ConicalGradientContents::RenderTexture(const ContentContext& renderer, VS::FrameInfo frame_info; frame_info.matrix = GetInverseEffectTransform(); + ConicalKind kind = GetConicalKind(center_, radius_, focus_, focus_radius_); PipelineBuilderCallback pipeline_callback = - [&renderer](ContentContextOptions options) { - return renderer.GetConicalGradientFillPipeline(options); + [&renderer, kind](ContentContextOptions options) { + return renderer.GetConicalGradientFillPipeline(options, kind); }; return ColorSourceContents::DrawGeometry( renderer, entity, pass, pipeline_callback, frame_info, diff --git a/engine/src/flutter/impeller/entity/contents/content_context.cc b/engine/src/flutter/impeller/entity/contents/content_context.cc index 7cf890768a..fed8fb9230 100644 --- a/engine/src/flutter/impeller/entity/contents/content_context.cc +++ b/engine/src/flutter/impeller/entity/contents/content_context.cc @@ -326,18 +326,35 @@ ContentContext::ContentContext( if (context_->GetCapabilities()->SupportsSSBO()) { linear_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options); radial_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options); - conical_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options); + conical_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options, + {3.0}); + conical_gradient_ssbo_fill_radial_pipelines_.CreateDefault( + *context_, options, {1.0}); + conical_gradient_ssbo_fill_strip_pipelines_.CreateDefault(*context_, + options, {2.0}); + conical_gradient_ssbo_fill_strip_and_radial_pipelines_.CreateDefault( + *context_, options, {0.0}); sweep_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options); } else { linear_gradient_uniform_fill_pipelines_.CreateDefault(*context_, options); radial_gradient_uniform_fill_pipelines_.CreateDefault(*context_, options); conical_gradient_uniform_fill_pipelines_.CreateDefault(*context_, options); + conical_gradient_uniform_fill_radial_pipelines_.CreateDefault(*context_, + options); + conical_gradient_uniform_fill_strip_pipelines_.CreateDefault(*context_, + options); + conical_gradient_uniform_fill_strip_and_radial_pipelines_.CreateDefault( + *context_, options); sweep_gradient_uniform_fill_pipelines_.CreateDefault(*context_, options); linear_gradient_fill_pipelines_.CreateDefault(*context_, options); radial_gradient_fill_pipelines_.CreateDefault(*context_, options); conical_gradient_fill_pipelines_.CreateDefault(*context_, options); + conical_gradient_fill_radial_pipelines_.CreateDefault(*context_, options); + conical_gradient_fill_strip_pipelines_.CreateDefault(*context_, options); + conical_gradient_fill_strip_and_radial_pipelines_.CreateDefault(*context_, + options); sweep_gradient_fill_pipelines_.CreateDefault(*context_, options); } diff --git a/engine/src/flutter/impeller/entity/contents/content_context.h b/engine/src/flutter/impeller/entity/contents/content_context.h index 7446b31b44..9b0a379128 100644 --- a/engine/src/flutter/impeller/entity/contents/content_context.h +++ b/engine/src/flutter/impeller/entity/contents/content_context.h @@ -28,7 +28,10 @@ #include "impeller/entity/clip.frag.h" #include "impeller/entity/clip.vert.h" #include "impeller/entity/color_matrix_color_filter.frag.h" -#include "impeller/entity/conical_gradient_fill.frag.h" +#include "impeller/entity/conical_gradient_fill_conical.frag.h" +#include "impeller/entity/conical_gradient_fill_radial.frag.h" +#include "impeller/entity/conical_gradient_fill_strip.frag.h" +#include "impeller/entity/conical_gradient_fill_strip_radial.frag.h" #include "impeller/entity/fast_gradient.frag.h" #include "impeller/entity/fast_gradient.vert.h" #include "impeller/entity/filter_position.vert.h" @@ -57,7 +60,10 @@ #include "impeller/entity/tiled_texture_fill.frag.h" #include "impeller/entity/yuv_to_rgb_filter.frag.h" -#include "impeller/entity/conical_gradient_uniform_fill.frag.h" +#include "impeller/entity/conical_gradient_uniform_fill_conical.frag.h" +#include "impeller/entity/conical_gradient_uniform_fill_radial.frag.h" +#include "impeller/entity/conical_gradient_uniform_fill_strip.frag.h" +#include "impeller/entity/conical_gradient_uniform_fill_strip_radial.frag.h" #include "impeller/entity/linear_gradient_uniform_fill.frag.h" #include "impeller/entity/radial_gradient_uniform_fill.frag.h" #include "impeller/entity/sweep_gradient_uniform_fill.frag.h" @@ -92,18 +98,36 @@ using SolidFillPipeline = using RadialGradientFillPipeline = RenderPipelineHandle; -using ConicalGradientFillPipeline = +using ConicalGradientFillConicalPipeline = RenderPipelineHandle; + ConicalGradientFillConicalFragmentShader>; +using ConicalGradientFillStripPipeline = + RenderPipelineHandle; +using ConicalGradientFillRadialPipeline = + RenderPipelineHandle; +using ConicalGradientFillStripRadialPipeline = + RenderPipelineHandle; using SweepGradientFillPipeline = RenderPipelineHandle; using LinearGradientUniformFillPipeline = RenderPipelineHandle; -using ConicalGradientUniformFillPipeline = +using ConicalGradientUniformFillConicalPipeline = RenderPipelineHandle; + ConicalGradientUniformFillConicalFragmentShader>; +using ConicalGradientUniformFillStripPipeline = + RenderPipelineHandle; +using ConicalGradientUniformFillRadialPipeline = + RenderPipelineHandle; +using ConicalGradientUniformFillStripRadialPipeline = + RenderPipelineHandle; using RadialGradientUniformFillPipeline = RenderPipelineHandle; @@ -365,6 +389,13 @@ struct ContentContextOptions { void ApplyToPipelineDescriptor(PipelineDescriptor& desc) const; }; +enum ConicalKind { + kConical, + kRadial, + kStrip, + kStripAndRadial, +}; + class Tessellator; class RenderTargetCache; @@ -399,9 +430,21 @@ class ContentContext { return GetPipeline(radial_gradient_uniform_fill_pipelines_, opts); } - PipelineRef GetConicalGradientUniformFillPipeline( - ContentContextOptions opts) const { - return GetPipeline(conical_gradient_uniform_fill_pipelines_, opts); + PipelineRef GetConicalGradientUniformFillPipeline(ContentContextOptions opts, + ConicalKind kind) const { + switch (kind) { + case ConicalKind::kConical: + return GetPipeline(conical_gradient_uniform_fill_pipelines_, opts); + case ConicalKind::kRadial: + return GetPipeline(conical_gradient_uniform_fill_radial_pipelines_, + opts); + case ConicalKind::kStrip: + return GetPipeline(conical_gradient_uniform_fill_strip_pipelines_, + opts); + case ConicalKind::kStripAndRadial: + return GetPipeline( + conical_gradient_uniform_fill_strip_and_radial_pipelines_, opts); + } } PipelineRef GetSweepGradientUniformFillPipeline( @@ -421,10 +464,20 @@ class ContentContext { return GetPipeline(radial_gradient_ssbo_fill_pipelines_, opts); } - PipelineRef GetConicalGradientSSBOFillPipeline( - ContentContextOptions opts) const { + PipelineRef GetConicalGradientSSBOFillPipeline(ContentContextOptions opts, + ConicalKind kind) const { FML_DCHECK(GetDeviceCapabilities().SupportsSSBO()); - return GetPipeline(conical_gradient_ssbo_fill_pipelines_, opts); + switch (kind) { + case ConicalKind::kConical: + return GetPipeline(conical_gradient_ssbo_fill_pipelines_, opts); + case ConicalKind::kRadial: + return GetPipeline(conical_gradient_ssbo_fill_radial_pipelines_, opts); + case ConicalKind::kStrip: + return GetPipeline(conical_gradient_ssbo_fill_strip_pipelines_, opts); + case ConicalKind::kStripAndRadial: + return GetPipeline( + conical_gradient_ssbo_fill_strip_and_radial_pipelines_, opts); + } } PipelineRef GetSweepGradientSSBOFillPipeline( @@ -437,8 +490,19 @@ class ContentContext { return GetPipeline(radial_gradient_fill_pipelines_, opts); } - PipelineRef GetConicalGradientFillPipeline(ContentContextOptions opts) const { - return GetPipeline(conical_gradient_fill_pipelines_, opts); + PipelineRef GetConicalGradientFillPipeline(ContentContextOptions opts, + ConicalKind kind) const { + switch (kind) { + case ConicalKind::kConical: + return GetPipeline(conical_gradient_fill_pipelines_, opts); + case ConicalKind::kRadial: + return GetPipeline(conical_gradient_fill_radial_pipelines_, opts); + case ConicalKind::kStrip: + return GetPipeline(conical_gradient_fill_strip_pipelines_, opts); + case ConicalKind::kStripAndRadial: + return GetPipeline(conical_gradient_fill_strip_and_radial_pipelines_, + opts); + } } PipelineRef GetRRectBlurPipeline(ContentContextOptions opts) const { @@ -988,15 +1052,27 @@ class ContentContext { mutable Variants fast_gradient_pipelines_; mutable Variants linear_gradient_fill_pipelines_; mutable Variants radial_gradient_fill_pipelines_; - mutable Variants + mutable Variants conical_gradient_fill_pipelines_; + mutable Variants + conical_gradient_fill_radial_pipelines_; + mutable Variants + conical_gradient_fill_strip_pipelines_; + mutable Variants + conical_gradient_fill_strip_and_radial_pipelines_; mutable Variants sweep_gradient_fill_pipelines_; mutable Variants linear_gradient_uniform_fill_pipelines_; mutable Variants radial_gradient_uniform_fill_pipelines_; - mutable Variants + mutable Variants conical_gradient_uniform_fill_pipelines_; + mutable Variants + conical_gradient_uniform_fill_radial_pipelines_; + mutable Variants + conical_gradient_uniform_fill_strip_pipelines_; + mutable Variants + conical_gradient_uniform_fill_strip_and_radial_pipelines_; mutable Variants sweep_gradient_uniform_fill_pipelines_; mutable Variants @@ -1005,6 +1081,12 @@ class ContentContext { radial_gradient_ssbo_fill_pipelines_; mutable Variants conical_gradient_ssbo_fill_pipelines_; + mutable Variants + conical_gradient_ssbo_fill_radial_pipelines_; + mutable Variants + conical_gradient_ssbo_fill_strip_pipelines_; + mutable Variants + conical_gradient_ssbo_fill_strip_and_radial_pipelines_; mutable Variants sweep_gradient_ssbo_fill_pipelines_; mutable Variants rrect_blur_pipelines_; diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_conical.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_conical.frag new file mode 100644 index 0000000000..5f5b3e332e --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_conical.frag @@ -0,0 +1,22 @@ +// 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 highp float; + +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = + IPComputeConicalTConical(frag_info.focus, frag_info.focus_radius, + frag_info.center, frag_info.radius, v_position); + frag_color = DoConicalGradientTextureFill(res); +} diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_radial.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_radial.frag new file mode 100644 index 0000000000..8dce92c60a --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_radial.frag @@ -0,0 +1,22 @@ +// 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 highp float; + +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = + IPComputeConicalTRadial(frag_info.focus, frag_info.focus_radius, + frag_info.center, frag_info.radius, v_position); + frag_color = DoConicalGradientTextureFill(res); +} diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip.frag new file mode 100644 index 0000000000..4997ef92c6 --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip.frag @@ -0,0 +1,22 @@ +// 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 highp float; + +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = + IPComputeConicalTStrip(frag_info.focus, frag_info.focus_radius, + frag_info.center, frag_info.radius, v_position); + frag_color = DoConicalGradientTextureFill(res); +} diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip_radial.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip_radial.frag new file mode 100644 index 0000000000..377b7370e9 --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_fill_strip_radial.frag @@ -0,0 +1,20 @@ +// 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 highp float; + +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = vec2(0.0, -1.0); + frag_color = DoConicalGradientTextureFill(res); +} diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_ssbo_fill.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_ssbo_fill.frag index 8cb0acb830..6282d9e4ec 100644 --- a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_ssbo_fill.frag +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_ssbo_fill.frag @@ -10,6 +10,8 @@ precision highp float; #include #include +layout(constant_id = 0) const float kind = 3.0; + struct ColorPoint { vec4 color; float stop; @@ -37,7 +39,7 @@ highp in vec2 v_position; out vec4 frag_color; void main() { - vec2 res = IPComputeConicalT(frag_info.focus, frag_info.focus_radius, + vec2 res = IPComputeConicalT(kind, frag_info.focus, frag_info.focus_radius, frag_info.center, frag_info.radius, v_position); float t = res.x; diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_conical.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_conical.frag new file mode 100644 index 0000000000..d83cad2d5c --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_conical.frag @@ -0,0 +1,23 @@ +// 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 highp float; + +#include +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = + IPComputeConicalTConical(frag_info.focus, frag_info.focus_radius, + frag_info.center, frag_info.radius, v_position); + frag_color = DoConicalGradientUniformFill(res); +} diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_radial.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_radial.frag new file mode 100644 index 0000000000..ab98e5e094 --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_radial.frag @@ -0,0 +1,24 @@ +// 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 highp float; + +#include +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = + IPComputeConicalTRadial(frag_info.focus, frag_info.focus_radius, + frag_info.center, frag_info.radius, v_position); + + frag_color = DoConicalGradientUniformFill(res); +} diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip.frag new file mode 100644 index 0000000000..2292614338 --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip.frag @@ -0,0 +1,24 @@ +// 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 highp float; + +#include +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = + IPComputeConicalTStrip(frag_info.focus, frag_info.focus_radius, + frag_info.center, frag_info.radius, v_position); + + frag_color = DoConicalGradientUniformFill(res); +} diff --git a/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip_radial.frag b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip_radial.frag new file mode 100644 index 0000000000..e730bd282c --- /dev/null +++ b/engine/src/flutter/impeller/entity/shaders/gradients/conical_gradient_uniform_fill_strip_radial.frag @@ -0,0 +1,21 @@ +// 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 highp float; + +#include +#include +#include +#include +#include +#include + +highp in vec2 v_position; + +out vec4 frag_color; + +void main() { + vec2 res = vec2(0.0, -1.0); + frag_color = DoConicalGradientUniformFill(res); +} diff --git a/engine/src/flutter/impeller/tools/malioc.json b/engine/src/flutter/impeller/tools/malioc.json index 4502526e9a..c58ca59025 100644 --- a/engine/src/flutter/impeller/tools/malioc.json +++ b/engine/src/flutter/impeller/tools/malioc.json @@ -470,10 +470,10 @@ } } }, - "flutter/impeller/entity/conical_gradient_fill.frag.vkspv": { + "flutter/impeller/entity/conical_gradient_fill_conical.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/conical_gradient_fill.frag.vkspv", + "filename": "flutter/impeller/entity/conical_gradient_fill_conical.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -491,9 +491,9 @@ "arith_cvt" ], "longest_path_cycles": [ - 0.75, + 0.675000011920929, 0.46875, - 0.75, + 0.675000011920929, 0.1875, 0.0, 0.25, @@ -508,13 +508,158 @@ "varying", "texture" ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "shortest_path_cycles": [ + 0.265625, + 0.203125, + 0.265625, + 0.125, + 0.0, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.862500011920929, + 0.59375, + 0.862500011920929, + 0.3125, + 0.0, + 0.25, + 0.25 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 30, + "work_registers_used": 11 + } + } + } + }, + "flutter/impeller/entity/conical_gradient_fill_radial.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/conical_gradient_fill_radial.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": [ + "arith_total", + "arith_fma" + ], + "longest_path_cycles": [ + 0.328125, + 0.328125, + 0.296875, + 0.125, + 0.0, + 0.25, + 0.25 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], "shortest_path_bound_pipelines": [ "varying" ], "shortest_path_cycles": [ - 0.171875, + 0.234375, + 0.234375, + 0.203125, + 0.125, 0.0, - 0.171875, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.421875, + 0.359375, + 0.421875, + 0.125, + 0.0, + 0.25, + 0.25 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 22, + "work_registers_used": 12 + } + } + } + }, + "flutter/impeller/entity/conical_gradient_fill_strip.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/conical_gradient_fill_strip.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": [ + "arith_total", + "arith_cvt" + ], + "longest_path_cycles": [ + 0.421875, + 0.328125, + 0.421875, + 0.125, + 0.0, + 0.25, + 0.25 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "varying" + ], + "shortest_path_cycles": [ + 0.109375, + 0.0625, + 0.109375, 0.0, 0.0, 0.25, @@ -525,10 +670,10 @@ "arith_cvt" ], "total_cycles": [ - 1.21875, - 0.84375, - 1.21875, - 0.4375, + 0.546875, + 0.359375, + 0.546875, + 0.125, 0.0, 0.25, 0.25 @@ -536,8 +681,81 @@ }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 46, - "work_registers_used": 12 + "uniform_registers_used": 22, + "work_registers_used": 11 + } + } + } + }, + "flutter/impeller/entity/conical_gradient_fill_strip_radial.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/conical_gradient_fill_strip_radial.frag.vkspv", + "has_side_effects": false, + "has_uniform_computation": false, + "modifies_coverage": false, + "reads_color_buffer": false, + "type": "Fragment", + "uses_late_zs_test": false, + "uses_late_zs_update": false, + "variants": { + "Main": { + "fp16_arithmetic": null, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "longest_path_cycles": [ + 0.03125, + 0.0, + 0.03125, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "shortest_path_cycles": [ + 0.03125, + 0.0, + 0.03125, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.03125, + 0.0, + 0.03125, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 0, + "work_registers_used": 3 } } } @@ -584,10 +802,10 @@ "arith_sfu" ], "shortest_path_cycles": [ - 0.5, - 0.125, - 0.3125, - 0.5, + 0.625, + 0.359375, + 0.453125, + 0.625, 0.0, 0.25, 0.0 @@ -596,10 +814,10 @@ "load_store" ], "total_cycles": [ - 1.53125, - 1.03125, - 1.53125, - 0.9375, + 1.15625, + 0.78125, + 1.15625, + 0.8125, 4.0, 0.25, 0.0 @@ -607,16 +825,159 @@ }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 50, - "work_registers_used": 18 + "uniform_registers_used": 34, + "work_registers_used": 17 } } } }, - "flutter/impeller/entity/conical_gradient_uniform_fill.frag.vkspv": { + "flutter/impeller/entity/conical_gradient_uniform_fill_conical.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/conical_gradient_uniform_fill.frag.vkspv", + "filename": "flutter/impeller/entity/conical_gradient_uniform_fill_conical.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": [ + null + ], + "longest_path_cycles": [ + null, + null, + null, + null, + null, + null, + null + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "shortest_path_cycles": [ + 0.375, + 0.34375, + 0.375, + 0.125, + 0.0, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 1.2625000476837158, + 0.75, + 1.2625000476837158, + 0.4375, + 4.0, + 0.25, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 28, + "work_registers_used": 19 + } + } + } + }, + "flutter/impeller/entity/conical_gradient_uniform_fill_radial.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/conical_gradient_uniform_fill_radial.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": [ + null + ], + "longest_path_cycles": [ + null, + null, + null, + null, + null, + null, + null + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_fma", + "varying" + ], + "shortest_path_cycles": [ + 0.25, + 0.25, + 0.21875, + 0.125, + 0.0, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 0.862500011920929, + 0.5, + 0.862500011920929, + 0.3125, + 4.0, + 0.25, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 18, + "work_registers_used": 19 + } + } + } + }, + "flutter/impeller/entity/conical_gradient_uniform_fill_strip.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/conical_gradient_uniform_fill_strip.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -655,9 +1016,9 @@ ], "shortest_path_cycles": [ 0.234375, - 0.109375, 0.234375, - 0.0, + 0.21875, + 0.0625, 0.0, 0.25, 0.0 @@ -666,10 +1027,10 @@ "load_store" ], "total_cycles": [ - 1.6375000476837158, - 1.0, - 1.6375000476837158, - 0.5625, + 0.9375, + 0.515625, + 0.9375, + 0.25, 4.0, 0.25, 0.0 @@ -677,8 +1038,81 @@ }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 42, - "work_registers_used": 16 + "uniform_registers_used": 18, + "work_registers_used": 19 + } + } + } + }, + "flutter/impeller/entity/conical_gradient_uniform_fill_strip_radial.frag.vkspv": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/conical_gradient_uniform_fill_strip_radial.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": null, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "longest_path_cycles": [ + 0.0625, + 0.0, + 0.0625, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "shortest_path_cycles": [ + 0.0625, + 0.0, + 0.0625, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.0625, + 0.0, + 0.0625, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 4, + "work_registers_used": 5 } } } @@ -1904,10 +2338,10 @@ } } }, - "flutter/impeller/entity/gles/conical_gradient_fill.frag.gles": { + "flutter/impeller/entity/gles/conical_gradient_fill_conical.frag.gles": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/conical_gradient_fill.frag.gles", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_conical.frag.gles", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -1925,9 +2359,9 @@ "arith_cvt" ], "longest_path_cycles": [ - 0.875, + 0.78125, 0.46875, - 0.875, + 0.78125, 0.25, 0.0, 0.25, @@ -1943,13 +2377,14 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "arith_total", + "arith_cvt" ], "shortest_path_cycles": [ - 0.1875, - 0.0, - 0.1875, - 0.0, + 0.265625, + 0.203125, + 0.265625, + 0.125, 0.0, 0.25, 0.0 @@ -1959,10 +2394,10 @@ "arith_cvt" ], "total_cycles": [ - 1.375, - 0.84375, - 1.375, - 0.5, + 0.96875, + 0.59375, + 0.96875, + 0.375, 0.0, 0.25, 0.25 @@ -1970,14 +2405,14 @@ }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 46, - "work_registers_used": 21 + "uniform_registers_used": 32, + "work_registers_used": 20 } } }, "Mali-T880": { "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/conical_gradient_fill.frag.gles", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_conical.frag.gles", "has_uniform_computation": true, "type": "Fragment", "variants": { @@ -1988,7 +2423,7 @@ "arithmetic" ], "longest_path_cycles": [ - 10.890000343322754, + 9.899999618530273, 1.0, 1.0 ], @@ -2001,7 +2436,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 1.3200000524520874, + 3.630000114440918, 1.0, 0.0 ], @@ -2009,22 +2444,609 @@ "arithmetic" ], "total_cycles": [ - 17.33333396911621, + 13.0, 1.0, 1.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 12, + "uniform_registers_used": 8, "work_registers_used": 2 } } } }, - "flutter/impeller/entity/gles/conical_gradient_uniform_fill.frag.gles": { + "flutter/impeller/entity/gles/conical_gradient_fill_radial.frag.gles": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill.frag.gles", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_radial.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": [ + "arith_total", + "arith_cvt" + ], + "longest_path_cycles": [ + 0.40625, + 0.328125, + 0.40625, + 0.1875, + 0.0, + 0.25, + 0.25 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt", + "varying" + ], + "shortest_path_cycles": [ + 0.25, + 0.234375, + 0.25, + 0.1875, + 0.0, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.5625, + 0.359375, + 0.5625, + 0.1875, + 0.0, + 0.25, + 0.25 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 22, + "work_registers_used": 20 + } + } + }, + "Mali-T880": { + "core": "Mali-T880", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_radial.frag.gles", + "has_uniform_computation": true, + "type": "Fragment", + "variants": { + "Main": { + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arithmetic" + ], + "longest_path_cycles": [ + 7.260000228881836, + 1.0, + 1.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": [ + 8.0, + 1.0, + 1.0 + ] + }, + "thread_occupancy": 100, + "uniform_registers_used": 7, + "work_registers_used": 2 + } + } + } + }, + "flutter/impeller/entity/gles/conical_gradient_fill_strip.frag.gles": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_strip.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": [ + "arith_total", + "arith_cvt" + ], + "longest_path_cycles": [ + 0.53125, + 0.328125, + 0.53125, + 0.1875, + 0.0, + 0.25, + 0.25 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "varying" + ], + "shortest_path_cycles": [ + 0.109375, + 0.0625, + 0.109375, + 0.0, + 0.0, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.65625, + 0.359375, + 0.65625, + 0.1875, + 0.0, + 0.25, + 0.25 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 22, + "work_registers_used": 20 + } + } + }, + "Mali-T880": { + "core": "Mali-T880", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_strip.frag.gles", + "has_uniform_computation": true, + "type": "Fragment", + "variants": { + "Main": { + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arithmetic" + ], + "longest_path_cycles": [ + 8.25, + 1.0, + 1.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": [ + 9.666666984558105, + 1.0, + 1.0 + ] + }, + "thread_occupancy": 100, + "uniform_registers_used": 7, + "work_registers_used": 2 + } + } + } + }, + "flutter/impeller/entity/gles/conical_gradient_fill_strip_radial.frag.gles": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_strip_radial.frag.gles", + "has_side_effects": false, + "has_uniform_computation": false, + "modifies_coverage": false, + "reads_color_buffer": false, + "type": "Fragment", + "uses_late_zs_test": false, + "uses_late_zs_update": false, + "variants": { + "Main": { + "fp16_arithmetic": null, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "longest_path_cycles": [ + 0.0625, + 0.0, + 0.0625, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "shortest_path_cycles": [ + 0.03125, + 0.0, + 0.03125, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.0625, + 0.0, + 0.0625, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 0, + "work_registers_used": 18 + } + } + }, + "Mali-T880": { + "core": "Mali-T880", + "filename": "flutter/impeller/entity/gles/conical_gradient_fill_strip_radial.frag.gles", + "has_uniform_computation": false, + "type": "Fragment", + "variants": { + "Main": { + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arithmetic" + ], + "longest_path_cycles": [ + 1.0, + 0.0, + 0.0 + ], + "pipelines": [ + "arithmetic", + "load_store", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arithmetic" + ], + "shortest_path_cycles": [ + 1.0, + 0.0, + 0.0 + ], + "total_bound_pipelines": [ + "arithmetic" + ], + "total_cycles": [ + 0.6666666865348816, + 0.0, + 0.0 + ] + }, + "thread_occupancy": 100, + "uniform_registers_used": 0, + "work_registers_used": 2 + } + } + } + }, + "flutter/impeller/entity/gles/conical_gradient_uniform_fill_conical.frag.gles": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_conical.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": [ + null + ], + "longest_path_cycles": [ + null, + null, + null, + null, + null, + null, + null + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_fma" + ], + "shortest_path_cycles": [ + 0.3125, + 0.3125, + 0.296875, + 0.125, + 0.0, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 1.21875, + 0.737500011920929, + 1.21875, + 0.375, + 4.0, + 0.25, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 26, + "work_registers_used": 23 + } + } + }, + "Mali-T880": { + "core": "Mali-T880", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_conical.frag.gles", + "has_uniform_computation": true, + "type": "Fragment", + "variants": { + "Main": { + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + null + ], + "longest_path_cycles": [ + null, + null, + null + ], + "pipelines": [ + "arithmetic", + "load_store", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arithmetic" + ], + "shortest_path_cycles": [ + 4.289999961853027, + 1.0, + 0.0 + ], + "total_bound_pipelines": [ + "arithmetic" + ], + "total_cycles": [ + 14.333333015441895, + 5.0, + 0.0 + ] + }, + "thread_occupancy": 100, + "uniform_registers_used": 6, + "work_registers_used": 3 + } + } + } + }, + "flutter/impeller/entity/gles/conical_gradient_uniform_fill_radial.frag.gles": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_radial.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": [ + null + ], + "longest_path_cycles": [ + null, + null, + null, + null, + null, + null, + null + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_fma", + "varying" + ], + "shortest_path_cycles": [ + 0.25, + 0.25, + 0.21875, + 0.125, + 0.0, + 0.25, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 0.887499988079071, + 0.5, + 0.887499988079071, + 0.25, + 4.0, + 0.25, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 18, + "work_registers_used": 23 + } + } + }, + "Mali-T880": { + "core": "Mali-T880", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_radial.frag.gles", + "has_uniform_computation": false, + "type": "Fragment", + "variants": { + "Main": { + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + null + ], + "longest_path_cycles": [ + null, + null, + null + ], + "pipelines": [ + "arithmetic", + "load_store", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arithmetic" + ], + "shortest_path_cycles": [ + 2.9700000286102295, + 1.0, + 0.0 + ], + "total_bound_pipelines": [ + "arithmetic" + ], + "total_cycles": [ + 10.0, + 5.0, + 0.0 + ] + }, + "thread_occupancy": 100, + "uniform_registers_used": 3, + "work_registers_used": 3 + } + } + } + }, + "flutter/impeller/entity/gles/conical_gradient_uniform_fill_strip.frag.gles": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_strip.frag.gles", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -2062,9 +3084,9 @@ "varying" ], "shortest_path_cycles": [ - 0.1875, - 0.109375, - 0.1875, + 0.171875, + 0.171875, + 0.140625, 0.0, 0.0, 0.25, @@ -2074,10 +3096,10 @@ "load_store" ], "total_cycles": [ - 1.59375, - 0.987500011920929, - 1.59375, + 0.90625, 0.5, + 0.90625, + 0.1875, 4.0, 0.25, 0.0 @@ -2085,14 +3107,14 @@ }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 42, + "uniform_registers_used": 18, "work_registers_used": 23 } } }, "Mali-T880": { "core": "Mali-T880", - "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill.frag.gles", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_strip.frag.gles", "has_uniform_computation": true, "type": "Fragment", "variants": { @@ -2116,7 +3138,7 @@ "arithmetic" ], "shortest_path_cycles": [ - 1.649999976158142, + 2.9700000286102295, 1.0, 0.0 ], @@ -2124,18 +3146,136 @@ "arithmetic" ], "total_cycles": [ - 18.33333396911621, + 11.0, 5.0, 0.0 ] }, "thread_occupancy": 100, - "uniform_registers_used": 10, + "uniform_registers_used": 5, "work_registers_used": 3 } } } }, + "flutter/impeller/entity/gles/conical_gradient_uniform_fill_strip_radial.frag.gles": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_strip_radial.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": null, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "longest_path_cycles": [ + 0.109375, + 0.0, + 0.109375, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "varying", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "shortest_path_cycles": [ + 0.078125, + 0.0, + 0.078125, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "total_bound_pipelines": [ + "arith_total", + "arith_cvt" + ], + "total_cycles": [ + 0.109375, + 0.0, + 0.109375, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 6, + "work_registers_used": 18 + } + } + }, + "Mali-T880": { + "core": "Mali-T880", + "filename": "flutter/impeller/entity/gles/conical_gradient_uniform_fill_strip_radial.frag.gles", + "has_uniform_computation": false, + "type": "Fragment", + "variants": { + "Main": { + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "arithmetic" + ], + "longest_path_cycles": [ + 1.0, + 0.0, + 0.0 + ], + "pipelines": [ + "arithmetic", + "load_store", + "texture" + ], + "shortest_path_bound_pipelines": [ + "arithmetic" + ], + "shortest_path_cycles": [ + 1.0, + 0.0, + 0.0 + ], + "total_bound_pipelines": [ + "arithmetic" + ], + "total_cycles": [ + 0.6666666865348816, + 0.0, + 0.0 + ] + }, + "thread_occupancy": 100, + "uniform_registers_used": 2, + "work_registers_used": 2 + } + } + } + }, "flutter/impeller/entity/gles/fast_gradient.frag.gles": { "Mali-G78": { "core": "Mali-G78",