Skip to content

Commit df0dc1f

Browse files
authored
Provide a matrix inverse shim for GLES 2.0. (flutter#50545)
This PR addresses [ Issue flutter#141829](flutter#141829). We saw a shader compilation error after updating `flutter/impeller` due to the lack of a matrix `inverse` implementation on GLSL 1.0 used on GLSL 2.0. This change provides one (for the current used case which is only for `mat3` support. I think this change needs some discussion as gating the change on GLSL < 1.4 would be more effective. Also my knowledge of correctly managing these `.glsl` based shaders is still superficial. - [x ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x ] I read and followed the [Flutter Style Guide] and the [C++, Objective-C, Java style guides]. - [x ] I listed at least one issue that this PR fixes in the description above. [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
1 parent 5548b4b commit df0dc1f

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

impeller/compiler/shader_lib/impeller/gradient.glsl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
#define GRADIENT_GLSL_
77

88
#include <impeller/texture.glsl>
9+
#include <impeller/transform.glsl>
910

1011
mat3 IPMapToUnitX(vec2 p0, vec2 p1) {
1112
// Returns a matrix that maps [p0, p1] to [(0, 0), (1, 0)]. Results are
1213
// undefined if p0 = p1.
1314
return mat3(0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0) *
14-
inverse(mat3(p1.y - p0.y, p0.x - p1.x, 0.0, p1.x - p0.x, p1.y - p0.y,
15-
0.0, p0.x, p0.y, 1.0));
15+
IPMat3Inverse(mat3(p1.y - p0.y, p0.x - p1.x, 0.0, p1.x - p0.x,
16+
p1.y - p0.y, 0.0, p0.x, p0.y, 1.0));
1617
}
1718

1819
/// Compute the t value for a conical gradient at point `p` between the 2

impeller/compiler/shader_lib/impeller/transform.glsl

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,33 @@ vec4 IPPositionForGlyphPosition(mat4 mvp,
2626
unit_position.y * destination_size.y, 0.0, 1.0);
2727
}
2828

29-
#endif
29+
#ifdef IMPELLER_TARGET_OPENGLES
30+
31+
// Shim matrix `inverse` for versions that lack it.
32+
// TODO: This could be gated on GLSL < 1.4.
33+
mat3 IPMat3Inverse(mat3 m) {
34+
float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
35+
float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
36+
float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
37+
38+
float b01 = a22 * a11 - a12 * a21;
39+
float b11 = -a22 * a10 + a12 * a20;
40+
float b21 = a21 * a10 - a11 * a20;
41+
42+
float det = a00 * b01 + a01 * b11 + a02 * b21;
43+
44+
return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11), b11,
45+
(a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10), b21,
46+
(-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) /
47+
det;
48+
}
49+
50+
#else // IMPELLER_TARGET_OPENGLES
51+
52+
mat3 IPMat3Inverse(mat3 m) {
53+
return inverse(m);
54+
}
55+
56+
#endif // IMPELLER_TARGET_OPENGLES
57+
58+
#endif // TRANSFORM_GLSL_

0 commit comments

Comments
 (0)