26#include "cuda_runtime.h"
28typedef unsigned int uint;
29typedef unsigned short ushort;
38inline float fminf(
float a,
float b)
43inline float fmaxf(
float a,
float b)
48inline int max(
int a,
int b)
53inline int min(
int a,
int b)
58inline float rsqrtf(
float x)
60 return 1.0f / sqrtf(x);
68inline __host__ __device__ float2 make_float2(
float s)
70 return make_float2(s, s);
72inline __host__ __device__ float2 make_float2(float3 a)
74 return make_float2(a.x, a.y);
76inline __host__ __device__ float2 make_float2(int2 a)
78 return make_float2(
float(a.x),
float(a.y));
80inline __host__ __device__ float2 make_float2(uint2 a)
82 return make_float2(
float(a.x),
float(a.y));
85inline __host__ __device__ int2 make_int2(
int s)
87 return make_int2(s, s);
89inline __host__ __device__ int2 make_int2(int3 a)
91 return make_int2(a.x, a.y);
93inline __host__ __device__ int2 make_int2(uint2 a)
95 return make_int2(
int(a.x),
int(a.y));
97inline __host__ __device__ int2 make_int2(float2 a)
99 return make_int2(
int(a.x),
int(a.y));
102inline __host__ __device__ uint2 make_uint2(uint s)
104 return make_uint2(s, s);
106inline __host__ __device__ uint2 make_uint2(uint3 a)
108 return make_uint2(a.x, a.y);
110inline __host__ __device__ uint2 make_uint2(int2 a)
112 return make_uint2(uint(a.x), uint(a.y));
115inline __host__ __device__ float3 make_float3(
float s)
117 return make_float3(s, s, s);
119inline __host__ __device__ float3 make_float3(float2 a)
121 return make_float3(a.x, a.y, 0.0f);
123inline __host__ __device__ float3 make_float3(float2 a,
float s)
125 return make_float3(a.x, a.y, s);
127inline __host__ __device__ float3 make_float3(float4 a)
129 return make_float3(a.x, a.y, a.z);
131inline __host__ __device__ float3 make_float3(int3 a)
133 return make_float3(
float(a.x),
float(a.y),
float(a.z));
135inline __host__ __device__ float3 make_float3(uint3 a)
137 return make_float3(
float(a.x),
float(a.y),
float(a.z));
140inline __host__ __device__ int3 make_int3(
int s)
142 return make_int3(s, s, s);
144inline __host__ __device__ int3 make_int3(int2 a)
146 return make_int3(a.x, a.y, 0);
148inline __host__ __device__ int3 make_int3(int2 a,
int s)
150 return make_int3(a.x, a.y, s);
152inline __host__ __device__ int3 make_int3(uint3 a)
154 return make_int3(
int(a.x),
int(a.y),
int(a.z));
156inline __host__ __device__ int3 make_int3(float3 a)
158 return make_int3(
int(a.x),
int(a.y),
int(a.z));
161inline __host__ __device__ uint3 make_uint3(uint s)
163 return make_uint3(s, s, s);
165inline __host__ __device__ uint3 make_uint3(uint2 a)
167 return make_uint3(a.x, a.y, 0);
169inline __host__ __device__ uint3 make_uint3(uint2 a, uint s)
171 return make_uint3(a.x, a.y, s);
173inline __host__ __device__ uint3 make_uint3(uint4 a)
175 return make_uint3(a.x, a.y, a.z);
177inline __host__ __device__ uint3 make_uint3(int3 a)
179 return make_uint3(uint(a.x), uint(a.y), uint(a.z));
182inline __host__ __device__ float4 make_float4(
float s)
184 return make_float4(s, s, s, s);
186inline __host__ __device__ float4 make_float4(float3 a)
188 return make_float4(a.x, a.y, a.z, 0.0f);
190inline __host__ __device__ float4 make_float4(float3 a,
float w)
192 return make_float4(a.x, a.y, a.z, w);
194inline __host__ __device__ float4 make_float4(int4 a)
196 return make_float4(
float(a.x),
float(a.y),
float(a.z),
float(a.w));
198inline __host__ __device__ float4 make_float4(uint4 a)
200 return make_float4(
float(a.x),
float(a.y),
float(a.z),
float(a.w));
203inline __host__ __device__ int4 make_int4(
int s)
205 return make_int4(s, s, s, s);
207inline __host__ __device__ int4 make_int4(int3 a)
209 return make_int4(a.x, a.y, a.z, 0);
211inline __host__ __device__ int4 make_int4(int3 a,
int w)
213 return make_int4(a.x, a.y, a.z, w);
215inline __host__ __device__ int4 make_int4(uint4 a)
217 return make_int4(
int(a.x),
int(a.y),
int(a.z),
int(a.w));
219inline __host__ __device__ int4 make_int4(float4 a)
221 return make_int4(
int(a.x),
int(a.y),
int(a.z),
int(a.w));
225inline __host__ __device__ uint4 make_uint4(uint s)
227 return make_uint4(s, s, s, s);
229inline __host__ __device__ uint4 make_uint4(uint3 a)
231 return make_uint4(a.x, a.y, a.z, 0);
233inline __host__ __device__ uint4 make_uint4(uint3 a, uint w)
235 return make_uint4(a.x, a.y, a.z, w);
237inline __host__ __device__ uint4 make_uint4(int4 a)
239 return make_uint4(uint(a.x), uint(a.y), uint(a.z), uint(a.w));
246inline __host__ __device__ float2 operator-(float2 &a)
248 return make_float2(-a.x, -a.y);
250inline __host__ __device__ int2 operator-(int2 &a)
252 return make_int2(-a.x, -a.y);
254inline __host__ __device__ float3 operator-(float3 &a)
256 return make_float3(-a.x, -a.y, -a.z);
258inline __host__ __device__ int3 operator-(int3 &a)
260 return make_int3(-a.x, -a.y, -a.z);
262inline __host__ __device__ float4 operator-(float4 &a)
264 return make_float4(-a.x, -a.y, -a.z, -a.w);
266inline __host__ __device__ int4 operator-(int4 &a)
268 return make_int4(-a.x, -a.y, -a.z, -a.w);
275inline __host__ __device__ float2 operator+(float2 a, float2 b)
277 return make_float2(a.x + b.x, a.y + b.y);
279inline __host__ __device__
void operator+=(float2 &a, float2 b)
281 a.x += b.x; a.y += b.y;
283inline __host__ __device__ float2 operator+(float2 a,
float b)
285 return make_float2(a.x + b, a.y + b);
287inline __host__ __device__ float2 operator+(
float b, float2 a)
289 return make_float2(a.x + b, a.y + b);
291inline __host__ __device__
void operator+=(float2 &a,
float b)
296inline __host__ __device__ int2 operator+(int2 a, int2 b)
298 return make_int2(a.x + b.x, a.y + b.y);
300inline __host__ __device__
void operator+=(int2 &a, int2 b)
302 a.x += b.x; a.y += b.y;
304inline __host__ __device__ int2 operator+(int2 a,
int b)
306 return make_int2(a.x + b, a.y + b);
308inline __host__ __device__ int2 operator+(
int b, int2 a)
310 return make_int2(a.x + b, a.y + b);
312inline __host__ __device__
void operator+=(int2 &a,
int b)
317inline __host__ __device__ uint2 operator+(uint2 a, uint2 b)
319 return make_uint2(a.x + b.x, a.y + b.y);
321inline __host__ __device__
void operator+=(uint2 &a, uint2 b)
323 a.x += b.x; a.y += b.y;
325inline __host__ __device__ uint2 operator+(uint2 a, uint b)
327 return make_uint2(a.x + b, a.y + b);
329inline __host__ __device__ uint2 operator+(uint b, uint2 a)
331 return make_uint2(a.x + b, a.y + b);
333inline __host__ __device__
void operator+=(uint2 &a, uint b)
339inline __host__ __device__ float3 operator+(float3 a, float3 b)
341 return make_float3(a.x + b.x, a.y + b.y, a.z + b.z);
343inline __host__ __device__
void operator+=(float3 &a, float3 b)
345 a.x += b.x; a.y += b.y; a.z += b.z;
347inline __host__ __device__ float3 operator+(float3 a,
float b)
349 return make_float3(a.x + b, a.y + b, a.z + b);
351inline __host__ __device__
void operator+=(float3 &a,
float b)
353 a.x += b; a.y += b; a.z += b;
356inline __host__ __device__ int3 operator+(int3 a, int3 b)
358 return make_int3(a.x + b.x, a.y + b.y, a.z + b.z);
360inline __host__ __device__
void operator+=(int3 &a, int3 b)
362 a.x += b.x; a.y += b.y; a.z += b.z;
364inline __host__ __device__ int3 operator+(int3 a,
int b)
366 return make_int3(a.x + b, a.y + b, a.z + b);
368inline __host__ __device__
void operator+=(int3 &a,
int b)
370 a.x += b; a.y += b; a.z += b;
373inline __host__ __device__ uint3 operator+(uint3 a, uint3 b)
375 return make_uint3(a.x + b.x, a.y + b.y, a.z + b.z);
377inline __host__ __device__
void operator+=(uint3 &a, uint3 b)
379 a.x += b.x; a.y += b.y; a.z += b.z;
381inline __host__ __device__ uint3 operator+(uint3 a, uint b)
383 return make_uint3(a.x + b, a.y + b, a.z + b);
385inline __host__ __device__
void operator+=(uint3 &a, uint b)
387 a.x += b; a.y += b; a.z += b;
390inline __host__ __device__ int3 operator+(
int b, int3 a)
392 return make_int3(a.x + b, a.y + b, a.z + b);
394inline __host__ __device__ uint3 operator+(uint b, uint3 a)
396 return make_uint3(a.x + b, a.y + b, a.z + b);
398inline __host__ __device__ float3 operator+(
float b, float3 a)
400 return make_float3(a.x + b, a.y + b, a.z + b);
403inline __host__ __device__ float4 operator+(float4 a, float4 b)
405 return make_float4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
407inline __host__ __device__
void operator+=(float4 &a, float4 b)
409 a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w;
411inline __host__ __device__ float4 operator+(float4 a,
float b)
413 return make_float4(a.x + b, a.y + b, a.z + b, a.w + b);
415inline __host__ __device__ float4 operator+(
float b, float4 a)
417 return make_float4(a.x + b, a.y + b, a.z + b, a.w + b);
419inline __host__ __device__
void operator+=(float4 &a,
float b)
421 a.x += b; a.y += b; a.z += b; a.w += b;
424inline __host__ __device__ int4 operator+(int4 a, int4 b)
426 return make_int4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
428inline __host__ __device__
void operator+=(int4 &a, int4 b)
430 a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w;
432inline __host__ __device__ int4 operator+(int4 a,
int b)
434 return make_int4(a.x + b, a.y + b, a.z + b, a.w + b);
436inline __host__ __device__ int4 operator+(
int b, int4 a)
438 return make_int4(a.x + b, a.y + b, a.z + b, a.w + b);
440inline __host__ __device__
void operator+=(int4 &a,
int b)
442 a.x += b; a.y += b; a.z += b; a.w += b;
445inline __host__ __device__ uint4 operator+(uint4 a, uint4 b)
447 return make_uint4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
449inline __host__ __device__
void operator+=(uint4 &a, uint4 b)
451 a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w;
453inline __host__ __device__ uint4 operator+(uint4 a, uint b)
455 return make_uint4(a.x + b, a.y + b, a.z + b, a.w + b);
457inline __host__ __device__ uint4 operator+(uint b, uint4 a)
459 return make_uint4(a.x + b, a.y + b, a.z + b, a.w + b);
461inline __host__ __device__
void operator+=(uint4 &a, uint b)
463 a.x += b; a.y += b; a.z += b; a.w += b;
470inline __host__ __device__ float2 operator-(float2 a, float2 b)
472 return make_float2(a.x - b.x, a.y - b.y);
474inline __host__ __device__
void operator-=(float2 &a, float2 b)
476 a.x -= b.x; a.y -= b.y;
478inline __host__ __device__ float2 operator-(float2 a,
float b)
480 return make_float2(a.x - b, a.y - b);
482inline __host__ __device__ float2 operator-(
float b, float2 a)
484 return make_float2(b - a.x, b - a.y);
486inline __host__ __device__
void operator-=(float2 &a,
float b)
491inline __host__ __device__ int2 operator-(int2 a, int2 b)
493 return make_int2(a.x - b.x, a.y - b.y);
495inline __host__ __device__
void operator-=(int2 &a, int2 b)
497 a.x -= b.x; a.y -= b.y;
499inline __host__ __device__ int2 operator-(int2 a,
int b)
501 return make_int2(a.x - b, a.y - b);
503inline __host__ __device__ int2 operator-(
int b, int2 a)
505 return make_int2(b - a.x, b - a.y);
507inline __host__ __device__
void operator-=(int2 &a,
int b)
512inline __host__ __device__ uint2 operator-(uint2 a, uint2 b)
514 return make_uint2(a.x - b.x, a.y - b.y);
516inline __host__ __device__
void operator-=(uint2 &a, uint2 b)
518 a.x -= b.x; a.y -= b.y;
520inline __host__ __device__ uint2 operator-(uint2 a, uint b)
522 return make_uint2(a.x - b, a.y - b);
524inline __host__ __device__ uint2 operator-(uint b, uint2 a)
526 return make_uint2(b - a.x, b - a.y);
528inline __host__ __device__
void operator-=(uint2 &a, uint b)
533inline __host__ __device__ float3 operator-(float3 a, float3 b)
535 return make_float3(a.x - b.x, a.y - b.y, a.z - b.z);
537inline __host__ __device__
void operator-=(float3 &a, float3 b)
539 a.x -= b.x; a.y -= b.y; a.z -= b.z;
541inline __host__ __device__ float3 operator-(float3 a,
float b)
543 return make_float3(a.x - b, a.y - b, a.z - b);
545inline __host__ __device__ float3 operator-(
float b, float3 a)
547 return make_float3(b - a.x, b - a.y, b - a.z);
549inline __host__ __device__
void operator-=(float3 &a,
float b)
551 a.x -= b; a.y -= b; a.z -= b;
554inline __host__ __device__ int3 operator-(int3 a, int3 b)
556 return make_int3(a.x - b.x, a.y - b.y, a.z - b.z);
558inline __host__ __device__
void operator-=(int3 &a, int3 b)
560 a.x -= b.x; a.y -= b.y; a.z -= b.z;
562inline __host__ __device__ int3 operator-(int3 a,
int b)
564 return make_int3(a.x - b, a.y - b, a.z - b);
566inline __host__ __device__ int3 operator-(
int b, int3 a)
568 return make_int3(b - a.x, b - a.y, b - a.z);
570inline __host__ __device__
void operator-=(int3 &a,
int b)
572 a.x -= b; a.y -= b; a.z -= b;
575inline __host__ __device__ uint3 operator-(uint3 a, uint3 b)
577 return make_uint3(a.x - b.x, a.y - b.y, a.z - b.z);
579inline __host__ __device__
void operator-=(uint3 &a, uint3 b)
581 a.x -= b.x; a.y -= b.y; a.z -= b.z;
583inline __host__ __device__ uint3 operator-(uint3 a, uint b)
585 return make_uint3(a.x - b, a.y - b, a.z - b);
587inline __host__ __device__ uint3 operator-(uint b, uint3 a)
589 return make_uint3(b - a.x, b - a.y, b - a.z);
591inline __host__ __device__
void operator-=(uint3 &a, uint b)
593 a.x -= b; a.y -= b; a.z -= b;
596inline __host__ __device__ float4 operator-(float4 a, float4 b)
598 return make_float4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
600inline __host__ __device__
void operator-=(float4 &a, float4 b)
602 a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w;
604inline __host__ __device__ float4 operator-(float4 a,
float b)
606 return make_float4(a.x - b, a.y - b, a.z - b, a.w - b);
608inline __host__ __device__
void operator-=(float4 &a,
float b)
610 a.x -= b; a.y -= b; a.z -= b; a.w -= b;
613inline __host__ __device__ int4 operator-(int4 a, int4 b)
615 return make_int4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
617inline __host__ __device__
void operator-=(int4 &a, int4 b)
619 a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w;
621inline __host__ __device__ int4 operator-(int4 a,
int b)
623 return make_int4(a.x - b, a.y - b, a.z - b, a.w - b);
625inline __host__ __device__ int4 operator-(
int b, int4 a)
627 return make_int4(b - a.x, b - a.y, b - a.z, b - a.w);
629inline __host__ __device__
void operator-=(int4 &a,
int b)
631 a.x -= b; a.y -= b; a.z -= b; a.w -= b;
634inline __host__ __device__ uint4 operator-(uint4 a, uint4 b)
636 return make_uint4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
638inline __host__ __device__
void operator-=(uint4 &a, uint4 b)
640 a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w;
642inline __host__ __device__ uint4 operator-(uint4 a, uint b)
644 return make_uint4(a.x - b, a.y - b, a.z - b, a.w - b);
646inline __host__ __device__ uint4 operator-(uint b, uint4 a)
648 return make_uint4(b - a.x, b - a.y, b - a.z, b - a.w);
650inline __host__ __device__
void operator-=(uint4 &a, uint b)
652 a.x -= b; a.y -= b; a.z -= b; a.w -= b;
659inline __host__ __device__ float2 operator*(float2 a, float2 b)
661 return make_float2(a.x * b.x, a.y * b.y);
663inline __host__ __device__
void operator*=(float2 &a, float2 b)
665 a.x *= b.x; a.y *= b.y;
667inline __host__ __device__ float2 operator*(float2 a,
float b)
669 return make_float2(a.x * b, a.y * b);
671inline __host__ __device__ float2 operator*(
float b, float2 a)
673 return make_float2(b * a.x, b * a.y);
675inline __host__ __device__
void operator*=(float2 &a,
float b)
680inline __host__ __device__ int2 operator*(int2 a, int2 b)
682 return make_int2(a.x * b.x, a.y * b.y);
684inline __host__ __device__
void operator*=(int2 &a, int2 b)
686 a.x *= b.x; a.y *= b.y;
688inline __host__ __device__ int2 operator*(int2 a,
int b)
690 return make_int2(a.x * b, a.y * b);
692inline __host__ __device__ int2 operator*(
int b, int2 a)
694 return make_int2(b * a.x, b * a.y);
696inline __host__ __device__
void operator*=(int2 &a,
int b)
701inline __host__ __device__ uint2 operator*(uint2 a, uint2 b)
703 return make_uint2(a.x * b.x, a.y * b.y);
705inline __host__ __device__
void operator*=(uint2 &a, uint2 b)
707 a.x *= b.x; a.y *= b.y;
709inline __host__ __device__ uint2 operator*(uint2 a, uint b)
711 return make_uint2(a.x * b, a.y * b);
713inline __host__ __device__ uint2 operator*(uint b, uint2 a)
715 return make_uint2(b * a.x, b * a.y);
717inline __host__ __device__
void operator*=(uint2 &a, uint b)
722inline __host__ __device__ float3 operator*(float3 a, float3 b)
724 return make_float3(a.x * b.x, a.y * b.y, a.z * b.z);
726inline __host__ __device__
void operator*=(float3 &a, float3 b)
728 a.x *= b.x; a.y *= b.y; a.z *= b.z;
730inline __host__ __device__ float3 operator*(float3 a,
float b)
732 return make_float3(a.x * b, a.y * b, a.z * b);
734inline __host__ __device__ float3 operator*(
float b, float3 a)
736 return make_float3(b * a.x, b * a.y, b * a.z);
738inline __host__ __device__
void operator*=(float3 &a,
float b)
740 a.x *= b; a.y *= b; a.z *= b;
743inline __host__ __device__ int3 operator*(int3 a, int3 b)
745 return make_int3(a.x * b.x, a.y * b.y, a.z * b.z);
747inline __host__ __device__
void operator*=(int3 &a, int3 b)
749 a.x *= b.x; a.y *= b.y; a.z *= b.z;
751inline __host__ __device__ int3 operator*(int3 a,
int b)
753 return make_int3(a.x * b, a.y * b, a.z * b);
755inline __host__ __device__ int3 operator*(
int b, int3 a)
757 return make_int3(b * a.x, b * a.y, b * a.z);
759inline __host__ __device__
void operator*=(int3 &a,
int b)
761 a.x *= b; a.y *= b; a.z *= b;
764inline __host__ __device__ uint3 operator*(uint3 a, uint3 b)
766 return make_uint3(a.x * b.x, a.y * b.y, a.z * b.z);
768inline __host__ __device__
void operator*=(uint3 &a, uint3 b)
770 a.x *= b.x; a.y *= b.y; a.z *= b.z;
772inline __host__ __device__ uint3 operator*(uint3 a, uint b)
774 return make_uint3(a.x * b, a.y * b, a.z * b);
776inline __host__ __device__ uint3 operator*(uint b, uint3 a)
778 return make_uint3(b * a.x, b * a.y, b * a.z);
780inline __host__ __device__
void operator*=(uint3 &a, uint b)
782 a.x *= b; a.y *= b; a.z *= b;
785inline __host__ __device__ float4 operator*(float4 a, float4 b)
787 return make_float4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
789inline __host__ __device__
void operator*=(float4 &a, float4 b)
791 a.x *= b.x; a.y *= b.y; a.z *= b.z; a.w *= b.w;
793inline __host__ __device__ float4 operator*(float4 a,
float b)
795 return make_float4(a.x * b, a.y * b, a.z * b, a.w * b);
797inline __host__ __device__ float4 operator*(
float b, float4 a)
799 return make_float4(b * a.x, b * a.y, b * a.z, b * a.w);
801inline __host__ __device__
void operator*=(float4 &a,
float b)
803 a.x *= b; a.y *= b; a.z *= b; a.w *= b;
806inline __host__ __device__ int4 operator*(int4 a, int4 b)
808 return make_int4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
810inline __host__ __device__
void operator*=(int4 &a, int4 b)
812 a.x *= b.x; a.y *= b.y; a.z *= b.z; a.w *= b.w;
814inline __host__ __device__ int4 operator*(int4 a,
int b)
816 return make_int4(a.x * b, a.y * b, a.z * b, a.w * b);
818inline __host__ __device__ int4 operator*(
int b, int4 a)
820 return make_int4(b * a.x, b * a.y, b * a.z, b * a.w);
822inline __host__ __device__
void operator*=(int4 &a,
int b)
824 a.x *= b; a.y *= b; a.z *= b; a.w *= b;
827inline __host__ __device__ uint4 operator*(uint4 a, uint4 b)
829 return make_uint4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
831inline __host__ __device__
void operator*=(uint4 &a, uint4 b)
833 a.x *= b.x; a.y *= b.y; a.z *= b.z; a.w *= b.w;
835inline __host__ __device__ uint4 operator*(uint4 a, uint b)
837 return make_uint4(a.x * b, a.y * b, a.z * b, a.w * b);
839inline __host__ __device__ uint4 operator*(uint b, uint4 a)
841 return make_uint4(b * a.x, b * a.y, b * a.z, b * a.w);
843inline __host__ __device__
void operator*=(uint4 &a, uint b)
845 a.x *= b; a.y *= b; a.z *= b; a.w *= b;
852inline __host__ __device__ float2 operator/(float2 a, float2 b)
854 return make_float2(a.x / b.x, a.y / b.y);
856inline __host__ __device__
void operator/=(float2 &a, float2 b)
858 a.x /= b.x; a.y /= b.y;
860inline __host__ __device__ float2 operator/(float2 a,
float b)
862 return make_float2(a.x / b, a.y / b);
864inline __host__ __device__
void operator/=(float2 &a,
float b)
868inline __host__ __device__ float2 operator/(
float b, float2 a)
870 return make_float2(b / a.x, b / a.y);
873inline __host__ __device__ float3 operator/(float3 a, float3 b)
875 return make_float3(a.x / b.x, a.y / b.y, a.z / b.z);
877inline __host__ __device__
void operator/=(float3 &a, float3 b)
879 a.x /= b.x; a.y /= b.y; a.z /= b.z;
881inline __host__ __device__ float3 operator/(float3 a,
float b)
883 return make_float3(a.x / b, a.y / b, a.z / b);
885inline __host__ __device__
void operator/=(float3 &a,
float b)
887 a.x /= b; a.y /= b; a.z /= b;
889inline __host__ __device__ float3 operator/(
float b, float3 a)
891 return make_float3(b / a.x, b / a.y, b / a.z);
894inline __host__ __device__ float4 operator/(float4 a, float4 b)
896 return make_float4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
898inline __host__ __device__
void operator/=(float4 &a, float4 b)
900 a.x /= b.x; a.y /= b.y; a.z /= b.z; a.w /= b.w;
902inline __host__ __device__ float4 operator/(float4 a,
float b)
904 return make_float4(a.x / b, a.y / b, a.z / b, a.w / b);
906inline __host__ __device__
void operator/=(float4 &a,
float b)
908 a.x /= b; a.y /= b; a.z /= b; a.w /= b;
910inline __host__ __device__ float4 operator/(
float b, float4 a){
911 return make_float4(b / a.x, b / a.y, b / a.z, b / a.w);
918inline __host__ __device__ float2 fminf(float2 a, float2 b)
920 return make_float2(fminf(a.x,b.x), fminf(a.y,b.y));
922inline __host__ __device__ float3 fminf(float3 a, float3 b)
924 return make_float3(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z));
926inline __host__ __device__ float4 fminf(float4 a, float4 b)
928 return make_float4(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z), fminf(a.w,b.w));
931inline __host__ __device__ int2 min(int2 a, int2 b)
933 return make_int2(min(a.x,b.x), min(a.y,b.y));
935inline __host__ __device__ int3 min(int3 a, int3 b)
937 return make_int3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z));
939inline __host__ __device__ int4 min(int4 a, int4 b)
941 return make_int4(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z), min(a.w,b.w));
944inline __host__ __device__ uint2 min(uint2 a, uint2 b)
946 return make_uint2(min(a.x,b.x), min(a.y,b.y));
948inline __host__ __device__ uint3 min(uint3 a, uint3 b)
950 return make_uint3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z));
952inline __host__ __device__ uint4 min(uint4 a, uint4 b)
954 return make_uint4(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z), min(a.w,b.w));
961inline __host__ __device__ float2 fmaxf(float2 a, float2 b)
963 return make_float2(fmaxf(a.x,b.x), fmaxf(a.y,b.y));
965inline __host__ __device__ float3 fmaxf(float3 a, float3 b)
967 return make_float3(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z));
969inline __host__ __device__ float4 fmaxf(float4 a, float4 b)
971 return make_float4(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z), fmaxf(a.w,b.w));
974inline __host__ __device__ int2 max(int2 a, int2 b)
976 return make_int2(max(a.x,b.x), max(a.y,b.y));
978inline __host__ __device__ int3 max(int3 a, int3 b)
980 return make_int3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z));
982inline __host__ __device__ int4 max(int4 a, int4 b)
984 return make_int4(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z), max(a.w,b.w));
987inline __host__ __device__ uint2 max(uint2 a, uint2 b)
989 return make_uint2(max(a.x,b.x), max(a.y,b.y));
991inline __host__ __device__ uint3 max(uint3 a, uint3 b)
993 return make_uint3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z));
995inline __host__ __device__ uint4 max(uint4 a, uint4 b)
997 return make_uint4(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z), max(a.w,b.w));
1005inline __device__ __host__
float lerp(
float a,
float b,
float t)
1009inline __device__ __host__ float2 lerp(float2 a, float2 b,
float t)
1013inline __device__ __host__ float3 lerp(float3 a, float3 b,
float t)
1017inline __device__ __host__ float4 lerp(float4 a, float4 b,
float t)
1027inline __device__ __host__
float clamp(
float f,
float a,
float b)
1029 return fmaxf(a, fminf(f, b));
1031inline __device__ __host__
int clamp(
int f,
int a,
int b)
1033 return max(a, min(f, b));
1035inline __device__ __host__ uint clamp(uint f, uint a, uint b)
1037 return max(a, min(f, b));
1040inline __device__ __host__ float2 clamp(float2 v,
float a,
float b)
1042 return make_float2(clamp(v.x, a, b), clamp(v.y, a, b));
1044inline __device__ __host__ float2 clamp(float2 v, float2 a, float2 b)
1046 return make_float2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y));
1048inline __device__ __host__ float3 clamp(float3 v,
float a,
float b)
1050 return make_float3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b));
1052inline __device__ __host__ float3 clamp(float3 v, float3 a, float3 b)
1054 return make_float3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z));
1056inline __device__ __host__ float4 clamp(float4 v,
float a,
float b)
1058 return make_float4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b));
1060inline __device__ __host__ float4 clamp(float4 v, float4 a, float4 b)
1062 return make_float4(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z), clamp(v.w, a.w, b.w));
1065inline __device__ __host__ int2 clamp(int2 v,
int a,
int b)
1067 return make_int2(clamp(v.x, a, b), clamp(v.y, a, b));
1069inline __device__ __host__ int2 clamp(int2 v, int2 a, int2 b)
1071 return make_int2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y));
1073inline __device__ __host__ int3 clamp(int3 v,
int a,
int b)
1075 return make_int3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b));
1077inline __device__ __host__ int3 clamp(int3 v, int3 a, int3 b)
1079 return make_int3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z));
1081inline __device__ __host__ int4 clamp(int4 v,
int a,
int b)
1083 return make_int4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b));
1085inline __device__ __host__ int4 clamp(int4 v, int4 a, int4 b)
1087 return make_int4(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z), clamp(v.w, a.w, b.w));
1090inline __device__ __host__ uint2 clamp(uint2 v, uint a, uint b)
1092 return make_uint2(clamp(v.x, a, b), clamp(v.y, a, b));
1094inline __device__ __host__ uint2 clamp(uint2 v, uint2 a, uint2 b)
1096 return make_uint2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y));
1098inline __device__ __host__ uint3 clamp(uint3 v, uint a, uint b)
1100 return make_uint3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b));
1102inline __device__ __host__ uint3 clamp(uint3 v, uint3 a, uint3 b)
1104 return make_uint3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z));
1106inline __device__ __host__ uint4 clamp(uint4 v, uint a, uint b)
1108 return make_uint4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b));
1110inline __device__ __host__ uint4 clamp(uint4 v, uint4 a, uint4 b)
1112 return make_uint4(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z), clamp(v.w, a.w, b.w));
1119inline __host__ __device__
float dot(float2 a, float2 b)
1121 return a.x * b.x + a.y * b.y;
1123inline __host__ __device__
float dot(float3 a, float3 b)
1125 return a.x * b.x + a.y * b.y + a.z * b.z;
1127inline __host__ __device__
float dot(float4 a, float4 b)
1129 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
1132inline __host__ __device__
int dot(int2 a, int2 b)
1134 return a.x * b.x + a.y * b.y;
1136inline __host__ __device__
int dot(int3 a, int3 b)
1138 return a.x * b.x + a.y * b.y + a.z * b.z;
1140inline __host__ __device__
int dot(int4 a, int4 b)
1142 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
1145inline __host__ __device__ uint dot(uint2 a, uint2 b)
1147 return a.x * b.x + a.y * b.y;
1149inline __host__ __device__ uint dot(uint3 a, uint3 b)
1151 return a.x * b.x + a.y * b.y + a.z * b.z;
1153inline __host__ __device__ uint dot(uint4 a, uint4 b)
1155 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
1162inline __host__ __device__
float length(float2 v)
1164 return sqrtf(dot(v, v));
1166inline __host__ __device__
float length(float3 v)
1168 return sqrtf(dot(v, v));
1170inline __host__ __device__
float length(float4 v)
1172 return sqrtf(dot(v, v));
1179inline __host__ __device__ float2 normalize(float2 v)
1181 float invLen = rsqrtf(dot(v, v));
1184inline __host__ __device__ float3 normalize(float3 v)
1186 float invLen = rsqrtf(dot(v, v));
1189inline __host__ __device__ float4 normalize(float4 v)
1191 float invLen = rsqrtf(dot(v, v));
1199inline __host__ __device__ float2 floorf(float2 v)
1201 return make_float2(floorf(v.x), floorf(v.y));
1203inline __host__ __device__ float3 floorf(float3 v)
1205 return make_float3(floorf(v.x), floorf(v.y), floorf(v.z));
1207inline __host__ __device__ float4 floorf(float4 v)
1209 return make_float4(floorf(v.x), floorf(v.y), floorf(v.z), floorf(v.w));
1216inline __host__ __device__
float fracf(
float v)
1218 return v - floorf(v);
1220inline __host__ __device__ float2 fracf(float2 v)
1222 return make_float2(fracf(v.x), fracf(v.y));
1224inline __host__ __device__ float3 fracf(float3 v)
1226 return make_float3(fracf(v.x), fracf(v.y), fracf(v.z));
1228inline __host__ __device__ float4 fracf(float4 v)
1230 return make_float4(fracf(v.x), fracf(v.y), fracf(v.z), fracf(v.w));
1237inline __host__ __device__ float2 fmodf(float2 a, float2 b)
1239 return make_float2(fmodf(a.x, b.x), fmodf(a.y, b.y));
1241inline __host__ __device__ float3 fmodf(float3 a, float3 b)
1243 return make_float3(fmodf(a.x, b.x), fmodf(a.y, b.y), fmodf(a.z, b.z));
1245inline __host__ __device__ float4 fmodf(float4 a, float4 b)
1247 return make_float4(fmodf(a.x, b.x), fmodf(a.y, b.y), fmodf(a.z, b.z), fmodf(a.w, b.w));
1254inline __host__ __device__ float2 fabs(float2 v)
1256 return make_float2(fabs(v.x), fabs(v.y));
1258inline __host__ __device__ float3 fabs(float3 v)
1260 return make_float3(fabs(v.x), fabs(v.y), fabs(v.z));
1262inline __host__ __device__ float4 fabs(float4 v)
1264 return make_float4(fabs(v.x), fabs(v.y), fabs(v.z), fabs(v.w));
1267inline __host__ __device__ int2 abs(int2 v)
1269 return make_int2(abs(v.x), abs(v.y));
1271inline __host__ __device__ int3 abs(int3 v)
1273 return make_int3(abs(v.x), abs(v.y), abs(v.z));
1275inline __host__ __device__ int4 abs(int4 v)
1277 return make_int4(abs(v.x), abs(v.y), abs(v.z), abs(v.w));
1286inline __host__ __device__ float3 reflect(float3 i, float3 n)
1288 return i - 2.0f * n * dot(n,i);
1295inline __host__ __device__ float3 cross(float3 a, float3 b)
1297 return make_float3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x);
1307inline __device__ __host__
float smoothstep(
float a,
float b,
float x)
1309 float y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1310 return (y*y*(3.0f - (2.0f*y)));
1312inline __device__ __host__ float2 smoothstep(float2 a, float2 b, float2 x)
1314 float2 y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1315 return (y*y*(make_float2(3.0f) - (make_float2(2.0f)*y)));
1317inline __device__ __host__ float3 smoothstep(float3 a, float3 b, float3 x)
1319 float3 y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1320 return (y*y*(make_float3(3.0f) - (make_float3(2.0f)*y)));
1322inline __device__ __host__ float4 smoothstep(float4 a, float4 b, float4 x)
1324 float4 y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1325 return (y*y*(make_float4(3.0f) - (make_float4(2.0f)*y)));