25 #include "cuda_runtime.h"
27 using uint =
unsigned int;
28 using ushort =
unsigned short;
37 inline float fminf(
float a,
float b)
42 inline float fmaxf(
float a,
float b)
47 inline int max(
int a,
int b)
52 inline int min(
int a,
int b)
57 inline float rsqrtf(
float x)
59 return 1.0f / sqrtf(x);
67 inline __host__ __device__ float2 make_float2(
float s)
69 return make_float2(s, s);
71 inline __host__ __device__ float2 make_float2(float3 a)
73 return make_float2(a.x, a.y);
75 inline __host__ __device__ float2 make_float2(int2 a)
77 return make_float2(
float(a.x),
float(a.y));
79 inline __host__ __device__ float2 make_float2(uint2 a)
81 return make_float2(
float(a.x),
float(a.y));
84 inline __host__ __device__ int2 make_int2(
int s)
86 return make_int2(s, s);
88 inline __host__ __device__ int2 make_int2(int3 a)
90 return make_int2(a.x, a.y);
92 inline __host__ __device__ int2 make_int2(uint2 a)
94 return make_int2(
int(a.x),
int(a.y));
96 inline __host__ __device__ int2 make_int2(float2 a)
98 return make_int2(
int(a.x),
int(a.y));
101 inline __host__ __device__ uint2 make_uint2(uint s)
103 return make_uint2(s, s);
105 inline __host__ __device__ uint2 make_uint2(uint3 a)
107 return make_uint2(a.x, a.y);
109 inline __host__ __device__ uint2 make_uint2(int2 a)
111 return make_uint2(uint(a.x), uint(a.y));
114 inline __host__ __device__ float3 make_float3(
float s)
116 return make_float3(s, s, s);
118 inline __host__ __device__ float3 make_float3(float2 a)
120 return make_float3(a.x, a.y, 0.0f);
122 inline __host__ __device__ float3 make_float3(float2 a,
float s)
124 return make_float3(a.x, a.y, s);
126 inline __host__ __device__ float3 make_float3(float4 a)
128 return make_float3(a.x, a.y, a.z);
130 inline __host__ __device__ float3 make_float3(int3 a)
132 return make_float3(
float(a.x),
float(a.y),
float(a.z));
134 inline __host__ __device__ float3 make_float3(uint3 a)
136 return make_float3(
float(a.x),
float(a.y),
float(a.z));
139 inline __host__ __device__ int3 make_int3(
int s)
141 return make_int3(s, s, s);
143 inline __host__ __device__ int3 make_int3(int2 a)
145 return make_int3(a.x, a.y, 0);
147 inline __host__ __device__ int3 make_int3(int2 a,
int s)
149 return make_int3(a.x, a.y, s);
151 inline __host__ __device__ int3 make_int3(uint3 a)
153 return make_int3(
int(a.x),
int(a.y),
int(a.z));
155 inline __host__ __device__ int3 make_int3(float3 a)
157 return make_int3(
int(a.x),
int(a.y),
int(a.z));
160 inline __host__ __device__ uint3 make_uint3(uint s)
162 return make_uint3(s, s, s);
164 inline __host__ __device__ uint3 make_uint3(uint2 a)
166 return make_uint3(a.x, a.y, 0);
168 inline __host__ __device__ uint3 make_uint3(uint2 a, uint s)
170 return make_uint3(a.x, a.y, s);
172 inline __host__ __device__ uint3 make_uint3(uint4 a)
174 return make_uint3(a.x, a.y, a.z);
176 inline __host__ __device__ uint3 make_uint3(int3 a)
178 return make_uint3(uint(a.x), uint(a.y), uint(a.z));
181 inline __host__ __device__ float4 make_float4(
float s)
183 return make_float4(s, s, s, s);
185 inline __host__ __device__ float4 make_float4(float3 a)
187 return make_float4(a.x, a.y, a.z, 0.0f);
189 inline __host__ __device__ float4 make_float4(float3 a,
float w)
191 return make_float4(a.x, a.y, a.z, w);
193 inline __host__ __device__ float4 make_float4(int4 a)
195 return make_float4(
float(a.x),
float(a.y),
float(a.z),
float(a.w));
197 inline __host__ __device__ float4 make_float4(uint4 a)
199 return make_float4(
float(a.x),
float(a.y),
float(a.z),
float(a.w));
202 inline __host__ __device__ int4 make_int4(
int s)
204 return make_int4(s, s, s, s);
206 inline __host__ __device__ int4 make_int4(int3 a)
208 return make_int4(a.x, a.y, a.z, 0);
210 inline __host__ __device__ int4 make_int4(int3 a,
int w)
212 return make_int4(a.x, a.y, a.z, w);
214 inline __host__ __device__ int4 make_int4(uint4 a)
216 return make_int4(
int(a.x),
int(a.y),
int(a.z),
int(a.w));
218 inline __host__ __device__ int4 make_int4(float4 a)
220 return make_int4(
int(a.x),
int(a.y),
int(a.z),
int(a.w));
224 inline __host__ __device__ uint4 make_uint4(uint s)
226 return make_uint4(s, s, s, s);
228 inline __host__ __device__ uint4 make_uint4(uint3 a)
230 return make_uint4(a.x, a.y, a.z, 0);
232 inline __host__ __device__ uint4 make_uint4(uint3 a, uint w)
234 return make_uint4(a.x, a.y, a.z, w);
236 inline __host__ __device__ uint4 make_uint4(int4 a)
238 return make_uint4(uint(a.x), uint(a.y), uint(a.z), uint(a.w));
245 inline __host__ __device__ float2 operator-(float2 &a)
247 return make_float2(-a.x, -a.y);
249 inline __host__ __device__ int2 operator-(int2 &a)
251 return make_int2(-a.x, -a.y);
253 inline __host__ __device__ float3 operator-(float3 &a)
255 return make_float3(-a.x, -a.y, -a.z);
257 inline __host__ __device__ int3 operator-(int3 &a)
259 return make_int3(-a.x, -a.y, -a.z);
261 inline __host__ __device__ float4 operator-(float4 &a)
263 return make_float4(-a.x, -a.y, -a.z, -a.w);
265 inline __host__ __device__ int4 operator-(int4 &a)
267 return make_int4(-a.x, -a.y, -a.z, -a.w);
274 inline __host__ __device__ float2 operator+(float2 a, float2 b)
276 return make_float2(a.x + b.x, a.y + b.y);
278 inline __host__ __device__
void operator+=(float2 &a, float2 b)
280 a.x += b.x; a.y += b.y;
282 inline __host__ __device__ float2 operator+(float2 a,
float b)
284 return make_float2(a.x + b, a.y + b);
286 inline __host__ __device__ float2 operator+(
float b, float2 a)
288 return make_float2(a.x + b, a.y + b);
290 inline __host__ __device__
void operator+=(float2 &a,
float b)
295 inline __host__ __device__ int2 operator+(int2 a, int2 b)
297 return make_int2(a.x + b.x, a.y + b.y);
299 inline __host__ __device__
void operator+=(int2 &a, int2 b)
301 a.x += b.x; a.y += b.y;
303 inline __host__ __device__ int2 operator+(int2 a,
int b)
305 return make_int2(a.x + b, a.y + b);
307 inline __host__ __device__ int2 operator+(
int b, int2 a)
309 return make_int2(a.x + b, a.y + b);
311 inline __host__ __device__
void operator+=(int2 &a,
int b)
316 inline __host__ __device__ uint2 operator+(uint2 a, uint2 b)
318 return make_uint2(a.x + b.x, a.y + b.y);
320 inline __host__ __device__
void operator+=(uint2 &a, uint2 b)
322 a.x += b.x; a.y += b.y;
324 inline __host__ __device__ uint2 operator+(uint2 a, uint b)
326 return make_uint2(a.x + b, a.y + b);
328 inline __host__ __device__ uint2 operator+(uint b, uint2 a)
330 return make_uint2(a.x + b, a.y + b);
332 inline __host__ __device__
void operator+=(uint2 &a, uint b)
338 inline __host__ __device__ float3 operator+(float3 a, float3 b)
340 return make_float3(a.x + b.x, a.y + b.y, a.z + b.z);
342 inline __host__ __device__
void operator+=(float3 &a, float3 b)
344 a.x += b.x; a.y += b.y; a.z += b.z;
346 inline __host__ __device__ float3 operator+(float3 a,
float b)
348 return make_float3(a.x + b, a.y + b, a.z + b);
350 inline __host__ __device__
void operator+=(float3 &a,
float b)
352 a.x += b; a.y += b; a.z += b;
355 inline __host__ __device__ int3 operator+(int3 a, int3 b)
357 return make_int3(a.x + b.x, a.y + b.y, a.z + b.z);
359 inline __host__ __device__
void operator+=(int3 &a, int3 b)
361 a.x += b.x; a.y += b.y; a.z += b.z;
363 inline __host__ __device__ int3 operator+(int3 a,
int b)
365 return make_int3(a.x + b, a.y + b, a.z + b);
367 inline __host__ __device__
void operator+=(int3 &a,
int b)
369 a.x += b; a.y += b; a.z += b;
372 inline __host__ __device__ uint3 operator+(uint3 a, uint3 b)
374 return make_uint3(a.x + b.x, a.y + b.y, a.z + b.z);
376 inline __host__ __device__
void operator+=(uint3 &a, uint3 b)
378 a.x += b.x; a.y += b.y; a.z += b.z;
380 inline __host__ __device__ uint3 operator+(uint3 a, uint b)
382 return make_uint3(a.x + b, a.y + b, a.z + b);
384 inline __host__ __device__
void operator+=(uint3 &a, uint b)
386 a.x += b; a.y += b; a.z += b;
389 inline __host__ __device__ int3 operator+(
int b, int3 a)
391 return make_int3(a.x + b, a.y + b, a.z + b);
393 inline __host__ __device__ uint3 operator+(uint b, uint3 a)
395 return make_uint3(a.x + b, a.y + b, a.z + b);
397 inline __host__ __device__ float3 operator+(
float b, float3 a)
399 return make_float3(a.x + b, a.y + b, a.z + b);
402 inline __host__ __device__ float4 operator+(float4 a, float4 b)
404 return make_float4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
406 inline __host__ __device__
void operator+=(float4 &a, float4 b)
408 a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w;
410 inline __host__ __device__ float4 operator+(float4 a,
float b)
412 return make_float4(a.x + b, a.y + b, a.z + b, a.w + b);
414 inline __host__ __device__ float4 operator+(
float b, float4 a)
416 return make_float4(a.x + b, a.y + b, a.z + b, a.w + b);
418 inline __host__ __device__
void operator+=(float4 &a,
float b)
420 a.x += b; a.y += b; a.z += b; a.w += b;
423 inline __host__ __device__ int4 operator+(int4 a, int4 b)
425 return make_int4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
427 inline __host__ __device__
void operator+=(int4 &a, int4 b)
429 a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w;
431 inline __host__ __device__ int4 operator+(int4 a,
int b)
433 return make_int4(a.x + b, a.y + b, a.z + b, a.w + b);
435 inline __host__ __device__ int4 operator+(
int b, int4 a)
437 return make_int4(a.x + b, a.y + b, a.z + b, a.w + b);
439 inline __host__ __device__
void operator+=(int4 &a,
int b)
441 a.x += b; a.y += b; a.z += b; a.w += b;
444 inline __host__ __device__ uint4 operator+(uint4 a, uint4 b)
446 return make_uint4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
448 inline __host__ __device__
void operator+=(uint4 &a, uint4 b)
450 a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w;
452 inline __host__ __device__ uint4 operator+(uint4 a, uint b)
454 return make_uint4(a.x + b, a.y + b, a.z + b, a.w + b);
456 inline __host__ __device__ uint4 operator+(uint b, uint4 a)
458 return make_uint4(a.x + b, a.y + b, a.z + b, a.w + b);
460 inline __host__ __device__
void operator+=(uint4 &a, uint b)
462 a.x += b; a.y += b; a.z += b; a.w += b;
469 inline __host__ __device__ float2 operator-(float2 a, float2 b)
471 return make_float2(a.x - b.x, a.y - b.y);
473 inline __host__ __device__
void operator-=(float2 &a, float2 b)
475 a.x -= b.x; a.y -= b.y;
477 inline __host__ __device__ float2 operator-(float2 a,
float b)
479 return make_float2(a.x - b, a.y - b);
481 inline __host__ __device__ float2 operator-(
float b, float2 a)
483 return make_float2(b - a.x, b - a.y);
485 inline __host__ __device__
void operator-=(float2 &a,
float b)
490 inline __host__ __device__ int2 operator-(int2 a, int2 b)
492 return make_int2(a.x - b.x, a.y - b.y);
494 inline __host__ __device__
void operator-=(int2 &a, int2 b)
496 a.x -= b.x; a.y -= b.y;
498 inline __host__ __device__ int2 operator-(int2 a,
int b)
500 return make_int2(a.x - b, a.y - b);
502 inline __host__ __device__ int2 operator-(
int b, int2 a)
504 return make_int2(b - a.x, b - a.y);
506 inline __host__ __device__
void operator-=(int2 &a,
int b)
511 inline __host__ __device__ uint2 operator-(uint2 a, uint2 b)
513 return make_uint2(a.x - b.x, a.y - b.y);
515 inline __host__ __device__
void operator-=(uint2 &a, uint2 b)
517 a.x -= b.x; a.y -= b.y;
519 inline __host__ __device__ uint2 operator-(uint2 a, uint b)
521 return make_uint2(a.x - b, a.y - b);
523 inline __host__ __device__ uint2 operator-(uint b, uint2 a)
525 return make_uint2(b - a.x, b - a.y);
527 inline __host__ __device__
void operator-=(uint2 &a, uint b)
532 inline __host__ __device__ float3 operator-(float3 a, float3 b)
534 return make_float3(a.x - b.x, a.y - b.y, a.z - b.z);
536 inline __host__ __device__
void operator-=(float3 &a, float3 b)
538 a.x -= b.x; a.y -= b.y; a.z -= b.z;
540 inline __host__ __device__ float3 operator-(float3 a,
float b)
542 return make_float3(a.x - b, a.y - b, a.z - b);
544 inline __host__ __device__ float3 operator-(
float b, float3 a)
546 return make_float3(b - a.x, b - a.y, b - a.z);
548 inline __host__ __device__
void operator-=(float3 &a,
float b)
550 a.x -= b; a.y -= b; a.z -= b;
553 inline __host__ __device__ int3 operator-(int3 a, int3 b)
555 return make_int3(a.x - b.x, a.y - b.y, a.z - b.z);
557 inline __host__ __device__
void operator-=(int3 &a, int3 b)
559 a.x -= b.x; a.y -= b.y; a.z -= b.z;
561 inline __host__ __device__ int3 operator-(int3 a,
int b)
563 return make_int3(a.x - b, a.y - b, a.z - b);
565 inline __host__ __device__ int3 operator-(
int b, int3 a)
567 return make_int3(b - a.x, b - a.y, b - a.z);
569 inline __host__ __device__
void operator-=(int3 &a,
int b)
571 a.x -= b; a.y -= b; a.z -= b;
574 inline __host__ __device__ uint3 operator-(uint3 a, uint3 b)
576 return make_uint3(a.x - b.x, a.y - b.y, a.z - b.z);
578 inline __host__ __device__
void operator-=(uint3 &a, uint3 b)
580 a.x -= b.x; a.y -= b.y; a.z -= b.z;
582 inline __host__ __device__ uint3 operator-(uint3 a, uint b)
584 return make_uint3(a.x - b, a.y - b, a.z - b);
586 inline __host__ __device__ uint3 operator-(uint b, uint3 a)
588 return make_uint3(b - a.x, b - a.y, b - a.z);
590 inline __host__ __device__
void operator-=(uint3 &a, uint b)
592 a.x -= b; a.y -= b; a.z -= b;
595 inline __host__ __device__ float4 operator-(float4 a, float4 b)
597 return make_float4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
599 inline __host__ __device__
void operator-=(float4 &a, float4 b)
601 a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w;
603 inline __host__ __device__ float4 operator-(float4 a,
float b)
605 return make_float4(a.x - b, a.y - b, a.z - b, a.w - b);
607 inline __host__ __device__
void operator-=(float4 &a,
float b)
609 a.x -= b; a.y -= b; a.z -= b; a.w -= b;
612 inline __host__ __device__ int4 operator-(int4 a, int4 b)
614 return make_int4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
616 inline __host__ __device__
void operator-=(int4 &a, int4 b)
618 a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w;
620 inline __host__ __device__ int4 operator-(int4 a,
int b)
622 return make_int4(a.x - b, a.y - b, a.z - b, a.w - b);
624 inline __host__ __device__ int4 operator-(
int b, int4 a)
626 return make_int4(b - a.x, b - a.y, b - a.z, b - a.w);
628 inline __host__ __device__
void operator-=(int4 &a,
int b)
630 a.x -= b; a.y -= b; a.z -= b; a.w -= b;
633 inline __host__ __device__ uint4 operator-(uint4 a, uint4 b)
635 return make_uint4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
637 inline __host__ __device__
void operator-=(uint4 &a, uint4 b)
639 a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w;
641 inline __host__ __device__ uint4 operator-(uint4 a, uint b)
643 return make_uint4(a.x - b, a.y - b, a.z - b, a.w - b);
645 inline __host__ __device__ uint4 operator-(uint b, uint4 a)
647 return make_uint4(b - a.x, b - a.y, b - a.z, b - a.w);
649 inline __host__ __device__
void operator-=(uint4 &a, uint b)
651 a.x -= b; a.y -= b; a.z -= b; a.w -= b;
658 inline __host__ __device__ float2 operator*(float2 a, float2 b)
660 return make_float2(a.x * b.x, a.y * b.y);
662 inline __host__ __device__
void operator*=(float2 &a, float2 b)
664 a.x *= b.x; a.y *= b.y;
666 inline __host__ __device__ float2 operator*(float2 a,
float b)
668 return make_float2(a.x * b, a.y * b);
670 inline __host__ __device__ float2 operator*(
float b, float2 a)
672 return make_float2(b * a.x, b * a.y);
674 inline __host__ __device__
void operator*=(float2 &a,
float b)
679 inline __host__ __device__ int2 operator*(int2 a, int2 b)
681 return make_int2(a.x * b.x, a.y * b.y);
683 inline __host__ __device__
void operator*=(int2 &a, int2 b)
685 a.x *= b.x; a.y *= b.y;
687 inline __host__ __device__ int2 operator*(int2 a,
int b)
689 return make_int2(a.x * b, a.y * b);
691 inline __host__ __device__ int2 operator*(
int b, int2 a)
693 return make_int2(b * a.x, b * a.y);
695 inline __host__ __device__
void operator*=(int2 &a,
int b)
700 inline __host__ __device__ uint2 operator*(uint2 a, uint2 b)
702 return make_uint2(a.x * b.x, a.y * b.y);
704 inline __host__ __device__
void operator*=(uint2 &a, uint2 b)
706 a.x *= b.x; a.y *= b.y;
708 inline __host__ __device__ uint2 operator*(uint2 a, uint b)
710 return make_uint2(a.x * b, a.y * b);
712 inline __host__ __device__ uint2 operator*(uint b, uint2 a)
714 return make_uint2(b * a.x, b * a.y);
716 inline __host__ __device__
void operator*=(uint2 &a, uint b)
721 inline __host__ __device__ float3 operator*(float3 a, float3 b)
723 return make_float3(a.x * b.x, a.y * b.y, a.z * b.z);
725 inline __host__ __device__
void operator*=(float3 &a, float3 b)
727 a.x *= b.x; a.y *= b.y; a.z *= b.z;
729 inline __host__ __device__ float3 operator*(float3 a,
float b)
731 return make_float3(a.x * b, a.y * b, a.z * b);
733 inline __host__ __device__ float3 operator*(
float b, float3 a)
735 return make_float3(b * a.x, b * a.y, b * a.z);
737 inline __host__ __device__
void operator*=(float3 &a,
float b)
739 a.x *= b; a.y *= b; a.z *= b;
742 inline __host__ __device__ int3 operator*(int3 a, int3 b)
744 return make_int3(a.x * b.x, a.y * b.y, a.z * b.z);
746 inline __host__ __device__
void operator*=(int3 &a, int3 b)
748 a.x *= b.x; a.y *= b.y; a.z *= b.z;
750 inline __host__ __device__ int3 operator*(int3 a,
int b)
752 return make_int3(a.x * b, a.y * b, a.z * b);
754 inline __host__ __device__ int3 operator*(
int b, int3 a)
756 return make_int3(b * a.x, b * a.y, b * a.z);
758 inline __host__ __device__
void operator*=(int3 &a,
int b)
760 a.x *= b; a.y *= b; a.z *= b;
763 inline __host__ __device__ uint3 operator*(uint3 a, uint3 b)
765 return make_uint3(a.x * b.x, a.y * b.y, a.z * b.z);
767 inline __host__ __device__
void operator*=(uint3 &a, uint3 b)
769 a.x *= b.x; a.y *= b.y; a.z *= b.z;
771 inline __host__ __device__ uint3 operator*(uint3 a, uint b)
773 return make_uint3(a.x * b, a.y * b, a.z * b);
775 inline __host__ __device__ uint3 operator*(uint b, uint3 a)
777 return make_uint3(b * a.x, b * a.y, b * a.z);
779 inline __host__ __device__
void operator*=(uint3 &a, uint b)
781 a.x *= b; a.y *= b; a.z *= b;
784 inline __host__ __device__ float4 operator*(float4 a, float4 b)
786 return make_float4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
788 inline __host__ __device__
void operator*=(float4 &a, float4 b)
790 a.x *= b.x; a.y *= b.y; a.z *= b.z; a.w *= b.w;
792 inline __host__ __device__ float4 operator*(float4 a,
float b)
794 return make_float4(a.x * b, a.y * b, a.z * b, a.w * b);
796 inline __host__ __device__ float4 operator*(
float b, float4 a)
798 return make_float4(b * a.x, b * a.y, b * a.z, b * a.w);
800 inline __host__ __device__
void operator*=(float4 &a,
float b)
802 a.x *= b; a.y *= b; a.z *= b; a.w *= b;
805 inline __host__ __device__ int4 operator*(int4 a, int4 b)
807 return make_int4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
809 inline __host__ __device__
void operator*=(int4 &a, int4 b)
811 a.x *= b.x; a.y *= b.y; a.z *= b.z; a.w *= b.w;
813 inline __host__ __device__ int4 operator*(int4 a,
int b)
815 return make_int4(a.x * b, a.y * b, a.z * b, a.w * b);
817 inline __host__ __device__ int4 operator*(
int b, int4 a)
819 return make_int4(b * a.x, b * a.y, b * a.z, b * a.w);
821 inline __host__ __device__
void operator*=(int4 &a,
int b)
823 a.x *= b; a.y *= b; a.z *= b; a.w *= b;
826 inline __host__ __device__ uint4 operator*(uint4 a, uint4 b)
828 return make_uint4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
830 inline __host__ __device__
void operator*=(uint4 &a, uint4 b)
832 a.x *= b.x; a.y *= b.y; a.z *= b.z; a.w *= b.w;
834 inline __host__ __device__ uint4 operator*(uint4 a, uint b)
836 return make_uint4(a.x * b, a.y * b, a.z * b, a.w * b);
838 inline __host__ __device__ uint4 operator*(uint b, uint4 a)
840 return make_uint4(b * a.x, b * a.y, b * a.z, b * a.w);
842 inline __host__ __device__
void operator*=(uint4 &a, uint b)
844 a.x *= b; a.y *= b; a.z *= b; a.w *= b;
851 inline __host__ __device__ float2 operator/(float2 a, float2 b)
853 return make_float2(a.x / b.x, a.y / b.y);
855 inline __host__ __device__
void operator/=(float2 &a, float2 b)
857 a.x /= b.x; a.y /= b.y;
859 inline __host__ __device__ float2 operator/(float2 a,
float b)
861 return make_float2(a.x / b, a.y / b);
863 inline __host__ __device__
void operator/=(float2 &a,
float b)
867 inline __host__ __device__ float2 operator/(
float b, float2 a)
869 return make_float2(b / a.x, b / a.y);
872 inline __host__ __device__ float3 operator/(float3 a, float3 b)
874 return make_float3(a.x / b.x, a.y / b.y, a.z / b.z);
876 inline __host__ __device__
void operator/=(float3 &a, float3 b)
878 a.x /= b.x; a.y /= b.y; a.z /= b.z;
880 inline __host__ __device__ float3 operator/(float3 a,
float b)
882 return make_float3(a.x / b, a.y / b, a.z / b);
884 inline __host__ __device__
void operator/=(float3 &a,
float b)
886 a.x /= b; a.y /= b; a.z /= b;
888 inline __host__ __device__ float3 operator/(
float b, float3 a)
890 return make_float3(b / a.x, b / a.y, b / a.z);
893 inline __host__ __device__ float4 operator/(float4 a, float4 b)
895 return make_float4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
897 inline __host__ __device__
void operator/=(float4 &a, float4 b)
899 a.x /= b.x; a.y /= b.y; a.z /= b.z; a.w /= b.w;
901 inline __host__ __device__ float4 operator/(float4 a,
float b)
903 return make_float4(a.x / b, a.y / b, a.z / b, a.w / b);
905 inline __host__ __device__
void operator/=(float4 &a,
float b)
907 a.x /= b; a.y /= b; a.z /= b; a.w /= b;
909 inline __host__ __device__ float4 operator/(
float b, float4 a){
910 return make_float4(b / a.x, b / a.y, b / a.z, b / a.w);
917 inline __host__ __device__ float2 fminf(float2 a, float2 b)
919 return make_float2(fminf(a.x,b.x), fminf(a.y,b.y));
921 inline __host__ __device__ float3 fminf(float3 a, float3 b)
923 return make_float3(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z));
925 inline __host__ __device__ float4 fminf(float4 a, float4 b)
927 return make_float4(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z), fminf(a.w,b.w));
930 inline __host__ __device__ int2 min(int2 a, int2 b)
932 return make_int2(min(a.x,b.x), min(a.y,b.y));
934 inline __host__ __device__ int3 min(int3 a, int3 b)
936 return make_int3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z));
938 inline __host__ __device__ int4 min(int4 a, int4 b)
940 return make_int4(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z), min(a.w,b.w));
943 inline __host__ __device__ uint2 min(uint2 a, uint2 b)
945 return make_uint2(min(a.x,b.x), min(a.y,b.y));
947 inline __host__ __device__ uint3 min(uint3 a, uint3 b)
949 return make_uint3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z));
951 inline __host__ __device__ uint4 min(uint4 a, uint4 b)
953 return make_uint4(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z), min(a.w,b.w));
960 inline __host__ __device__ float2 fmaxf(float2 a, float2 b)
962 return make_float2(fmaxf(a.x,b.x), fmaxf(a.y,b.y));
964 inline __host__ __device__ float3 fmaxf(float3 a, float3 b)
966 return make_float3(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z));
968 inline __host__ __device__ float4 fmaxf(float4 a, float4 b)
970 return make_float4(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z), fmaxf(a.w,b.w));
973 inline __host__ __device__ int2 max(int2 a, int2 b)
975 return make_int2(max(a.x,b.x), max(a.y,b.y));
977 inline __host__ __device__ int3 max(int3 a, int3 b)
979 return make_int3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z));
981 inline __host__ __device__ int4 max(int4 a, int4 b)
983 return make_int4(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z), max(a.w,b.w));
986 inline __host__ __device__ uint2 max(uint2 a, uint2 b)
988 return make_uint2(max(a.x,b.x), max(a.y,b.y));
990 inline __host__ __device__ uint3 max(uint3 a, uint3 b)
992 return make_uint3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z));
994 inline __host__ __device__ uint4 max(uint4 a, uint4 b)
996 return make_uint4(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z), max(a.w,b.w));
1004 inline __device__ __host__
float lerp(
float a,
float b,
float t)
1008 inline __device__ __host__ float2 lerp(float2 a, float2 b,
float t)
1012 inline __device__ __host__ float3 lerp(float3 a, float3 b,
float t)
1016 inline __device__ __host__ float4 lerp(float4 a, float4 b,
float t)
1026 inline __device__ __host__
float clamp(
float f,
float a,
float b)
1028 return fmaxf(a, fminf(f, b));
1030 inline __device__ __host__
int clamp(
int f,
int a,
int b)
1032 return max(a, min(f, b));
1034 inline __device__ __host__ uint clamp(uint f, uint a, uint b)
1036 return max(a, min(f, b));
1039 inline __device__ __host__ float2 clamp(float2 v,
float a,
float b)
1041 return make_float2(clamp(v.x, a, b), clamp(v.y, a, b));
1043 inline __device__ __host__ float2 clamp(float2 v, float2 a, float2 b)
1045 return make_float2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y));
1047 inline __device__ __host__ float3 clamp(float3 v,
float a,
float b)
1049 return make_float3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b));
1051 inline __device__ __host__ float3 clamp(float3 v, float3 a, float3 b)
1053 return make_float3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z));
1055 inline __device__ __host__ float4 clamp(float4 v,
float a,
float b)
1057 return make_float4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b));
1059 inline __device__ __host__ float4 clamp(float4 v, float4 a, float4 b)
1061 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));
1064 inline __device__ __host__ int2 clamp(int2 v,
int a,
int b)
1066 return make_int2(clamp(v.x, a, b), clamp(v.y, a, b));
1068 inline __device__ __host__ int2 clamp(int2 v, int2 a, int2 b)
1070 return make_int2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y));
1072 inline __device__ __host__ int3 clamp(int3 v,
int a,
int b)
1074 return make_int3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b));
1076 inline __device__ __host__ int3 clamp(int3 v, int3 a, int3 b)
1078 return make_int3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z));
1080 inline __device__ __host__ int4 clamp(int4 v,
int a,
int b)
1082 return make_int4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b));
1084 inline __device__ __host__ int4 clamp(int4 v, int4 a, int4 b)
1086 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));
1089 inline __device__ __host__ uint2 clamp(uint2 v, uint a, uint b)
1091 return make_uint2(clamp(v.x, a, b), clamp(v.y, a, b));
1093 inline __device__ __host__ uint2 clamp(uint2 v, uint2 a, uint2 b)
1095 return make_uint2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y));
1097 inline __device__ __host__ uint3 clamp(uint3 v, uint a, uint b)
1099 return make_uint3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b));
1101 inline __device__ __host__ uint3 clamp(uint3 v, uint3 a, uint3 b)
1103 return make_uint3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z));
1105 inline __device__ __host__ uint4 clamp(uint4 v, uint a, uint b)
1107 return make_uint4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b));
1109 inline __device__ __host__ uint4 clamp(uint4 v, uint4 a, uint4 b)
1111 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));
1118 inline __host__ __device__
float dot(float2 a, float2 b)
1120 return a.x * b.x + a.y * b.y;
1122 inline __host__ __device__
float dot(float3 a, float3 b)
1124 return a.x * b.x + a.y * b.y + a.z * b.z;
1126 inline __host__ __device__
float dot(float4 a, float4 b)
1128 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
1131 inline __host__ __device__
int dot(int2 a, int2 b)
1133 return a.x * b.x + a.y * b.y;
1135 inline __host__ __device__
int dot(int3 a, int3 b)
1137 return a.x * b.x + a.y * b.y + a.z * b.z;
1139 inline __host__ __device__
int dot(int4 a, int4 b)
1141 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
1144 inline __host__ __device__ uint dot(uint2 a, uint2 b)
1146 return a.x * b.x + a.y * b.y;
1148 inline __host__ __device__ uint dot(uint3 a, uint3 b)
1150 return a.x * b.x + a.y * b.y + a.z * b.z;
1152 inline __host__ __device__ uint dot(uint4 a, uint4 b)
1154 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
1161 inline __host__ __device__
float length(float2 v)
1163 return sqrtf(dot(v, v));
1165 inline __host__ __device__
float length(float3 v)
1167 return sqrtf(dot(v, v));
1169 inline __host__ __device__
float length(float4 v)
1171 return sqrtf(dot(v, v));
1178 inline __host__ __device__ float2 normalize(float2 v)
1180 float invLen = rsqrtf(dot(v, v));
1183 inline __host__ __device__ float3 normalize(float3 v)
1185 float invLen = rsqrtf(dot(v, v));
1188 inline __host__ __device__ float4 normalize(float4 v)
1190 float invLen = rsqrtf(dot(v, v));
1198 inline __host__ __device__ float2 floorf(float2 v)
1200 return make_float2(floorf(v.x), floorf(v.y));
1202 inline __host__ __device__ float3 floorf(float3 v)
1204 return make_float3(floorf(v.x), floorf(v.y), floorf(v.z));
1206 inline __host__ __device__ float4 floorf(float4 v)
1208 return make_float4(floorf(v.x), floorf(v.y), floorf(v.z), floorf(v.w));
1215 inline __host__ __device__
float fracf(
float v)
1217 return v - floorf(v);
1219 inline __host__ __device__ float2 fracf(float2 v)
1221 return make_float2(fracf(v.x), fracf(v.y));
1223 inline __host__ __device__ float3 fracf(float3 v)
1225 return make_float3(fracf(v.x), fracf(v.y), fracf(v.z));
1227 inline __host__ __device__ float4 fracf(float4 v)
1229 return make_float4(fracf(v.x), fracf(v.y), fracf(v.z), fracf(v.w));
1236 inline __host__ __device__ float2 fmodf(float2 a, float2 b)
1238 return make_float2(fmodf(a.x, b.x), fmodf(a.y, b.y));
1240 inline __host__ __device__ float3 fmodf(float3 a, float3 b)
1242 return make_float3(fmodf(a.x, b.x), fmodf(a.y, b.y), fmodf(a.z, b.z));
1244 inline __host__ __device__ float4 fmodf(float4 a, float4 b)
1246 return make_float4(fmodf(a.x, b.x), fmodf(a.y, b.y), fmodf(a.z, b.z), fmodf(a.w, b.w));
1253 inline __host__ __device__ float2 fabs(float2 v)
1255 return make_float2(fabs(v.x), fabs(v.y));
1257 inline __host__ __device__ float3 fabs(float3 v)
1259 return make_float3(fabs(v.x), fabs(v.y), fabs(v.z));
1261 inline __host__ __device__ float4 fabs(float4 v)
1263 return make_float4(fabs(v.x), fabs(v.y), fabs(v.z), fabs(v.w));
1266 inline __host__ __device__ int2 abs(int2 v)
1268 return make_int2(abs(v.x), abs(v.y));
1270 inline __host__ __device__ int3 abs(int3 v)
1272 return make_int3(abs(v.x), abs(v.y), abs(v.z));
1274 inline __host__ __device__ int4 abs(int4 v)
1276 return make_int4(abs(v.x), abs(v.y), abs(v.z), abs(v.w));
1285 inline __host__ __device__ float3 reflect(float3 i, float3 n)
1287 return i - 2.0f * n * dot(n,i);
1294 inline __host__ __device__ float3 cross(float3 a, float3 b)
1296 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);
1306 inline __device__ __host__
float smoothstep(
float a,
float b,
float x)
1308 float y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1309 return (y*y*(3.0f - (2.0f*y)));
1311 inline __device__ __host__ float2 smoothstep(float2 a, float2 b, float2 x)
1313 float2 y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1314 return (y*y*(make_float2(3.0f) - (make_float2(2.0f)*y)));
1316 inline __device__ __host__ float3 smoothstep(float3 a, float3 b, float3 x)
1318 float3 y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1319 return (y*y*(make_float3(3.0f) - (make_float3(2.0f)*y)));
1321 inline __device__ __host__ float4 smoothstep(float4 a, float4 b, float4 x)
1323 float4 y = clamp((x - a) / (b - a), 0.0f, 1.0f);
1324 return (y*y*(make_float4(3.0f) - (make_float4(2.0f)*y)));