diff --git a/impeller/compiler/shader_lib/impeller/gradient.glsl b/impeller/compiler/shader_lib/impeller/gradient.glsl index 53160385e0c0f..15647aee5fd9e 100644 --- a/impeller/compiler/shader_lib/impeller/gradient.glsl +++ b/impeller/compiler/shader_lib/impeller/gradient.glsl @@ -6,13 +6,14 @@ #define GRADIENT_GLSL_ #include +#include mat3 IPMapToUnitX(vec2 p0, vec2 p1) { // Returns a matrix that maps [p0, p1] to [(0, 0), (1, 0)]. Results are // undefined if p0 = p1. return mat3(0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0) * - inverse(mat3(p1.y - p0.y, p0.x - p1.x, 0.0, p1.x - p0.x, p1.y - p0.y, - 0.0, p0.x, p0.y, 1.0)); + IPMat3Inverse(mat3(p1.y - p0.y, p0.x - p1.x, 0.0, p1.x - p0.x, + p1.y - p0.y, 0.0, p0.x, p0.y, 1.0)); } /// Compute the t value for a conical gradient at point `p` between the 2 diff --git a/impeller/compiler/shader_lib/impeller/transform.glsl b/impeller/compiler/shader_lib/impeller/transform.glsl index bfe033137ca31..f84696d96ff30 100644 --- a/impeller/compiler/shader_lib/impeller/transform.glsl +++ b/impeller/compiler/shader_lib/impeller/transform.glsl @@ -26,4 +26,33 @@ vec4 IPPositionForGlyphPosition(mat4 mvp, unit_position.y * destination_size.y, 0.0, 1.0); } -#endif +#ifdef IMPELLER_TARGET_OPENGLES + +// Shim matrix `inverse` for versions that lack it. +// TODO: This could be gated on GLSL < 1.4. +mat3 IPMat3Inverse(mat3 m) { + float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2]; + float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2]; + float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2]; + + float b01 = a22 * a11 - a12 * a21; + float b11 = -a22 * a10 + a12 * a20; + float b21 = a21 * a10 - a11 * a20; + + float det = a00 * b01 + a01 * b11 + a02 * b21; + + return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11), b11, + (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10), b21, + (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / + det; +} + +#else // IMPELLER_TARGET_OPENGLES + +mat3 IPMat3Inverse(mat3 m) { + return inverse(m); +} + +#endif // IMPELLER_TARGET_OPENGLES + +#endif // TRANSFORM_GLSL_