blob: 1ca093fdf4c0e9303ad03707c046162e3a60a150 [file] [log] [blame]
Jason Sams1b937f52010-06-09 14:26:16 -07001#ifndef __RS_CL_RSH__
2#define __RS_CL_RSH__
3
Stephen Hinesf6a28c62011-01-18 16:53:19 -08004#ifdef BCC_PREPARE_BC
5#define _RS_STATIC extern
6#else
7#define _RS_STATIC static
8#endif
Jason Sams1b937f52010-06-09 14:26:16 -07009
Stephen Hinesf6a28c62011-01-18 16:53:19 -080010#define M_PI 3.14159265358979323846264338327950288f /* pi */
Jason Sams1b937f52010-06-09 14:26:16 -070011
12// Conversions
13#define CVT_FUNC_2(typeout, typein) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080014_RS_STATIC typeout##2 __attribute__((overloadable)) convert_##typeout##2(typein##2 v) { \
Jason Sams5e9811f2010-06-21 17:42:41 -070015 typeout##2 r = {(typeout)v.x, (typeout)v.y}; \
Jason Sams1b937f52010-06-09 14:26:16 -070016 return r; \
17} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080018_RS_STATIC typeout##3 __attribute__((overloadable)) convert_##typeout##3(typein##3 v) { \
Jason Sams5e9811f2010-06-21 17:42:41 -070019 typeout##3 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z}; \
Jason Sams1b937f52010-06-09 14:26:16 -070020 return r; \
21} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080022_RS_STATIC typeout##4 __attribute__((overloadable)) convert_##typeout##4(typein##4 v) { \
Jason Sams5e9811f2010-06-21 17:42:41 -070023 typeout##4 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z, (typeout)v.w}; \
Jason Sams1b937f52010-06-09 14:26:16 -070024 return r; \
25}
26
27#define CVT_FUNC(type) CVT_FUNC_2(type, uchar) \
28 CVT_FUNC_2(type, char) \
29 CVT_FUNC_2(type, ushort) \
30 CVT_FUNC_2(type, short) \
Jason Sams1b937f52010-06-09 14:26:16 -070031 CVT_FUNC_2(type, uint) \
Stephen Hines47416532011-01-11 14:38:18 -080032 CVT_FUNC_2(type, int) \
Jason Sams1b937f52010-06-09 14:26:16 -070033 CVT_FUNC_2(type, float)
34
35CVT_FUNC(char)
36CVT_FUNC(uchar)
37CVT_FUNC(short)
38CVT_FUNC(ushort)
39CVT_FUNC(int)
40CVT_FUNC(uint)
41CVT_FUNC(float)
42
43
44
Jason Sams22fa3712010-05-19 17:22:57 -070045// Float ops, 6.11.2
46
Jason Sams1b937f52010-06-09 14:26:16 -070047#define DEF_FUNC_1(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080048_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v) { \
Jason Sams1b937f52010-06-09 14:26:16 -070049 float2 r; \
50 r.x = fnc(v.x); \
51 r.y = fnc(v.y); \
52 return r; \
53} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080054_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v) { \
Jason Sams1b937f52010-06-09 14:26:16 -070055 float3 r; \
56 r.x = fnc(v.x); \
57 r.y = fnc(v.y); \
58 r.z = fnc(v.z); \
59 return r; \
60} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080061_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v) { \
Jason Sams1b937f52010-06-09 14:26:16 -070062 float4 r; \
63 r.x = fnc(v.x); \
64 r.y = fnc(v.y); \
65 r.z = fnc(v.z); \
66 r.w = fnc(v.w); \
67 return r; \
68}
69
Stephen Hines47416532011-01-11 14:38:18 -080070#define DEF_FUNC_1_RI(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080071_RS_STATIC int2 __attribute__((overloadable)) fnc(float2 v) { \
Stephen Hines47416532011-01-11 14:38:18 -080072 int2 r; \
73 r.x = fnc(v.x); \
74 r.y = fnc(v.y); \
75 return r; \
76} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080077_RS_STATIC int3 __attribute__((overloadable)) fnc(float3 v) { \
Stephen Hines47416532011-01-11 14:38:18 -080078 int3 r; \
79 r.x = fnc(v.x); \
80 r.y = fnc(v.y); \
81 r.z = fnc(v.z); \
82 return r; \
83} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080084_RS_STATIC int4 __attribute__((overloadable)) fnc(float4 v) { \
Stephen Hines47416532011-01-11 14:38:18 -080085 int4 r; \
86 r.x = fnc(v.x); \
87 r.y = fnc(v.y); \
88 r.z = fnc(v.z); \
89 r.w = fnc(v.w); \
90 return r; \
91}
92
Jason Sams1b937f52010-06-09 14:26:16 -070093#define DEF_FUNC_2(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080094_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -070095 float2 r; \
96 r.x = fnc(v1.x, v2.x); \
97 r.y = fnc(v1.y, v2.y); \
98 return r; \
99} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800100_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700101 float3 r; \
102 r.x = fnc(v1.x, v2.x); \
103 r.y = fnc(v1.y, v2.y); \
104 r.z = fnc(v1.z, v2.z); \
105 return r; \
106} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800107_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700108 float4 r; \
109 r.x = fnc(v1.x, v2.x); \
110 r.y = fnc(v1.y, v2.y); \
111 r.z = fnc(v1.z, v2.z); \
Stephen Hines32086d82011-01-18 19:39:29 -0800112 r.w = fnc(v1.w, v2.w); \
Jason Sams1b937f52010-06-09 14:26:16 -0700113 return r; \
114}
115
116#define DEF_FUNC_2F(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800117_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700118 float2 r; \
119 r.x = fnc(v1.x, v2); \
120 r.y = fnc(v1.y, v2); \
121 return r; \
122} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800123_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700124 float3 r; \
125 r.x = fnc(v1.x, v2); \
126 r.y = fnc(v1.y, v2); \
127 r.z = fnc(v1.z, v2); \
128 return r; \
129} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800130_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700131 float4 r; \
132 r.x = fnc(v1.x, v2); \
133 r.y = fnc(v1.y, v2); \
134 r.z = fnc(v1.z, v2); \
135 r.w = fnc(v1.w, v2); \
136 return r; \
137}
138
Stephen Hines32086d82011-01-18 19:39:29 -0800139#define DEF_FUNC_2P(fnc) \
140_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 *v2) { \
141 float2 r; \
142 float q; \
143 r.x = fnc(v1.x, &q); \
144 v2->x = q; \
145 r.y = fnc(v1.y, &q); \
146 v2->y = q; \
147 return r; \
148} \
149_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 *v2) { \
150 float3 r; \
151 float q; \
152 r.x = fnc(v1.x, &q); \
153 v2->x = q; \
154 r.y = fnc(v1.y, &q); \
155 v2->y = q; \
156 r.z = fnc(v1.z, &q); \
157 v2->z = q; \
158 return r; \
159} \
160_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 *v2) { \
161 float4 r; \
162 float q; \
163 r.x = fnc(v1.x, &q); \
164 v2->x = q; \
165 r.y = fnc(v1.y, &q); \
166 v2->y = q; \
167 r.z = fnc(v1.z, &q); \
168 v2->z = q; \
169 r.w = fnc(v1.w, &q); \
170 v2->w = q; \
171 return r; \
172}
Jason Sams1b937f52010-06-09 14:26:16 -0700173
Jason Sams22fa3712010-05-19 17:22:57 -0700174extern float __attribute__((overloadable)) acos(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700175DEF_FUNC_1(acos)
Jason Sams22fa3712010-05-19 17:22:57 -0700176
177extern float __attribute__((overloadable)) acosh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700178DEF_FUNC_1(acosh)
Jason Sams22fa3712010-05-19 17:22:57 -0700179
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800180_RS_STATIC float __attribute__((overloadable)) acospi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700181 return acos(v) / M_PI;
182}
183DEF_FUNC_1(acospi)
Jason Sams22fa3712010-05-19 17:22:57 -0700184
185extern float __attribute__((overloadable)) asin(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700186DEF_FUNC_1(asin)
Jason Sams22fa3712010-05-19 17:22:57 -0700187
188extern float __attribute__((overloadable)) asinh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700189DEF_FUNC_1(asinh)
Jason Sams22fa3712010-05-19 17:22:57 -0700190
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800191_RS_STATIC float __attribute__((overloadable)) asinpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700192 return asin(v) / M_PI;
193}
194DEF_FUNC_1(asinpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700195
196extern float __attribute__((overloadable)) atan(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700197DEF_FUNC_1(atan)
Jason Sams22fa3712010-05-19 17:22:57 -0700198
199extern float __attribute__((overloadable)) atan2(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700200DEF_FUNC_2(atan2)
Jason Sams22fa3712010-05-19 17:22:57 -0700201
202extern float __attribute__((overloadable)) atanh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700203DEF_FUNC_1(atanh)
Jason Sams22fa3712010-05-19 17:22:57 -0700204
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800205_RS_STATIC float __attribute__((overloadable)) atanpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700206 return atan(v) / M_PI;
207}
208DEF_FUNC_1(atanpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700209
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800210_RS_STATIC float __attribute__((overloadable)) atan2pi(float y, float x) {
Jason Sams1b937f52010-06-09 14:26:16 -0700211 return atan2(y, x) / M_PI;
212}
213DEF_FUNC_2(atan2pi)
Jason Sams22fa3712010-05-19 17:22:57 -0700214
215extern float __attribute__((overloadable)) cbrt(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700216DEF_FUNC_1(cbrt)
Jason Sams22fa3712010-05-19 17:22:57 -0700217
218extern float __attribute__((overloadable)) ceil(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700219DEF_FUNC_1(ceil)
Jason Sams22fa3712010-05-19 17:22:57 -0700220
221extern float __attribute__((overloadable)) copysign(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700222DEF_FUNC_2(copysign)
Jason Sams22fa3712010-05-19 17:22:57 -0700223
224extern float __attribute__((overloadable)) cos(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700225DEF_FUNC_1(cos)
Jason Sams22fa3712010-05-19 17:22:57 -0700226
227extern float __attribute__((overloadable)) cosh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700228DEF_FUNC_1(cosh)
Jason Sams22fa3712010-05-19 17:22:57 -0700229
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800230_RS_STATIC float __attribute__((overloadable)) cospi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700231 return cos(v * M_PI);
232}
233DEF_FUNC_1(cospi)
Jason Sams22fa3712010-05-19 17:22:57 -0700234
235extern float __attribute__((overloadable)) erfc(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700236DEF_FUNC_1(erfc)
Jason Sams22fa3712010-05-19 17:22:57 -0700237
238extern float __attribute__((overloadable)) erf(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700239DEF_FUNC_1(erf)
Jason Sams22fa3712010-05-19 17:22:57 -0700240
241extern float __attribute__((overloadable)) exp(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700242DEF_FUNC_1(exp)
Jason Sams22fa3712010-05-19 17:22:57 -0700243
244extern float __attribute__((overloadable)) exp2(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700245DEF_FUNC_1(exp2)
Jason Sams22fa3712010-05-19 17:22:57 -0700246
Jason Sams1b937f52010-06-09 14:26:16 -0700247extern float __attribute__((overloadable)) pow(float, float);
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800248_RS_STATIC float __attribute__((overloadable)) exp10(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700249 return pow(10.f, v);
250}
251DEF_FUNC_1(exp10)
Jason Sams22fa3712010-05-19 17:22:57 -0700252
253extern float __attribute__((overloadable)) expm1(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700254DEF_FUNC_1(expm1)
Jason Sams22fa3712010-05-19 17:22:57 -0700255
256extern float __attribute__((overloadable)) fabs(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700257DEF_FUNC_1(fabs)
Jason Sams22fa3712010-05-19 17:22:57 -0700258
259extern float __attribute__((overloadable)) fdim(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700260DEF_FUNC_2(fdim)
Jason Sams22fa3712010-05-19 17:22:57 -0700261
262extern float __attribute__((overloadable)) floor(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700263DEF_FUNC_1(floor)
Jason Sams22fa3712010-05-19 17:22:57 -0700264
265extern float __attribute__((overloadable)) fma(float, float, float);
266extern float2 __attribute__((overloadable)) fma(float2, float2, float2);
267extern float3 __attribute__((overloadable)) fma(float3, float3, float3);
268extern float4 __attribute__((overloadable)) fma(float4, float4, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700269
270extern float __attribute__((overloadable)) fmax(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700271DEF_FUNC_2(fmax);
272DEF_FUNC_2F(fmax);
Jason Sams22fa3712010-05-19 17:22:57 -0700273
274extern float __attribute__((overloadable)) fmin(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700275DEF_FUNC_2(fmin);
276DEF_FUNC_2F(fmin);
Jason Sams22fa3712010-05-19 17:22:57 -0700277
278extern float __attribute__((overloadable)) fmod(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700279DEF_FUNC_2(fmod)
Jason Sams22fa3712010-05-19 17:22:57 -0700280
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800281_RS_STATIC float __attribute__((overloadable)) fract(float v, float *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700282 int i = (int)floor(v);
283 iptr[0] = i;
284 return fmin(v - i, 0x1.fffffep-1f);
285}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800286_RS_STATIC float2 __attribute__((overloadable)) fract(float2 v, float2 *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700287 float t[2];
288 float2 r;
289 r.x = fract(v.x, &t[0]);
290 r.y = fract(v.y, &t[1]);
291 iptr[0] = t[0];
292 iptr[1] = t[1];
293 return r;
294}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800295_RS_STATIC float3 __attribute__((overloadable)) fract(float3 v, float3 *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700296 float t[3];
297 float3 r;
298 r.x = fract(v.x, &t[0]);
299 r.y = fract(v.y, &t[1]);
300 r.z = fract(v.z, &t[2]);
301 iptr[0] = t[0];
302 iptr[1] = t[1];
303 iptr[2] = t[2];
304 return r;
305}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800306_RS_STATIC float4 __attribute__((overloadable)) fract(float4 v, float4 *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700307 float t[4];
308 float4 r;
309 r.x = fract(v.x, &t[0]);
310 r.y = fract(v.y, &t[1]);
311 r.z = fract(v.z, &t[2]);
312 r.w = fract(v.w, &t[3]);
313 iptr[0] = t[0];
314 iptr[1] = t[1];
315 iptr[2] = t[2];
316 iptr[3] = t[3];
317 return r;
318}
Jason Sams22fa3712010-05-19 17:22:57 -0700319
320extern float __attribute__((overloadable)) frexp(float, float *);
321extern float2 __attribute__((overloadable)) frexp(float2, float2 *);
322extern float3 __attribute__((overloadable)) frexp(float3, float3 *);
323extern float4 __attribute__((overloadable)) frexp(float4, float4 *);
Jason Sams22fa3712010-05-19 17:22:57 -0700324
325extern float __attribute__((overloadable)) hypot(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700326DEF_FUNC_2(hypot)
Jason Sams22fa3712010-05-19 17:22:57 -0700327
328extern int __attribute__((overloadable)) ilogb(float);
Stephen Hines47416532011-01-11 14:38:18 -0800329DEF_FUNC_1_RI(ilogb)
Jason Sams22fa3712010-05-19 17:22:57 -0700330
331extern float __attribute__((overloadable)) ldexp(float, int);
332extern float2 __attribute__((overloadable)) ldexp(float2, int2);
333extern float3 __attribute__((overloadable)) ldexp(float3, int3);
334extern float4 __attribute__((overloadable)) ldexp(float4, int4);
Jason Sams22fa3712010-05-19 17:22:57 -0700335extern float2 __attribute__((overloadable)) ldexp(float2, int);
336extern float3 __attribute__((overloadable)) ldexp(float3, int);
337extern float4 __attribute__((overloadable)) ldexp(float4, int);
Jason Sams22fa3712010-05-19 17:22:57 -0700338
339extern float __attribute__((overloadable)) lgamma(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700340DEF_FUNC_1(lgamma)
Jason Sams22fa3712010-05-19 17:22:57 -0700341extern float __attribute__((overloadable)) lgamma(float, float *);
342extern float2 __attribute__((overloadable)) lgamma(float2, float2 *);
343extern float3 __attribute__((overloadable)) lgamma(float3, float3 *);
344extern float4 __attribute__((overloadable)) lgamma(float4, float4 *);
Jason Sams22fa3712010-05-19 17:22:57 -0700345
346extern float __attribute__((overloadable)) log(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700347DEF_FUNC_1(log)
Jason Sams22fa3712010-05-19 17:22:57 -0700348
Jason Sams22fa3712010-05-19 17:22:57 -0700349
350extern float __attribute__((overloadable)) log10(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700351DEF_FUNC_1(log10)
352
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800353_RS_STATIC float __attribute__((overloadable)) log2(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700354 return log10(v) / log10(2.f);
355}
356DEF_FUNC_1(log2)
Jason Sams22fa3712010-05-19 17:22:57 -0700357
358extern float __attribute__((overloadable)) log1p(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700359DEF_FUNC_1(log1p)
Jason Sams22fa3712010-05-19 17:22:57 -0700360
361extern float __attribute__((overloadable)) logb(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700362DEF_FUNC_1(logb)
Jason Sams22fa3712010-05-19 17:22:57 -0700363
364extern float __attribute__((overloadable)) mad(float, float, float);
365extern float2 __attribute__((overloadable)) mad(float2, float2, float2);
366extern float3 __attribute__((overloadable)) mad(float3, float3, float3);
367extern float4 __attribute__((overloadable)) mad(float4, float4, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700368
369extern float __attribute__((overloadable)) modf(float, float *);
Stephen Hines32086d82011-01-18 19:39:29 -0800370DEF_FUNC_2P(modf);
Jason Sams22fa3712010-05-19 17:22:57 -0700371
Jason Sams1b937f52010-06-09 14:26:16 -0700372//extern float __attribute__((overloadable)) nan(uint);
Jason Sams22fa3712010-05-19 17:22:57 -0700373
374extern float __attribute__((overloadable)) nextafter(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700375DEF_FUNC_2(nextafter)
Jason Sams22fa3712010-05-19 17:22:57 -0700376
Jason Sams1b937f52010-06-09 14:26:16 -0700377DEF_FUNC_2(pow)
Jason Sams22fa3712010-05-19 17:22:57 -0700378
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800379_RS_STATIC float __attribute__((overloadable)) pown(float v, int p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700380 return pow(v, (float)p);
381}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800382_RS_STATIC float2 __attribute__((overloadable)) pown(float2 v, int2 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700383 return pow(v, (float2)p);
384}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800385_RS_STATIC float3 __attribute__((overloadable)) pown(float3 v, int3 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700386 return pow(v, (float3)p);
387}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800388_RS_STATIC float4 __attribute__((overloadable)) pown(float4 v, int4 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700389 return pow(v, (float4)p);
390}
Jason Sams22fa3712010-05-19 17:22:57 -0700391
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800392_RS_STATIC float __attribute__((overloadable)) powr(float v, float p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700393 return pow(v, p);
394}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800395_RS_STATIC float2 __attribute__((overloadable)) powr(float2 v, float2 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700396 return pow(v, p);
397}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800398_RS_STATIC float3 __attribute__((overloadable)) powr(float3 v, float3 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700399 return pow(v, p);
400}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800401_RS_STATIC float4 __attribute__((overloadable)) powr(float4 v, float4 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700402 return pow(v, p);
403}
Jason Sams22fa3712010-05-19 17:22:57 -0700404
405extern float __attribute__((overloadable)) remainder(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700406DEF_FUNC_2(remainder)
Jason Sams22fa3712010-05-19 17:22:57 -0700407
Stephen Hines47416532011-01-11 14:38:18 -0800408extern float __attribute__((overloadable)) remquo(float, float, int *);
409extern float2 __attribute__((overloadable)) remquo(float2, float2, int2 *);
410extern float3 __attribute__((overloadable)) remquo(float3, float3, int3 *);
411extern float4 __attribute__((overloadable)) remquo(float4, float4, int4 *);
Jason Sams22fa3712010-05-19 17:22:57 -0700412
413extern float __attribute__((overloadable)) rint(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700414DEF_FUNC_1(rint)
Jason Sams22fa3712010-05-19 17:22:57 -0700415
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800416_RS_STATIC float __attribute__((overloadable)) rootn(float v, int r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700417 return pow(v, 1.f / r);
418}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800419_RS_STATIC float2 __attribute__((overloadable)) rootn(float2 v, int2 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700420 float2 t = {1.f / r.x, 1.f / r.y};
421 return pow(v, t);
422}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800423_RS_STATIC float3 __attribute__((overloadable)) rootn(float3 v, int3 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700424 float3 t = {1.f / r.x, 1.f / r.y, 1.f / r.z};
425 return pow(v, t);
426}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800427_RS_STATIC float4 __attribute__((overloadable)) rootn(float4 v, int4 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700428 float4 t = {1.f / r.x, 1.f / r.y, 1.f / r.z, 1.f / r.w};
429 return pow(v, t);
430}
Jason Sams22fa3712010-05-19 17:22:57 -0700431
432extern float __attribute__((overloadable)) round(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700433DEF_FUNC_1(round)
Jason Sams22fa3712010-05-19 17:22:57 -0700434
435extern float __attribute__((overloadable)) sqrt(float);
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800436_RS_STATIC float __attribute__((overloadable)) rsqrt(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700437 return 1.f / sqrt(v);
438}
Stephen Hines47416532011-01-11 14:38:18 -0800439DEF_FUNC_1(rsqrt)
Jason Sams1b937f52010-06-09 14:26:16 -0700440
441extern float __attribute__((overloadable)) sin(float);
442DEF_FUNC_1(sin)
443
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800444_RS_STATIC float __attribute__((overloadable)) sincos(float v, float *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700445 *cosptr = cos(v);
446 return sin(v);
447}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800448_RS_STATIC float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700449 *cosptr = cos(v);
450 return sin(v);
451}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800452_RS_STATIC float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700453 *cosptr = cos(v);
454 return sin(v);
455}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800456_RS_STATIC float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700457 *cosptr = cos(v);
458 return sin(v);
459}
460
461extern float __attribute__((overloadable)) sinh(float);
462DEF_FUNC_1(sinh)
463
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800464_RS_STATIC float __attribute__((overloadable)) sinpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700465 return sin(v * M_PI);
466}
467DEF_FUNC_1(sinpi)
468
469DEF_FUNC_1(sqrt)
Jason Sams22fa3712010-05-19 17:22:57 -0700470
471extern float __attribute__((overloadable)) tan(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700472DEF_FUNC_1(tan)
Jason Sams22fa3712010-05-19 17:22:57 -0700473
474extern float __attribute__((overloadable)) tanh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700475DEF_FUNC_1(tanh)
Jason Sams22fa3712010-05-19 17:22:57 -0700476
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800477_RS_STATIC float __attribute__((overloadable)) tanpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700478 return tan(v * M_PI);
479}
480DEF_FUNC_1(tanpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700481
482extern float __attribute__((overloadable)) tgamma(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700483DEF_FUNC_1(tgamma)
Jason Sams22fa3712010-05-19 17:22:57 -0700484
485extern float __attribute__((overloadable)) trunc(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700486DEF_FUNC_1(trunc)
Jason Sams22fa3712010-05-19 17:22:57 -0700487
488// Int ops (partial), 6.11.3
Jason Sams22fa3712010-05-19 17:22:57 -0700489
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800490#define DEF_RIFUNC_1(typeout, typein, fnc) \
491extern typeout __attribute__((overloadable)) fnc(typein); \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800492_RS_STATIC typeout##2 __attribute__((overloadable)) fnc(typein##2 v) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800493 typeout##2 r; \
494 r.x = fnc(v.x); \
495 r.y = fnc(v.y); \
496 return r; \
497} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800498_RS_STATIC typeout##3 __attribute__((overloadable)) fnc(typein##3 v) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800499 typeout##3 r; \
500 r.x = fnc(v.x); \
501 r.y = fnc(v.y); \
502 r.z = fnc(v.z); \
503 return r; \
504} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800505_RS_STATIC typeout##4 __attribute__((overloadable)) fnc(typein##4 v) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800506 typeout##4 r; \
507 r.x = fnc(v.x); \
508 r.y = fnc(v.y); \
509 r.z = fnc(v.z); \
510 r.w = fnc(v.w); \
511 return r; \
Jason Sams1b937f52010-06-09 14:26:16 -0700512}
Jason Sams22fa3712010-05-19 17:22:57 -0700513
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800514#define DEF_UIFUNC_1(fnc) \
515DEF_RIFUNC_1(uchar, char, fnc) \
516DEF_RIFUNC_1(ushort, short, fnc) \
517DEF_RIFUNC_1(uint, int, fnc)
Jason Sams22fa3712010-05-19 17:22:57 -0700518
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800519#define DEF_IFUNC_1(fnc) \
520DEF_RIFUNC_1(uchar, uchar, fnc) \
521DEF_RIFUNC_1(char, char, fnc) \
522DEF_RIFUNC_1(ushort, ushort, fnc) \
523DEF_RIFUNC_1(short, short, fnc) \
524DEF_RIFUNC_1(uint, uint, fnc) \
525DEF_RIFUNC_1(int, int, fnc)
Jason Sams22fa3712010-05-19 17:22:57 -0700526
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800527#define DEF_RIFUNC_2(type, fnc, body) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800528_RS_STATIC type __attribute__((overloadable)) fnc(type v1, type v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800529 return body; \
530} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800531_RS_STATIC type##2 __attribute__((overloadable)) fnc(type##2 v1, type##2 v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800532 type##2 r; \
533 r.x = fnc(v1.x, v2.x); \
534 r.y = fnc(v1.y, v2.y); \
535 return r; \
536} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800537_RS_STATIC type##3 __attribute__((overloadable)) fnc(type##3 v1, type##3 v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800538 type##3 r; \
539 r.x = fnc(v1.x, v2.x); \
540 r.y = fnc(v1.y, v2.y); \
541 r.z = fnc(v1.z, v2.z); \
542 return r; \
543} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800544_RS_STATIC type##4 __attribute__((overloadable)) fnc(type##4 v1, type##4 v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800545 type##4 r; \
546 r.x = fnc(v1.x, v2.x); \
547 r.y = fnc(v1.y, v2.y); \
548 r.z = fnc(v1.z, v2.z); \
549 r.w = fnc(v1.w, v2.w); \
550 return r; \
551} \
Jason Sams22fa3712010-05-19 17:22:57 -0700552
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800553#define DEF_IFUNC_2(fnc, body) \
554DEF_RIFUNC_2(uchar, fnc, body) \
555DEF_RIFUNC_2(char, fnc, body) \
556DEF_RIFUNC_2(ushort, fnc, body) \
557DEF_RIFUNC_2(short, fnc, body) \
558DEF_RIFUNC_2(uint, fnc, body) \
559DEF_RIFUNC_2(int, fnc, body) \
560DEF_RIFUNC_2(float, fnc, body)
561
562DEF_UIFUNC_1(abs)
563DEF_IFUNC_1(clz)
564
565DEF_IFUNC_2(min, (v1 < v2 ? v1 : v2))
566DEF_FUNC_2F(min)
567
568DEF_IFUNC_2(max, (v1 > v2 ? v1 : v2))
569DEF_FUNC_2F(max)
Jason Sams22fa3712010-05-19 17:22:57 -0700570
571// 6.11.4
572
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800573_RS_STATIC float __attribute__((overloadable)) clamp(float amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700574 return amount < low ? low : (amount > high ? high : amount);
575}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800576_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700577 float2 r;
578 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
579 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
580 return r;
581}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800582_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700583 float3 r;
584 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
585 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
586 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
587 return r;
588}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800589_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700590 float4 r;
591 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
592 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
593 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
594 r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);
595 return r;
596}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800597_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700598 float2 r;
599 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
600 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
601 return r;
602}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800603_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700604 float3 r;
605 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
606 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
607 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
608 return r;
609}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800610_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700611 float4 r;
612 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
613 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
614 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
615 r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
616 return r;
617}
Jason Sams22fa3712010-05-19 17:22:57 -0700618
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800619_RS_STATIC float __attribute__((overloadable)) degrees(float radians) {
Jason Sams1b937f52010-06-09 14:26:16 -0700620 return radians * (180.f / M_PI);
621}
622DEF_FUNC_1(degrees)
Jason Sams22fa3712010-05-19 17:22:57 -0700623
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800624_RS_STATIC float __attribute__((overloadable)) mix(float start, float stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700625 return start + (stop - start) * amount;
626}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800627_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700628 return start + (stop - start) * amount;
629}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800630_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700631 return start + (stop - start) * amount;
632}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800633_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700634 return start + (stop - start) * amount;
635}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800636_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700637 return start + (stop - start) * amount;
638}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800639_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700640 return start + (stop - start) * amount;
641}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800642_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700643 return start + (stop - start) * amount;
644}
Jason Sams22fa3712010-05-19 17:22:57 -0700645
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800646_RS_STATIC float __attribute__((overloadable)) radians(float degrees) {
Jason Sams1b937f52010-06-09 14:26:16 -0700647 return degrees * (M_PI / 180.f);
648}
649DEF_FUNC_1(radians)
Jason Sams22fa3712010-05-19 17:22:57 -0700650
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800651_RS_STATIC float __attribute__((overloadable)) step(float edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700652 return (v < edge) ? 0.f : 1.f;
653}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800654_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700655 float2 r;
656 r.x = (v.x < edge.x) ? 0.f : 1.f;
657 r.y = (v.y < edge.y) ? 0.f : 1.f;
658 return r;
659}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800660_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700661 float3 r;
662 r.x = (v.x < edge.x) ? 0.f : 1.f;
663 r.y = (v.y < edge.y) ? 0.f : 1.f;
664 r.z = (v.z < edge.z) ? 0.f : 1.f;
665 return r;
666}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800667_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700668 float4 r;
669 r.x = (v.x < edge.x) ? 0.f : 1.f;
670 r.y = (v.y < edge.y) ? 0.f : 1.f;
671 r.z = (v.z < edge.z) ? 0.f : 1.f;
672 r.w = (v.w < edge.w) ? 0.f : 1.f;
673 return r;
674}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800675_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700676 float2 r;
677 r.x = (v < edge.x) ? 0.f : 1.f;
678 r.y = (v < edge.y) ? 0.f : 1.f;
679 return r;
680}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800681_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700682 float3 r;
683 r.x = (v < edge.x) ? 0.f : 1.f;
684 r.y = (v < edge.y) ? 0.f : 1.f;
685 r.z = (v < edge.z) ? 0.f : 1.f;
686 return r;
687}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800688_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700689 float4 r;
690 r.x = (v < edge.x) ? 0.f : 1.f;
691 r.y = (v < edge.y) ? 0.f : 1.f;
692 r.z = (v < edge.z) ? 0.f : 1.f;
693 r.w = (v < edge.w) ? 0.f : 1.f;
694 return r;
695}
Jason Sams22fa3712010-05-19 17:22:57 -0700696
697extern float __attribute__((overloadable)) smoothstep(float, float, float);
698extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2);
699extern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3);
700extern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700701extern float2 __attribute__((overloadable)) smoothstep(float, float, float2);
702extern float3 __attribute__((overloadable)) smoothstep(float, float, float3);
703extern float4 __attribute__((overloadable)) smoothstep(float, float, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700704
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800705_RS_STATIC float __attribute__((overloadable)) sign(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700706 if (v > 0) return 1.f;
707 if (v < 0) return -1.f;
708 return v;
709}
710DEF_FUNC_1(sign)
Jason Sams22fa3712010-05-19 17:22:57 -0700711
712// 6.11.5
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800713_RS_STATIC float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700714 float3 r;
715 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
716 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
717 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
718 return r;
719}
Jason Sams22fa3712010-05-19 17:22:57 -0700720
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800721_RS_STATIC float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700722 float4 r;
723 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
724 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
725 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
726 r.w = 0.f;
727 return r;
728}
Jason Sams22fa3712010-05-19 17:22:57 -0700729
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800730_RS_STATIC float __attribute__((overloadable)) dot(float lhs, float rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700731 return lhs * rhs;
732}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800733_RS_STATIC float __attribute__((overloadable)) dot(float2 lhs, float2 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700734 return lhs.x*rhs.x + lhs.y*rhs.y;
735}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800736_RS_STATIC float __attribute__((overloadable)) dot(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700737 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z;
738}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800739_RS_STATIC float __attribute__((overloadable)) dot(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700740 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z + lhs.w*rhs.w;
741}
Jason Sams22fa3712010-05-19 17:22:57 -0700742
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800743_RS_STATIC float __attribute__((overloadable)) length(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700744 return v;
745}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800746_RS_STATIC float __attribute__((overloadable)) length(float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700747 return sqrt(v.x*v.x + v.y*v.y);
748}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800749_RS_STATIC float __attribute__((overloadable)) length(float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700750 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
751}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800752_RS_STATIC float __attribute__((overloadable)) length(float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700753 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
754}
Jason Sams22fa3712010-05-19 17:22:57 -0700755
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800756_RS_STATIC float __attribute__((overloadable)) distance(float lhs, float rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700757 return length(lhs - rhs);
758}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800759_RS_STATIC float __attribute__((overloadable)) distance(float2 lhs, float2 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700760 return length(lhs - rhs);
761}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800762_RS_STATIC float __attribute__((overloadable)) distance(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700763 return length(lhs - rhs);
764}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800765_RS_STATIC float __attribute__((overloadable)) distance(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700766 return length(lhs - rhs);
767}
Jason Sams22fa3712010-05-19 17:22:57 -0700768
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800769_RS_STATIC float __attribute__((overloadable)) normalize(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700770 return 1.f;
771}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800772_RS_STATIC float2 __attribute__((overloadable)) normalize(float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700773 return v / length(v);
774}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800775_RS_STATIC float3 __attribute__((overloadable)) normalize(float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700776 return v / length(v);
777}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800778_RS_STATIC float4 __attribute__((overloadable)) normalize(float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700779 return v / length(v);
780}
781
Stephen Hines47416532011-01-11 14:38:18 -0800782#undef CVT_FUNC
783#undef CVT_FUNC_2
784#undef DEF_FUNC_1
785#undef DEF_FUNC_1_RI
786#undef DEF_FUNC_2
787#undef DEF_FUNC_2F
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800788#undef DEF_RIFUNC_1
789#undef DEF_UIFUNC_1
790#undef DEF_IFUNC_1
791#undef DEF_RIFUNC_2
792#undef DEF_IFUNC_2
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800793#undef _RS_STATIC
Jason Sams1b937f52010-06-09 14:26:16 -0700794
795#endif