blob: ab8270f404a8a55571d41e6bc24feddf566e5b26 [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
Jason Sams1b937f52010-06-09 14:26:16 -070010// Conversions
11#define CVT_FUNC_2(typeout, typein) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080012_RS_STATIC typeout##2 __attribute__((overloadable)) convert_##typeout##2(typein##2 v) { \
Jason Sams5e9811f2010-06-21 17:42:41 -070013 typeout##2 r = {(typeout)v.x, (typeout)v.y}; \
Jason Sams1b937f52010-06-09 14:26:16 -070014 return r; \
15} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080016_RS_STATIC typeout##3 __attribute__((overloadable)) convert_##typeout##3(typein##3 v) { \
Jason Sams5e9811f2010-06-21 17:42:41 -070017 typeout##3 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z}; \
Jason Sams1b937f52010-06-09 14:26:16 -070018 return r; \
19} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080020_RS_STATIC typeout##4 __attribute__((overloadable)) convert_##typeout##4(typein##4 v) { \
Jason Sams5e9811f2010-06-21 17:42:41 -070021 typeout##4 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z, (typeout)v.w}; \
Jason Sams1b937f52010-06-09 14:26:16 -070022 return r; \
23}
24
25#define CVT_FUNC(type) CVT_FUNC_2(type, uchar) \
26 CVT_FUNC_2(type, char) \
27 CVT_FUNC_2(type, ushort) \
28 CVT_FUNC_2(type, short) \
Jason Sams1b937f52010-06-09 14:26:16 -070029 CVT_FUNC_2(type, uint) \
Stephen Hines47416532011-01-11 14:38:18 -080030 CVT_FUNC_2(type, int) \
Jason Sams1b937f52010-06-09 14:26:16 -070031 CVT_FUNC_2(type, float)
32
33CVT_FUNC(char)
34CVT_FUNC(uchar)
35CVT_FUNC(short)
36CVT_FUNC(ushort)
37CVT_FUNC(int)
38CVT_FUNC(uint)
39CVT_FUNC(float)
40
41
42
Jason Sams22fa3712010-05-19 17:22:57 -070043// Float ops, 6.11.2
44
Jason Sams1b937f52010-06-09 14:26:16 -070045#define DEF_FUNC_1(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080046_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v) { \
Jason Sams1b937f52010-06-09 14:26:16 -070047 float2 r; \
48 r.x = fnc(v.x); \
49 r.y = fnc(v.y); \
50 return r; \
51} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080052_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v) { \
Jason Sams1b937f52010-06-09 14:26:16 -070053 float3 r; \
54 r.x = fnc(v.x); \
55 r.y = fnc(v.y); \
56 r.z = fnc(v.z); \
57 return r; \
58} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080059_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v) { \
Jason Sams1b937f52010-06-09 14:26:16 -070060 float4 r; \
61 r.x = fnc(v.x); \
62 r.y = fnc(v.y); \
63 r.z = fnc(v.z); \
64 r.w = fnc(v.w); \
65 return r; \
66}
67
Stephen Hines47416532011-01-11 14:38:18 -080068#define DEF_FUNC_1_RI(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080069_RS_STATIC int2 __attribute__((overloadable)) fnc(float2 v) { \
Stephen Hines47416532011-01-11 14:38:18 -080070 int2 r; \
71 r.x = fnc(v.x); \
72 r.y = fnc(v.y); \
73 return r; \
74} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080075_RS_STATIC int3 __attribute__((overloadable)) fnc(float3 v) { \
Stephen Hines47416532011-01-11 14:38:18 -080076 int3 r; \
77 r.x = fnc(v.x); \
78 r.y = fnc(v.y); \
79 r.z = fnc(v.z); \
80 return r; \
81} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080082_RS_STATIC int4 __attribute__((overloadable)) fnc(float4 v) { \
Stephen Hines47416532011-01-11 14:38:18 -080083 int4 r; \
84 r.x = fnc(v.x); \
85 r.y = fnc(v.y); \
86 r.z = fnc(v.z); \
87 r.w = fnc(v.w); \
88 return r; \
89}
90
Jason Sams1b937f52010-06-09 14:26:16 -070091#define DEF_FUNC_2(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080092_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -070093 float2 r; \
94 r.x = fnc(v1.x, v2.x); \
95 r.y = fnc(v1.y, v2.y); \
96 return r; \
97} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080098_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -070099 float3 r; \
100 r.x = fnc(v1.x, v2.x); \
101 r.y = fnc(v1.y, v2.y); \
102 r.z = fnc(v1.z, v2.z); \
103 return r; \
104} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800105_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700106 float4 r; \
107 r.x = fnc(v1.x, v2.x); \
108 r.y = fnc(v1.y, v2.y); \
109 r.z = fnc(v1.z, v2.z); \
Stephen Hines32086d82011-01-18 19:39:29 -0800110 r.w = fnc(v1.w, v2.w); \
Jason Sams1b937f52010-06-09 14:26:16 -0700111 return r; \
112}
113
114#define DEF_FUNC_2F(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800115_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700116 float2 r; \
117 r.x = fnc(v1.x, v2); \
118 r.y = fnc(v1.y, v2); \
119 return r; \
120} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800121_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700122 float3 r; \
123 r.x = fnc(v1.x, v2); \
124 r.y = fnc(v1.y, v2); \
125 r.z = fnc(v1.z, v2); \
126 return r; \
127} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800128_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float v2) { \
Jason Sams1b937f52010-06-09 14:26:16 -0700129 float4 r; \
130 r.x = fnc(v1.x, v2); \
131 r.y = fnc(v1.y, v2); \
132 r.z = fnc(v1.z, v2); \
133 r.w = fnc(v1.w, v2); \
134 return r; \
135}
136
Stephen Hines32086d82011-01-18 19:39:29 -0800137#define DEF_FUNC_2P(fnc) \
138_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 *v2) { \
139 float2 r; \
140 float q; \
141 r.x = fnc(v1.x, &q); \
142 v2->x = q; \
143 r.y = fnc(v1.y, &q); \
144 v2->y = q; \
145 return r; \
146} \
147_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 *v2) { \
148 float3 r; \
149 float q; \
150 r.x = fnc(v1.x, &q); \
151 v2->x = q; \
152 r.y = fnc(v1.y, &q); \
153 v2->y = q; \
154 r.z = fnc(v1.z, &q); \
155 v2->z = q; \
156 return r; \
157} \
158_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 *v2) { \
159 float4 r; \
160 float q; \
161 r.x = fnc(v1.x, &q); \
162 v2->x = q; \
163 r.y = fnc(v1.y, &q); \
164 v2->y = q; \
165 r.z = fnc(v1.z, &q); \
166 v2->z = q; \
167 r.w = fnc(v1.w, &q); \
168 v2->w = q; \
169 return r; \
170}
Jason Sams1b937f52010-06-09 14:26:16 -0700171
Jason Sams22fa3712010-05-19 17:22:57 -0700172extern float __attribute__((overloadable)) acos(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700173DEF_FUNC_1(acos)
Jason Sams22fa3712010-05-19 17:22:57 -0700174
175extern float __attribute__((overloadable)) acosh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700176DEF_FUNC_1(acosh)
Jason Sams22fa3712010-05-19 17:22:57 -0700177
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800178_RS_STATIC float __attribute__((overloadable)) acospi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700179 return acos(v) / M_PI;
180}
181DEF_FUNC_1(acospi)
Jason Sams22fa3712010-05-19 17:22:57 -0700182
183extern float __attribute__((overloadable)) asin(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700184DEF_FUNC_1(asin)
Jason Sams22fa3712010-05-19 17:22:57 -0700185
186extern float __attribute__((overloadable)) asinh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700187DEF_FUNC_1(asinh)
Jason Sams22fa3712010-05-19 17:22:57 -0700188
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800189_RS_STATIC float __attribute__((overloadable)) asinpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700190 return asin(v) / M_PI;
191}
192DEF_FUNC_1(asinpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700193
194extern float __attribute__((overloadable)) atan(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700195DEF_FUNC_1(atan)
Jason Sams22fa3712010-05-19 17:22:57 -0700196
197extern float __attribute__((overloadable)) atan2(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700198DEF_FUNC_2(atan2)
Jason Sams22fa3712010-05-19 17:22:57 -0700199
200extern float __attribute__((overloadable)) atanh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700201DEF_FUNC_1(atanh)
Jason Sams22fa3712010-05-19 17:22:57 -0700202
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800203_RS_STATIC float __attribute__((overloadable)) atanpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700204 return atan(v) / M_PI;
205}
206DEF_FUNC_1(atanpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700207
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800208_RS_STATIC float __attribute__((overloadable)) atan2pi(float y, float x) {
Jason Sams1b937f52010-06-09 14:26:16 -0700209 return atan2(y, x) / M_PI;
210}
211DEF_FUNC_2(atan2pi)
Jason Sams22fa3712010-05-19 17:22:57 -0700212
213extern float __attribute__((overloadable)) cbrt(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700214DEF_FUNC_1(cbrt)
Jason Sams22fa3712010-05-19 17:22:57 -0700215
216extern float __attribute__((overloadable)) ceil(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700217DEF_FUNC_1(ceil)
Jason Sams22fa3712010-05-19 17:22:57 -0700218
219extern float __attribute__((overloadable)) copysign(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700220DEF_FUNC_2(copysign)
Jason Sams22fa3712010-05-19 17:22:57 -0700221
222extern float __attribute__((overloadable)) cos(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700223DEF_FUNC_1(cos)
Jason Sams22fa3712010-05-19 17:22:57 -0700224
225extern float __attribute__((overloadable)) cosh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700226DEF_FUNC_1(cosh)
Jason Sams22fa3712010-05-19 17:22:57 -0700227
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800228_RS_STATIC float __attribute__((overloadable)) cospi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700229 return cos(v * M_PI);
230}
231DEF_FUNC_1(cospi)
Jason Sams22fa3712010-05-19 17:22:57 -0700232
233extern float __attribute__((overloadable)) erfc(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700234DEF_FUNC_1(erfc)
Jason Sams22fa3712010-05-19 17:22:57 -0700235
236extern float __attribute__((overloadable)) erf(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700237DEF_FUNC_1(erf)
Jason Sams22fa3712010-05-19 17:22:57 -0700238
239extern float __attribute__((overloadable)) exp(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700240DEF_FUNC_1(exp)
Jason Sams22fa3712010-05-19 17:22:57 -0700241
242extern float __attribute__((overloadable)) exp2(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700243DEF_FUNC_1(exp2)
Jason Sams22fa3712010-05-19 17:22:57 -0700244
Jason Sams1b937f52010-06-09 14:26:16 -0700245extern float __attribute__((overloadable)) pow(float, float);
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800246_RS_STATIC float __attribute__((overloadable)) exp10(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700247 return pow(10.f, v);
248}
249DEF_FUNC_1(exp10)
Jason Sams22fa3712010-05-19 17:22:57 -0700250
251extern float __attribute__((overloadable)) expm1(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700252DEF_FUNC_1(expm1)
Jason Sams22fa3712010-05-19 17:22:57 -0700253
254extern float __attribute__((overloadable)) fabs(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700255DEF_FUNC_1(fabs)
Jason Sams22fa3712010-05-19 17:22:57 -0700256
257extern float __attribute__((overloadable)) fdim(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700258DEF_FUNC_2(fdim)
Jason Sams22fa3712010-05-19 17:22:57 -0700259
260extern float __attribute__((overloadable)) floor(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700261DEF_FUNC_1(floor)
Jason Sams22fa3712010-05-19 17:22:57 -0700262
263extern float __attribute__((overloadable)) fma(float, float, float);
264extern float2 __attribute__((overloadable)) fma(float2, float2, float2);
265extern float3 __attribute__((overloadable)) fma(float3, float3, float3);
266extern float4 __attribute__((overloadable)) fma(float4, float4, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700267
268extern float __attribute__((overloadable)) fmax(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700269DEF_FUNC_2(fmax);
270DEF_FUNC_2F(fmax);
Jason Sams22fa3712010-05-19 17:22:57 -0700271
272extern float __attribute__((overloadable)) fmin(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700273DEF_FUNC_2(fmin);
274DEF_FUNC_2F(fmin);
Jason Sams22fa3712010-05-19 17:22:57 -0700275
276extern float __attribute__((overloadable)) fmod(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700277DEF_FUNC_2(fmod)
Jason Sams22fa3712010-05-19 17:22:57 -0700278
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800279_RS_STATIC float __attribute__((overloadable)) fract(float v, float *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700280 int i = (int)floor(v);
281 iptr[0] = i;
282 return fmin(v - i, 0x1.fffffep-1f);
283}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800284_RS_STATIC float2 __attribute__((overloadable)) fract(float2 v, float2 *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700285 float t[2];
286 float2 r;
287 r.x = fract(v.x, &t[0]);
288 r.y = fract(v.y, &t[1]);
289 iptr[0] = t[0];
290 iptr[1] = t[1];
291 return r;
292}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800293_RS_STATIC float3 __attribute__((overloadable)) fract(float3 v, float3 *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700294 float t[3];
295 float3 r;
296 r.x = fract(v.x, &t[0]);
297 r.y = fract(v.y, &t[1]);
298 r.z = fract(v.z, &t[2]);
299 iptr[0] = t[0];
300 iptr[1] = t[1];
301 iptr[2] = t[2];
302 return r;
303}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800304_RS_STATIC float4 __attribute__((overloadable)) fract(float4 v, float4 *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700305 float t[4];
306 float4 r;
307 r.x = fract(v.x, &t[0]);
308 r.y = fract(v.y, &t[1]);
309 r.z = fract(v.z, &t[2]);
310 r.w = fract(v.w, &t[3]);
311 iptr[0] = t[0];
312 iptr[1] = t[1];
313 iptr[2] = t[2];
314 iptr[3] = t[3];
315 return r;
316}
Jason Sams22fa3712010-05-19 17:22:57 -0700317
318extern float __attribute__((overloadable)) frexp(float, float *);
319extern float2 __attribute__((overloadable)) frexp(float2, float2 *);
320extern float3 __attribute__((overloadable)) frexp(float3, float3 *);
321extern float4 __attribute__((overloadable)) frexp(float4, float4 *);
Jason Sams22fa3712010-05-19 17:22:57 -0700322
323extern float __attribute__((overloadable)) hypot(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700324DEF_FUNC_2(hypot)
Jason Sams22fa3712010-05-19 17:22:57 -0700325
326extern int __attribute__((overloadable)) ilogb(float);
Stephen Hines47416532011-01-11 14:38:18 -0800327DEF_FUNC_1_RI(ilogb)
Jason Sams22fa3712010-05-19 17:22:57 -0700328
329extern float __attribute__((overloadable)) ldexp(float, int);
330extern float2 __attribute__((overloadable)) ldexp(float2, int2);
331extern float3 __attribute__((overloadable)) ldexp(float3, int3);
332extern float4 __attribute__((overloadable)) ldexp(float4, int4);
Jason Sams22fa3712010-05-19 17:22:57 -0700333extern float2 __attribute__((overloadable)) ldexp(float2, int);
334extern float3 __attribute__((overloadable)) ldexp(float3, int);
335extern float4 __attribute__((overloadable)) ldexp(float4, int);
Jason Sams22fa3712010-05-19 17:22:57 -0700336
337extern float __attribute__((overloadable)) lgamma(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700338DEF_FUNC_1(lgamma)
Jason Sams22fa3712010-05-19 17:22:57 -0700339extern float __attribute__((overloadable)) lgamma(float, float *);
340extern float2 __attribute__((overloadable)) lgamma(float2, float2 *);
341extern float3 __attribute__((overloadable)) lgamma(float3, float3 *);
342extern float4 __attribute__((overloadable)) lgamma(float4, float4 *);
Jason Sams22fa3712010-05-19 17:22:57 -0700343
344extern float __attribute__((overloadable)) log(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700345DEF_FUNC_1(log)
Jason Sams22fa3712010-05-19 17:22:57 -0700346
Jason Sams22fa3712010-05-19 17:22:57 -0700347
348extern float __attribute__((overloadable)) log10(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700349DEF_FUNC_1(log10)
350
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800351_RS_STATIC float __attribute__((overloadable)) log2(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700352 return log10(v) / log10(2.f);
353}
354DEF_FUNC_1(log2)
Jason Sams22fa3712010-05-19 17:22:57 -0700355
356extern float __attribute__((overloadable)) log1p(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700357DEF_FUNC_1(log1p)
Jason Sams22fa3712010-05-19 17:22:57 -0700358
359extern float __attribute__((overloadable)) logb(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700360DEF_FUNC_1(logb)
Jason Sams22fa3712010-05-19 17:22:57 -0700361
362extern float __attribute__((overloadable)) mad(float, float, float);
363extern float2 __attribute__((overloadable)) mad(float2, float2, float2);
364extern float3 __attribute__((overloadable)) mad(float3, float3, float3);
365extern float4 __attribute__((overloadable)) mad(float4, float4, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700366
367extern float __attribute__((overloadable)) modf(float, float *);
Stephen Hines32086d82011-01-18 19:39:29 -0800368DEF_FUNC_2P(modf);
Jason Sams22fa3712010-05-19 17:22:57 -0700369
Jason Sams1b937f52010-06-09 14:26:16 -0700370//extern float __attribute__((overloadable)) nan(uint);
Jason Sams22fa3712010-05-19 17:22:57 -0700371
372extern float __attribute__((overloadable)) nextafter(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700373DEF_FUNC_2(nextafter)
Jason Sams22fa3712010-05-19 17:22:57 -0700374
Jason Sams1b937f52010-06-09 14:26:16 -0700375DEF_FUNC_2(pow)
Jason Sams22fa3712010-05-19 17:22:57 -0700376
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800377_RS_STATIC float __attribute__((overloadable)) pown(float v, int p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700378 return pow(v, (float)p);
379}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800380_RS_STATIC float2 __attribute__((overloadable)) pown(float2 v, int2 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700381 return pow(v, (float2)p);
382}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800383_RS_STATIC float3 __attribute__((overloadable)) pown(float3 v, int3 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700384 return pow(v, (float3)p);
385}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800386_RS_STATIC float4 __attribute__((overloadable)) pown(float4 v, int4 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700387 return pow(v, (float4)p);
388}
Jason Sams22fa3712010-05-19 17:22:57 -0700389
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800390_RS_STATIC float __attribute__((overloadable)) powr(float v, float p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700391 return pow(v, p);
392}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800393_RS_STATIC float2 __attribute__((overloadable)) powr(float2 v, float2 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700394 return pow(v, p);
395}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800396_RS_STATIC float3 __attribute__((overloadable)) powr(float3 v, float3 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700397 return pow(v, p);
398}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800399_RS_STATIC float4 __attribute__((overloadable)) powr(float4 v, float4 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700400 return pow(v, p);
401}
Jason Sams22fa3712010-05-19 17:22:57 -0700402
403extern float __attribute__((overloadable)) remainder(float, float);
Jason Sams1b937f52010-06-09 14:26:16 -0700404DEF_FUNC_2(remainder)
Jason Sams22fa3712010-05-19 17:22:57 -0700405
Stephen Hines47416532011-01-11 14:38:18 -0800406extern float __attribute__((overloadable)) remquo(float, float, int *);
407extern float2 __attribute__((overloadable)) remquo(float2, float2, int2 *);
408extern float3 __attribute__((overloadable)) remquo(float3, float3, int3 *);
409extern float4 __attribute__((overloadable)) remquo(float4, float4, int4 *);
Jason Sams22fa3712010-05-19 17:22:57 -0700410
411extern float __attribute__((overloadable)) rint(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700412DEF_FUNC_1(rint)
Jason Sams22fa3712010-05-19 17:22:57 -0700413
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800414_RS_STATIC float __attribute__((overloadable)) rootn(float v, int r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700415 return pow(v, 1.f / r);
416}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800417_RS_STATIC float2 __attribute__((overloadable)) rootn(float2 v, int2 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700418 float2 t = {1.f / r.x, 1.f / r.y};
419 return pow(v, t);
420}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800421_RS_STATIC float3 __attribute__((overloadable)) rootn(float3 v, int3 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700422 float3 t = {1.f / r.x, 1.f / r.y, 1.f / r.z};
423 return pow(v, t);
424}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800425_RS_STATIC float4 __attribute__((overloadable)) rootn(float4 v, int4 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700426 float4 t = {1.f / r.x, 1.f / r.y, 1.f / r.z, 1.f / r.w};
427 return pow(v, t);
428}
Jason Sams22fa3712010-05-19 17:22:57 -0700429
430extern float __attribute__((overloadable)) round(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700431DEF_FUNC_1(round)
Jason Sams22fa3712010-05-19 17:22:57 -0700432
433extern float __attribute__((overloadable)) sqrt(float);
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800434_RS_STATIC float __attribute__((overloadable)) rsqrt(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700435 return 1.f / sqrt(v);
436}
Stephen Hines47416532011-01-11 14:38:18 -0800437DEF_FUNC_1(rsqrt)
Jason Sams1b937f52010-06-09 14:26:16 -0700438
439extern float __attribute__((overloadable)) sin(float);
440DEF_FUNC_1(sin)
441
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800442_RS_STATIC float __attribute__((overloadable)) sincos(float v, float *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700443 *cosptr = cos(v);
444 return sin(v);
445}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800446_RS_STATIC float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700447 *cosptr = cos(v);
448 return sin(v);
449}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800450_RS_STATIC float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700451 *cosptr = cos(v);
452 return sin(v);
453}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800454_RS_STATIC float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700455 *cosptr = cos(v);
456 return sin(v);
457}
458
459extern float __attribute__((overloadable)) sinh(float);
460DEF_FUNC_1(sinh)
461
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800462_RS_STATIC float __attribute__((overloadable)) sinpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700463 return sin(v * M_PI);
464}
465DEF_FUNC_1(sinpi)
466
467DEF_FUNC_1(sqrt)
Jason Sams22fa3712010-05-19 17:22:57 -0700468
469extern float __attribute__((overloadable)) tan(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700470DEF_FUNC_1(tan)
Jason Sams22fa3712010-05-19 17:22:57 -0700471
472extern float __attribute__((overloadable)) tanh(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700473DEF_FUNC_1(tanh)
Jason Sams22fa3712010-05-19 17:22:57 -0700474
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800475_RS_STATIC float __attribute__((overloadable)) tanpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700476 return tan(v * M_PI);
477}
478DEF_FUNC_1(tanpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700479
480extern float __attribute__((overloadable)) tgamma(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700481DEF_FUNC_1(tgamma)
Jason Sams22fa3712010-05-19 17:22:57 -0700482
483extern float __attribute__((overloadable)) trunc(float);
Jason Sams1b937f52010-06-09 14:26:16 -0700484DEF_FUNC_1(trunc)
Jason Sams22fa3712010-05-19 17:22:57 -0700485
486// Int ops (partial), 6.11.3
Jason Sams22fa3712010-05-19 17:22:57 -0700487
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800488#define DEF_RIFUNC_1(typeout, typein, fnc) \
489extern typeout __attribute__((overloadable)) fnc(typein); \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800490_RS_STATIC typeout##2 __attribute__((overloadable)) fnc(typein##2 v) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800491 typeout##2 r; \
492 r.x = fnc(v.x); \
493 r.y = fnc(v.y); \
494 return r; \
495} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800496_RS_STATIC typeout##3 __attribute__((overloadable)) fnc(typein##3 v) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800497 typeout##3 r; \
498 r.x = fnc(v.x); \
499 r.y = fnc(v.y); \
500 r.z = fnc(v.z); \
501 return r; \
502} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800503_RS_STATIC typeout##4 __attribute__((overloadable)) fnc(typein##4 v) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800504 typeout##4 r; \
505 r.x = fnc(v.x); \
506 r.y = fnc(v.y); \
507 r.z = fnc(v.z); \
508 r.w = fnc(v.w); \
509 return r; \
Jason Sams1b937f52010-06-09 14:26:16 -0700510}
Jason Sams22fa3712010-05-19 17:22:57 -0700511
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800512#define DEF_UIFUNC_1(fnc) \
513DEF_RIFUNC_1(uchar, char, fnc) \
514DEF_RIFUNC_1(ushort, short, fnc) \
515DEF_RIFUNC_1(uint, int, fnc)
Jason Sams22fa3712010-05-19 17:22:57 -0700516
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800517#define DEF_IFUNC_1(fnc) \
518DEF_RIFUNC_1(uchar, uchar, fnc) \
519DEF_RIFUNC_1(char, char, fnc) \
520DEF_RIFUNC_1(ushort, ushort, fnc) \
521DEF_RIFUNC_1(short, short, fnc) \
522DEF_RIFUNC_1(uint, uint, fnc) \
523DEF_RIFUNC_1(int, int, fnc)
Jason Sams22fa3712010-05-19 17:22:57 -0700524
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800525#define DEF_RIFUNC_2(type, fnc, body) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800526_RS_STATIC type __attribute__((overloadable)) fnc(type v1, type v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800527 return body; \
528} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800529_RS_STATIC type##2 __attribute__((overloadable)) fnc(type##2 v1, type##2 v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800530 type##2 r; \
531 r.x = fnc(v1.x, v2.x); \
532 r.y = fnc(v1.y, v2.y); \
533 return r; \
534} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800535_RS_STATIC type##3 __attribute__((overloadable)) fnc(type##3 v1, type##3 v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800536 type##3 r; \
537 r.x = fnc(v1.x, v2.x); \
538 r.y = fnc(v1.y, v2.y); \
539 r.z = fnc(v1.z, v2.z); \
540 return r; \
541} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800542_RS_STATIC type##4 __attribute__((overloadable)) fnc(type##4 v1, type##4 v2) { \
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800543 type##4 r; \
544 r.x = fnc(v1.x, v2.x); \
545 r.y = fnc(v1.y, v2.y); \
546 r.z = fnc(v1.z, v2.z); \
547 r.w = fnc(v1.w, v2.w); \
548 return r; \
549} \
Jason Sams22fa3712010-05-19 17:22:57 -0700550
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800551#define DEF_IFUNC_2(fnc, body) \
552DEF_RIFUNC_2(uchar, fnc, body) \
553DEF_RIFUNC_2(char, fnc, body) \
554DEF_RIFUNC_2(ushort, fnc, body) \
555DEF_RIFUNC_2(short, fnc, body) \
556DEF_RIFUNC_2(uint, fnc, body) \
557DEF_RIFUNC_2(int, fnc, body) \
558DEF_RIFUNC_2(float, fnc, body)
559
560DEF_UIFUNC_1(abs)
561DEF_IFUNC_1(clz)
562
563DEF_IFUNC_2(min, (v1 < v2 ? v1 : v2))
564DEF_FUNC_2F(min)
565
566DEF_IFUNC_2(max, (v1 > v2 ? v1 : v2))
567DEF_FUNC_2F(max)
Jason Sams22fa3712010-05-19 17:22:57 -0700568
569// 6.11.4
570
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800571_RS_STATIC float __attribute__((overloadable)) clamp(float amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700572 return amount < low ? low : (amount > high ? high : amount);
573}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800574_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700575 float2 r;
576 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
577 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
578 return r;
579}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800580_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700581 float3 r;
582 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
583 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
584 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
585 return r;
586}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800587_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700588 float4 r;
589 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
590 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
591 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
592 r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);
593 return r;
594}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800595_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700596 float2 r;
597 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
598 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
599 return r;
600}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800601_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700602 float3 r;
603 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
604 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
605 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
606 return r;
607}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800608_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700609 float4 r;
610 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
611 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
612 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
613 r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
614 return r;
615}
Jason Sams22fa3712010-05-19 17:22:57 -0700616
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800617_RS_STATIC float __attribute__((overloadable)) degrees(float radians) {
Jason Sams1b937f52010-06-09 14:26:16 -0700618 return radians * (180.f / M_PI);
619}
620DEF_FUNC_1(degrees)
Jason Sams22fa3712010-05-19 17:22:57 -0700621
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800622_RS_STATIC float __attribute__((overloadable)) mix(float start, float stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700623 return start + (stop - start) * amount;
624}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800625_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700626 return start + (stop - start) * amount;
627}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800628_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700629 return start + (stop - start) * amount;
630}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800631_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700632 return start + (stop - start) * amount;
633}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800634_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700635 return start + (stop - start) * amount;
636}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800637_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700638 return start + (stop - start) * amount;
639}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800640_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700641 return start + (stop - start) * amount;
642}
Jason Sams22fa3712010-05-19 17:22:57 -0700643
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800644_RS_STATIC float __attribute__((overloadable)) radians(float degrees) {
Jason Sams1b937f52010-06-09 14:26:16 -0700645 return degrees * (M_PI / 180.f);
646}
647DEF_FUNC_1(radians)
Jason Sams22fa3712010-05-19 17:22:57 -0700648
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800649_RS_STATIC float __attribute__((overloadable)) step(float edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700650 return (v < edge) ? 0.f : 1.f;
651}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800652_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700653 float2 r;
654 r.x = (v.x < edge.x) ? 0.f : 1.f;
655 r.y = (v.y < edge.y) ? 0.f : 1.f;
656 return r;
657}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800658_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700659 float3 r;
660 r.x = (v.x < edge.x) ? 0.f : 1.f;
661 r.y = (v.y < edge.y) ? 0.f : 1.f;
662 r.z = (v.z < edge.z) ? 0.f : 1.f;
663 return r;
664}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800665_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700666 float4 r;
667 r.x = (v.x < edge.x) ? 0.f : 1.f;
668 r.y = (v.y < edge.y) ? 0.f : 1.f;
669 r.z = (v.z < edge.z) ? 0.f : 1.f;
670 r.w = (v.w < edge.w) ? 0.f : 1.f;
671 return r;
672}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800673_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700674 float2 r;
675 r.x = (v < edge.x) ? 0.f : 1.f;
676 r.y = (v < edge.y) ? 0.f : 1.f;
677 return r;
678}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800679_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700680 float3 r;
681 r.x = (v < edge.x) ? 0.f : 1.f;
682 r.y = (v < edge.y) ? 0.f : 1.f;
683 r.z = (v < edge.z) ? 0.f : 1.f;
684 return r;
685}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800686_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700687 float4 r;
688 r.x = (v < edge.x) ? 0.f : 1.f;
689 r.y = (v < edge.y) ? 0.f : 1.f;
690 r.z = (v < edge.z) ? 0.f : 1.f;
691 r.w = (v < edge.w) ? 0.f : 1.f;
692 return r;
693}
Jason Sams22fa3712010-05-19 17:22:57 -0700694
695extern float __attribute__((overloadable)) smoothstep(float, float, float);
696extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2);
697extern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3);
698extern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700699extern float2 __attribute__((overloadable)) smoothstep(float, float, float2);
700extern float3 __attribute__((overloadable)) smoothstep(float, float, float3);
701extern float4 __attribute__((overloadable)) smoothstep(float, float, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700702
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800703_RS_STATIC float __attribute__((overloadable)) sign(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700704 if (v > 0) return 1.f;
705 if (v < 0) return -1.f;
706 return v;
707}
708DEF_FUNC_1(sign)
Jason Sams22fa3712010-05-19 17:22:57 -0700709
710// 6.11.5
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800711_RS_STATIC float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700712 float3 r;
713 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
714 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
715 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
716 return r;
717}
Jason Sams22fa3712010-05-19 17:22:57 -0700718
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800719_RS_STATIC float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700720 float4 r;
721 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
722 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
723 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
724 r.w = 0.f;
725 return r;
726}
Jason Sams22fa3712010-05-19 17:22:57 -0700727
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800728_RS_STATIC float __attribute__((overloadable)) dot(float lhs, float rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700729 return lhs * rhs;
730}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800731_RS_STATIC float __attribute__((overloadable)) dot(float2 lhs, float2 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700732 return lhs.x*rhs.x + lhs.y*rhs.y;
733}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800734_RS_STATIC float __attribute__((overloadable)) dot(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700735 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z;
736}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800737_RS_STATIC float __attribute__((overloadable)) dot(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700738 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z + lhs.w*rhs.w;
739}
Jason Sams22fa3712010-05-19 17:22:57 -0700740
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800741_RS_STATIC float __attribute__((overloadable)) length(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700742 return v;
743}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800744_RS_STATIC float __attribute__((overloadable)) length(float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700745 return sqrt(v.x*v.x + v.y*v.y);
746}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800747_RS_STATIC float __attribute__((overloadable)) length(float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700748 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
749}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800750_RS_STATIC float __attribute__((overloadable)) length(float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700751 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
752}
Jason Sams22fa3712010-05-19 17:22:57 -0700753
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800754_RS_STATIC float __attribute__((overloadable)) distance(float lhs, float rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700755 return length(lhs - rhs);
756}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800757_RS_STATIC float __attribute__((overloadable)) distance(float2 lhs, float2 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700758 return length(lhs - rhs);
759}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800760_RS_STATIC float __attribute__((overloadable)) distance(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700761 return length(lhs - rhs);
762}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800763_RS_STATIC float __attribute__((overloadable)) distance(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700764 return length(lhs - rhs);
765}
Jason Sams22fa3712010-05-19 17:22:57 -0700766
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800767_RS_STATIC float __attribute__((overloadable)) normalize(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700768 return 1.f;
769}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800770_RS_STATIC float2 __attribute__((overloadable)) normalize(float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700771 return v / length(v);
772}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800773_RS_STATIC float3 __attribute__((overloadable)) normalize(float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700774 return v / length(v);
775}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800776_RS_STATIC float4 __attribute__((overloadable)) normalize(float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700777 return v / length(v);
778}
779
Stephen Hines47416532011-01-11 14:38:18 -0800780#undef CVT_FUNC
781#undef CVT_FUNC_2
782#undef DEF_FUNC_1
783#undef DEF_FUNC_1_RI
784#undef DEF_FUNC_2
785#undef DEF_FUNC_2F
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800786#undef DEF_RIFUNC_1
787#undef DEF_UIFUNC_1
788#undef DEF_IFUNC_1
789#undef DEF_RIFUNC_2
790#undef DEF_IFUNC_2
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800791#undef _RS_STATIC
Jason Sams1b937f52010-06-09 14:26:16 -0700792
793#endif