xref: /aosp_15_r20/frameworks/rs/cpu_ref/rsCpuRuntimeMath.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2011-2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
18*e1eccf28SAndroid Build Coastguard Worker #include "rsScriptC.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rsMatrix4x4.h"
20*e1eccf28SAndroid Build Coastguard Worker #include "rsMatrix3x3.h"
21*e1eccf28SAndroid Build Coastguard Worker #include "rsMatrix2x2.h"
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker #include "rsCpuCore.h"
24*e1eccf28SAndroid Build Coastguard Worker #include "rsCpuScript.h"
25*e1eccf28SAndroid Build Coastguard Worker 
26*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Matrix2x2;
27*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Matrix3x3;
28*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Matrix4x4;
29*e1eccf28SAndroid Build Coastguard Worker 
30*e1eccf28SAndroid Build Coastguard Worker #define EXPORT_F32_FN_F32(func)                                 \
31*e1eccf28SAndroid Build Coastguard Worker     float __attribute__((overloadable)) SC_##func(float v) {    \
32*e1eccf28SAndroid Build Coastguard Worker         return func(v);                                         \
33*e1eccf28SAndroid Build Coastguard Worker     }
34*e1eccf28SAndroid Build Coastguard Worker 
35*e1eccf28SAndroid Build Coastguard Worker #define EXPORT_F32_FN_F32_F32(func)                                     \
36*e1eccf28SAndroid Build Coastguard Worker     float __attribute__((overloadable)) SC_##func(float t, float v) {   \
37*e1eccf28SAndroid Build Coastguard Worker         return func(t, v);                                              \
38*e1eccf28SAndroid Build Coastguard Worker     }
39*e1eccf28SAndroid Build Coastguard Worker 
40*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
41*e1eccf28SAndroid Build Coastguard Worker // Float util
42*e1eccf28SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
43*e1eccf28SAndroid Build Coastguard Worker 
44*e1eccf28SAndroid Build Coastguard Worker // Handle missing Gingerbread functions like tgammaf.
SC_tgammaf(float x)45*e1eccf28SAndroid Build Coastguard Worker float SC_tgammaf(float x) {
46*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_COMPATIBILITY_LIB
47*e1eccf28SAndroid Build Coastguard Worker     return __builtin_tgamma(x);
48*e1eccf28SAndroid Build Coastguard Worker #else
49*e1eccf28SAndroid Build Coastguard Worker     return tgammaf(x);
50*e1eccf28SAndroid Build Coastguard Worker #endif
51*e1eccf28SAndroid Build Coastguard Worker }
52*e1eccf28SAndroid Build Coastguard Worker 
SC_abs_i32(int32_t v)53*e1eccf28SAndroid Build Coastguard Worker uint32_t SC_abs_i32(int32_t v) {return abs(v);}
54*e1eccf28SAndroid Build Coastguard Worker 
SC_MatrixLoadRotate(Matrix4x4 * m,float rot,float x,float y,float z)55*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixLoadRotate(Matrix4x4 *m, float rot, float x, float y, float z) {
56*e1eccf28SAndroid Build Coastguard Worker     m->loadRotate(rot, x, y, z);
57*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixLoadScale(Matrix4x4 * m,float x,float y,float z)58*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixLoadScale(Matrix4x4 *m, float x, float y, float z) {
59*e1eccf28SAndroid Build Coastguard Worker     m->loadScale(x, y, z);
60*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixLoadTranslate(Matrix4x4 * m,float x,float y,float z)61*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixLoadTranslate(Matrix4x4 *m, float x, float y, float z) {
62*e1eccf28SAndroid Build Coastguard Worker     m->loadTranslate(x, y, z);
63*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixRotate(Matrix4x4 * m,float rot,float x,float y,float z)64*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixRotate(Matrix4x4 *m, float rot, float x, float y, float z) {
65*e1eccf28SAndroid Build Coastguard Worker     m->rotate(rot, x, y, z);
66*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixScale(Matrix4x4 * m,float x,float y,float z)67*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixScale(Matrix4x4 *m, float x, float y, float z) {
68*e1eccf28SAndroid Build Coastguard Worker     m->scale(x, y, z);
69*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixTranslate(Matrix4x4 * m,float x,float y,float z)70*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixTranslate(Matrix4x4 *m, float x, float y, float z) {
71*e1eccf28SAndroid Build Coastguard Worker     m->translate(x, y, z);
72*e1eccf28SAndroid Build Coastguard Worker }
73*e1eccf28SAndroid Build Coastguard Worker 
SC_MatrixLoadOrtho(Matrix4x4 * m,float l,float r,float b,float t,float n,float f)74*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixLoadOrtho(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) {
75*e1eccf28SAndroid Build Coastguard Worker     m->loadOrtho(l, r, b, t, n, f);
76*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixLoadFrustum(Matrix4x4 * m,float l,float r,float b,float t,float n,float f)77*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixLoadFrustum(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) {
78*e1eccf28SAndroid Build Coastguard Worker     m->loadFrustum(l, r, b, t, n, f);
79*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixLoadPerspective(Matrix4x4 * m,float fovy,float aspect,float near,float far)80*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixLoadPerspective(Matrix4x4 *m, float fovy, float aspect, float near, float far) {
81*e1eccf28SAndroid Build Coastguard Worker     m->loadPerspective(fovy, aspect, near, far);
82*e1eccf28SAndroid Build Coastguard Worker }
83*e1eccf28SAndroid Build Coastguard Worker 
SC_MatrixInverse_4x4(Matrix4x4 * m)84*e1eccf28SAndroid Build Coastguard Worker static bool SC_MatrixInverse_4x4(Matrix4x4 *m) {
85*e1eccf28SAndroid Build Coastguard Worker     return m->inverse();
86*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixInverseTranspose_4x4(Matrix4x4 * m)87*e1eccf28SAndroid Build Coastguard Worker static bool SC_MatrixInverseTranspose_4x4(Matrix4x4 *m) {
88*e1eccf28SAndroid Build Coastguard Worker     return m->inverseTranspose();
89*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixTranspose_4x4(Matrix4x4 * m)90*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixTranspose_4x4(Matrix4x4 *m) {
91*e1eccf28SAndroid Build Coastguard Worker     m->transpose();
92*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixTranspose_3x3(Matrix3x3 * m)93*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixTranspose_3x3(Matrix3x3 *m) {
94*e1eccf28SAndroid Build Coastguard Worker     m->transpose();
95*e1eccf28SAndroid Build Coastguard Worker }
SC_MatrixTranspose_2x2(Matrix2x2 * m)96*e1eccf28SAndroid Build Coastguard Worker static void SC_MatrixTranspose_2x2(Matrix2x2 *m) {
97*e1eccf28SAndroid Build Coastguard Worker     m->transpose();
98*e1eccf28SAndroid Build Coastguard Worker }
99*e1eccf28SAndroid Build Coastguard Worker 
SC_randf2(float min,float max)100*e1eccf28SAndroid Build Coastguard Worker float SC_randf2(float min, float max) {
101*e1eccf28SAndroid Build Coastguard Worker     float r = (float)rand();
102*e1eccf28SAndroid Build Coastguard Worker     r /= (float)RAND_MAX;
103*e1eccf28SAndroid Build Coastguard Worker     r = r * (max - min) + min;
104*e1eccf28SAndroid Build Coastguard Worker     return r;
105*e1eccf28SAndroid Build Coastguard Worker }
106*e1eccf28SAndroid Build Coastguard Worker 
107*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(acosf)
EXPORT_F32_FN_F32(acoshf)108*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(acoshf)
109*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(asinf)
110*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(asinhf)
111*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(atanf)
112*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(atan2f)
113*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(atanhf)
114*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(cbrtf)
115*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(ceilf)
116*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(copysignf)
117*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(cosf)
118*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(coshf)
119*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(erfcf)
120*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(erff)
121*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(expf)
122*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(exp2f)
123*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(expm1f)
124*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(fdimf)
125*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(floorf)
126*e1eccf28SAndroid Build Coastguard Worker float SC_fmaf(float u, float t, float v) {return fmaf(u, t, v);}
127*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(fmaxf)
EXPORT_F32_FN_F32_F32(fminf)128*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(fminf)
129*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(fmodf)
130*e1eccf28SAndroid Build Coastguard Worker float SC_frexpf(float v, int* ptr) {return frexpf(v, ptr);}
EXPORT_F32_FN_F32_F32(hypotf)131*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(hypotf)
132*e1eccf28SAndroid Build Coastguard Worker int SC_ilogbf(float v) {return ilogbf(v); }
SC_ldexpf(float v,int i)133*e1eccf28SAndroid Build Coastguard Worker float SC_ldexpf(float v, int i) {return ldexpf(v, i);}
EXPORT_F32_FN_F32(lgammaf)134*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(lgammaf)
135*e1eccf28SAndroid Build Coastguard Worker float SC_lgammaf_r(float v, int* ptr) {return lgammaf_r(v, ptr);}
136*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(logf)
EXPORT_F32_FN_F32(log10f)137*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(log10f)
138*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(log1pf)
139*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(logbf)
140*e1eccf28SAndroid Build Coastguard Worker float SC_modff(float v, float* ptr) {return modff(v, ptr);}
141*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(nextafterf)
EXPORT_F32_FN_F32_F32(powf)142*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(powf)
143*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32_F32(remainderf)
144*e1eccf28SAndroid Build Coastguard Worker float SC_remquof(float t, float v, int* ptr) {return remquof(t, v, ptr);}
145*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(rintf)
EXPORT_F32_FN_F32(roundf)146*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(roundf)
147*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(sinf)
148*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(sinhf)
149*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(sqrtf)
150*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(tanf)
151*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(tanhf)
152*e1eccf28SAndroid Build Coastguard Worker EXPORT_F32_FN_F32(truncf)
153*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixLoadRotate(rs_matrix4x4 *m,
154*e1eccf28SAndroid Build Coastguard Worker         float rot, float x, float y, float z) {
155*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixLoadRotate((Matrix4x4 *) m, rot, x, y, z);
156*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixLoadScale(rs_matrix4x4 * m,float x,float y,float z)157*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixLoadScale(rs_matrix4x4 *m,
158*e1eccf28SAndroid Build Coastguard Worker         float x, float y, float z) {
159*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixLoadScale((Matrix4x4 *) m, x, y, z);
160*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixLoadTranslate(rs_matrix4x4 * m,float x,float y,float z)161*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixLoadTranslate(rs_matrix4x4 *m,
162*e1eccf28SAndroid Build Coastguard Worker         float x, float y, float z) {
163*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixLoadTranslate((Matrix4x4 *) m, x, y, z);
164*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixRotate(rs_matrix4x4 * m,float rot,float x,float y,float z)165*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixRotate(rs_matrix4x4 *m, float rot,
166*e1eccf28SAndroid Build Coastguard Worker         float x, float y, float z) {
167*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixRotate((Matrix4x4 *) m, rot, x, y, z);
168*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixScale(rs_matrix4x4 * m,float x,float y,float z)169*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixScale(rs_matrix4x4 *m, float x,
170*e1eccf28SAndroid Build Coastguard Worker         float y, float z) {
171*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixScale((Matrix4x4 *) m, x, y, z);
172*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixTranslate(rs_matrix4x4 * m,float x,float y,float z)173*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixTranslate(rs_matrix4x4 *m, float x,
174*e1eccf28SAndroid Build Coastguard Worker         float y, float z) {
175*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixTranslate((Matrix4x4 *) m, x, y, z);
176*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixLoadOrtho(rs_matrix4x4 * m,float l,float r,float b,float t,float n,float f)177*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixLoadOrtho(rs_matrix4x4 *m, float l,
178*e1eccf28SAndroid Build Coastguard Worker         float r, float b, float t, float n, float f) {
179*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixLoadOrtho((Matrix4x4 *) m, l, r, b, t, n, f);
180*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixLoadFrustum(rs_matrix4x4 * m,float l,float r,float b,float t,float n,float f)181*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixLoadFrustum(rs_matrix4x4 *m,
182*e1eccf28SAndroid Build Coastguard Worker         float l, float r, float b, float t, float n, float f) {
183*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixLoadFrustum((Matrix4x4 *) m, l, r, b, t, n, f);
184*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixLoadPerspective(rs_matrix4x4 * m,float fovy,float aspect,float near,float far)185*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixLoadPerspective(rs_matrix4x4 *m,
186*e1eccf28SAndroid Build Coastguard Worker         float fovy, float aspect, float near, float far) {
187*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixLoadPerspective((Matrix4x4 *) m, fovy, aspect, near, far);
188*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixInverse(rs_matrix4x4 * m)189*e1eccf28SAndroid Build Coastguard Worker bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m) {
190*e1eccf28SAndroid Build Coastguard Worker     return SC_MatrixInverse_4x4((Matrix4x4 *) m);
191*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixInverseTranspose(rs_matrix4x4 * m)192*e1eccf28SAndroid Build Coastguard Worker bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m) {
193*e1eccf28SAndroid Build Coastguard Worker     return SC_MatrixInverseTranspose_4x4((Matrix4x4 *) m);
194*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixTranspose(rs_matrix4x4 * m)195*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m) {
196*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixTranspose_4x4((Matrix4x4 *) m);
197*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixTranspose(rs_matrix3x3 * m)198*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m) {
199*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixTranspose_3x3((Matrix3x3 *) m);
200*e1eccf28SAndroid Build Coastguard Worker }
rsMatrixTranspose(rs_matrix2x2 * m)201*e1eccf28SAndroid Build Coastguard Worker void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m) {
202*e1eccf28SAndroid Build Coastguard Worker     SC_MatrixTranspose_2x2((Matrix2x2 *) m);
203*e1eccf28SAndroid Build Coastguard Worker }
204*e1eccf28SAndroid Build Coastguard Worker 
205*e1eccf28SAndroid Build Coastguard Worker 
206