xref: /aosp_15_r20/external/skia/tests/sksl/intrinsics/Inverse.hlsl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1cbuffer _UniformBuffer : register(b0, space0)
2{
3    float4 _7_colorGreen : packoffset(c0);
4    float4 _7_colorRed : packoffset(c1);
5};
6
7
8static float4 sk_FragColor;
9
10struct SPIRV_Cross_Output
11{
12    float4 sk_FragColor : SV_Target0;
13};
14
15// Returns the inverse of a matrix, by using the algorithm of calculating the classical
16// adjoint and dividing by the determinant. The contents of the matrix are changed.
17float2x2 spvInverse(float2x2 m)
18{
19    float2x2 adj;	// The adjoint matrix (inverse after dividing by determinant)
20
21    // Create the transpose of the cofactors, as the classical adjoint of the matrix.
22    adj[0][0] =  m[1][1];
23    adj[0][1] = -m[0][1];
24
25    adj[1][0] = -m[1][0];
26    adj[1][1] =  m[0][0];
27
28    // Calculate the determinant as a combination of the cofactors of the first row.
29    float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]);
30
31    // Divide the classical adjoint matrix by the determinant.
32    // If determinant is zero, matrix is not invertable, so leave it unchanged.
33    return (det != 0.0f) ? (adj * (1.0f / det)) : m;
34}
35
36// Returns the determinant of a 2x2 matrix.
37float spvDet2x2(float a1, float a2, float b1, float b2)
38{
39    return a1 * b2 - b1 * a2;
40}
41
42// Returns the inverse of a matrix, by using the algorithm of calculating the classical
43// adjoint and dividing by the determinant. The contents of the matrix are changed.
44float3x3 spvInverse(float3x3 m)
45{
46    float3x3 adj;	// The adjoint matrix (inverse after dividing by determinant)
47
48    // Create the transpose of the cofactors, as the classical adjoint of the matrix.
49    adj[0][0] =  spvDet2x2(m[1][1], m[1][2], m[2][1], m[2][2]);
50    adj[0][1] = -spvDet2x2(m[0][1], m[0][2], m[2][1], m[2][2]);
51    adj[0][2] =  spvDet2x2(m[0][1], m[0][2], m[1][1], m[1][2]);
52
53    adj[1][0] = -spvDet2x2(m[1][0], m[1][2], m[2][0], m[2][2]);
54    adj[1][1] =  spvDet2x2(m[0][0], m[0][2], m[2][0], m[2][2]);
55    adj[1][2] = -spvDet2x2(m[0][0], m[0][2], m[1][0], m[1][2]);
56
57    adj[2][0] =  spvDet2x2(m[1][0], m[1][1], m[2][0], m[2][1]);
58    adj[2][1] = -spvDet2x2(m[0][0], m[0][1], m[2][0], m[2][1]);
59    adj[2][2] =  spvDet2x2(m[0][0], m[0][1], m[1][0], m[1][1]);
60
61    // Calculate the determinant as a combination of the cofactors of the first row.
62    float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]);
63
64    // Divide the classical adjoint matrix by the determinant.
65    // If determinant is zero, matrix is not invertable, so leave it unchanged.
66    return (det != 0.0f) ? (adj * (1.0f / det)) : m;
67}
68
69// Returns the determinant of a 3x3 matrix.
70float spvDet3x3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3)
71{
72    return a1 * spvDet2x2(b2, b3, c2, c3) - b1 * spvDet2x2(a2, a3, c2, c3) + c1 * spvDet2x2(a2, a3, b2, b3);
73}
74
75// Returns the inverse of a matrix, by using the algorithm of calculating the classical
76// adjoint and dividing by the determinant. The contents of the matrix are changed.
77float4x4 spvInverse(float4x4 m)
78{
79    float4x4 adj;	// The adjoint matrix (inverse after dividing by determinant)
80
81    // Create the transpose of the cofactors, as the classical adjoint of the matrix.
82    adj[0][0] =  spvDet3x3(m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3]);
83    adj[0][1] = -spvDet3x3(m[0][1], m[0][2], m[0][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3]);
84    adj[0][2] =  spvDet3x3(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[3][1], m[3][2], m[3][3]);
85    adj[0][3] = -spvDet3x3(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3]);
86
87    adj[1][0] = -spvDet3x3(m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3]);
88    adj[1][1] =  spvDet3x3(m[0][0], m[0][2], m[0][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3]);
89    adj[1][2] = -spvDet3x3(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[3][0], m[3][2], m[3][3]);
90    adj[1][3] =  spvDet3x3(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3]);
91
92    adj[2][0] =  spvDet3x3(m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], m[3][3]);
93    adj[2][1] = -spvDet3x3(m[0][0], m[0][1], m[0][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], m[3][3]);
94    adj[2][2] =  spvDet3x3(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[3][0], m[3][1], m[3][3]);
95    adj[2][3] = -spvDet3x3(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], m[2][3]);
96
97    adj[3][0] = -spvDet3x3(m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2]);
98    adj[3][1] =  spvDet3x3(m[0][0], m[0][1], m[0][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2]);
99    adj[3][2] = -spvDet3x3(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[3][0], m[3][1], m[3][2]);
100    adj[3][3] =  spvDet3x3(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2]);
101
102    // Calculate the determinant as a combination of the cofactors of the first row.
103    float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]) + (adj[0][3] * m[3][0]);
104
105    // Divide the classical adjoint matrix by the determinant.
106    // If determinant is zero, matrix is not invertable, so leave it unchanged.
107    return (det != 0.0f) ? (adj * (1.0f / det)) : m;
108}
109
110float4 main(float2 _21)
111{
112    float2x2 matrix2x2 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
113    float2x2 inv2x2 = float2x2(float2(-2.0f, 1.0f), float2(1.5f, -0.5f));
114    float3x3 inv3x3 = float3x3(float3(-24.0f, 18.0f, 5.0f), float3(20.0f, -15.0f, -4.0f), float3(-5.0f, 4.0f, 1.0f));
115    float4x4 inv4x4 = float4x4(float4(-2.0f, -0.5f, 1.0f, 0.5f), float4(1.0f, 0.5f, 0.0f, -0.5f), float4(-8.0f, -1.0f, 2.0f, 2.0f), float4(3.0f, 0.5f, -1.0f, -0.5f));
116    float Zero = _7_colorGreen.z;
117    bool _93 = false;
118    if (all(bool2(float2(-2.0f, 1.0f).x == float2(-2.0f, 1.0f).x, float2(-2.0f, 1.0f).y == float2(-2.0f, 1.0f).y)) && all(bool2(float2(1.5f, -0.5f).x == float2(1.5f, -0.5f).x, float2(1.5f, -0.5f).y == float2(1.5f, -0.5f).y)))
119    {
120        _93 = (all(bool3(float3(-24.0f, 18.0f, 5.0f).x == float3(-24.0f, 18.0f, 5.0f).x, float3(-24.0f, 18.0f, 5.0f).y == float3(-24.0f, 18.0f, 5.0f).y, float3(-24.0f, 18.0f, 5.0f).z == float3(-24.0f, 18.0f, 5.0f).z)) && all(bool3(float3(20.0f, -15.0f, -4.0f).x == float3(20.0f, -15.0f, -4.0f).x, float3(20.0f, -15.0f, -4.0f).y == float3(20.0f, -15.0f, -4.0f).y, float3(20.0f, -15.0f, -4.0f).z == float3(20.0f, -15.0f, -4.0f).z))) && all(bool3(float3(-5.0f, 4.0f, 1.0f).x == float3(-5.0f, 4.0f, 1.0f).x, float3(-5.0f, 4.0f, 1.0f).y == float3(-5.0f, 4.0f, 1.0f).y, float3(-5.0f, 4.0f, 1.0f).z == float3(-5.0f, 4.0f, 1.0f).z));
121    }
122    else
123    {
124        _93 = false;
125    }
126    bool _108 = false;
127    if (_93)
128    {
129        _108 = ((all(bool4(float4(-2.0f, -0.5f, 1.0f, 0.5f).x == float4(-2.0f, -0.5f, 1.0f, 0.5f).x, float4(-2.0f, -0.5f, 1.0f, 0.5f).y == float4(-2.0f, -0.5f, 1.0f, 0.5f).y, float4(-2.0f, -0.5f, 1.0f, 0.5f).z == float4(-2.0f, -0.5f, 1.0f, 0.5f).z, float4(-2.0f, -0.5f, 1.0f, 0.5f).w == float4(-2.0f, -0.5f, 1.0f, 0.5f).w)) && all(bool4(float4(1.0f, 0.5f, 0.0f, -0.5f).x == float4(1.0f, 0.5f, 0.0f, -0.5f).x, float4(1.0f, 0.5f, 0.0f, -0.5f).y == float4(1.0f, 0.5f, 0.0f, -0.5f).y, float4(1.0f, 0.5f, 0.0f, -0.5f).z == float4(1.0f, 0.5f, 0.0f, -0.5f).z, float4(1.0f, 0.5f, 0.0f, -0.5f).w == float4(1.0f, 0.5f, 0.0f, -0.5f).w))) && all(bool4(float4(-8.0f, -1.0f, 2.0f, 2.0f).x == float4(-8.0f, -1.0f, 2.0f, 2.0f).x, float4(-8.0f, -1.0f, 2.0f, 2.0f).y == float4(-8.0f, -1.0f, 2.0f, 2.0f).y, float4(-8.0f, -1.0f, 2.0f, 2.0f).z == float4(-8.0f, -1.0f, 2.0f, 2.0f).z, float4(-8.0f, -1.0f, 2.0f, 2.0f).w == float4(-8.0f, -1.0f, 2.0f, 2.0f).w))) && all(bool4(float4(3.0f, 0.5f, -1.0f, -0.5f).x == float4(3.0f, 0.5f, -1.0f, -0.5f).x, float4(3.0f, 0.5f, -1.0f, -0.5f).y == float4(3.0f, 0.5f, -1.0f, -0.5f).y, float4(3.0f, 0.5f, -1.0f, -0.5f).z == float4(3.0f, 0.5f, -1.0f, -0.5f).z, float4(3.0f, 0.5f, -1.0f, -0.5f).w == float4(3.0f, 0.5f, -1.0f, -0.5f).w));
130    }
131    else
132    {
133        _108 = false;
134    }
135    bool _131 = false;
136    if (_108)
137    {
138        float3x3 _111 = spvInverse(float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)));
139        float3 _120 = _111[0];
140        float3 _123 = _111[1];
141        float3 _127 = _111[2];
142        _131 = (any(bool3(_120.x != float3(-24.0f, 18.0f, 5.0f).x, _120.y != float3(-24.0f, 18.0f, 5.0f).y, _120.z != float3(-24.0f, 18.0f, 5.0f).z)) || any(bool3(_123.x != float3(20.0f, -15.0f, -4.0f).x, _123.y != float3(20.0f, -15.0f, -4.0f).y, _123.z != float3(20.0f, -15.0f, -4.0f).z))) || any(bool3(_127.x != float3(-5.0f, 4.0f, 1.0f).x, _127.y != float3(-5.0f, 4.0f, 1.0f).y, _127.z != float3(-5.0f, 4.0f, 1.0f).z));
143    }
144    else
145    {
146        _131 = false;
147    }
148    bool _147 = false;
149    if (_131)
150    {
151        float2 _135 = _7_colorGreen.z.xx;
152        float2x2 _134 = spvInverse(float2x2(float2(1.0f, 2.0f) + _135, float2(3.0f, 4.0f) + _135));
153        float2 _140 = _134[0];
154        float2 _143 = _134[1];
155        _147 = all(bool2(_140.x == float2(-2.0f, 1.0f).x, _140.y == float2(-2.0f, 1.0f).y)) && all(bool2(_143.x == float2(1.5f, -0.5f).x, _143.y == float2(1.5f, -0.5f).y));
156    }
157    else
158    {
159        _147 = false;
160    }
161    bool _171 = false;
162    if (_147)
163    {
164        float3 _154 = _7_colorGreen.z.xxx;
165        float3x3 _150 = spvInverse(float3x3(float3(1.0f, 2.0f, 3.0f) + _154, float3(0.0f, 1.0f, 4.0f) + _154, float3(5.0f, 6.0f, 0.0f) + _154));
166        float3 _160 = _150[0];
167        float3 _163 = _150[1];
168        float3 _167 = _150[2];
169        _171 = (all(bool3(_160.x == float3(-24.0f, 18.0f, 5.0f).x, _160.y == float3(-24.0f, 18.0f, 5.0f).y, _160.z == float3(-24.0f, 18.0f, 5.0f).z)) && all(bool3(_163.x == float3(20.0f, -15.0f, -4.0f).x, _163.y == float3(20.0f, -15.0f, -4.0f).y, _163.z == float3(20.0f, -15.0f, -4.0f).z))) && all(bool3(_167.x == float3(-5.0f, 4.0f, 1.0f).x, _167.y == float3(-5.0f, 4.0f, 1.0f).y, _167.z == float3(-5.0f, 4.0f, 1.0f).z));
170    }
171    else
172    {
173        _171 = false;
174    }
175    bool _202 = false;
176    if (_171)
177    {
178        float4 _180 = _7_colorGreen.z.xxxx;
179        float4x4 _174 = spvInverse(float4x4(float4(1.0f, 0.0f, 0.0f, 1.0f) + _180, float4(0.0f, 2.0f, 1.0f, 2.0f) + _180, float4(2.0f, 1.0f, 0.0f, 1.0f) + _180, float4(2.0f, 0.0f, 1.0f, 4.0f) + _180));
180        float4 _187 = _174[0];
181        float4 _190 = _174[1];
182        float4 _194 = _174[2];
183        float4 _198 = _174[3];
184        _202 = ((all(bool4(_187.x == float4(-2.0f, -0.5f, 1.0f, 0.5f).x, _187.y == float4(-2.0f, -0.5f, 1.0f, 0.5f).y, _187.z == float4(-2.0f, -0.5f, 1.0f, 0.5f).z, _187.w == float4(-2.0f, -0.5f, 1.0f, 0.5f).w)) && all(bool4(_190.x == float4(1.0f, 0.5f, 0.0f, -0.5f).x, _190.y == float4(1.0f, 0.5f, 0.0f, -0.5f).y, _190.z == float4(1.0f, 0.5f, 0.0f, -0.5f).z, _190.w == float4(1.0f, 0.5f, 0.0f, -0.5f).w))) && all(bool4(_194.x == float4(-8.0f, -1.0f, 2.0f, 2.0f).x, _194.y == float4(-8.0f, -1.0f, 2.0f, 2.0f).y, _194.z == float4(-8.0f, -1.0f, 2.0f, 2.0f).z, _194.w == float4(-8.0f, -1.0f, 2.0f, 2.0f).w))) && all(bool4(_198.x == float4(3.0f, 0.5f, -1.0f, -0.5f).x, _198.y == float4(3.0f, 0.5f, -1.0f, -0.5f).y, _198.z == float4(3.0f, 0.5f, -1.0f, -0.5f).z, _198.w == float4(3.0f, 0.5f, -1.0f, -0.5f).w));
185    }
186    else
187    {
188        _202 = false;
189    }
190    float4 _203 = 0.0f.xxxx;
191    if (_202)
192    {
193        _203 = _7_colorGreen;
194    }
195    else
196    {
197        _203 = _7_colorRed;
198    }
199    return _203;
200}
201
202void frag_main()
203{
204    float2 _17 = 0.0f.xx;
205    sk_FragColor = main(_17);
206}
207
208SPIRV_Cross_Output main()
209{
210    frag_main();
211    SPIRV_Cross_Output stage_output;
212    stage_output.sk_FragColor = sk_FragColor;
213    return stage_output;
214}
215