Skip to content

Commit 2daf917

Browse files
author
Jonah Williams
authored
[framework] reduce ink sparkle uniform count. (flutter#133897)
Fixes flutter#133325 Due to the number of uniforms present, the ink_sparkle shader can't run without post processing (on all target platforms) that the impellerc offline compiler doesn't perform. However, we can't just move the uniforms into a uniform buffer object (UBO) because the Skia backend doesn't support it. Rather than work around this in the compiler, we can reduce the uniform count by 1) packing four floats into a single vec4 2) removing a uniform for what is effectively a constant. This should have no visible effects, and if any scubas fail it means I did this wrong �
1 parent 12261f9 commit 2daf917

File tree

2 files changed

+42
-49
lines changed

2 files changed

+42
-49
lines changed

packages/flutter/lib/src/material/ink_sparkle.dart

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -326,50 +326,42 @@ class InkSparkle extends InteractiveInkFeature {
326326
..setFloat(1, _color.green / 255.0)
327327
..setFloat(2, _color.blue / 255.0)
328328
..setFloat(3, _color.alpha / 255.0)
329-
// uAlpha
329+
// Composite 1 (u_alpha, u_sparkle_alpha, u_blur, u_radius_scale)
330330
..setFloat(4, _alpha.value)
331-
// uSparkleColor
332-
..setFloat(5, 1.0)
331+
..setFloat(5, _sparkleAlpha.value)
333332
..setFloat(6, 1.0)
334-
..setFloat(7, 1.0)
335-
..setFloat(8, 1.0)
336-
// uSparkleAlpha
337-
..setFloat(9, _sparkleAlpha.value)
338-
// uBlur
339-
..setFloat(10, 1.0)
333+
..setFloat(7, _radiusScale.value)
340334
// uCenter
341-
..setFloat(11, _center.value.x)
342-
..setFloat(12, _center.value.y)
343-
// uRadiusScale
344-
..setFloat(13, _radiusScale.value)
335+
..setFloat(8, _center.value.x)
336+
..setFloat(9, _center.value.y)
345337
// uMaxRadius
346-
..setFloat(14, _targetRadius)
338+
..setFloat(10, _targetRadius)
347339
// uResolutionScale
348-
..setFloat(15, 1.0 / _width)
349-
..setFloat(16, 1.0 / _height)
340+
..setFloat(11, 1.0 / _width)
341+
..setFloat(12, 1.0 / _height)
350342
// uNoiseScale
351-
..setFloat(17, _noiseDensity / _width)
352-
..setFloat(18, _noiseDensity / _height)
343+
..setFloat(13, _noiseDensity / _width)
344+
..setFloat(14, _noiseDensity / _height)
353345
// uNoisePhase
354-
..setFloat(19, noisePhase / 1000.0)
346+
..setFloat(15, noisePhase / 1000.0)
355347
// uCircle1
356-
..setFloat(20, turbulenceScale * 0.5 + (turbulencePhase * 0.01 * math.cos(turbulenceScale * 0.55)))
357-
..setFloat(21, turbulenceScale * 0.5 + (turbulencePhase * 0.01 * math.sin(turbulenceScale * 0.55)))
348+
..setFloat(16, turbulenceScale * 0.5 + (turbulencePhase * 0.01 * math.cos(turbulenceScale * 0.55)))
349+
..setFloat(17, turbulenceScale * 0.5 + (turbulencePhase * 0.01 * math.sin(turbulenceScale * 0.55)))
358350
// uCircle2
359-
..setFloat(22, turbulenceScale * 0.2 + (turbulencePhase * -0.0066 * math.cos(turbulenceScale * 0.45)))
360-
..setFloat(23, turbulenceScale * 0.2 + (turbulencePhase * -0.0066 * math.sin(turbulenceScale * 0.45)))
351+
..setFloat(18, turbulenceScale * 0.2 + (turbulencePhase * -0.0066 * math.cos(turbulenceScale * 0.45)))
352+
..setFloat(19, turbulenceScale * 0.2 + (turbulencePhase * -0.0066 * math.sin(turbulenceScale * 0.45)))
361353
// uCircle3
362-
..setFloat(24, turbulenceScale + (turbulencePhase * -0.0066 * math.cos(turbulenceScale * 0.35)))
363-
..setFloat(25, turbulenceScale + (turbulencePhase * -0.0066 * math.sin(turbulenceScale * 0.35)))
354+
..setFloat(20, turbulenceScale + (turbulencePhase * -0.0066 * math.cos(turbulenceScale * 0.35)))
355+
..setFloat(21, turbulenceScale + (turbulencePhase * -0.0066 * math.sin(turbulenceScale * 0.35)))
364356
// uRotation1
365-
..setFloat(26, math.cos(rotation1))
366-
..setFloat(27, math.sin(rotation1))
357+
..setFloat(22, math.cos(rotation1))
358+
..setFloat(23, math.sin(rotation1))
367359
// uRotation2
368-
..setFloat(28, math.cos(rotation2))
369-
..setFloat(29, math.sin(rotation2))
360+
..setFloat(24, math.cos(rotation2))
361+
..setFloat(25, math.sin(rotation2))
370362
// uRotation3
371-
..setFloat(30, math.cos(rotation3))
372-
..setFloat(31, math.sin(rotation3));
363+
..setFloat(26, math.cos(rotation3))
364+
..setFloat(27, math.sin(rotation3));
373365
}
374366

375367
/// Transforms the canvas for an ink feature to be painted on the [canvas].

packages/flutter/lib/src/material/shaders/ink_sparkle.frag

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,19 @@ precision highp float;
1111
// TODO(antrob): Put these in a more logical order (e.g. separate consts vs varying, etc)
1212

1313
layout(location = 0) uniform vec4 u_color;
14-
layout(location = 1) uniform float u_alpha;
15-
layout(location = 2) uniform vec4 u_sparkle_color;
16-
layout(location = 3) uniform float u_sparkle_alpha;
17-
layout(location = 4) uniform float u_blur;
18-
layout(location = 5) uniform vec2 u_center;
19-
layout(location = 6) uniform float u_radius_scale;
20-
layout(location = 7) uniform float u_max_radius;
21-
layout(location = 8) uniform vec2 u_resolution_scale;
22-
layout(location = 9) uniform vec2 u_noise_scale;
23-
layout(location = 10) uniform float u_noise_phase;
24-
layout(location = 11) uniform vec2 u_circle1;
25-
layout(location = 12) uniform vec2 u_circle2;
26-
layout(location = 13) uniform vec2 u_circle3;
27-
layout(location = 14) uniform vec2 u_rotation1;
28-
layout(location = 15) uniform vec2 u_rotation2;
29-
layout(location = 16) uniform vec2 u_rotation3;
14+
// u_alpha, u_sparkle_alpha, u_blur, u_radius_scale
15+
layout(location = 1) uniform vec4 u_composite_1;
16+
layout(location = 2) uniform vec2 u_center;
17+
layout(location = 3) uniform float u_max_radius;
18+
layout(location = 4) uniform vec2 u_resolution_scale;
19+
layout(location = 5) uniform vec2 u_noise_scale;
20+
layout(location = 6) uniform float u_noise_phase;
21+
layout(location = 7) uniform vec2 u_circle1;
22+
layout(location = 8) uniform vec2 u_circle2;
23+
layout(location = 9) uniform vec2 u_circle3;
24+
layout(location = 10) uniform vec2 u_rotation1;
25+
layout(location = 11) uniform vec2 u_rotation2;
26+
layout(location = 12) uniform vec2 u_rotation3;
3027

3128
layout(location = 0) out vec4 fragColor;
3229

@@ -36,6 +33,11 @@ const float PI_ROTATE_LEFT = PI * -0.0078125;
3633
const float ONE_THIRD = 1./3.;
3734
const vec2 TURBULENCE_SCALE = vec2(0.8);
3835

36+
float u_alpha = u_composite_1.x;
37+
float u_sparkle_alpha = u_composite_1.y;
38+
float u_blur = u_composite_1.z;
39+
float u_radius_scale = u_composite_1.w;
40+
3941
float triangle_noise(highp vec2 n) {
4042
n = fract(n * vec2(5.3987, 5.4421));
4143
n += dot(n.yx, n.xy + vec2(21.5351, 14.3137));
@@ -99,6 +101,5 @@ void main() {
99101
float sparkle = sparkle(density_uv, u_noise_phase) * ring * turbulence * u_sparkle_alpha;
100102
float wave_alpha = soft_circle(p, u_center, radius, u_blur) * u_alpha * u_color.a;
101103
vec4 wave_color = vec4(u_color.rgb * wave_alpha, wave_alpha);
102-
vec4 sparkle_color = vec4(u_sparkle_color.rgb * u_sparkle_color.a, u_sparkle_color.a);
103-
fragColor = mix(wave_color, sparkle_color, sparkle);
104+
fragColor = mix(wave_color, vec4(1.0), sparkle);
104105
}

0 commit comments

Comments
 (0)