blob: 77a535b8a881120ed7b755681f4d251f34a12e79 [file] [log] [blame]
Ying Wang77643ba2011-01-18 22:24:26 -08001#include "rs_types.rsh"
Shih-wei Liaof9728b92011-01-17 18:04:33 -08002
Shih-wei Liao9e658b42011-01-26 04:05:28 -08003// Conversions
4#define CVT_FUNC_2(typeout, typein) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -08005extern typeout##2 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -08006 convert_##typeout##2(typein##2 v) { \
7 typeout##2 r = {(typeout)v.x, (typeout)v.y}; \
8 return r; \
9} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080010extern typeout##3 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080011 convert_##typeout##3(typein##3 v) { \
12 typeout##3 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z}; \
13 return r; \
14} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080015extern typeout##4 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080016 convert_##typeout##4(typein##4 v) { \
17 typeout##4 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z, \
18 (typeout)v.w}; \
19 return r; \
20}
21
22#define CVT_FUNC(type) CVT_FUNC_2(type, uchar) \
23 CVT_FUNC_2(type, char) \
24 CVT_FUNC_2(type, ushort) \
25 CVT_FUNC_2(type, short) \
26 CVT_FUNC_2(type, uint) \
27 CVT_FUNC_2(type, int) \
28 CVT_FUNC_2(type, float)
29
30CVT_FUNC(char)
Jason Sams5bc951c2012-02-27 19:32:15 -080031//CVT_FUNC(uchar)
Shih-wei Liao9e658b42011-01-26 04:05:28 -080032CVT_FUNC(short)
33CVT_FUNC(ushort)
34CVT_FUNC(int)
35CVT_FUNC(uint)
Jason Sams5bc951c2012-02-27 19:32:15 -080036//CVT_FUNC(float)
Shih-wei Liao9e658b42011-01-26 04:05:28 -080037
38// Float ops, 6.11.2
39
40#define FN_FUNC_FN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080041extern float2 __attribute__((overloadable)) fnc(float2 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080042 float2 r; \
43 r.x = fnc(v.x); \
44 r.y = fnc(v.y); \
45 return r; \
46} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080047extern float3 __attribute__((overloadable)) fnc(float3 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080048 float3 r; \
49 r.x = fnc(v.x); \
50 r.y = fnc(v.y); \
51 r.z = fnc(v.z); \
52 return r; \
53} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080054extern float4 __attribute__((overloadable)) fnc(float4 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080055 float4 r; \
56 r.x = fnc(v.x); \
57 r.y = fnc(v.y); \
58 r.z = fnc(v.z); \
59 r.w = fnc(v.w); \
60 return r; \
61}
62
63#define IN_FUNC_FN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080064extern int2 __attribute__((overloadable)) fnc(float2 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080065 int2 r; \
66 r.x = fnc(v.x); \
67 r.y = fnc(v.y); \
68 return r; \
69} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080070extern int3 __attribute__((overloadable)) fnc(float3 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080071 int3 r; \
72 r.x = fnc(v.x); \
73 r.y = fnc(v.y); \
74 r.z = fnc(v.z); \
75 return r; \
76} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080077extern int4 __attribute__((overloadable)) fnc(float4 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080078 int4 r; \
79 r.x = fnc(v.x); \
80 r.y = fnc(v.y); \
81 r.z = fnc(v.z); \
82 r.w = fnc(v.w); \
83 return r; \
84}
85
86#define FN_FUNC_FN_FN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080087extern float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080088 float2 r; \
89 r.x = fnc(v1.x, v2.x); \
90 r.y = fnc(v1.y, v2.y); \
91 return r; \
92} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -080093extern float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -080094 float3 r; \
95 r.x = fnc(v1.x, v2.x); \
96 r.y = fnc(v1.y, v2.y); \
97 r.z = fnc(v1.z, v2.z); \
98 return r; \
99} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800100extern float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800101 float4 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 r.w = fnc(v1.w, v2.w); \
106 return r; \
107}
108
109#define FN_FUNC_FN_F(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800110extern float2 __attribute__((overloadable)) fnc(float2 v1, float v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800111 float2 r; \
112 r.x = fnc(v1.x, v2); \
113 r.y = fnc(v1.y, v2); \
114 return r; \
115} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800116extern float3 __attribute__((overloadable)) fnc(float3 v1, float v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800117 float3 r; \
118 r.x = fnc(v1.x, v2); \
119 r.y = fnc(v1.y, v2); \
120 r.z = fnc(v1.z, v2); \
121 return r; \
122} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800123extern float4 __attribute__((overloadable)) fnc(float4 v1, float v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800124 float4 r; \
125 r.x = fnc(v1.x, v2); \
126 r.y = fnc(v1.y, v2); \
127 r.z = fnc(v1.z, v2); \
128 r.w = fnc(v1.w, v2); \
129 return r; \
130}
131
132#define FN_FUNC_FN_IN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800133extern float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800134 float2 r; \
135 r.x = fnc(v1.x, v2.x); \
136 r.y = fnc(v1.y, v2.y); \
137 return r; \
138} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800139extern float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800140 float3 r; \
141 r.x = fnc(v1.x, v2.x); \
142 r.y = fnc(v1.y, v2.y); \
143 r.z = fnc(v1.z, v2.z); \
144 return r; \
145} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800146extern float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800147 float4 r; \
148 r.x = fnc(v1.x, v2.x); \
149 r.y = fnc(v1.y, v2.y); \
150 r.z = fnc(v1.z, v2.z); \
151 r.w = fnc(v1.w, v2.w); \
152 return r; \
153}
154
155#define FN_FUNC_FN_I(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800156extern float2 __attribute__((overloadable)) fnc(float2 v1, int v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800157 float2 r; \
158 r.x = fnc(v1.x, v2); \
159 r.y = fnc(v1.y, v2); \
160 return r; \
161} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800162extern float3 __attribute__((overloadable)) fnc(float3 v1, int v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800163 float3 r; \
164 r.x = fnc(v1.x, v2); \
165 r.y = fnc(v1.y, v2); \
166 r.z = fnc(v1.z, v2); \
167 return r; \
168} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800169extern float4 __attribute__((overloadable)) fnc(float4 v1, int v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800170 float4 r; \
171 r.x = fnc(v1.x, v2); \
172 r.y = fnc(v1.y, v2); \
173 r.z = fnc(v1.z, v2); \
174 r.w = fnc(v1.w, v2); \
175 return r; \
176}
177
178#define FN_FUNC_FN_PFN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800179extern float2 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800180 fnc(float2 v1, float2 *v2) { \
181 float2 r; \
182 float t[2]; \
183 r.x = fnc(v1.x, &t[0]); \
184 r.y = fnc(v1.y, &t[1]); \
185 v2->x = t[0]; \
186 v2->y = t[1]; \
187 return r; \
188} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800189extern float3 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800190 fnc(float3 v1, float3 *v2) { \
191 float3 r; \
192 float t[3]; \
193 r.x = fnc(v1.x, &t[0]); \
194 r.y = fnc(v1.y, &t[1]); \
195 r.z = fnc(v1.z, &t[2]); \
196 v2->x = t[0]; \
197 v2->y = t[1]; \
198 v2->z = t[2]; \
199 return r; \
200} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800201extern float4 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800202 fnc(float4 v1, float4 *v2) { \
203 float4 r; \
204 float t[4]; \
205 r.x = fnc(v1.x, &t[0]); \
206 r.y = fnc(v1.y, &t[1]); \
207 r.z = fnc(v1.z, &t[2]); \
208 r.w = fnc(v1.w, &t[3]); \
209 v2->x = t[0]; \
210 v2->y = t[1]; \
211 v2->z = t[2]; \
212 v2->w = t[3]; \
213 return r; \
214}
215
216#define FN_FUNC_FN_PIN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800217extern float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800218 float2 r; \
219 int t[2]; \
220 r.x = fnc(v1.x, &t[0]); \
221 r.y = fnc(v1.y, &t[1]); \
222 v2->x = t[0]; \
223 v2->y = t[1]; \
224 return r; \
225} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800226extern float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800227 float3 r; \
228 int t[3]; \
229 r.x = fnc(v1.x, &t[0]); \
230 r.y = fnc(v1.y, &t[1]); \
231 r.z = fnc(v1.z, &t[2]); \
232 v2->x = t[0]; \
233 v2->y = t[1]; \
234 v2->z = t[2]; \
235 return r; \
236} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800237extern float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800238 float4 r; \
239 int t[4]; \
240 r.x = fnc(v1.x, &t[0]); \
241 r.y = fnc(v1.y, &t[1]); \
242 r.z = fnc(v1.z, &t[2]); \
243 r.w = fnc(v1.w, &t[3]); \
244 v2->x = t[0]; \
245 v2->y = t[1]; \
246 v2->z = t[2]; \
247 v2->w = t[3]; \
248 return r; \
249}
250
251#define FN_FUNC_FN_FN_FN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800252extern float2 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800253 fnc(float2 v1, float2 v2, float2 v3) { \
254 float2 r; \
255 r.x = fnc(v1.x, v2.x, v3.x); \
256 r.y = fnc(v1.y, v2.y, v3.y); \
257 return r; \
258} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800259extern float3 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800260 fnc(float3 v1, float3 v2, float3 v3) { \
261 float3 r; \
262 r.x = fnc(v1.x, v2.x, v3.x); \
263 r.y = fnc(v1.y, v2.y, v3.y); \
264 r.z = fnc(v1.z, v2.z, v3.z); \
265 return r; \
266} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800267extern float4 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800268 fnc(float4 v1, float4 v2, float4 v3) { \
269 float4 r; \
270 r.x = fnc(v1.x, v2.x, v3.x); \
271 r.y = fnc(v1.y, v2.y, v3.y); \
272 r.z = fnc(v1.z, v2.z, v3.z); \
273 r.w = fnc(v1.w, v2.w, v3.w); \
274 return r; \
275}
276
277#define FN_FUNC_FN_FN_PIN(fnc) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800278extern float2 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800279 fnc(float2 v1, float2 v2, int2 *v3) { \
280 float2 r; \
281 int t[2]; \
282 r.x = fnc(v1.x, v2.x, &t[0]); \
283 r.y = fnc(v1.y, v2.y, &t[1]); \
284 v3->x = t[0]; \
285 v3->y = t[1]; \
286 return r; \
287} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800288extern float3 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800289 fnc(float3 v1, float3 v2, int3 *v3) { \
290 float3 r; \
291 int t[3]; \
292 r.x = fnc(v1.x, v2.x, &t[0]); \
293 r.y = fnc(v1.y, v2.y, &t[1]); \
294 r.z = fnc(v1.z, v2.z, &t[2]); \
295 v3->x = t[0]; \
296 v3->y = t[1]; \
297 v3->z = t[2]; \
298 return r; \
299} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800300extern float4 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800301 fnc(float4 v1, float4 v2, int4 *v3) { \
302 float4 r; \
303 int t[4]; \
304 r.x = fnc(v1.x, v2.x, &t[0]); \
305 r.y = fnc(v1.y, v2.y, &t[1]); \
306 r.z = fnc(v1.z, v2.z, &t[2]); \
307 r.w = fnc(v1.w, v2.w, &t[3]); \
308 v3->x = t[0]; \
309 v3->y = t[1]; \
310 v3->z = t[2]; \
311 v3->w = t[3]; \
312 return r; \
313}
314
315extern float __attribute__((overloadable)) acos(float);
316FN_FUNC_FN(acos)
317
318extern float __attribute__((overloadable)) acosh(float);
319FN_FUNC_FN(acosh)
320
321
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800322extern float __attribute__((overloadable)) acospi(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800323 return acos(v) / M_PI;
324}
325FN_FUNC_FN(acospi)
326
327extern float __attribute__((overloadable)) asin(float);
328FN_FUNC_FN(asin)
329
330extern float __attribute__((overloadable)) asinh(float);
331FN_FUNC_FN(asinh)
332
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800333extern float __attribute__((overloadable)) asinpi(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800334 return asin(v) / M_PI;
335}
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800336FN_FUNC_FN(asinpi)
337
338extern float __attribute__((overloadable)) atan(float);
339FN_FUNC_FN(atan)
340
341extern float __attribute__((overloadable)) atan2(float, float);
342FN_FUNC_FN_FN(atan2)
343
344extern float __attribute__((overloadable)) atanh(float);
345FN_FUNC_FN(atanh)
346
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800347extern float __attribute__((overloadable)) atanpi(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800348 return atan(v) / M_PI;
349}
350FN_FUNC_FN(atanpi)
351
352
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800353extern float __attribute__((overloadable)) atan2pi(float y, float x) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800354 return atan2(y, x) / M_PI;
355}
356FN_FUNC_FN_FN(atan2pi)
357
358extern float __attribute__((overloadable)) cbrt(float);
359FN_FUNC_FN(cbrt)
360
361extern float __attribute__((overloadable)) ceil(float);
362FN_FUNC_FN(ceil)
363
364extern float __attribute__((overloadable)) copysign(float, float);
365FN_FUNC_FN_FN(copysign)
366
367extern float __attribute__((overloadable)) cos(float);
368FN_FUNC_FN(cos)
369
370extern float __attribute__((overloadable)) cosh(float);
371FN_FUNC_FN(cosh)
372
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800373extern float __attribute__((overloadable)) cospi(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800374 return cos(v * M_PI);
375}
376FN_FUNC_FN(cospi)
377
378extern float __attribute__((overloadable)) erfc(float);
379FN_FUNC_FN(erfc)
380
381extern float __attribute__((overloadable)) erf(float);
382FN_FUNC_FN(erf)
383
384extern float __attribute__((overloadable)) exp(float);
385FN_FUNC_FN(exp)
386
387extern float __attribute__((overloadable)) exp2(float);
388FN_FUNC_FN(exp2)
389
390extern float __attribute__((overloadable)) pow(float, float);
391
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800392extern float __attribute__((overloadable)) exp10(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800393 return pow(10.f, v);
394}
395FN_FUNC_FN(exp10)
396
397extern float __attribute__((overloadable)) expm1(float);
398FN_FUNC_FN(expm1)
399
400extern float __attribute__((overloadable)) fabs(float);
401FN_FUNC_FN(fabs)
402
403extern float __attribute__((overloadable)) fdim(float, float);
404FN_FUNC_FN_FN(fdim)
405
406extern float __attribute__((overloadable)) floor(float);
407FN_FUNC_FN(floor)
408
409extern float __attribute__((overloadable)) fma(float, float, float);
410FN_FUNC_FN_FN_FN(fma)
411
412extern float __attribute__((overloadable)) fmax(float, float);
413FN_FUNC_FN_FN(fmax);
414FN_FUNC_FN_F(fmax);
415
416extern float __attribute__((overloadable)) fmin(float, float);
417FN_FUNC_FN_FN(fmin);
418FN_FUNC_FN_F(fmin);
419
420extern float __attribute__((overloadable)) fmod(float, float);
421FN_FUNC_FN_FN(fmod)
422
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800423extern float __attribute__((overloadable)) fract(float v, float *iptr) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800424 int i = (int)floor(v);
425 iptr[0] = i;
426 return fmin(v - i, 0x1.fffffep-1f);
427}
428FN_FUNC_FN_PFN(fract)
429
430extern float __attribute__((overloadable)) frexp(float, int *);
431FN_FUNC_FN_PIN(frexp)
432
433extern float __attribute__((overloadable)) hypot(float, float);
434FN_FUNC_FN_FN(hypot)
435
436extern int __attribute__((overloadable)) ilogb(float);
437IN_FUNC_FN(ilogb)
438
439extern float __attribute__((overloadable)) ldexp(float, int);
440FN_FUNC_FN_IN(ldexp)
441FN_FUNC_FN_I(ldexp)
442
443extern float __attribute__((overloadable)) lgamma(float);
444FN_FUNC_FN(lgamma)
445extern float __attribute__((overloadable)) lgamma(float, int*);
446FN_FUNC_FN_PIN(lgamma)
447
448extern float __attribute__((overloadable)) log(float);
449FN_FUNC_FN(log)
450
451extern float __attribute__((overloadable)) log10(float);
452FN_FUNC_FN(log10)
453
454
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800455extern float __attribute__((overloadable)) log2(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800456 return log10(v) / log10(2.f);
457}
458FN_FUNC_FN(log2)
459
460extern float __attribute__((overloadable)) log1p(float);
461FN_FUNC_FN(log1p)
462
463extern float __attribute__((overloadable)) logb(float);
464FN_FUNC_FN(logb)
465
466extern float __attribute__((overloadable)) mad(float, float, float);
467FN_FUNC_FN_FN_FN(mad)
468
469extern float __attribute__((overloadable)) modf(float, float *);
470FN_FUNC_FN_PFN(modf);
471
Jason Sams23999ef2012-03-30 18:56:15 -0700472extern float __attribute__((overloadable)) nan(uint v) {
473 float f[1];
474 uint32_t *ip = (uint32_t *)f;
475 *ip = v | 0x7fc00000;
476 return f[0];
477}
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800478
479extern float __attribute__((overloadable)) nextafter(float, float);
480FN_FUNC_FN_FN(nextafter)
481
482FN_FUNC_FN_FN(pow)
483
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800484extern float __attribute__((overloadable)) pown(float v, int p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800485 return pow(v, (float)p);
486}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800487extern float2 __attribute__((overloadable)) pown(float2 v, int2 p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800488 return pow(v, (float2)p);
489}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800490extern float3 __attribute__((overloadable)) pown(float3 v, int3 p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800491 return pow(v, (float3)p);
492}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800493extern float4 __attribute__((overloadable)) pown(float4 v, int4 p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800494 return pow(v, (float4)p);
495}
496
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800497extern float __attribute__((overloadable)) powr(float v, float p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800498 return pow(v, p);
499}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800500extern float2 __attribute__((overloadable)) powr(float2 v, float2 p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800501 return pow(v, p);
502}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800503extern float3 __attribute__((overloadable)) powr(float3 v, float3 p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800504 return pow(v, p);
505}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800506extern float4 __attribute__((overloadable)) powr(float4 v, float4 p) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800507 return pow(v, p);
508}
509
510extern float __attribute__((overloadable)) remainder(float, float);
511FN_FUNC_FN_FN(remainder)
512
513extern float __attribute__((overloadable)) remquo(float, float, int *);
514FN_FUNC_FN_FN_PIN(remquo)
515
516extern float __attribute__((overloadable)) rint(float);
517FN_FUNC_FN(rint)
518
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800519extern float __attribute__((overloadable)) rootn(float v, int r) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800520 return pow(v, 1.f / r);
521}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800522extern float2 __attribute__((overloadable)) rootn(float2 v, int2 r) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800523 float2 t = {1.f / r.x, 1.f / r.y};
524 return pow(v, t);
525}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800526extern float3 __attribute__((overloadable)) rootn(float3 v, int3 r) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800527 float3 t = {1.f / r.x, 1.f / r.y, 1.f / r.z};
528 return pow(v, t);
529}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800530extern float4 __attribute__((overloadable)) rootn(float4 v, int4 r) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800531 float4 t = {1.f / r.x, 1.f / r.y, 1.f / r.z, 1.f / r.w};
532 return pow(v, t);
533}
534
535extern float __attribute__((overloadable)) round(float);
536FN_FUNC_FN(round)
537
538
539extern float __attribute__((overloadable)) sqrt(float);
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800540extern float __attribute__((overloadable)) rsqrt(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800541 return 1.f / sqrt(v);
542}
543FN_FUNC_FN(rsqrt)
544
545extern float __attribute__((overloadable)) sin(float);
546FN_FUNC_FN(sin)
547
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800548extern float __attribute__((overloadable)) sincos(float v, float *cosptr) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800549 *cosptr = cos(v);
550 return sin(v);
551}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800552extern float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800553 *cosptr = cos(v);
554 return sin(v);
555}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800556extern float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800557 *cosptr = cos(v);
558 return sin(v);
559}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800560extern float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800561 *cosptr = cos(v);
562 return sin(v);
563}
564
565extern float __attribute__((overloadable)) sinh(float);
566FN_FUNC_FN(sinh)
567
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800568extern float __attribute__((overloadable)) sinpi(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800569 return sin(v * M_PI);
570}
571FN_FUNC_FN(sinpi)
572
573FN_FUNC_FN(sqrt)
574
575extern float __attribute__((overloadable)) tan(float);
576FN_FUNC_FN(tan)
577
578extern float __attribute__((overloadable)) tanh(float);
579FN_FUNC_FN(tanh)
580
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800581extern float __attribute__((overloadable)) tanpi(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800582 return tan(v * M_PI);
583}
584FN_FUNC_FN(tanpi)
585
586
587extern float __attribute__((overloadable)) tgamma(float);
588FN_FUNC_FN(tgamma)
589
590extern float __attribute__((overloadable)) trunc(float);
591FN_FUNC_FN(trunc)
592
593// Int ops (partial), 6.11.3
594
595#define XN_FUNC_YN(typeout, fnc, typein) \
596extern typeout __attribute__((overloadable)) fnc(typein); \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800597extern typeout##2 __attribute__((overloadable)) fnc(typein##2 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800598 typeout##2 r; \
599 r.x = fnc(v.x); \
600 r.y = fnc(v.y); \
601 return r; \
602} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800603extern typeout##3 __attribute__((overloadable)) fnc(typein##3 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800604 typeout##3 r; \
605 r.x = fnc(v.x); \
606 r.y = fnc(v.y); \
607 r.z = fnc(v.z); \
608 return r; \
609} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800610extern typeout##4 __attribute__((overloadable)) fnc(typein##4 v) { \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800611 typeout##4 r; \
612 r.x = fnc(v.x); \
613 r.y = fnc(v.y); \
614 r.z = fnc(v.z); \
615 r.w = fnc(v.w); \
616 return r; \
617}
618
619
620#define UIN_FUNC_IN(fnc) \
621XN_FUNC_YN(uchar, fnc, char) \
622XN_FUNC_YN(ushort, fnc, short) \
623XN_FUNC_YN(uint, fnc, int)
624
625#define IN_FUNC_IN(fnc) \
626XN_FUNC_YN(uchar, fnc, uchar) \
627XN_FUNC_YN(char, fnc, char) \
628XN_FUNC_YN(ushort, fnc, ushort) \
629XN_FUNC_YN(short, fnc, short) \
630XN_FUNC_YN(uint, fnc, uint) \
631XN_FUNC_YN(int, fnc, int)
632
633
634#define XN_FUNC_XN_XN_BODY(type, fnc, body) \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800635extern type __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800636 fnc(type v1, type v2) { \
637 return body; \
638} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800639extern type##2 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800640 fnc(type##2 v1, type##2 v2) { \
641 type##2 r; \
642 r.x = fnc(v1.x, v2.x); \
643 r.y = fnc(v1.y, v2.y); \
644 return r; \
645} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800646extern type##3 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800647 fnc(type##3 v1, type##3 v2) { \
648 type##3 r; \
649 r.x = fnc(v1.x, v2.x); \
650 r.y = fnc(v1.y, v2.y); \
651 r.z = fnc(v1.z, v2.z); \
652 return r; \
653} \
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800654extern type##4 __attribute__((overloadable)) \
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800655 fnc(type##4 v1, type##4 v2) { \
656 type##4 r; \
657 r.x = fnc(v1.x, v2.x); \
658 r.y = fnc(v1.y, v2.y); \
659 r.z = fnc(v1.z, v2.z); \
660 r.w = fnc(v1.w, v2.w); \
661 return r; \
662}
663
664#define IN_FUNC_IN_IN_BODY(fnc, body) \
665XN_FUNC_XN_XN_BODY(uchar, fnc, body) \
666XN_FUNC_XN_XN_BODY(char, fnc, body) \
667XN_FUNC_XN_XN_BODY(ushort, fnc, body) \
668XN_FUNC_XN_XN_BODY(short, fnc, body) \
669XN_FUNC_XN_XN_BODY(uint, fnc, body) \
670XN_FUNC_XN_XN_BODY(int, fnc, body) \
671XN_FUNC_XN_XN_BODY(float, fnc, body)
672
673UIN_FUNC_IN(abs)
674IN_FUNC_IN(clz)
675
676IN_FUNC_IN_IN_BODY(min, (v1 < v2 ? v1 : v2))
677FN_FUNC_FN_F(min)
678
679IN_FUNC_IN_IN_BODY(max, (v1 > v2 ? v1 : v2))
680FN_FUNC_FN_F(max)
681
682
683// 6.11.4
684
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800685extern float __attribute__((overloadable)) clamp(float amount, float low, float high) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800686 return amount < low ? low : (amount > high ? high : amount);
687}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800688extern float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800689 float2 r;
690 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
691 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
692 return r;
693}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800694extern float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800695 float3 r;
696 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
697 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
698 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
699 return r;
700}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800701extern float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800702 float4 r;
703 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
704 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
705 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
706 r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);
707 return r;
708}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800709extern float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800710 float2 r;
711 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
712 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
713 return r;
714}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800715extern float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800716 float3 r;
717 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
718 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
719 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
720 return r;
721}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800722extern float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800723 float4 r;
724 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
725 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
726 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
727 r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
728 return r;
729}
730
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800731extern float __attribute__((overloadable)) degrees(float radians) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800732 return radians * (180.f / M_PI);
733}
734FN_FUNC_FN(degrees)
735
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800736extern float __attribute__((overloadable)) mix(float start, float stop, float amount) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800737 return start + (stop - start) * amount;
738}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800739extern float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800740 return start + (stop - start) * amount;
741}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800742extern float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800743 return start + (stop - start) * amount;
744}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800745extern float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800746 return start + (stop - start) * amount;
747}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800748extern float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800749 return start + (stop - start) * amount;
750}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800751extern float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800752 return start + (stop - start) * amount;
753}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800754extern float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800755 return start + (stop - start) * amount;
756}
757
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800758extern float __attribute__((overloadable)) radians(float degrees) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800759 return degrees * (M_PI / 180.f);
760}
761FN_FUNC_FN(radians)
762
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800763extern float __attribute__((overloadable)) step(float edge, float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800764 return (v < edge) ? 0.f : 1.f;
765}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800766extern float2 __attribute__((overloadable)) step(float2 edge, float2 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800767 float2 r;
768 r.x = (v.x < edge.x) ? 0.f : 1.f;
769 r.y = (v.y < edge.y) ? 0.f : 1.f;
770 return r;
771}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800772extern float3 __attribute__((overloadable)) step(float3 edge, float3 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800773 float3 r;
774 r.x = (v.x < edge.x) ? 0.f : 1.f;
775 r.y = (v.y < edge.y) ? 0.f : 1.f;
776 r.z = (v.z < edge.z) ? 0.f : 1.f;
777 return r;
778}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800779extern float4 __attribute__((overloadable)) step(float4 edge, float4 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800780 float4 r;
781 r.x = (v.x < edge.x) ? 0.f : 1.f;
782 r.y = (v.y < edge.y) ? 0.f : 1.f;
783 r.z = (v.z < edge.z) ? 0.f : 1.f;
784 r.w = (v.w < edge.w) ? 0.f : 1.f;
785 return r;
786}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800787extern float2 __attribute__((overloadable)) step(float2 edge, float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800788 float2 r;
789 r.x = (v < edge.x) ? 0.f : 1.f;
790 r.y = (v < edge.y) ? 0.f : 1.f;
791 return r;
792}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800793extern float3 __attribute__((overloadable)) step(float3 edge, float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800794 float3 r;
795 r.x = (v < edge.x) ? 0.f : 1.f;
796 r.y = (v < edge.y) ? 0.f : 1.f;
797 r.z = (v < edge.z) ? 0.f : 1.f;
798 return r;
799}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800800extern float4 __attribute__((overloadable)) step(float4 edge, float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800801 float4 r;
802 r.x = (v < edge.x) ? 0.f : 1.f;
803 r.y = (v < edge.y) ? 0.f : 1.f;
804 r.z = (v < edge.z) ? 0.f : 1.f;
805 r.w = (v < edge.w) ? 0.f : 1.f;
806 return r;
807}
808
809extern float __attribute__((overloadable)) smoothstep(float, float, float);
810extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2);
811extern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3);
812extern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4);
813extern float2 __attribute__((overloadable)) smoothstep(float, float, float2);
814extern float3 __attribute__((overloadable)) smoothstep(float, float, float3);
815extern float4 __attribute__((overloadable)) smoothstep(float, float, float4);
816
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800817extern float __attribute__((overloadable)) sign(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800818 if (v > 0) return 1.f;
819 if (v < 0) return -1.f;
820 return v;
821}
822FN_FUNC_FN(sign)
823
824
825// 6.11.5
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800826extern float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800827 float3 r;
828 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
829 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
830 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
831 return r;
832}
833
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800834extern float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800835 float4 r;
836 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
837 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
838 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
839 r.w = 0.f;
840 return r;
841}
842
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800843extern float __attribute__((overloadable)) dot(float lhs, float rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800844 return lhs * rhs;
845}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800846extern float __attribute__((overloadable)) dot(float2 lhs, float2 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800847 return lhs.x*rhs.x + lhs.y*rhs.y;
848}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800849extern float __attribute__((overloadable)) dot(float3 lhs, float3 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800850 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z;
851}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800852extern float __attribute__((overloadable)) dot(float4 lhs, float4 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800853 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z + lhs.w*rhs.w;
854}
855
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800856extern float __attribute__((overloadable)) length(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800857 return v;
858}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800859extern float __attribute__((overloadable)) length(float2 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800860 return sqrt(v.x*v.x + v.y*v.y);
861}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800862extern float __attribute__((overloadable)) length(float3 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800863 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
864}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800865extern float __attribute__((overloadable)) length(float4 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800866 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
867}
868
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800869extern float __attribute__((overloadable)) distance(float lhs, float rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800870 return length(lhs - rhs);
871}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800872extern float __attribute__((overloadable)) distance(float2 lhs, float2 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800873 return length(lhs - rhs);
874}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800875extern float __attribute__((overloadable)) distance(float3 lhs, float3 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800876 return length(lhs - rhs);
877}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800878extern float __attribute__((overloadable)) distance(float4 lhs, float4 rhs) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800879 return length(lhs - rhs);
880}
881
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800882extern float __attribute__((overloadable)) normalize(float v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800883 return 1.f;
884}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800885extern float2 __attribute__((overloadable)) normalize(float2 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800886 return v / length(v);
887}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800888extern float3 __attribute__((overloadable)) normalize(float3 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800889 return v / length(v);
890}
Shih-wei Liaob3d3f232011-01-26 17:01:32 -0800891extern float4 __attribute__((overloadable)) normalize(float4 v) {
Shih-wei Liao9e658b42011-01-26 04:05:28 -0800892 return v / length(v);
893}
894
895#undef CVT_FUNC
896#undef CVT_FUNC_2
897#undef FN_FUNC_FN
898#undef IN_FUNC_FN
899#undef FN_FUNC_FN_FN
900#undef FN_FUNC_FN_F
901#undef FN_FUNC_FN_IN
902#undef FN_FUNC_FN_I
903#undef FN_FUNC_FN_PFN
904#undef FN_FUNC_FN_PIN
905#undef FN_FUNC_FN_FN_FN
906#undef FN_FUNC_FN_FN_PIN
907#undef XN_FUNC_YN
908#undef UIN_FUNC_IN
909#undef IN_FUNC_IN
910#undef XN_FUNC_XN_XN_BODY
911#undef IN_FUNC_IN_IN_BODY