xref: /aosp_15_r20/external/skia/resources/sksl/intrinsics/Inverse.sksl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen, colorRed;
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 xy) {
4*c8dee2aaSAndroid Build Coastguard Worker    const float2x2 matrix2x2 = float2x2(1, 2, 3, 4);
5*c8dee2aaSAndroid Build Coastguard Worker    float2x2 inv2x2 = float2x2(-2, 1, 1.5, -0.5);
6*c8dee2aaSAndroid Build Coastguard Worker    float3x3 inv3x3 = float3x3(-24, 18, 5, 20, -15, -4, -5, 4, 1);
7*c8dee2aaSAndroid Build Coastguard Worker    float4x4 inv4x4 = float4x4(-2, -0.5, 1, 0.5, 1, 0.5, 0, -0.5, -8, -1, 2, 2, 3, 0.5, -1, -0.5);
8*c8dee2aaSAndroid Build Coastguard Worker    float Zero = colorGreen.b;
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker    // This test would require some slack to pass on real GPUs, since `inverse` on GPU hardware
11*c8dee2aaSAndroid Build Coastguard Worker    // introduces a bit of floating-point error.
12*c8dee2aaSAndroid Build Coastguard Worker    return (inverse(matrix2x2) == inv2x2 &&
13*c8dee2aaSAndroid Build Coastguard Worker            inverse(float3x3(1, 2, 3, 0, 1, 4, 5, 6, 0)) == inv3x3 &&
14*c8dee2aaSAndroid Build Coastguard Worker            inverse(float4x4(1, 0, 0, 1, 0, 2, 1, 2, 2, 1, 0, 1, 2, 0, 1, 4)) == inv4x4 &&
15*c8dee2aaSAndroid Build Coastguard Worker            inverse(float3x3(1, 2, 3, 4, 5, 6, 7, 8, 9)) != inv3x3 &&
16*c8dee2aaSAndroid Build Coastguard Worker            inverse(matrix2x2 + Zero) == inv2x2 &&
17*c8dee2aaSAndroid Build Coastguard Worker            inverse(float3x3(1, 2, 3, 0, 1, 4, 5, 6, 0) + Zero) == inv3x3 &&
18*c8dee2aaSAndroid Build Coastguard Worker            inverse(float4x4(1, 0, 0, 1, 0, 2, 1, 2, 2, 1, 0, 1, 2, 0, 1, 4) + Zero) == inv4x4)
19*c8dee2aaSAndroid Build Coastguard Worker                ? colorGreen : colorRed;
20*c8dee2aaSAndroid Build Coastguard Worker}
21