rs_cl.rsh revision 3e6482fd3d53f3d2422dcd5181444d10748816ff
1#ifndef __RS_CL_RSH__ 2#define __RS_CL_RSH__ 3 4#ifdef BCC_PREPARE_BC 5#define _RS_STATIC extern 6#else 7#define _RS_STATIC static 8#endif 9 10// Conversions 11#define CVT_FUNC_2(typeout, typein) \ 12_RS_STATIC typeout##2 __attribute__((overloadable)) convert_##typeout##2(typein##2 v) { \ 13 typeout##2 r = {(typeout)v.x, (typeout)v.y}; \ 14 return r; \ 15} \ 16_RS_STATIC typeout##3 __attribute__((overloadable)) convert_##typeout##3(typein##3 v) { \ 17 typeout##3 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z}; \ 18 return r; \ 19} \ 20_RS_STATIC typeout##4 __attribute__((overloadable)) convert_##typeout##4(typein##4 v) { \ 21 typeout##4 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z, (typeout)v.w}; \ 22 return r; \ 23} 24 25#define CVT_FUNC(type) CVT_FUNC_2(type, uchar) \ 26 CVT_FUNC_2(type, char) \ 27 CVT_FUNC_2(type, ushort) \ 28 CVT_FUNC_2(type, short) \ 29 CVT_FUNC_2(type, uint) \ 30 CVT_FUNC_2(type, int) \ 31 CVT_FUNC_2(type, float) 32 33CVT_FUNC(char) 34CVT_FUNC(uchar) 35CVT_FUNC(short) 36CVT_FUNC(ushort) 37CVT_FUNC(int) 38CVT_FUNC(uint) 39CVT_FUNC(float) 40 41 42 43// Float ops, 6.11.2 44 45#define FN_FUNC_FN(fnc) \ 46_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v) { \ 47 float2 r; \ 48 r.x = fnc(v.x); \ 49 r.y = fnc(v.y); \ 50 return r; \ 51} \ 52_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v) { \ 53 float3 r; \ 54 r.x = fnc(v.x); \ 55 r.y = fnc(v.y); \ 56 r.z = fnc(v.z); \ 57 return r; \ 58} \ 59_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v) { \ 60 float4 r; \ 61 r.x = fnc(v.x); \ 62 r.y = fnc(v.y); \ 63 r.z = fnc(v.z); \ 64 r.w = fnc(v.w); \ 65 return r; \ 66} 67 68#define IN_FUNC_FN(fnc) \ 69_RS_STATIC int2 __attribute__((overloadable)) fnc(float2 v) { \ 70 int2 r; \ 71 r.x = fnc(v.x); \ 72 r.y = fnc(v.y); \ 73 return r; \ 74} \ 75_RS_STATIC int3 __attribute__((overloadable)) fnc(float3 v) { \ 76 int3 r; \ 77 r.x = fnc(v.x); \ 78 r.y = fnc(v.y); \ 79 r.z = fnc(v.z); \ 80 return r; \ 81} \ 82_RS_STATIC int4 __attribute__((overloadable)) fnc(float4 v) { \ 83 int4 r; \ 84 r.x = fnc(v.x); \ 85 r.y = fnc(v.y); \ 86 r.z = fnc(v.z); \ 87 r.w = fnc(v.w); \ 88 return r; \ 89} 90 91#define FN_FUNC_FN_FN(fnc) \ 92_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2) { \ 93 float2 r; \ 94 r.x = fnc(v1.x, v2.x); \ 95 r.y = fnc(v1.y, v2.y); \ 96 return r; \ 97} \ 98_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2) { \ 99 float3 r; \ 100 r.x = fnc(v1.x, v2.x); \ 101 r.y = fnc(v1.y, v2.y); \ 102 r.z = fnc(v1.z, v2.z); \ 103 return r; \ 104} \ 105_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \ 106 float4 r; \ 107 r.x = fnc(v1.x, v2.x); \ 108 r.y = fnc(v1.y, v2.y); \ 109 r.z = fnc(v1.z, v2.z); \ 110 r.w = fnc(v1.w, v2.w); \ 111 return r; \ 112} 113 114#define FN_FUNC_FN_F(fnc) \ 115_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float v2) { \ 116 float2 r; \ 117 r.x = fnc(v1.x, v2); \ 118 r.y = fnc(v1.y, v2); \ 119 return r; \ 120} \ 121_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float v2) { \ 122 float3 r; \ 123 r.x = fnc(v1.x, v2); \ 124 r.y = fnc(v1.y, v2); \ 125 r.z = fnc(v1.z, v2); \ 126 return r; \ 127} \ 128_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float v2) { \ 129 float4 r; \ 130 r.x = fnc(v1.x, v2); \ 131 r.y = fnc(v1.y, v2); \ 132 r.z = fnc(v1.z, v2); \ 133 r.w = fnc(v1.w, v2); \ 134 return r; \ 135} 136 137#define FN_FUNC_FN_IN(fnc) \ 138_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2) { \ 139 float2 r; \ 140 r.x = fnc(v1.x, v2.x); \ 141 r.y = fnc(v1.y, v2.y); \ 142 return r; \ 143} \ 144_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2) { \ 145 float3 r; \ 146 r.x = fnc(v1.x, v2.x); \ 147 r.y = fnc(v1.y, v2.y); \ 148 r.z = fnc(v1.z, v2.z); \ 149 return r; \ 150} \ 151_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2) { \ 152 float4 r; \ 153 r.x = fnc(v1.x, v2.x); \ 154 r.y = fnc(v1.y, v2.y); \ 155 r.z = fnc(v1.z, v2.z); \ 156 r.w = fnc(v1.w, v2.w); \ 157 return r; \ 158} 159 160#define FN_FUNC_FN_I(fnc) \ 161_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int v2) { \ 162 float2 r; \ 163 r.x = fnc(v1.x, v2); \ 164 r.y = fnc(v1.y, v2); \ 165 return r; \ 166} \ 167_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int v2) { \ 168 float3 r; \ 169 r.x = fnc(v1.x, v2); \ 170 r.y = fnc(v1.y, v2); \ 171 r.z = fnc(v1.z, v2); \ 172 return r; \ 173} \ 174_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int v2) { \ 175 float4 r; \ 176 r.x = fnc(v1.x, v2); \ 177 r.y = fnc(v1.y, v2); \ 178 r.z = fnc(v1.z, v2); \ 179 r.w = fnc(v1.w, v2); \ 180 return r; \ 181} 182 183#define FN_FUNC_FN_PFN(fnc) \ 184_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 *v2) { \ 185 float2 r; \ 186 float q; \ 187 r.x = fnc(v1.x, &q); \ 188 v2->x = q; \ 189 r.y = fnc(v1.y, &q); \ 190 v2->y = q; \ 191 return r; \ 192} \ 193_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 *v2) { \ 194 float3 r; \ 195 float q; \ 196 r.x = fnc(v1.x, &q); \ 197 v2->x = q; \ 198 r.y = fnc(v1.y, &q); \ 199 v2->y = q; \ 200 r.z = fnc(v1.z, &q); \ 201 v2->z = q; \ 202 return r; \ 203} \ 204_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 *v2) { \ 205 float4 r; \ 206 float q; \ 207 r.x = fnc(v1.x, &q); \ 208 v2->x = q; \ 209 r.y = fnc(v1.y, &q); \ 210 v2->y = q; \ 211 r.z = fnc(v1.z, &q); \ 212 v2->z = q; \ 213 r.w = fnc(v1.w, &q); \ 214 v2->w = q; \ 215 return r; \ 216} 217 218#define FN_FUNC_FN_PIN(fnc) \ 219_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2) { \ 220 float2 r; \ 221 int q; \ 222 r.x = fnc(v1.x, &q); \ 223 v2->x = q; \ 224 r.y = fnc(v1.y, &q); \ 225 v2->y = q; \ 226 return r; \ 227} \ 228_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2) { \ 229 float3 r; \ 230 int q; \ 231 r.x = fnc(v1.x, &q); \ 232 v2->x = q; \ 233 r.y = fnc(v1.y, &q); \ 234 v2->y = q; \ 235 r.z = fnc(v1.z, &q); \ 236 v2->z = q; \ 237 return r; \ 238} \ 239_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2) { \ 240 float4 r; \ 241 int q; \ 242 r.x = fnc(v1.x, &q); \ 243 v2->x = q; \ 244 r.y = fnc(v1.y, &q); \ 245 v2->y = q; \ 246 r.z = fnc(v1.z, &q); \ 247 v2->z = q; \ 248 r.w = fnc(v1.w, &q); \ 249 v2->w = q; \ 250 return r; \ 251} 252 253#define FN_FUNC_FN_FN_FN(fnc) \ 254_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2, float2 v3) { \ 255 float2 r; \ 256 r.x = fnc(v1.x, v2.x, v3.x); \ 257 r.y = fnc(v1.y, v2.y, v3.y); \ 258 return r; \ 259} \ 260_RS_STATIC float3 __attribute__((overloadable)) 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} \ 267_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2, float4 v3) { \ 268 float4 r; \ 269 r.x = fnc(v1.x, v2.x, v3.x); \ 270 r.y = fnc(v1.y, v2.y, v3.y); \ 271 r.z = fnc(v1.z, v2.z, v3.z); \ 272 r.w = fnc(v1.w, v2.w, v3.w); \ 273 return r; \ 274} 275 276#define FN_FUNC_FN_FN_PIN(fnc) \ 277_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2, int2 *v3) { \ 278 float2 r; \ 279 int q; \ 280 r.x = fnc(v1.x, v2.x, &q); \ 281 v3->x = q; \ 282 r.y = fnc(v1.y, v2.y, &q); \ 283 v3->y = q; \ 284 return r; \ 285} \ 286_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2, int3 *v3) { \ 287 float3 r; \ 288 int q; \ 289 r.x = fnc(v1.x, v2.x, &q); \ 290 v3->x = q; \ 291 r.y = fnc(v1.y, v2.y, &q); \ 292 v3->y = q; \ 293 r.z = fnc(v1.z, v2.z, &q); \ 294 v3->z = q; \ 295 return r; \ 296} \ 297_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2, int4 *v3) { \ 298 float4 r; \ 299 int q; \ 300 r.x = fnc(v1.x, v2.x, &q); \ 301 v3->x = q; \ 302 r.y = fnc(v1.y, v2.y, &q); \ 303 v3->y = q; \ 304 r.z = fnc(v1.z, v2.z, &q); \ 305 v3->z = q; \ 306 r.w = fnc(v1.w, v2.w, &q); \ 307 v3->w = q; \ 308 return r; \ 309} 310 311 312 313extern float __attribute__((overloadable)) acos(float); 314FN_FUNC_FN(acos) 315 316extern float __attribute__((overloadable)) acosh(float); 317FN_FUNC_FN(acosh) 318 319_RS_STATIC float __attribute__((overloadable)) acospi(float v) { 320 return acos(v) / M_PI; 321} 322FN_FUNC_FN(acospi) 323 324extern float __attribute__((overloadable)) asin(float); 325FN_FUNC_FN(asin) 326 327extern float __attribute__((overloadable)) asinh(float); 328FN_FUNC_FN(asinh) 329 330_RS_STATIC float __attribute__((overloadable)) asinpi(float v) { 331 return asin(v) / M_PI; 332} 333FN_FUNC_FN(asinpi) 334 335extern float __attribute__((overloadable)) atan(float); 336FN_FUNC_FN(atan) 337 338extern float __attribute__((overloadable)) atan2(float, float); 339FN_FUNC_FN_FN(atan2) 340 341extern float __attribute__((overloadable)) atanh(float); 342FN_FUNC_FN(atanh) 343 344_RS_STATIC float __attribute__((overloadable)) atanpi(float v) { 345 return atan(v) / M_PI; 346} 347FN_FUNC_FN(atanpi) 348 349_RS_STATIC float __attribute__((overloadable)) atan2pi(float y, float x) { 350 return atan2(y, x) / M_PI; 351} 352FN_FUNC_FN_FN(atan2pi) 353 354extern float __attribute__((overloadable)) cbrt(float); 355FN_FUNC_FN(cbrt) 356 357extern float __attribute__((overloadable)) ceil(float); 358FN_FUNC_FN(ceil) 359 360extern float __attribute__((overloadable)) copysign(float, float); 361FN_FUNC_FN_FN(copysign) 362 363extern float __attribute__((overloadable)) cos(float); 364FN_FUNC_FN(cos) 365 366extern float __attribute__((overloadable)) cosh(float); 367FN_FUNC_FN(cosh) 368 369_RS_STATIC float __attribute__((overloadable)) cospi(float v) { 370 return cos(v * M_PI); 371} 372FN_FUNC_FN(cospi) 373 374extern float __attribute__((overloadable)) erfc(float); 375FN_FUNC_FN(erfc) 376 377extern float __attribute__((overloadable)) erf(float); 378FN_FUNC_FN(erf) 379 380extern float __attribute__((overloadable)) exp(float); 381FN_FUNC_FN(exp) 382 383extern float __attribute__((overloadable)) exp2(float); 384FN_FUNC_FN(exp2) 385 386extern float __attribute__((overloadable)) pow(float, float); 387_RS_STATIC float __attribute__((overloadable)) exp10(float v) { 388 return pow(10.f, v); 389} 390FN_FUNC_FN(exp10) 391 392extern float __attribute__((overloadable)) expm1(float); 393FN_FUNC_FN(expm1) 394 395extern float __attribute__((overloadable)) fabs(float); 396FN_FUNC_FN(fabs) 397 398extern float __attribute__((overloadable)) fdim(float, float); 399FN_FUNC_FN_FN(fdim) 400 401extern float __attribute__((overloadable)) floor(float); 402FN_FUNC_FN(floor) 403 404extern float __attribute__((overloadable)) fma(float, float, float); 405FN_FUNC_FN_FN_FN(fma) 406 407extern float __attribute__((overloadable)) fmax(float, float); 408FN_FUNC_FN_FN(fmax); 409FN_FUNC_FN_F(fmax); 410 411extern float __attribute__((overloadable)) fmin(float, float); 412FN_FUNC_FN_FN(fmin); 413FN_FUNC_FN_F(fmin); 414 415extern float __attribute__((overloadable)) fmod(float, float); 416FN_FUNC_FN_FN(fmod) 417 418_RS_STATIC float __attribute__((overloadable)) fract(float v, float *iptr) { 419 int i = (int)floor(v); 420 iptr[0] = i; 421 return fmin(v - i, 0x1.fffffep-1f); 422} 423_RS_STATIC float2 __attribute__((overloadable)) fract(float2 v, float2 *iptr) { 424 float t[2]; 425 float2 r; 426 r.x = fract(v.x, &t[0]); 427 r.y = fract(v.y, &t[1]); 428 iptr[0] = t[0]; 429 iptr[1] = t[1]; 430 return r; 431} 432_RS_STATIC float3 __attribute__((overloadable)) fract(float3 v, float3 *iptr) { 433 float t[3]; 434 float3 r; 435 r.x = fract(v.x, &t[0]); 436 r.y = fract(v.y, &t[1]); 437 r.z = fract(v.z, &t[2]); 438 iptr[0] = t[0]; 439 iptr[1] = t[1]; 440 iptr[2] = t[2]; 441 return r; 442} 443_RS_STATIC float4 __attribute__((overloadable)) fract(float4 v, float4 *iptr) { 444 float t[4]; 445 float4 r; 446 r.x = fract(v.x, &t[0]); 447 r.y = fract(v.y, &t[1]); 448 r.z = fract(v.z, &t[2]); 449 r.w = fract(v.w, &t[3]); 450 iptr[0] = t[0]; 451 iptr[1] = t[1]; 452 iptr[2] = t[2]; 453 iptr[3] = t[3]; 454 return r; 455} 456 457extern float __attribute__((overloadable)) frexp(float, int *); 458FN_FUNC_FN_PIN(frexp) 459 460extern float __attribute__((overloadable)) hypot(float, float); 461FN_FUNC_FN_FN(hypot) 462 463extern int __attribute__((overloadable)) ilogb(float); 464IN_FUNC_FN(ilogb) 465 466extern float __attribute__((overloadable)) ldexp(float, int); 467FN_FUNC_FN_IN(ldexp) 468FN_FUNC_FN_I(ldexp) 469 470extern float __attribute__((overloadable)) lgamma(float); 471FN_FUNC_FN(lgamma) 472extern float __attribute__((overloadable)) lgamma(float, int*); 473FN_FUNC_FN_PIN(lgamma) 474 475extern float __attribute__((overloadable)) log(float); 476FN_FUNC_FN(log) 477 478 479extern float __attribute__((overloadable)) log10(float); 480FN_FUNC_FN(log10) 481 482_RS_STATIC float __attribute__((overloadable)) log2(float v) { 483 return log10(v) / log10(2.f); 484} 485FN_FUNC_FN(log2) 486 487extern float __attribute__((overloadable)) log1p(float); 488FN_FUNC_FN(log1p) 489 490extern float __attribute__((overloadable)) logb(float); 491FN_FUNC_FN(logb) 492 493extern float __attribute__((overloadable)) mad(float, float, float); 494FN_FUNC_FN_FN_FN(mad) 495 496extern float __attribute__((overloadable)) modf(float, float *); 497FN_FUNC_FN_PFN(modf); 498 499//extern float __attribute__((overloadable)) nan(uint); 500 501extern float __attribute__((overloadable)) nextafter(float, float); 502FN_FUNC_FN_FN(nextafter) 503 504FN_FUNC_FN_FN(pow) 505 506_RS_STATIC float __attribute__((overloadable)) pown(float v, int p) { 507 return pow(v, (float)p); 508} 509_RS_STATIC float2 __attribute__((overloadable)) pown(float2 v, int2 p) { 510 return pow(v, (float2)p); 511} 512_RS_STATIC float3 __attribute__((overloadable)) pown(float3 v, int3 p) { 513 return pow(v, (float3)p); 514} 515_RS_STATIC float4 __attribute__((overloadable)) pown(float4 v, int4 p) { 516 return pow(v, (float4)p); 517} 518 519_RS_STATIC float __attribute__((overloadable)) powr(float v, float p) { 520 return pow(v, p); 521} 522_RS_STATIC float2 __attribute__((overloadable)) powr(float2 v, float2 p) { 523 return pow(v, p); 524} 525_RS_STATIC float3 __attribute__((overloadable)) powr(float3 v, float3 p) { 526 return pow(v, p); 527} 528_RS_STATIC float4 __attribute__((overloadable)) powr(float4 v, float4 p) { 529 return pow(v, p); 530} 531 532extern float __attribute__((overloadable)) remainder(float, float); 533FN_FUNC_FN_FN(remainder) 534 535extern float __attribute__((overloadable)) remquo(float, float, int *); 536FN_FUNC_FN_FN_PIN(remquo) 537 538extern float __attribute__((overloadable)) rint(float); 539FN_FUNC_FN(rint) 540 541_RS_STATIC float __attribute__((overloadable)) rootn(float v, int r) { 542 return pow(v, 1.f / r); 543} 544_RS_STATIC float2 __attribute__((overloadable)) rootn(float2 v, int2 r) { 545 float2 t = {1.f / r.x, 1.f / r.y}; 546 return pow(v, t); 547} 548_RS_STATIC float3 __attribute__((overloadable)) rootn(float3 v, int3 r) { 549 float3 t = {1.f / r.x, 1.f / r.y, 1.f / r.z}; 550 return pow(v, t); 551} 552_RS_STATIC float4 __attribute__((overloadable)) rootn(float4 v, int4 r) { 553 float4 t = {1.f / r.x, 1.f / r.y, 1.f / r.z, 1.f / r.w}; 554 return pow(v, t); 555} 556 557extern float __attribute__((overloadable)) round(float); 558FN_FUNC_FN(round) 559 560extern float __attribute__((overloadable)) sqrt(float); 561_RS_STATIC float __attribute__((overloadable)) rsqrt(float v) { 562 return 1.f / sqrt(v); 563} 564FN_FUNC_FN(rsqrt) 565 566extern float __attribute__((overloadable)) sin(float); 567FN_FUNC_FN(sin) 568 569_RS_STATIC float __attribute__((overloadable)) sincos(float v, float *cosptr) { 570 *cosptr = cos(v); 571 return sin(v); 572} 573_RS_STATIC float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr) { 574 *cosptr = cos(v); 575 return sin(v); 576} 577_RS_STATIC float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr) { 578 *cosptr = cos(v); 579 return sin(v); 580} 581_RS_STATIC float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr) { 582 *cosptr = cos(v); 583 return sin(v); 584} 585 586extern float __attribute__((overloadable)) sinh(float); 587FN_FUNC_FN(sinh) 588 589_RS_STATIC float __attribute__((overloadable)) sinpi(float v) { 590 return sin(v * M_PI); 591} 592FN_FUNC_FN(sinpi) 593 594FN_FUNC_FN(sqrt) 595 596extern float __attribute__((overloadable)) tan(float); 597FN_FUNC_FN(tan) 598 599extern float __attribute__((overloadable)) tanh(float); 600FN_FUNC_FN(tanh) 601 602_RS_STATIC float __attribute__((overloadable)) tanpi(float v) { 603 return tan(v * M_PI); 604} 605FN_FUNC_FN(tanpi) 606 607extern float __attribute__((overloadable)) tgamma(float); 608FN_FUNC_FN(tgamma) 609 610extern float __attribute__((overloadable)) trunc(float); 611FN_FUNC_FN(trunc) 612 613// Int ops (partial), 6.11.3 614 615#define XN_FUNC_YN(typeout, fnc, typein) \ 616extern typeout __attribute__((overloadable)) fnc(typein); \ 617_RS_STATIC typeout##2 __attribute__((overloadable)) fnc(typein##2 v) { \ 618 typeout##2 r; \ 619 r.x = fnc(v.x); \ 620 r.y = fnc(v.y); \ 621 return r; \ 622} \ 623_RS_STATIC typeout##3 __attribute__((overloadable)) fnc(typein##3 v) { \ 624 typeout##3 r; \ 625 r.x = fnc(v.x); \ 626 r.y = fnc(v.y); \ 627 r.z = fnc(v.z); \ 628 return r; \ 629} \ 630_RS_STATIC typeout##4 __attribute__((overloadable)) fnc(typein##4 v) { \ 631 typeout##4 r; \ 632 r.x = fnc(v.x); \ 633 r.y = fnc(v.y); \ 634 r.z = fnc(v.z); \ 635 r.w = fnc(v.w); \ 636 return r; \ 637} 638 639#define UIN_FUNC_IN(fnc) \ 640XN_FUNC_YN(uchar, fnc, char) \ 641XN_FUNC_YN(ushort, fnc, short) \ 642XN_FUNC_YN(uint, fnc, int) 643 644#define IN_FUNC_IN(fnc) \ 645XN_FUNC_YN(uchar, fnc, uchar) \ 646XN_FUNC_YN(char, fnc, char) \ 647XN_FUNC_YN(ushort, fnc, ushort) \ 648XN_FUNC_YN(short, fnc, short) \ 649XN_FUNC_YN(uint, fnc, uint) \ 650XN_FUNC_YN(int, fnc, int) 651 652#define XN_FUNC_XN_XN_BODY(type, fnc, body) \ 653_RS_STATIC type __attribute__((overloadable)) fnc(type v1, type v2) { \ 654 return body; \ 655} \ 656_RS_STATIC type##2 __attribute__((overloadable)) fnc(type##2 v1, type##2 v2) { \ 657 type##2 r; \ 658 r.x = fnc(v1.x, v2.x); \ 659 r.y = fnc(v1.y, v2.y); \ 660 return r; \ 661} \ 662_RS_STATIC type##3 __attribute__((overloadable)) fnc(type##3 v1, type##3 v2) { \ 663 type##3 r; \ 664 r.x = fnc(v1.x, v2.x); \ 665 r.y = fnc(v1.y, v2.y); \ 666 r.z = fnc(v1.z, v2.z); \ 667 return r; \ 668} \ 669_RS_STATIC type##4 __attribute__((overloadable)) fnc(type##4 v1, type##4 v2) { \ 670 type##4 r; \ 671 r.x = fnc(v1.x, v2.x); \ 672 r.y = fnc(v1.y, v2.y); \ 673 r.z = fnc(v1.z, v2.z); \ 674 r.w = fnc(v1.w, v2.w); \ 675 return r; \ 676} \ 677 678#define IN_FUNC_IN_IN_BODY(fnc, body) \ 679XN_FUNC_XN_XN_BODY(uchar, fnc, body) \ 680XN_FUNC_XN_XN_BODY(char, fnc, body) \ 681XN_FUNC_XN_XN_BODY(ushort, fnc, body) \ 682XN_FUNC_XN_XN_BODY(short, fnc, body) \ 683XN_FUNC_XN_XN_BODY(uint, fnc, body) \ 684XN_FUNC_XN_XN_BODY(int, fnc, body) \ 685XN_FUNC_XN_XN_BODY(float, fnc, body) 686 687UIN_FUNC_IN(abs) 688IN_FUNC_IN(clz) 689 690IN_FUNC_IN_IN_BODY(min, (v1 < v2 ? v1 : v2)) 691FN_FUNC_FN_F(min) 692 693IN_FUNC_IN_IN_BODY(max, (v1 > v2 ? v1 : v2)) 694FN_FUNC_FN_F(max) 695 696// 6.11.4 697 698_RS_STATIC float __attribute__((overloadable)) clamp(float amount, float low, float high) { 699 return amount < low ? low : (amount > high ? high : amount); 700} 701_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high) { 702 float2 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 return r; 706} 707_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high) { 708 float3 r; 709 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x); 710 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y); 711 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z); 712 return r; 713} 714_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high) { 715 float4 r; 716 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x); 717 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y); 718 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z); 719 r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w); 720 return r; 721} 722_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high) { 723 float2 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 return r; 727} 728_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high) { 729 float3 r; 730 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x); 731 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y); 732 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z); 733 return r; 734} 735_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high) { 736 float4 r; 737 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x); 738 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y); 739 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z); 740 r.w = amount.w < low ? low : (amount.w > high ? high : amount.w); 741 return r; 742} 743 744_RS_STATIC float __attribute__((overloadable)) degrees(float radians) { 745 return radians * (180.f / M_PI); 746} 747FN_FUNC_FN(degrees) 748 749_RS_STATIC float __attribute__((overloadable)) mix(float start, float stop, float amount) { 750 return start + (stop - start) * amount; 751} 752_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount) { 753 return start + (stop - start) * amount; 754} 755_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount) { 756 return start + (stop - start) * amount; 757} 758_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount) { 759 return start + (stop - start) * amount; 760} 761_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount) { 762 return start + (stop - start) * amount; 763} 764_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount) { 765 return start + (stop - start) * amount; 766} 767_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount) { 768 return start + (stop - start) * amount; 769} 770 771_RS_STATIC float __attribute__((overloadable)) radians(float degrees) { 772 return degrees * (M_PI / 180.f); 773} 774FN_FUNC_FN(radians) 775 776_RS_STATIC float __attribute__((overloadable)) step(float edge, float v) { 777 return (v < edge) ? 0.f : 1.f; 778} 779_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float2 v) { 780 float2 r; 781 r.x = (v.x < edge.x) ? 0.f : 1.f; 782 r.y = (v.y < edge.y) ? 0.f : 1.f; 783 return r; 784} 785_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float3 v) { 786 float3 r; 787 r.x = (v.x < edge.x) ? 0.f : 1.f; 788 r.y = (v.y < edge.y) ? 0.f : 1.f; 789 r.z = (v.z < edge.z) ? 0.f : 1.f; 790 return r; 791} 792_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float4 v) { 793 float4 r; 794 r.x = (v.x < edge.x) ? 0.f : 1.f; 795 r.y = (v.y < edge.y) ? 0.f : 1.f; 796 r.z = (v.z < edge.z) ? 0.f : 1.f; 797 r.w = (v.w < edge.w) ? 0.f : 1.f; 798 return r; 799} 800_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float v) { 801 float2 r; 802 r.x = (v < edge.x) ? 0.f : 1.f; 803 r.y = (v < edge.y) ? 0.f : 1.f; 804 return r; 805} 806_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float v) { 807 float3 r; 808 r.x = (v < edge.x) ? 0.f : 1.f; 809 r.y = (v < edge.y) ? 0.f : 1.f; 810 r.z = (v < edge.z) ? 0.f : 1.f; 811 return r; 812} 813_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float v) { 814 float4 r; 815 r.x = (v < edge.x) ? 0.f : 1.f; 816 r.y = (v < edge.y) ? 0.f : 1.f; 817 r.z = (v < edge.z) ? 0.f : 1.f; 818 r.w = (v < edge.w) ? 0.f : 1.f; 819 return r; 820} 821 822extern float __attribute__((overloadable)) smoothstep(float, float, float); 823extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2); 824extern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3); 825extern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4); 826extern float2 __attribute__((overloadable)) smoothstep(float, float, float2); 827extern float3 __attribute__((overloadable)) smoothstep(float, float, float3); 828extern float4 __attribute__((overloadable)) smoothstep(float, float, float4); 829 830_RS_STATIC float __attribute__((overloadable)) sign(float v) { 831 if (v > 0) return 1.f; 832 if (v < 0) return -1.f; 833 return v; 834} 835FN_FUNC_FN(sign) 836 837// 6.11.5 838_RS_STATIC float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs) { 839 float3 r; 840 r.x = lhs.y * rhs.z - lhs.z * rhs.y; 841 r.y = lhs.z * rhs.x - lhs.x * rhs.z; 842 r.z = lhs.x * rhs.y - lhs.y * rhs.x; 843 return r; 844} 845 846_RS_STATIC float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs) { 847 float4 r; 848 r.x = lhs.y * rhs.z - lhs.z * rhs.y; 849 r.y = lhs.z * rhs.x - lhs.x * rhs.z; 850 r.z = lhs.x * rhs.y - lhs.y * rhs.x; 851 r.w = 0.f; 852 return r; 853} 854 855_RS_STATIC float __attribute__((overloadable)) dot(float lhs, float rhs) { 856 return lhs * rhs; 857} 858_RS_STATIC float __attribute__((overloadable)) dot(float2 lhs, float2 rhs) { 859 return lhs.x*rhs.x + lhs.y*rhs.y; 860} 861_RS_STATIC float __attribute__((overloadable)) dot(float3 lhs, float3 rhs) { 862 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z; 863} 864_RS_STATIC float __attribute__((overloadable)) dot(float4 lhs, float4 rhs) { 865 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z + lhs.w*rhs.w; 866} 867 868_RS_STATIC float __attribute__((overloadable)) length(float v) { 869 return v; 870} 871_RS_STATIC float __attribute__((overloadable)) length(float2 v) { 872 return sqrt(v.x*v.x + v.y*v.y); 873} 874_RS_STATIC float __attribute__((overloadable)) length(float3 v) { 875 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z); 876} 877_RS_STATIC float __attribute__((overloadable)) length(float4 v) { 878 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); 879} 880 881_RS_STATIC float __attribute__((overloadable)) distance(float lhs, float rhs) { 882 return length(lhs - rhs); 883} 884_RS_STATIC float __attribute__((overloadable)) distance(float2 lhs, float2 rhs) { 885 return length(lhs - rhs); 886} 887_RS_STATIC float __attribute__((overloadable)) distance(float3 lhs, float3 rhs) { 888 return length(lhs - rhs); 889} 890_RS_STATIC float __attribute__((overloadable)) distance(float4 lhs, float4 rhs) { 891 return length(lhs - rhs); 892} 893 894_RS_STATIC float __attribute__((overloadable)) normalize(float v) { 895 return 1.f; 896} 897_RS_STATIC float2 __attribute__((overloadable)) normalize(float2 v) { 898 return v / length(v); 899} 900_RS_STATIC float3 __attribute__((overloadable)) normalize(float3 v) { 901 return v / length(v); 902} 903_RS_STATIC float4 __attribute__((overloadable)) normalize(float4 v) { 904 return v / length(v); 905} 906 907#undef CVT_FUNC 908#undef CVT_FUNC_2 909#undef FN_FUNC_FN 910#undef IN_FUNC_FN 911#undef FN_FUNC_FN_FN 912#undef FN_FUNC_FN_F 913#undef FN_FUNC_FN_IN 914#undef FN_FUNC_FN_I 915#undef FN_FUNC_FN_PFN 916#undef FN_FUNC_FN_PIN 917#undef FN_FUNC_FN_FN_FN 918#undef FN_FUNC_FN_FN_PIN 919#undef XN_FUNC_YN 920#undef UIN_FUNC_IN 921#undef IN_FUNC_IN 922#undef XN_FUNC_XN_XN_BODY 923#undef IN_FUNC_IN_IN_BODY 924#undef _RS_STATIC 925 926#endif 927