xref: /aosp_15_r20/frameworks/rs/driver/runtime/rs_matrix.c (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker #include "rs_core.rsh"
2*e1eccf28SAndroid Build Coastguard Worker #include "rs_structs.h"
3*e1eccf28SAndroid Build Coastguard Worker 
4*e1eccf28SAndroid Build Coastguard Worker /* Function declarations from libRS */
5*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
6*e1eccf28SAndroid Build Coastguard Worker 
7*e1eccf28SAndroid Build Coastguard Worker /* Implementation of Core Runtime */
8*e1eccf28SAndroid Build Coastguard Worker 
9*e1eccf28SAndroid Build Coastguard Worker 
10*e1eccf28SAndroid Build Coastguard Worker /////////////////////////////////////////////////////
11*e1eccf28SAndroid Build Coastguard Worker // Matrix ops
12*e1eccf28SAndroid Build Coastguard Worker /////////////////////////////////////////////////////
13*e1eccf28SAndroid Build Coastguard Worker 
14*e1eccf28SAndroid Build Coastguard Worker 
15*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoadIdentity(rs_matrix4x4 * m)16*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoadIdentity(rs_matrix4x4 *m) {
17*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = 1.f;
18*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = 0.f;
19*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = 0.f;
20*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = 0.f;
21*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = 0.f;
22*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = 1.f;
23*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = 0.f;
24*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = 0.f;
25*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = 0.f;
26*e1eccf28SAndroid Build Coastguard Worker     m->m[9] = 0.f;
27*e1eccf28SAndroid Build Coastguard Worker     m->m[10] = 1.f;
28*e1eccf28SAndroid Build Coastguard Worker     m->m[11] = 0.f;
29*e1eccf28SAndroid Build Coastguard Worker     m->m[12] = 0.f;
30*e1eccf28SAndroid Build Coastguard Worker     m->m[13] = 0.f;
31*e1eccf28SAndroid Build Coastguard Worker     m->m[14] = 0.f;
32*e1eccf28SAndroid Build Coastguard Worker     m->m[15] = 1.f;
33*e1eccf28SAndroid Build Coastguard Worker }
34*e1eccf28SAndroid Build Coastguard Worker 
35*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoadIdentity(rs_matrix3x3 * m)36*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoadIdentity(rs_matrix3x3 *m) {
37*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = 1.f;
38*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = 0.f;
39*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = 0.f;
40*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = 0.f;
41*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = 1.f;
42*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = 0.f;
43*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = 0.f;
44*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = 0.f;
45*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = 1.f;
46*e1eccf28SAndroid Build Coastguard Worker }
47*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoadIdentity(rs_matrix2x2 * m)48*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoadIdentity(rs_matrix2x2 *m) {
49*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = 1.f;
50*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = 0.f;
51*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = 0.f;
52*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = 1.f;
53*e1eccf28SAndroid Build Coastguard Worker }
54*e1eccf28SAndroid Build Coastguard Worker 
55*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix4x4 * m,const float * f)56*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix4x4 *m, const float *f) {
57*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = f[0];
58*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = f[1];
59*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = f[2];
60*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = f[3];
61*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = f[4];
62*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = f[5];
63*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = f[6];
64*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = f[7];
65*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = f[8];
66*e1eccf28SAndroid Build Coastguard Worker     m->m[9] = f[9];
67*e1eccf28SAndroid Build Coastguard Worker     m->m[10] = f[10];
68*e1eccf28SAndroid Build Coastguard Worker     m->m[11] = f[11];
69*e1eccf28SAndroid Build Coastguard Worker     m->m[12] = f[12];
70*e1eccf28SAndroid Build Coastguard Worker     m->m[13] = f[13];
71*e1eccf28SAndroid Build Coastguard Worker     m->m[14] = f[14];
72*e1eccf28SAndroid Build Coastguard Worker     m->m[15] = f[15];
73*e1eccf28SAndroid Build Coastguard Worker }
74*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix3x3 * m,const float * f)75*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix3x3 *m, const float *f) {
76*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = f[0];
77*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = f[1];
78*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = f[2];
79*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = f[3];
80*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = f[4];
81*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = f[5];
82*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = f[6];
83*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = f[7];
84*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = f[8];
85*e1eccf28SAndroid Build Coastguard Worker }
86*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix2x2 * m,const float * f)87*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix2x2 *m, const float *f) {
88*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = f[0];
89*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = f[1];
90*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = f[2];
91*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = f[3];
92*e1eccf28SAndroid Build Coastguard Worker }
93*e1eccf28SAndroid Build Coastguard Worker 
94*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix4x4 * m,const rs_matrix4x4 * s)95*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *s) {
96*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = s->m[0];
97*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = s->m[1];
98*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = s->m[2];
99*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = s->m[3];
100*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = s->m[4];
101*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = s->m[5];
102*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = s->m[6];
103*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = s->m[7];
104*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = s->m[8];
105*e1eccf28SAndroid Build Coastguard Worker     m->m[9] = s->m[9];
106*e1eccf28SAndroid Build Coastguard Worker     m->m[10] = s->m[10];
107*e1eccf28SAndroid Build Coastguard Worker     m->m[11] = s->m[11];
108*e1eccf28SAndroid Build Coastguard Worker     m->m[12] = s->m[12];
109*e1eccf28SAndroid Build Coastguard Worker     m->m[13] = s->m[13];
110*e1eccf28SAndroid Build Coastguard Worker     m->m[14] = s->m[14];
111*e1eccf28SAndroid Build Coastguard Worker     m->m[15] = s->m[15];
112*e1eccf28SAndroid Build Coastguard Worker }
113*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix4x4 * m,const rs_matrix3x3 * v)114*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v) {
115*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = v->m[0];
116*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = v->m[1];
117*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = v->m[2];
118*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = 0.f;
119*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = v->m[3];
120*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = v->m[4];
121*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = v->m[5];
122*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = 0.f;
123*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = v->m[6];
124*e1eccf28SAndroid Build Coastguard Worker     m->m[9] = v->m[7];
125*e1eccf28SAndroid Build Coastguard Worker     m->m[10] = v->m[8];
126*e1eccf28SAndroid Build Coastguard Worker     m->m[11] = 0.f;
127*e1eccf28SAndroid Build Coastguard Worker     m->m[12] = 0.f;
128*e1eccf28SAndroid Build Coastguard Worker     m->m[13] = 0.f;
129*e1eccf28SAndroid Build Coastguard Worker     m->m[14] = 0.f;
130*e1eccf28SAndroid Build Coastguard Worker     m->m[15] = 1.f;
131*e1eccf28SAndroid Build Coastguard Worker }
132*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix4x4 * m,const rs_matrix2x2 * v)133*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v) {
134*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = v->m[0];
135*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = v->m[1];
136*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = 0.f;
137*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = 0.f;
138*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = v->m[2];
139*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = v->m[3];
140*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = 0.f;
141*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = 0.f;
142*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = 0.f;
143*e1eccf28SAndroid Build Coastguard Worker     m->m[9] = 0.f;
144*e1eccf28SAndroid Build Coastguard Worker     m->m[10] = 1.f;
145*e1eccf28SAndroid Build Coastguard Worker     m->m[11] = 0.f;
146*e1eccf28SAndroid Build Coastguard Worker     m->m[12] = 0.f;
147*e1eccf28SAndroid Build Coastguard Worker     m->m[13] = 0.f;
148*e1eccf28SAndroid Build Coastguard Worker     m->m[14] = 0.f;
149*e1eccf28SAndroid Build Coastguard Worker     m->m[15] = 1.f;
150*e1eccf28SAndroid Build Coastguard Worker }
151*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix3x3 * m,const rs_matrix3x3 * s)152*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *s) {
153*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = s->m[0];
154*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = s->m[1];
155*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = s->m[2];
156*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = s->m[3];
157*e1eccf28SAndroid Build Coastguard Worker     m->m[4] = s->m[4];
158*e1eccf28SAndroid Build Coastguard Worker     m->m[5] = s->m[5];
159*e1eccf28SAndroid Build Coastguard Worker     m->m[6] = s->m[6];
160*e1eccf28SAndroid Build Coastguard Worker     m->m[7] = s->m[7];
161*e1eccf28SAndroid Build Coastguard Worker     m->m[8] = s->m[8];
162*e1eccf28SAndroid Build Coastguard Worker }
163*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoad(rs_matrix2x2 * m,const rs_matrix2x2 * s)164*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *s) {
165*e1eccf28SAndroid Build Coastguard Worker     m->m[0] = s->m[0];
166*e1eccf28SAndroid Build Coastguard Worker     m->m[1] = s->m[1];
167*e1eccf28SAndroid Build Coastguard Worker     m->m[2] = s->m[2];
168*e1eccf28SAndroid Build Coastguard Worker     m->m[3] = s->m[3];
169*e1eccf28SAndroid Build Coastguard Worker }
170*e1eccf28SAndroid Build Coastguard Worker 
171*e1eccf28SAndroid Build Coastguard Worker 
172*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixSet(rs_matrix4x4 * m,uint32_t col,uint32_t row,float v)173*e1eccf28SAndroid Build Coastguard Worker rsMatrixSet(rs_matrix4x4 *m, uint32_t col, uint32_t row, float v) {
174*e1eccf28SAndroid Build Coastguard Worker     m->m[col * 4 + row] = v;
175*e1eccf28SAndroid Build Coastguard Worker }
176*e1eccf28SAndroid Build Coastguard Worker 
177*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable))
rsMatrixGet(const rs_matrix4x4 * m,uint32_t col,uint32_t row)178*e1eccf28SAndroid Build Coastguard Worker rsMatrixGet(const rs_matrix4x4 *m, uint32_t col, uint32_t row) {
179*e1eccf28SAndroid Build Coastguard Worker     return m->m[col * 4 + row];
180*e1eccf28SAndroid Build Coastguard Worker }
181*e1eccf28SAndroid Build Coastguard Worker 
182*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixSet(rs_matrix3x3 * m,uint32_t col,uint32_t row,float v)183*e1eccf28SAndroid Build Coastguard Worker rsMatrixSet(rs_matrix3x3 *m, uint32_t col, uint32_t row, float v) {
184*e1eccf28SAndroid Build Coastguard Worker     m->m[col * 3 + row] = v;
185*e1eccf28SAndroid Build Coastguard Worker }
186*e1eccf28SAndroid Build Coastguard Worker 
187*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable))
rsMatrixGet(const rs_matrix3x3 * m,uint32_t col,uint32_t row)188*e1eccf28SAndroid Build Coastguard Worker rsMatrixGet(const rs_matrix3x3 *m, uint32_t col, uint32_t row) {
189*e1eccf28SAndroid Build Coastguard Worker     return m->m[col * 3 + row];
190*e1eccf28SAndroid Build Coastguard Worker }
191*e1eccf28SAndroid Build Coastguard Worker 
192*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixSet(rs_matrix2x2 * m,uint32_t col,uint32_t row,float v)193*e1eccf28SAndroid Build Coastguard Worker rsMatrixSet(rs_matrix2x2 *m, uint32_t col, uint32_t row, float v) {
194*e1eccf28SAndroid Build Coastguard Worker     m->m[col * 2 + row] = v;
195*e1eccf28SAndroid Build Coastguard Worker }
196*e1eccf28SAndroid Build Coastguard Worker 
197*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable))
rsMatrixGet(const rs_matrix2x2 * m,uint32_t col,uint32_t row)198*e1eccf28SAndroid Build Coastguard Worker rsMatrixGet(const rs_matrix2x2 *m, uint32_t col, uint32_t row) {
199*e1eccf28SAndroid Build Coastguard Worker     return m->m[col * 2 + row];
200*e1eccf28SAndroid Build Coastguard Worker }
201*e1eccf28SAndroid Build Coastguard Worker 
202*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable))
rsMatrixMultiply(const rs_matrix2x2 * m,float2 in)203*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(const rs_matrix2x2 *m, float2 in) {
204*e1eccf28SAndroid Build Coastguard Worker     float2 ret;
205*e1eccf28SAndroid Build Coastguard Worker     ret.x = (m->m[0] * in.x) + (m->m[2] * in.y);
206*e1eccf28SAndroid Build Coastguard Worker     ret.y = (m->m[1] * in.x) + (m->m[3] * in.y);
207*e1eccf28SAndroid Build Coastguard Worker     return ret;
208*e1eccf28SAndroid Build Coastguard Worker }
209*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable))
rsMatrixMultiply(rs_matrix2x2 * m,float2 in)210*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix2x2 *m, float2 in) {
211*e1eccf28SAndroid Build Coastguard Worker     return rsMatrixMultiply((const rs_matrix2x2 *)m, in);
212*e1eccf28SAndroid Build Coastguard Worker }
213*e1eccf28SAndroid Build Coastguard Worker 
214*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable))
rsMatrixMultiply(rs_matrix4x4 * m,float4 in)215*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix4x4 *m, float4 in) {
216*e1eccf28SAndroid Build Coastguard Worker     return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
217*e1eccf28SAndroid Build Coastguard Worker }
218*e1eccf28SAndroid Build Coastguard Worker 
219*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable))
rsMatrixMultiply(rs_matrix4x4 * m,float3 in)220*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix4x4 *m, float3 in) {
221*e1eccf28SAndroid Build Coastguard Worker     return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
222*e1eccf28SAndroid Build Coastguard Worker }
223*e1eccf28SAndroid Build Coastguard Worker 
224*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable))
rsMatrixMultiply(rs_matrix4x4 * m,float2 in)225*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix4x4 *m, float2 in) {
226*e1eccf28SAndroid Build Coastguard Worker     return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
227*e1eccf28SAndroid Build Coastguard Worker }
228*e1eccf28SAndroid Build Coastguard Worker 
229*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable))
rsMatrixMultiply(rs_matrix3x3 * m,float3 in)230*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix3x3 *m, float3 in) {
231*e1eccf28SAndroid Build Coastguard Worker     return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
232*e1eccf28SAndroid Build Coastguard Worker }
233*e1eccf28SAndroid Build Coastguard Worker 
234*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable))
rsMatrixMultiply(rs_matrix3x3 * m,float2 in)235*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix3x3 *m, float2 in) {
236*e1eccf28SAndroid Build Coastguard Worker     return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
237*e1eccf28SAndroid Build Coastguard Worker }
238*e1eccf28SAndroid Build Coastguard Worker 
239*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoadMultiply(rs_matrix4x4 * ret,const rs_matrix4x4 * lhs,const rs_matrix4x4 * rhs)240*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoadMultiply(rs_matrix4x4 *ret, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) {
241*e1eccf28SAndroid Build Coastguard Worker     // Use a temporary variable to support the case where one of the inputs
242*e1eccf28SAndroid Build Coastguard Worker     // is also the destination, e.g. rsMatrixLoadMultiply(&left, &left, &right);
243*e1eccf28SAndroid Build Coastguard Worker     rs_matrix4x4 result;
244*e1eccf28SAndroid Build Coastguard Worker     for (int i=0 ; i<4 ; i++) {
245*e1eccf28SAndroid Build Coastguard Worker         float ri0 = 0;
246*e1eccf28SAndroid Build Coastguard Worker         float ri1 = 0;
247*e1eccf28SAndroid Build Coastguard Worker         float ri2 = 0;
248*e1eccf28SAndroid Build Coastguard Worker         float ri3 = 0;
249*e1eccf28SAndroid Build Coastguard Worker         for (int j=0 ; j<4 ; j++) {
250*e1eccf28SAndroid Build Coastguard Worker             const float rhs_ij = rsMatrixGet(rhs, i, j);
251*e1eccf28SAndroid Build Coastguard Worker             ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
252*e1eccf28SAndroid Build Coastguard Worker             ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
253*e1eccf28SAndroid Build Coastguard Worker             ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij;
254*e1eccf28SAndroid Build Coastguard Worker             ri3 += rsMatrixGet(lhs, j, 3) * rhs_ij;
255*e1eccf28SAndroid Build Coastguard Worker         }
256*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 0, ri0);
257*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 1, ri1);
258*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 2, ri2);
259*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 3, ri3);
260*e1eccf28SAndroid Build Coastguard Worker     }
261*e1eccf28SAndroid Build Coastguard Worker     rsMatrixLoad(ret, &result);
262*e1eccf28SAndroid Build Coastguard Worker }
263*e1eccf28SAndroid Build Coastguard Worker 
264*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixMultiply(rs_matrix4x4 * lhs,const rs_matrix4x4 * rhs)265*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) {
266*e1eccf28SAndroid Build Coastguard Worker     rsMatrixLoadMultiply(lhs, lhs, rhs);
267*e1eccf28SAndroid Build Coastguard Worker }
268*e1eccf28SAndroid Build Coastguard Worker 
269*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoadMultiply(rs_matrix3x3 * ret,const rs_matrix3x3 * lhs,const rs_matrix3x3 * rhs)270*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoadMultiply(rs_matrix3x3 *ret, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
271*e1eccf28SAndroid Build Coastguard Worker     // Use a temporary variable to support the case where one of the inputs
272*e1eccf28SAndroid Build Coastguard Worker     // is also the destination, e.g. rsMatrixLoadMultiply(&left, &left, &right);
273*e1eccf28SAndroid Build Coastguard Worker     rs_matrix3x3 result;
274*e1eccf28SAndroid Build Coastguard Worker     for (int i=0 ; i<3 ; i++) {
275*e1eccf28SAndroid Build Coastguard Worker         float ri0 = 0;
276*e1eccf28SAndroid Build Coastguard Worker         float ri1 = 0;
277*e1eccf28SAndroid Build Coastguard Worker         float ri2 = 0;
278*e1eccf28SAndroid Build Coastguard Worker         for (int j=0 ; j<3 ; j++) {
279*e1eccf28SAndroid Build Coastguard Worker             const float rhs_ij = rsMatrixGet(rhs, i, j);
280*e1eccf28SAndroid Build Coastguard Worker             ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
281*e1eccf28SAndroid Build Coastguard Worker             ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
282*e1eccf28SAndroid Build Coastguard Worker             ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij;
283*e1eccf28SAndroid Build Coastguard Worker         }
284*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 0, ri0);
285*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 1, ri1);
286*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 2, ri2);
287*e1eccf28SAndroid Build Coastguard Worker     }
288*e1eccf28SAndroid Build Coastguard Worker     rsMatrixLoad(ret, &result);
289*e1eccf28SAndroid Build Coastguard Worker }
290*e1eccf28SAndroid Build Coastguard Worker 
291*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixMultiply(rs_matrix3x3 * lhs,const rs_matrix3x3 * rhs)292*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
293*e1eccf28SAndroid Build Coastguard Worker     rsMatrixLoadMultiply(lhs, lhs, rhs);
294*e1eccf28SAndroid Build Coastguard Worker }
295*e1eccf28SAndroid Build Coastguard Worker 
296*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixLoadMultiply(rs_matrix2x2 * ret,const rs_matrix2x2 * lhs,const rs_matrix2x2 * rhs)297*e1eccf28SAndroid Build Coastguard Worker rsMatrixLoadMultiply(rs_matrix2x2 *ret, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) {
298*e1eccf28SAndroid Build Coastguard Worker     // Use a temporary variable to support the case where one of the inputs
299*e1eccf28SAndroid Build Coastguard Worker     // is also the destination, e.g. rsMatrixLoadMultiply(&left, &left, &right);
300*e1eccf28SAndroid Build Coastguard Worker     rs_matrix2x2 result;
301*e1eccf28SAndroid Build Coastguard Worker     for (int i=0 ; i<2 ; i++) {
302*e1eccf28SAndroid Build Coastguard Worker         float ri0 = 0;
303*e1eccf28SAndroid Build Coastguard Worker         float ri1 = 0;
304*e1eccf28SAndroid Build Coastguard Worker         for (int j=0 ; j<2 ; j++) {
305*e1eccf28SAndroid Build Coastguard Worker             const float rhs_ij = rsMatrixGet(rhs, i, j);
306*e1eccf28SAndroid Build Coastguard Worker             ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
307*e1eccf28SAndroid Build Coastguard Worker             ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
308*e1eccf28SAndroid Build Coastguard Worker         }
309*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 0, ri0);
310*e1eccf28SAndroid Build Coastguard Worker         rsMatrixSet(&result, i, 1, ri1);
311*e1eccf28SAndroid Build Coastguard Worker     }
312*e1eccf28SAndroid Build Coastguard Worker     rsMatrixLoad(ret, &result);
313*e1eccf28SAndroid Build Coastguard Worker }
314*e1eccf28SAndroid Build Coastguard Worker 
315*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsMatrixMultiply(rs_matrix2x2 * lhs,const rs_matrix2x2 * rhs)316*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) {
317*e1eccf28SAndroid Build Coastguard Worker     rsMatrixLoadMultiply(lhs, lhs, rhs);
318*e1eccf28SAndroid Build Coastguard Worker }
319*e1eccf28SAndroid Build Coastguard Worker 
320*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsExtractFrustumPlanes(const rs_matrix4x4 * viewProj,float4 * left,float4 * right,float4 * top,float4 * bottom,float4 * near,float4 * far)321*e1eccf28SAndroid Build Coastguard Worker     rsExtractFrustumPlanes(const rs_matrix4x4* viewProj, float4* left, float4* right, float4* top,
322*e1eccf28SAndroid Build Coastguard Worker                            float4* bottom, float4* near, float4* far) {
323*e1eccf28SAndroid Build Coastguard Worker     // x y z w = a b c d in the plane equation
324*e1eccf28SAndroid Build Coastguard Worker     left->x = viewProj->m[3] + viewProj->m[0];
325*e1eccf28SAndroid Build Coastguard Worker     left->y = viewProj->m[7] + viewProj->m[4];
326*e1eccf28SAndroid Build Coastguard Worker     left->z = viewProj->m[11] + viewProj->m[8];
327*e1eccf28SAndroid Build Coastguard Worker     left->w = viewProj->m[15] + viewProj->m[12];
328*e1eccf28SAndroid Build Coastguard Worker 
329*e1eccf28SAndroid Build Coastguard Worker     right->x = viewProj->m[3] - viewProj->m[0];
330*e1eccf28SAndroid Build Coastguard Worker     right->y = viewProj->m[7] - viewProj->m[4];
331*e1eccf28SAndroid Build Coastguard Worker     right->z = viewProj->m[11] - viewProj->m[8];
332*e1eccf28SAndroid Build Coastguard Worker     right->w = viewProj->m[15] - viewProj->m[12];
333*e1eccf28SAndroid Build Coastguard Worker 
334*e1eccf28SAndroid Build Coastguard Worker     top->x = viewProj->m[3] - viewProj->m[1];
335*e1eccf28SAndroid Build Coastguard Worker     top->y = viewProj->m[7] - viewProj->m[5];
336*e1eccf28SAndroid Build Coastguard Worker     top->z = viewProj->m[11] - viewProj->m[9];
337*e1eccf28SAndroid Build Coastguard Worker     top->w = viewProj->m[15] - viewProj->m[13];
338*e1eccf28SAndroid Build Coastguard Worker 
339*e1eccf28SAndroid Build Coastguard Worker     bottom->x = viewProj->m[3] + viewProj->m[1];
340*e1eccf28SAndroid Build Coastguard Worker     bottom->y = viewProj->m[7] + viewProj->m[5];
341*e1eccf28SAndroid Build Coastguard Worker     bottom->z = viewProj->m[11] + viewProj->m[9];
342*e1eccf28SAndroid Build Coastguard Worker     bottom->w = viewProj->m[15] + viewProj->m[13];
343*e1eccf28SAndroid Build Coastguard Worker 
344*e1eccf28SAndroid Build Coastguard Worker     near->x = viewProj->m[3] + viewProj->m[2];
345*e1eccf28SAndroid Build Coastguard Worker     near->y = viewProj->m[7] + viewProj->m[6];
346*e1eccf28SAndroid Build Coastguard Worker     near->z = viewProj->m[11] + viewProj->m[10];
347*e1eccf28SAndroid Build Coastguard Worker     near->w = viewProj->m[15] + viewProj->m[14];
348*e1eccf28SAndroid Build Coastguard Worker 
349*e1eccf28SAndroid Build Coastguard Worker     far->x = viewProj->m[3] - viewProj->m[2];
350*e1eccf28SAndroid Build Coastguard Worker     far->y = viewProj->m[7] - viewProj->m[6];
351*e1eccf28SAndroid Build Coastguard Worker     far->z = viewProj->m[11] - viewProj->m[10];
352*e1eccf28SAndroid Build Coastguard Worker     far->w = viewProj->m[15] - viewProj->m[14];
353*e1eccf28SAndroid Build Coastguard Worker 
354*e1eccf28SAndroid Build Coastguard Worker     float len = length(left->xyz);
355*e1eccf28SAndroid Build Coastguard Worker     *left /= len;
356*e1eccf28SAndroid Build Coastguard Worker     len = length(right->xyz);
357*e1eccf28SAndroid Build Coastguard Worker     *right /= len;
358*e1eccf28SAndroid Build Coastguard Worker     len = length(top->xyz);
359*e1eccf28SAndroid Build Coastguard Worker     *top /= len;
360*e1eccf28SAndroid Build Coastguard Worker     len = length(bottom->xyz);
361*e1eccf28SAndroid Build Coastguard Worker     *bottom /= len;
362*e1eccf28SAndroid Build Coastguard Worker     len = length(near->xyz);
363*e1eccf28SAndroid Build Coastguard Worker     *near /= len;
364*e1eccf28SAndroid Build Coastguard Worker     len = length(far->xyz);
365*e1eccf28SAndroid Build Coastguard Worker     *far /= len;
366*e1eccf28SAndroid Build Coastguard Worker }
367*e1eccf28SAndroid Build Coastguard Worker 
368*e1eccf28SAndroid Build Coastguard Worker extern bool __attribute__((overloadable))
rsIsSphereInFrustum(float4 * sphere,float4 * left,float4 * right,float4 * top,float4 * bottom,float4 * near,float4 * far)369*e1eccf28SAndroid Build Coastguard Worker     rsIsSphereInFrustum(float4* sphere, float4* left, float4* right, float4* top, float4* bottom,
370*e1eccf28SAndroid Build Coastguard Worker                         float4* near, float4* far) {
371*e1eccf28SAndroid Build Coastguard Worker     float distToCenter = dot(left->xyz, sphere->xyz) + left->w;
372*e1eccf28SAndroid Build Coastguard Worker     if (distToCenter < -sphere->w) {
373*e1eccf28SAndroid Build Coastguard Worker         return false;
374*e1eccf28SAndroid Build Coastguard Worker     }
375*e1eccf28SAndroid Build Coastguard Worker     distToCenter = dot(right->xyz, sphere->xyz) + right->w;
376*e1eccf28SAndroid Build Coastguard Worker     if (distToCenter < -sphere->w) {
377*e1eccf28SAndroid Build Coastguard Worker         return false;
378*e1eccf28SAndroid Build Coastguard Worker     }
379*e1eccf28SAndroid Build Coastguard Worker     distToCenter = dot(top->xyz, sphere->xyz) + top->w;
380*e1eccf28SAndroid Build Coastguard Worker     if (distToCenter < -sphere->w) {
381*e1eccf28SAndroid Build Coastguard Worker         return false;
382*e1eccf28SAndroid Build Coastguard Worker     }
383*e1eccf28SAndroid Build Coastguard Worker     distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w;
384*e1eccf28SAndroid Build Coastguard Worker     if (distToCenter < -sphere->w) {
385*e1eccf28SAndroid Build Coastguard Worker         return false;
386*e1eccf28SAndroid Build Coastguard Worker     }
387*e1eccf28SAndroid Build Coastguard Worker     distToCenter = dot(near->xyz, sphere->xyz) + near->w;
388*e1eccf28SAndroid Build Coastguard Worker     if (distToCenter < -sphere->w) {
389*e1eccf28SAndroid Build Coastguard Worker         return false;
390*e1eccf28SAndroid Build Coastguard Worker     }
391*e1eccf28SAndroid Build Coastguard Worker     distToCenter = dot(far->xyz, sphere->xyz) + far->w;
392*e1eccf28SAndroid Build Coastguard Worker     if (distToCenter < -sphere->w) {
393*e1eccf28SAndroid Build Coastguard Worker         return false;
394*e1eccf28SAndroid Build Coastguard Worker     }
395*e1eccf28SAndroid Build Coastguard Worker     return true;
396*e1eccf28SAndroid Build Coastguard Worker }
397