xref: /aosp_15_r20/frameworks/rs/driver/runtime/arch/generic.c (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 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 
18*e1eccf28SAndroid Build Coastguard Worker #include "rs_core.rsh"
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker extern short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high);
21*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) convert_uchar4(short4);
22*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) convert_uchar4(float4);
23*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) convert_float4(uchar4);
24*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) sqrt(float);
25*e1eccf28SAndroid Build Coastguard Worker 
26*e1eccf28SAndroid Build Coastguard Worker /*
27*e1eccf28SAndroid Build Coastguard Worker  * CLAMP
28*e1eccf28SAndroid Build Coastguard Worker  */
29*e1eccf28SAndroid Build Coastguard Worker #define _CLAMP(T) \
30*e1eccf28SAndroid Build Coastguard Worker extern T __attribute__((overloadable)) clamp(T amount, T low, T high) {             \
31*e1eccf28SAndroid Build Coastguard Worker     return amount < low ? low : (amount > high ? high : amount);                    \
32*e1eccf28SAndroid Build Coastguard Worker }                                                                                   \
33*e1eccf28SAndroid Build Coastguard Worker                                                                                     \
34*e1eccf28SAndroid Build Coastguard Worker extern T##2 __attribute__((overloadable)) clamp(T##2 amount, T##2 low, T##2 high) { \
35*e1eccf28SAndroid Build Coastguard Worker     T##2 r;                                                                         \
36*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
37*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
38*e1eccf28SAndroid Build Coastguard Worker     return r;                                                                       \
39*e1eccf28SAndroid Build Coastguard Worker }                                                                                   \
40*e1eccf28SAndroid Build Coastguard Worker                                                                                     \
41*e1eccf28SAndroid Build Coastguard Worker extern T##3 __attribute__((overloadable)) clamp(T##3 amount, T##3 low, T##3 high) { \
42*e1eccf28SAndroid Build Coastguard Worker     T##3 r;                                                                         \
43*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
44*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
45*e1eccf28SAndroid Build Coastguard Worker     r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);       \
46*e1eccf28SAndroid Build Coastguard Worker     return r;                                                                       \
47*e1eccf28SAndroid Build Coastguard Worker }                                                                                   \
48*e1eccf28SAndroid Build Coastguard Worker                                                                                     \
49*e1eccf28SAndroid Build Coastguard Worker extern T##4 __attribute__((overloadable)) clamp(T##4 amount, T##4 low, T##4 high) { \
50*e1eccf28SAndroid Build Coastguard Worker     T##4 r;                                                                         \
51*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
52*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
53*e1eccf28SAndroid Build Coastguard Worker     r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);       \
54*e1eccf28SAndroid Build Coastguard Worker     r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);       \
55*e1eccf28SAndroid Build Coastguard Worker     return r;                                                                       \
56*e1eccf28SAndroid Build Coastguard Worker }                                                                                   \
57*e1eccf28SAndroid Build Coastguard Worker                                                                                     \
58*e1eccf28SAndroid Build Coastguard Worker extern T##2 __attribute__((overloadable)) clamp(T##2 amount, T low, T high) {       \
59*e1eccf28SAndroid Build Coastguard Worker     T##2 r;                                                                         \
60*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
61*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
62*e1eccf28SAndroid Build Coastguard Worker     return r;                                                                       \
63*e1eccf28SAndroid Build Coastguard Worker }                                                                                   \
64*e1eccf28SAndroid Build Coastguard Worker                                                                                     \
65*e1eccf28SAndroid Build Coastguard Worker extern T##3 __attribute__((overloadable)) clamp(T##3 amount, T low, T high) {       \
66*e1eccf28SAndroid Build Coastguard Worker     T##3 r;                                                                         \
67*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
68*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
69*e1eccf28SAndroid Build Coastguard Worker     r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);               \
70*e1eccf28SAndroid Build Coastguard Worker     return r;                                                                       \
71*e1eccf28SAndroid Build Coastguard Worker }                                                                                   \
72*e1eccf28SAndroid Build Coastguard Worker                                                                                     \
73*e1eccf28SAndroid Build Coastguard Worker extern T##4 __attribute__((overloadable)) clamp(T##4 amount, T low, T high) {       \
74*e1eccf28SAndroid Build Coastguard Worker     T##4 r;                                                                         \
75*e1eccf28SAndroid Build Coastguard Worker     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
76*e1eccf28SAndroid Build Coastguard Worker     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
77*e1eccf28SAndroid Build Coastguard Worker     r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);               \
78*e1eccf28SAndroid Build Coastguard Worker     r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);               \
79*e1eccf28SAndroid Build Coastguard Worker     return r;                                                                       \
80*e1eccf28SAndroid Build Coastguard Worker }
81*e1eccf28SAndroid Build Coastguard Worker 
82*e1eccf28SAndroid Build Coastguard Worker #if !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
83*e1eccf28SAndroid Build Coastguard Worker // These functions must be defined here if we are not using the SSE
84*e1eccf28SAndroid Build Coastguard Worker // implementation, which includes when we are built as part of the
85*e1eccf28SAndroid Build Coastguard Worker // debug runtime (libclcore_debug.bc) or compiling with debug info.
86*e1eccf28SAndroid Build Coastguard Worker 
87*e1eccf28SAndroid Build Coastguard Worker _CLAMP(float);
88*e1eccf28SAndroid Build Coastguard Worker 
89*e1eccf28SAndroid Build Coastguard Worker #else
90*e1eccf28SAndroid Build Coastguard Worker 
91*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) clamp(float amount, float low, float high);
92*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high);
93*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high);
94*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high);
95*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high);
96*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high);
97*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high);
98*e1eccf28SAndroid Build Coastguard Worker 
99*e1eccf28SAndroid Build Coastguard Worker #endif // !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
100*e1eccf28SAndroid Build Coastguard Worker 
101*e1eccf28SAndroid Build Coastguard Worker _CLAMP(half);
102*e1eccf28SAndroid Build Coastguard Worker _CLAMP(double);
103*e1eccf28SAndroid Build Coastguard Worker _CLAMP(char);
104*e1eccf28SAndroid Build Coastguard Worker _CLAMP(uchar);
105*e1eccf28SAndroid Build Coastguard Worker _CLAMP(short);
106*e1eccf28SAndroid Build Coastguard Worker _CLAMP(ushort);
107*e1eccf28SAndroid Build Coastguard Worker _CLAMP(int);
108*e1eccf28SAndroid Build Coastguard Worker _CLAMP(uint);
109*e1eccf28SAndroid Build Coastguard Worker _CLAMP(long);
110*e1eccf28SAndroid Build Coastguard Worker _CLAMP(ulong);
111*e1eccf28SAndroid Build Coastguard Worker 
112*e1eccf28SAndroid Build Coastguard Worker #undef _CLAMP
113*e1eccf28SAndroid Build Coastguard Worker 
114*e1eccf28SAndroid Build Coastguard Worker /*
115*e1eccf28SAndroid Build Coastguard Worker  * FMAX
116*e1eccf28SAndroid Build Coastguard Worker  */
117*e1eccf28SAndroid Build Coastguard Worker 
fmax(float v1,float v2)118*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fmax(float v1, float v2) {
119*e1eccf28SAndroid Build Coastguard Worker     return v1 > v2 ? v1 : v2;
120*e1eccf28SAndroid Build Coastguard Worker }
121*e1eccf28SAndroid Build Coastguard Worker 
fmax(float2 v1,float2 v2)122*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fmax(float2 v1, float2 v2) {
123*e1eccf28SAndroid Build Coastguard Worker     float2 r;
124*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
125*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
126*e1eccf28SAndroid Build Coastguard Worker     return r;
127*e1eccf28SAndroid Build Coastguard Worker }
128*e1eccf28SAndroid Build Coastguard Worker 
fmax(float3 v1,float3 v2)129*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fmax(float3 v1, float3 v2) {
130*e1eccf28SAndroid Build Coastguard Worker     float3 r;
131*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
132*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
133*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
134*e1eccf28SAndroid Build Coastguard Worker     return r;
135*e1eccf28SAndroid Build Coastguard Worker }
136*e1eccf28SAndroid Build Coastguard Worker 
fmax(float4 v1,float4 v2)137*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fmax(float4 v1, float4 v2) {
138*e1eccf28SAndroid Build Coastguard Worker     float4 r;
139*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
140*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
141*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
142*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2.w ? v1.w : v2.w;
143*e1eccf28SAndroid Build Coastguard Worker     return r;
144*e1eccf28SAndroid Build Coastguard Worker }
145*e1eccf28SAndroid Build Coastguard Worker 
fmax(float2 v1,float v2)146*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fmax(float2 v1, float v2) {
147*e1eccf28SAndroid Build Coastguard Worker     float2 r;
148*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2 ? v1.x : v2;
149*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2 ? v1.y : v2;
150*e1eccf28SAndroid Build Coastguard Worker     return r;
151*e1eccf28SAndroid Build Coastguard Worker }
152*e1eccf28SAndroid Build Coastguard Worker 
fmax(float3 v1,float v2)153*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fmax(float3 v1, float v2) {
154*e1eccf28SAndroid Build Coastguard Worker     float3 r;
155*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2 ? v1.x : v2;
156*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2 ? v1.y : v2;
157*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2 ? v1.z : v2;
158*e1eccf28SAndroid Build Coastguard Worker     return r;
159*e1eccf28SAndroid Build Coastguard Worker }
160*e1eccf28SAndroid Build Coastguard Worker 
fmax(float4 v1,float v2)161*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fmax(float4 v1, float v2) {
162*e1eccf28SAndroid Build Coastguard Worker     float4 r;
163*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2 ? v1.x : v2;
164*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2 ? v1.y : v2;
165*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2 ? v1.z : v2;
166*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2 ? v1.w : v2;
167*e1eccf28SAndroid Build Coastguard Worker     return r;
168*e1eccf28SAndroid Build Coastguard Worker }
169*e1eccf28SAndroid Build Coastguard Worker 
fmin(float v1,float v2)170*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fmin(float v1, float v2) {
171*e1eccf28SAndroid Build Coastguard Worker     return v1 < v2 ? v1 : v2;
172*e1eccf28SAndroid Build Coastguard Worker }
173*e1eccf28SAndroid Build Coastguard Worker 
174*e1eccf28SAndroid Build Coastguard Worker 
175*e1eccf28SAndroid Build Coastguard Worker /*
176*e1eccf28SAndroid Build Coastguard Worker  * FMIN
177*e1eccf28SAndroid Build Coastguard Worker  */
fmin(float2 v1,float2 v2)178*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fmin(float2 v1, float2 v2) {
179*e1eccf28SAndroid Build Coastguard Worker     float2 r;
180*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
181*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
182*e1eccf28SAndroid Build Coastguard Worker     return r;
183*e1eccf28SAndroid Build Coastguard Worker }
184*e1eccf28SAndroid Build Coastguard Worker 
fmin(float3 v1,float3 v2)185*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fmin(float3 v1, float3 v2) {
186*e1eccf28SAndroid Build Coastguard Worker     float3 r;
187*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
188*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
189*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
190*e1eccf28SAndroid Build Coastguard Worker     return r;
191*e1eccf28SAndroid Build Coastguard Worker }
192*e1eccf28SAndroid Build Coastguard Worker 
fmin(float4 v1,float4 v2)193*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fmin(float4 v1, float4 v2) {
194*e1eccf28SAndroid Build Coastguard Worker     float4 r;
195*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
196*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
197*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
198*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2.w ? v1.w : v2.w;
199*e1eccf28SAndroid Build Coastguard Worker     return r;
200*e1eccf28SAndroid Build Coastguard Worker }
201*e1eccf28SAndroid Build Coastguard Worker 
fmin(float2 v1,float v2)202*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fmin(float2 v1, float v2) {
203*e1eccf28SAndroid Build Coastguard Worker     float2 r;
204*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2 ? v1.x : v2;
205*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2 ? v1.y : v2;
206*e1eccf28SAndroid Build Coastguard Worker     return r;
207*e1eccf28SAndroid Build Coastguard Worker }
208*e1eccf28SAndroid Build Coastguard Worker 
fmin(float3 v1,float v2)209*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fmin(float3 v1, float v2) {
210*e1eccf28SAndroid Build Coastguard Worker     float3 r;
211*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2 ? v1.x : v2;
212*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2 ? v1.y : v2;
213*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2 ? v1.z : v2;
214*e1eccf28SAndroid Build Coastguard Worker     return r;
215*e1eccf28SAndroid Build Coastguard Worker }
216*e1eccf28SAndroid Build Coastguard Worker 
fmin(float4 v1,float v2)217*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fmin(float4 v1, float v2) {
218*e1eccf28SAndroid Build Coastguard Worker     float4 r;
219*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2 ? v1.x : v2;
220*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2 ? v1.y : v2;
221*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2 ? v1.z : v2;
222*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2 ? v1.w : v2;
223*e1eccf28SAndroid Build Coastguard Worker     return r;
224*e1eccf28SAndroid Build Coastguard Worker }
225*e1eccf28SAndroid Build Coastguard Worker 
226*e1eccf28SAndroid Build Coastguard Worker 
227*e1eccf28SAndroid Build Coastguard Worker /*
228*e1eccf28SAndroid Build Coastguard Worker  * MAX
229*e1eccf28SAndroid Build Coastguard Worker  */
230*e1eccf28SAndroid Build Coastguard Worker 
max(char v1,char v2)231*e1eccf28SAndroid Build Coastguard Worker extern char __attribute__((overloadable)) max(char v1, char v2) {
232*e1eccf28SAndroid Build Coastguard Worker     return v1 > v2 ? v1 : v2;
233*e1eccf28SAndroid Build Coastguard Worker }
234*e1eccf28SAndroid Build Coastguard Worker 
max(char2 v1,char2 v2)235*e1eccf28SAndroid Build Coastguard Worker extern char2 __attribute__((overloadable)) max(char2 v1, char2 v2) {
236*e1eccf28SAndroid Build Coastguard Worker     char2 r;
237*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
238*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
239*e1eccf28SAndroid Build Coastguard Worker     return r;
240*e1eccf28SAndroid Build Coastguard Worker }
241*e1eccf28SAndroid Build Coastguard Worker 
max(char3 v1,char3 v2)242*e1eccf28SAndroid Build Coastguard Worker extern char3 __attribute__((overloadable)) max(char3 v1, char3 v2) {
243*e1eccf28SAndroid Build Coastguard Worker     char3 r;
244*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
245*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
246*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
247*e1eccf28SAndroid Build Coastguard Worker     return r;
248*e1eccf28SAndroid Build Coastguard Worker }
249*e1eccf28SAndroid Build Coastguard Worker 
max(char4 v1,char4 v2)250*e1eccf28SAndroid Build Coastguard Worker extern char4 __attribute__((overloadable)) max(char4 v1, char4 v2) {
251*e1eccf28SAndroid Build Coastguard Worker     char4 r;
252*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
253*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
254*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
255*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2.w ? v1.w : v2.w;
256*e1eccf28SAndroid Build Coastguard Worker     return r;
257*e1eccf28SAndroid Build Coastguard Worker }
258*e1eccf28SAndroid Build Coastguard Worker 
max(short v1,short v2)259*e1eccf28SAndroid Build Coastguard Worker extern short __attribute__((overloadable)) max(short v1, short v2) {
260*e1eccf28SAndroid Build Coastguard Worker     return v1 > v2 ? v1 : v2;
261*e1eccf28SAndroid Build Coastguard Worker }
262*e1eccf28SAndroid Build Coastguard Worker 
max(short2 v1,short2 v2)263*e1eccf28SAndroid Build Coastguard Worker extern short2 __attribute__((overloadable)) max(short2 v1, short2 v2) {
264*e1eccf28SAndroid Build Coastguard Worker     short2 r;
265*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
266*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
267*e1eccf28SAndroid Build Coastguard Worker     return r;
268*e1eccf28SAndroid Build Coastguard Worker }
269*e1eccf28SAndroid Build Coastguard Worker 
max(short3 v1,short3 v2)270*e1eccf28SAndroid Build Coastguard Worker extern short3 __attribute__((overloadable)) max(short3 v1, short3 v2) {
271*e1eccf28SAndroid Build Coastguard Worker     short3 r;
272*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
273*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
274*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
275*e1eccf28SAndroid Build Coastguard Worker     return r;
276*e1eccf28SAndroid Build Coastguard Worker }
277*e1eccf28SAndroid Build Coastguard Worker 
max(short4 v1,short4 v2)278*e1eccf28SAndroid Build Coastguard Worker extern short4 __attribute__((overloadable)) max(short4 v1, short4 v2) {
279*e1eccf28SAndroid Build Coastguard Worker     short4 r;
280*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
281*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
282*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
283*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2.w ? v1.w : v2.w;
284*e1eccf28SAndroid Build Coastguard Worker     return r;
285*e1eccf28SAndroid Build Coastguard Worker }
286*e1eccf28SAndroid Build Coastguard Worker 
max(int v1,int v2)287*e1eccf28SAndroid Build Coastguard Worker extern int __attribute__((overloadable)) max(int v1, int v2) {
288*e1eccf28SAndroid Build Coastguard Worker     return v1 > v2 ? v1 : v2;
289*e1eccf28SAndroid Build Coastguard Worker }
290*e1eccf28SAndroid Build Coastguard Worker 
max(int2 v1,int2 v2)291*e1eccf28SAndroid Build Coastguard Worker extern int2 __attribute__((overloadable)) max(int2 v1, int2 v2) {
292*e1eccf28SAndroid Build Coastguard Worker     int2 r;
293*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
294*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
295*e1eccf28SAndroid Build Coastguard Worker     return r;
296*e1eccf28SAndroid Build Coastguard Worker }
297*e1eccf28SAndroid Build Coastguard Worker 
max(int3 v1,int3 v2)298*e1eccf28SAndroid Build Coastguard Worker extern int3 __attribute__((overloadable)) max(int3 v1, int3 v2) {
299*e1eccf28SAndroid Build Coastguard Worker     int3 r;
300*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
301*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
302*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
303*e1eccf28SAndroid Build Coastguard Worker     return r;
304*e1eccf28SAndroid Build Coastguard Worker }
305*e1eccf28SAndroid Build Coastguard Worker 
max(int4 v1,int4 v2)306*e1eccf28SAndroid Build Coastguard Worker extern int4 __attribute__((overloadable)) max(int4 v1, int4 v2) {
307*e1eccf28SAndroid Build Coastguard Worker     int4 r;
308*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
309*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
310*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
311*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2.w ? v1.w : v2.w;
312*e1eccf28SAndroid Build Coastguard Worker     return r;
313*e1eccf28SAndroid Build Coastguard Worker }
314*e1eccf28SAndroid Build Coastguard Worker 
max(uchar v1,uchar v2)315*e1eccf28SAndroid Build Coastguard Worker extern uchar __attribute__((overloadable)) max(uchar v1, uchar v2) {
316*e1eccf28SAndroid Build Coastguard Worker     return v1 > v2 ? v1 : v2;
317*e1eccf28SAndroid Build Coastguard Worker }
318*e1eccf28SAndroid Build Coastguard Worker 
max(uchar2 v1,uchar2 v2)319*e1eccf28SAndroid Build Coastguard Worker extern uchar2 __attribute__((overloadable)) max(uchar2 v1, uchar2 v2) {
320*e1eccf28SAndroid Build Coastguard Worker     uchar2 r;
321*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
322*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
323*e1eccf28SAndroid Build Coastguard Worker     return r;
324*e1eccf28SAndroid Build Coastguard Worker }
325*e1eccf28SAndroid Build Coastguard Worker 
max(uchar3 v1,uchar3 v2)326*e1eccf28SAndroid Build Coastguard Worker extern uchar3 __attribute__((overloadable)) max(uchar3 v1, uchar3 v2) {
327*e1eccf28SAndroid Build Coastguard Worker     uchar3 r;
328*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
329*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
330*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
331*e1eccf28SAndroid Build Coastguard Worker     return r;
332*e1eccf28SAndroid Build Coastguard Worker }
333*e1eccf28SAndroid Build Coastguard Worker 
max(uchar4 v1,uchar4 v2)334*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) max(uchar4 v1, uchar4 v2) {
335*e1eccf28SAndroid Build Coastguard Worker     uchar4 r;
336*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
337*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
338*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
339*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2.w ? v1.w : v2.w;
340*e1eccf28SAndroid Build Coastguard Worker     return r;
341*e1eccf28SAndroid Build Coastguard Worker }
342*e1eccf28SAndroid Build Coastguard Worker 
max(ushort v1,ushort v2)343*e1eccf28SAndroid Build Coastguard Worker extern ushort __attribute__((overloadable)) max(ushort v1, ushort v2) {
344*e1eccf28SAndroid Build Coastguard Worker     return v1 > v2 ? v1 : v2;
345*e1eccf28SAndroid Build Coastguard Worker }
346*e1eccf28SAndroid Build Coastguard Worker 
max(ushort2 v1,ushort2 v2)347*e1eccf28SAndroid Build Coastguard Worker extern ushort2 __attribute__((overloadable)) max(ushort2 v1, ushort2 v2) {
348*e1eccf28SAndroid Build Coastguard Worker     ushort2 r;
349*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
350*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
351*e1eccf28SAndroid Build Coastguard Worker     return r;
352*e1eccf28SAndroid Build Coastguard Worker }
353*e1eccf28SAndroid Build Coastguard Worker 
max(ushort3 v1,ushort3 v2)354*e1eccf28SAndroid Build Coastguard Worker extern ushort3 __attribute__((overloadable)) max(ushort3 v1, ushort3 v2) {
355*e1eccf28SAndroid Build Coastguard Worker     ushort3 r;
356*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
357*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
358*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
359*e1eccf28SAndroid Build Coastguard Worker     return r;
360*e1eccf28SAndroid Build Coastguard Worker }
361*e1eccf28SAndroid Build Coastguard Worker 
max(ushort4 v1,ushort4 v2)362*e1eccf28SAndroid Build Coastguard Worker extern ushort4 __attribute__((overloadable)) max(ushort4 v1, ushort4 v2) {
363*e1eccf28SAndroid Build Coastguard Worker     ushort4 r;
364*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
365*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
366*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
367*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2.w ? v1.w : v2.w;
368*e1eccf28SAndroid Build Coastguard Worker     return r;
369*e1eccf28SAndroid Build Coastguard Worker }
370*e1eccf28SAndroid Build Coastguard Worker 
max(uint v1,uint v2)371*e1eccf28SAndroid Build Coastguard Worker extern uint __attribute__((overloadable)) max(uint v1, uint v2) {
372*e1eccf28SAndroid Build Coastguard Worker     return v1 > v2 ? v1 : v2;
373*e1eccf28SAndroid Build Coastguard Worker }
374*e1eccf28SAndroid Build Coastguard Worker 
max(uint2 v1,uint2 v2)375*e1eccf28SAndroid Build Coastguard Worker extern uint2 __attribute__((overloadable)) max(uint2 v1, uint2 v2) {
376*e1eccf28SAndroid Build Coastguard Worker     uint2 r;
377*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
378*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
379*e1eccf28SAndroid Build Coastguard Worker     return r;
380*e1eccf28SAndroid Build Coastguard Worker }
381*e1eccf28SAndroid Build Coastguard Worker 
max(uint3 v1,uint3 v2)382*e1eccf28SAndroid Build Coastguard Worker extern uint3 __attribute__((overloadable)) max(uint3 v1, uint3 v2) {
383*e1eccf28SAndroid Build Coastguard Worker     uint3 r;
384*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
385*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
386*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
387*e1eccf28SAndroid Build Coastguard Worker     return r;
388*e1eccf28SAndroid Build Coastguard Worker }
389*e1eccf28SAndroid Build Coastguard Worker 
max(uint4 v1,uint4 v2)390*e1eccf28SAndroid Build Coastguard Worker extern uint4 __attribute__((overloadable)) max(uint4 v1, uint4 v2) {
391*e1eccf28SAndroid Build Coastguard Worker     uint4 r;
392*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x > v2.x ? v1.x : v2.x;
393*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y > v2.y ? v1.y : v2.y;
394*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z > v2.z ? v1.z : v2.z;
395*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w > v2.w ? v1.w : v2.w;
396*e1eccf28SAndroid Build Coastguard Worker     return r;
397*e1eccf28SAndroid Build Coastguard Worker }
398*e1eccf28SAndroid Build Coastguard Worker 
max(float v1,float v2)399*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) max(float v1, float v2) {
400*e1eccf28SAndroid Build Coastguard Worker     return fmax(v1, v2);
401*e1eccf28SAndroid Build Coastguard Worker }
402*e1eccf28SAndroid Build Coastguard Worker 
max(float2 v1,float2 v2)403*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) max(float2 v1, float2 v2) {
404*e1eccf28SAndroid Build Coastguard Worker     return fmax(v1, v2);
405*e1eccf28SAndroid Build Coastguard Worker }
406*e1eccf28SAndroid Build Coastguard Worker 
max(float2 v1,float v2)407*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) max(float2 v1, float v2) {
408*e1eccf28SAndroid Build Coastguard Worker     return fmax(v1, v2);
409*e1eccf28SAndroid Build Coastguard Worker }
410*e1eccf28SAndroid Build Coastguard Worker 
max(float3 v1,float3 v2)411*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) max(float3 v1, float3 v2) {
412*e1eccf28SAndroid Build Coastguard Worker     return fmax(v1, v2);
413*e1eccf28SAndroid Build Coastguard Worker }
414*e1eccf28SAndroid Build Coastguard Worker 
max(float3 v1,float v2)415*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) max(float3 v1, float v2) {
416*e1eccf28SAndroid Build Coastguard Worker     return fmax(v1, v2);
417*e1eccf28SAndroid Build Coastguard Worker }
418*e1eccf28SAndroid Build Coastguard Worker 
max(float4 v1,float4 v2)419*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) max(float4 v1, float4 v2) {
420*e1eccf28SAndroid Build Coastguard Worker     return fmax(v1, v2);
421*e1eccf28SAndroid Build Coastguard Worker }
422*e1eccf28SAndroid Build Coastguard Worker 
max(float4 v1,float v2)423*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) max(float4 v1, float v2) {
424*e1eccf28SAndroid Build Coastguard Worker     return fmax(v1, v2);
425*e1eccf28SAndroid Build Coastguard Worker }
426*e1eccf28SAndroid Build Coastguard Worker 
427*e1eccf28SAndroid Build Coastguard Worker 
428*e1eccf28SAndroid Build Coastguard Worker /*
429*e1eccf28SAndroid Build Coastguard Worker  * MIN
430*e1eccf28SAndroid Build Coastguard Worker  */
431*e1eccf28SAndroid Build Coastguard Worker 
min(int8_t v1,int8_t v2)432*e1eccf28SAndroid Build Coastguard Worker extern int8_t __attribute__((overloadable)) min(int8_t v1, int8_t v2) {
433*e1eccf28SAndroid Build Coastguard Worker     return v1 < v2 ? v1 : v2;
434*e1eccf28SAndroid Build Coastguard Worker }
435*e1eccf28SAndroid Build Coastguard Worker 
min(char2 v1,char2 v2)436*e1eccf28SAndroid Build Coastguard Worker extern char2 __attribute__((overloadable)) min(char2 v1, char2 v2) {
437*e1eccf28SAndroid Build Coastguard Worker     char2 r;
438*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
439*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
440*e1eccf28SAndroid Build Coastguard Worker     return r;
441*e1eccf28SAndroid Build Coastguard Worker }
442*e1eccf28SAndroid Build Coastguard Worker 
min(char3 v1,char3 v2)443*e1eccf28SAndroid Build Coastguard Worker extern char3 __attribute__((overloadable)) min(char3 v1, char3 v2) {
444*e1eccf28SAndroid Build Coastguard Worker     char3 r;
445*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
446*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
447*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
448*e1eccf28SAndroid Build Coastguard Worker     return r;
449*e1eccf28SAndroid Build Coastguard Worker }
450*e1eccf28SAndroid Build Coastguard Worker 
min(char4 v1,char4 v2)451*e1eccf28SAndroid Build Coastguard Worker extern char4 __attribute__((overloadable)) min(char4 v1, char4 v2) {
452*e1eccf28SAndroid Build Coastguard Worker     char4 r;
453*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
454*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
455*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
456*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2.w ? v1.w : v2.w;
457*e1eccf28SAndroid Build Coastguard Worker     return r;
458*e1eccf28SAndroid Build Coastguard Worker }
459*e1eccf28SAndroid Build Coastguard Worker 
min(int16_t v1,int16_t v2)460*e1eccf28SAndroid Build Coastguard Worker extern int16_t __attribute__((overloadable)) min(int16_t v1, int16_t v2) {
461*e1eccf28SAndroid Build Coastguard Worker     return v1 < v2 ? v1 : v2;
462*e1eccf28SAndroid Build Coastguard Worker }
463*e1eccf28SAndroid Build Coastguard Worker 
min(short2 v1,short2 v2)464*e1eccf28SAndroid Build Coastguard Worker extern short2 __attribute__((overloadable)) min(short2 v1, short2 v2) {
465*e1eccf28SAndroid Build Coastguard Worker     short2 r;
466*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
467*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
468*e1eccf28SAndroid Build Coastguard Worker     return r;
469*e1eccf28SAndroid Build Coastguard Worker }
470*e1eccf28SAndroid Build Coastguard Worker 
min(short3 v1,short3 v2)471*e1eccf28SAndroid Build Coastguard Worker extern short3 __attribute__((overloadable)) min(short3 v1, short3 v2) {
472*e1eccf28SAndroid Build Coastguard Worker     short3 r;
473*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
474*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
475*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
476*e1eccf28SAndroid Build Coastguard Worker     return r;
477*e1eccf28SAndroid Build Coastguard Worker }
478*e1eccf28SAndroid Build Coastguard Worker 
min(short4 v1,short4 v2)479*e1eccf28SAndroid Build Coastguard Worker extern short4 __attribute__((overloadable)) min(short4 v1, short4 v2) {
480*e1eccf28SAndroid Build Coastguard Worker     short4 r;
481*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
482*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
483*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
484*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2.w ? v1.w : v2.w;
485*e1eccf28SAndroid Build Coastguard Worker     return r;
486*e1eccf28SAndroid Build Coastguard Worker }
487*e1eccf28SAndroid Build Coastguard Worker 
min(int32_t v1,int32_t v2)488*e1eccf28SAndroid Build Coastguard Worker extern int32_t __attribute__((overloadable)) min(int32_t v1, int32_t v2) {
489*e1eccf28SAndroid Build Coastguard Worker     return v1 < v2 ? v1 : v2;
490*e1eccf28SAndroid Build Coastguard Worker }
491*e1eccf28SAndroid Build Coastguard Worker 
min(int2 v1,int2 v2)492*e1eccf28SAndroid Build Coastguard Worker extern int2 __attribute__((overloadable)) min(int2 v1, int2 v2) {
493*e1eccf28SAndroid Build Coastguard Worker     int2 r;
494*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
495*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
496*e1eccf28SAndroid Build Coastguard Worker     return r;
497*e1eccf28SAndroid Build Coastguard Worker }
498*e1eccf28SAndroid Build Coastguard Worker 
min(int3 v1,int3 v2)499*e1eccf28SAndroid Build Coastguard Worker extern int3 __attribute__((overloadable)) min(int3 v1, int3 v2) {
500*e1eccf28SAndroid Build Coastguard Worker     int3 r;
501*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
502*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
503*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
504*e1eccf28SAndroid Build Coastguard Worker     return r;
505*e1eccf28SAndroid Build Coastguard Worker }
506*e1eccf28SAndroid Build Coastguard Worker 
min(int4 v1,int4 v2)507*e1eccf28SAndroid Build Coastguard Worker extern int4 __attribute__((overloadable)) min(int4 v1, int4 v2) {
508*e1eccf28SAndroid Build Coastguard Worker     int4 r;
509*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
510*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
511*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
512*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2.w ? v1.w : v2.w;
513*e1eccf28SAndroid Build Coastguard Worker     return r;
514*e1eccf28SAndroid Build Coastguard Worker }
515*e1eccf28SAndroid Build Coastguard Worker 
min(uchar v1,uchar v2)516*e1eccf28SAndroid Build Coastguard Worker extern uchar __attribute__((overloadable)) min(uchar v1, uchar v2) {
517*e1eccf28SAndroid Build Coastguard Worker     return v1 < v2 ? v1 : v2;
518*e1eccf28SAndroid Build Coastguard Worker }
519*e1eccf28SAndroid Build Coastguard Worker 
min(uchar2 v1,uchar2 v2)520*e1eccf28SAndroid Build Coastguard Worker extern uchar2 __attribute__((overloadable)) min(uchar2 v1, uchar2 v2) {
521*e1eccf28SAndroid Build Coastguard Worker     uchar2 r;
522*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
523*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
524*e1eccf28SAndroid Build Coastguard Worker     return r;
525*e1eccf28SAndroid Build Coastguard Worker }
526*e1eccf28SAndroid Build Coastguard Worker 
min(uchar3 v1,uchar3 v2)527*e1eccf28SAndroid Build Coastguard Worker extern uchar3 __attribute__((overloadable)) min(uchar3 v1, uchar3 v2) {
528*e1eccf28SAndroid Build Coastguard Worker     uchar3 r;
529*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
530*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
531*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
532*e1eccf28SAndroid Build Coastguard Worker     return r;
533*e1eccf28SAndroid Build Coastguard Worker }
534*e1eccf28SAndroid Build Coastguard Worker 
min(uchar4 v1,uchar4 v2)535*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) min(uchar4 v1, uchar4 v2) {
536*e1eccf28SAndroid Build Coastguard Worker     uchar4 r;
537*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
538*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
539*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
540*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2.w ? v1.w : v2.w;
541*e1eccf28SAndroid Build Coastguard Worker     return r;
542*e1eccf28SAndroid Build Coastguard Worker }
543*e1eccf28SAndroid Build Coastguard Worker 
min(ushort v1,ushort v2)544*e1eccf28SAndroid Build Coastguard Worker extern ushort __attribute__((overloadable)) min(ushort v1, ushort v2) {
545*e1eccf28SAndroid Build Coastguard Worker     return v1 < v2 ? v1 : v2;
546*e1eccf28SAndroid Build Coastguard Worker }
547*e1eccf28SAndroid Build Coastguard Worker 
min(ushort2 v1,ushort2 v2)548*e1eccf28SAndroid Build Coastguard Worker extern ushort2 __attribute__((overloadable)) min(ushort2 v1, ushort2 v2) {
549*e1eccf28SAndroid Build Coastguard Worker     ushort2 r;
550*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
551*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
552*e1eccf28SAndroid Build Coastguard Worker     return r;
553*e1eccf28SAndroid Build Coastguard Worker }
554*e1eccf28SAndroid Build Coastguard Worker 
min(ushort3 v1,ushort3 v2)555*e1eccf28SAndroid Build Coastguard Worker extern ushort3 __attribute__((overloadable)) min(ushort3 v1, ushort3 v2) {
556*e1eccf28SAndroid Build Coastguard Worker     ushort3 r;
557*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
558*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
559*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
560*e1eccf28SAndroid Build Coastguard Worker     return r;
561*e1eccf28SAndroid Build Coastguard Worker }
562*e1eccf28SAndroid Build Coastguard Worker 
min(ushort4 v1,ushort4 v2)563*e1eccf28SAndroid Build Coastguard Worker extern ushort4 __attribute__((overloadable)) min(ushort4 v1, ushort4 v2) {
564*e1eccf28SAndroid Build Coastguard Worker     ushort4 r;
565*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
566*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
567*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
568*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2.w ? v1.w : v2.w;
569*e1eccf28SAndroid Build Coastguard Worker     return r;
570*e1eccf28SAndroid Build Coastguard Worker }
571*e1eccf28SAndroid Build Coastguard Worker 
min(uint v1,uint v2)572*e1eccf28SAndroid Build Coastguard Worker extern uint __attribute__((overloadable)) min(uint v1, uint v2) {
573*e1eccf28SAndroid Build Coastguard Worker     return v1 < v2 ? v1 : v2;
574*e1eccf28SAndroid Build Coastguard Worker }
575*e1eccf28SAndroid Build Coastguard Worker 
min(uint2 v1,uint2 v2)576*e1eccf28SAndroid Build Coastguard Worker extern uint2 __attribute__((overloadable)) min(uint2 v1, uint2 v2) {
577*e1eccf28SAndroid Build Coastguard Worker     uint2 r;
578*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
579*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
580*e1eccf28SAndroid Build Coastguard Worker     return r;
581*e1eccf28SAndroid Build Coastguard Worker }
582*e1eccf28SAndroid Build Coastguard Worker 
min(uint3 v1,uint3 v2)583*e1eccf28SAndroid Build Coastguard Worker extern uint3 __attribute__((overloadable)) min(uint3 v1, uint3 v2) {
584*e1eccf28SAndroid Build Coastguard Worker     uint3 r;
585*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
586*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
587*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
588*e1eccf28SAndroid Build Coastguard Worker     return r;
589*e1eccf28SAndroid Build Coastguard Worker }
590*e1eccf28SAndroid Build Coastguard Worker 
min(uint4 v1,uint4 v2)591*e1eccf28SAndroid Build Coastguard Worker extern uint4 __attribute__((overloadable)) min(uint4 v1, uint4 v2) {
592*e1eccf28SAndroid Build Coastguard Worker     uint4 r;
593*e1eccf28SAndroid Build Coastguard Worker     r.x = v1.x < v2.x ? v1.x : v2.x;
594*e1eccf28SAndroid Build Coastguard Worker     r.y = v1.y < v2.y ? v1.y : v2.y;
595*e1eccf28SAndroid Build Coastguard Worker     r.z = v1.z < v2.z ? v1.z : v2.z;
596*e1eccf28SAndroid Build Coastguard Worker     r.w = v1.w < v2.w ? v1.w : v2.w;
597*e1eccf28SAndroid Build Coastguard Worker     return r;
598*e1eccf28SAndroid Build Coastguard Worker }
599*e1eccf28SAndroid Build Coastguard Worker 
min(float v1,float v2)600*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) min(float v1, float v2) {
601*e1eccf28SAndroid Build Coastguard Worker     return fmin(v1, v2);
602*e1eccf28SAndroid Build Coastguard Worker }
603*e1eccf28SAndroid Build Coastguard Worker 
min(float2 v1,float2 v2)604*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) min(float2 v1, float2 v2) {
605*e1eccf28SAndroid Build Coastguard Worker     return fmin(v1, v2);
606*e1eccf28SAndroid Build Coastguard Worker }
607*e1eccf28SAndroid Build Coastguard Worker 
min(float2 v1,float v2)608*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) min(float2 v1, float v2) {
609*e1eccf28SAndroid Build Coastguard Worker     return fmin(v1, v2);
610*e1eccf28SAndroid Build Coastguard Worker }
611*e1eccf28SAndroid Build Coastguard Worker 
min(float3 v1,float3 v2)612*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) min(float3 v1, float3 v2) {
613*e1eccf28SAndroid Build Coastguard Worker     return fmin(v1, v2);
614*e1eccf28SAndroid Build Coastguard Worker }
615*e1eccf28SAndroid Build Coastguard Worker 
min(float3 v1,float v2)616*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) min(float3 v1, float v2) {
617*e1eccf28SAndroid Build Coastguard Worker     return fmin(v1, v2);
618*e1eccf28SAndroid Build Coastguard Worker }
619*e1eccf28SAndroid Build Coastguard Worker 
min(float4 v1,float4 v2)620*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) min(float4 v1, float4 v2) {
621*e1eccf28SAndroid Build Coastguard Worker     return fmin(v1, v2);
622*e1eccf28SAndroid Build Coastguard Worker }
623*e1eccf28SAndroid Build Coastguard Worker 
min(float4 v1,float v2)624*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) min(float4 v1, float v2) {
625*e1eccf28SAndroid Build Coastguard Worker     return fmin(v1, v2);
626*e1eccf28SAndroid Build Coastguard Worker }
627*e1eccf28SAndroid Build Coastguard Worker 
628*e1eccf28SAndroid Build Coastguard Worker /*
629*e1eccf28SAndroid Build Coastguard Worker  * YUV
630*e1eccf28SAndroid Build Coastguard Worker  */
631*e1eccf28SAndroid Build Coastguard Worker 
rsYuvToRGBA_uchar4(uchar y,uchar u,uchar v)632*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v) {
633*e1eccf28SAndroid Build Coastguard Worker     short Y = ((short)y) - 16;
634*e1eccf28SAndroid Build Coastguard Worker     short U = ((short)u) - 128;
635*e1eccf28SAndroid Build Coastguard Worker     short V = ((short)v) - 128;
636*e1eccf28SAndroid Build Coastguard Worker 
637*e1eccf28SAndroid Build Coastguard Worker     short4 p;
638*e1eccf28SAndroid Build Coastguard Worker     p.r = (Y * 298 + V * 409 + 128) >> 8;
639*e1eccf28SAndroid Build Coastguard Worker     p.g = (Y * 298 - U * 100 - V * 208 + 128) >> 8;
640*e1eccf28SAndroid Build Coastguard Worker     p.b = (Y * 298 + U * 516 + 128) >> 8;
641*e1eccf28SAndroid Build Coastguard Worker     p.a = 255;
642*e1eccf28SAndroid Build Coastguard Worker     p.r = rsClamp(p.r, (short)0, (short)255);
643*e1eccf28SAndroid Build Coastguard Worker     p.g = rsClamp(p.g, (short)0, (short)255);
644*e1eccf28SAndroid Build Coastguard Worker     p.b = rsClamp(p.b, (short)0, (short)255);
645*e1eccf28SAndroid Build Coastguard Worker 
646*e1eccf28SAndroid Build Coastguard Worker     return convert_uchar4(p);
647*e1eccf28SAndroid Build Coastguard Worker }
648*e1eccf28SAndroid Build Coastguard Worker 
649*e1eccf28SAndroid Build Coastguard Worker /*
650*e1eccf28SAndroid Build Coastguard Worker  * half_RECIP
651*e1eccf28SAndroid Build Coastguard Worker  */
652*e1eccf28SAndroid Build Coastguard Worker 
half_recip(float2 v)653*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) half_recip(float2 v) {
654*e1eccf28SAndroid Build Coastguard Worker     return ((float2) 1.f) / v;
655*e1eccf28SAndroid Build Coastguard Worker }
656*e1eccf28SAndroid Build Coastguard Worker 
half_recip(float3 v)657*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) half_recip(float3 v) {
658*e1eccf28SAndroid Build Coastguard Worker     return ((float3) 1.f) / v;
659*e1eccf28SAndroid Build Coastguard Worker }
660*e1eccf28SAndroid Build Coastguard Worker 
half_recip(float4 v)661*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) half_recip(float4 v) {
662*e1eccf28SAndroid Build Coastguard Worker     return ((float4) 1.f) / v;
663*e1eccf28SAndroid Build Coastguard Worker }
664*e1eccf28SAndroid Build Coastguard Worker 
665*e1eccf28SAndroid Build Coastguard Worker 
666*e1eccf28SAndroid Build Coastguard Worker 
667*e1eccf28SAndroid Build Coastguard Worker /*
668*e1eccf28SAndroid Build Coastguard Worker  * half_rsqrt
669*e1eccf28SAndroid Build Coastguard Worker  */
670*e1eccf28SAndroid Build Coastguard Worker 
half_rsqrt(float v)671*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) half_rsqrt(float v) {
672*e1eccf28SAndroid Build Coastguard Worker     return 1.f / sqrt(v);
673*e1eccf28SAndroid Build Coastguard Worker }
674*e1eccf28SAndroid Build Coastguard Worker 
half_rsqrt(float2 v)675*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) half_rsqrt(float2 v) {
676*e1eccf28SAndroid Build Coastguard Worker     float2 r;
677*e1eccf28SAndroid Build Coastguard Worker     r.x = half_rsqrt(v.x);
678*e1eccf28SAndroid Build Coastguard Worker     r.y = half_rsqrt(v.y);
679*e1eccf28SAndroid Build Coastguard Worker     return r;
680*e1eccf28SAndroid Build Coastguard Worker }
681*e1eccf28SAndroid Build Coastguard Worker 
half_rsqrt(float3 v)682*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) half_rsqrt(float3 v) {
683*e1eccf28SAndroid Build Coastguard Worker     float3 r;
684*e1eccf28SAndroid Build Coastguard Worker     r.x = half_rsqrt(v.x);
685*e1eccf28SAndroid Build Coastguard Worker     r.y = half_rsqrt(v.y);
686*e1eccf28SAndroid Build Coastguard Worker     r.z = half_rsqrt(v.z);
687*e1eccf28SAndroid Build Coastguard Worker     return r;
688*e1eccf28SAndroid Build Coastguard Worker }
689*e1eccf28SAndroid Build Coastguard Worker 
half_rsqrt(float4 v)690*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) half_rsqrt(float4 v) {
691*e1eccf28SAndroid Build Coastguard Worker     float4 r;
692*e1eccf28SAndroid Build Coastguard Worker     r.x = half_rsqrt(v.x);
693*e1eccf28SAndroid Build Coastguard Worker     r.y = half_rsqrt(v.y);
694*e1eccf28SAndroid Build Coastguard Worker     r.z = half_rsqrt(v.z);
695*e1eccf28SAndroid Build Coastguard Worker     r.w = half_rsqrt(v.w);
696*e1eccf28SAndroid Build Coastguard Worker     return r;
697*e1eccf28SAndroid Build Coastguard Worker }
698*e1eccf28SAndroid Build Coastguard Worker 
699*e1eccf28SAndroid Build Coastguard Worker /**
700*e1eccf28SAndroid Build Coastguard Worker  * matrix ops
701*e1eccf28SAndroid Build Coastguard Worker  */
702*e1eccf28SAndroid Build Coastguard Worker 
703*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable))
rsMatrixMultiply(const rs_matrix4x4 * m,float4 in)704*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(const rs_matrix4x4 *m, float4 in) {
705*e1eccf28SAndroid Build Coastguard Worker     float4 ret;
706*e1eccf28SAndroid Build Coastguard Worker     ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + (m->m[12] * in.w);
707*e1eccf28SAndroid Build Coastguard Worker     ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + (m->m[13] * in.w);
708*e1eccf28SAndroid Build Coastguard Worker     ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + (m->m[14] * in.w);
709*e1eccf28SAndroid Build Coastguard Worker     ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + (m->m[15] * in.w);
710*e1eccf28SAndroid Build Coastguard Worker     return ret;
711*e1eccf28SAndroid Build Coastguard Worker }
712*e1eccf28SAndroid Build Coastguard Worker 
713*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable))
rsMatrixMultiply(const rs_matrix4x4 * m,float3 in)714*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(const rs_matrix4x4 *m, float3 in) {
715*e1eccf28SAndroid Build Coastguard Worker     float4 ret;
716*e1eccf28SAndroid Build Coastguard Worker     ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + m->m[12];
717*e1eccf28SAndroid Build Coastguard Worker     ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + m->m[13];
718*e1eccf28SAndroid Build Coastguard Worker     ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + m->m[14];
719*e1eccf28SAndroid Build Coastguard Worker     ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + m->m[15];
720*e1eccf28SAndroid Build Coastguard Worker     return ret;
721*e1eccf28SAndroid Build Coastguard Worker }
722*e1eccf28SAndroid Build Coastguard Worker 
723*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable))
rsMatrixMultiply(const rs_matrix4x4 * m,float2 in)724*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(const rs_matrix4x4 *m, float2 in) {
725*e1eccf28SAndroid Build Coastguard Worker     float4 ret;
726*e1eccf28SAndroid Build Coastguard Worker     ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + m->m[12];
727*e1eccf28SAndroid Build Coastguard Worker     ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + m->m[13];
728*e1eccf28SAndroid Build Coastguard Worker     ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + m->m[14];
729*e1eccf28SAndroid Build Coastguard Worker     ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + m->m[15];
730*e1eccf28SAndroid Build Coastguard Worker     return ret;
731*e1eccf28SAndroid Build Coastguard Worker }
732*e1eccf28SAndroid Build Coastguard Worker 
733*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable))
rsMatrixMultiply(const rs_matrix3x3 * m,float3 in)734*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(const rs_matrix3x3 *m, float3 in) {
735*e1eccf28SAndroid Build Coastguard Worker     float3 ret;
736*e1eccf28SAndroid Build Coastguard Worker     ret.x = (m->m[0] * in.x) + (m->m[3] * in.y) + (m->m[6] * in.z);
737*e1eccf28SAndroid Build Coastguard Worker     ret.y = (m->m[1] * in.x) + (m->m[4] * in.y) + (m->m[7] * in.z);
738*e1eccf28SAndroid Build Coastguard Worker     ret.z = (m->m[2] * in.x) + (m->m[5] * in.y) + (m->m[8] * in.z);
739*e1eccf28SAndroid Build Coastguard Worker     return ret;
740*e1eccf28SAndroid Build Coastguard Worker }
741*e1eccf28SAndroid Build Coastguard Worker 
742*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable))
rsMatrixMultiply(const rs_matrix3x3 * m,float2 in)743*e1eccf28SAndroid Build Coastguard Worker rsMatrixMultiply(const rs_matrix3x3 *m, float2 in) {
744*e1eccf28SAndroid Build Coastguard Worker     float3 ret;
745*e1eccf28SAndroid Build Coastguard Worker     ret.x = (m->m[0] * in.x) + (m->m[3] * in.y);
746*e1eccf28SAndroid Build Coastguard Worker     ret.y = (m->m[1] * in.x) + (m->m[4] * in.y);
747*e1eccf28SAndroid Build Coastguard Worker     ret.z = (m->m[2] * in.x) + (m->m[5] * in.y);
748*e1eccf28SAndroid Build Coastguard Worker     return ret;
749*e1eccf28SAndroid Build Coastguard Worker }
750*e1eccf28SAndroid Build Coastguard Worker 
751*e1eccf28SAndroid Build Coastguard Worker /**
752*e1eccf28SAndroid Build Coastguard Worker  * Pixel Ops
753*e1eccf28SAndroid Build Coastguard Worker  */
rsPackColorTo8888(float r,float g,float b)754*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b)
755*e1eccf28SAndroid Build Coastguard Worker {
756*e1eccf28SAndroid Build Coastguard Worker     uchar4 c;
757*e1eccf28SAndroid Build Coastguard Worker     c.x = (uchar)clamp((r * 255.f + 0.5f), 0.f, 255.f);
758*e1eccf28SAndroid Build Coastguard Worker     c.y = (uchar)clamp((g * 255.f + 0.5f), 0.f, 255.f);
759*e1eccf28SAndroid Build Coastguard Worker     c.z = (uchar)clamp((b * 255.f + 0.5f), 0.f, 255.f);
760*e1eccf28SAndroid Build Coastguard Worker     c.w = 255;
761*e1eccf28SAndroid Build Coastguard Worker     return c;
762*e1eccf28SAndroid Build Coastguard Worker }
763*e1eccf28SAndroid Build Coastguard Worker 
rsPackColorTo8888(float r,float g,float b,float a)764*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a)
765*e1eccf28SAndroid Build Coastguard Worker {
766*e1eccf28SAndroid Build Coastguard Worker     uchar4 c;
767*e1eccf28SAndroid Build Coastguard Worker     c.x = (uchar)clamp((r * 255.f + 0.5f), 0.f, 255.f);
768*e1eccf28SAndroid Build Coastguard Worker     c.y = (uchar)clamp((g * 255.f + 0.5f), 0.f, 255.f);
769*e1eccf28SAndroid Build Coastguard Worker     c.z = (uchar)clamp((b * 255.f + 0.5f), 0.f, 255.f);
770*e1eccf28SAndroid Build Coastguard Worker     c.w = (uchar)clamp((a * 255.f + 0.5f), 0.f, 255.f);
771*e1eccf28SAndroid Build Coastguard Worker     return c;
772*e1eccf28SAndroid Build Coastguard Worker }
773*e1eccf28SAndroid Build Coastguard Worker 
rsPackColorTo8888(float3 color)774*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color)
775*e1eccf28SAndroid Build Coastguard Worker {
776*e1eccf28SAndroid Build Coastguard Worker     color *= 255.f;
777*e1eccf28SAndroid Build Coastguard Worker     color += 0.5f;
778*e1eccf28SAndroid Build Coastguard Worker     color = clamp(color, 0.f, 255.f);
779*e1eccf28SAndroid Build Coastguard Worker     uchar4 c = {color.x, color.y, color.z, 255};
780*e1eccf28SAndroid Build Coastguard Worker     return c;
781*e1eccf28SAndroid Build Coastguard Worker }
782*e1eccf28SAndroid Build Coastguard Worker 
rsPackColorTo8888(float4 color)783*e1eccf28SAndroid Build Coastguard Worker extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color)
784*e1eccf28SAndroid Build Coastguard Worker {
785*e1eccf28SAndroid Build Coastguard Worker     color *= 255.f;
786*e1eccf28SAndroid Build Coastguard Worker     color += 0.5f;
787*e1eccf28SAndroid Build Coastguard Worker     color = clamp(color, 0.f, 255.f);
788*e1eccf28SAndroid Build Coastguard Worker     uchar4 c = {color.x, color.y, color.z, color.w};
789*e1eccf28SAndroid Build Coastguard Worker     return c;
790*e1eccf28SAndroid Build Coastguard Worker }
791