@deck.gl/extensions 9.0.0-beta.6 → 9.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +500 -694
- package/dist.min.js +526 -717
- package/package.json +8 -12
package/dist/dist.dev.js
CHANGED
|
@@ -1392,9 +1392,6 @@ void main() {
|
|
|
1392
1392
|
// src/fp64/fp64-extension.ts
|
|
1393
1393
|
var import_core6 = __toESM(require_core(), 1);
|
|
1394
1394
|
|
|
1395
|
-
// ../../node_modules/@luma.gl/shadertools/dist/lib/glsl-utils/highlight.js
|
|
1396
|
-
var glsl2 = (x) => `${x}`;
|
|
1397
|
-
|
|
1398
1395
|
// ../../node_modules/@luma.gl/shadertools/dist/modules-webgl1/math/fp64/fp64-utils.js
|
|
1399
1396
|
function fp64ify(a, out = [], startIndex = 0) {
|
|
1400
1397
|
const hiPart = Math.fround(a);
|
|
@@ -1418,177 +1415,142 @@ void main() {
|
|
|
1418
1415
|
}
|
|
1419
1416
|
|
|
1420
1417
|
// ../../node_modules/@luma.gl/shadertools/dist/modules-webgl1/math/fp64/fp64-arithmetic-glsl.js
|
|
1421
|
-
var fp64arithmeticShader =
|
|
1422
|
-
uniform float ONE;
|
|
1423
|
-
|
|
1424
|
-
/*
|
|
1425
|
-
About LUMA_FP64_CODE_ELIMINATION_WORKAROUND
|
|
1426
|
-
|
|
1427
|
-
The purpose of this workaround is to prevent shader compilers from
|
|
1428
|
-
optimizing away necessary arithmetic operations by swapping their sequences
|
|
1429
|
-
or transform the equation to some 'equivalent' form.
|
|
1430
|
-
|
|
1431
|
-
The method is to multiply an artifical variable, ONE, which will be known to
|
|
1432
|
-
the compiler to be 1 only at runtime. The whole expression is then represented
|
|
1433
|
-
as a polynomial with respective to ONE. In the coefficients of all terms, only one a
|
|
1434
|
-
and one b should appear
|
|
1435
|
-
|
|
1436
|
-
err = (a + b) * ONE^6 - a * ONE^5 - (a + b) * ONE^4 + a * ONE^3 - b - (a + b) * ONE^2 + a * ONE
|
|
1437
|
-
*/
|
|
1438
|
-
|
|
1439
|
-
// Divide float number to high and low floats to extend fraction bits
|
|
1418
|
+
var fp64arithmeticShader = `uniform float ONE;
|
|
1440
1419
|
vec2 split(float a) {
|
|
1441
|
-
|
|
1442
|
-
|
|
1420
|
+
const float SPLIT = 4097.0;
|
|
1421
|
+
float t = a * SPLIT;
|
|
1443
1422
|
#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
|
|
1444
|
-
|
|
1445
|
-
|
|
1423
|
+
float a_hi = t * ONE - (t - a);
|
|
1424
|
+
float a_lo = a * ONE - a_hi;
|
|
1446
1425
|
#else
|
|
1447
|
-
|
|
1448
|
-
|
|
1426
|
+
float a_hi = t - (t - a);
|
|
1427
|
+
float a_lo = a - a_hi;
|
|
1449
1428
|
#endif
|
|
1450
|
-
|
|
1429
|
+
return vec2(a_hi, a_lo);
|
|
1451
1430
|
}
|
|
1452
|
-
|
|
1453
|
-
// Divide float number again when high float uses too many fraction bits
|
|
1454
1431
|
vec2 split2(vec2 a) {
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1432
|
+
vec2 b = split(a.x);
|
|
1433
|
+
b.y += a.y;
|
|
1434
|
+
return b;
|
|
1458
1435
|
}
|
|
1459
|
-
|
|
1460
|
-
// Special sum operation when a > b
|
|
1461
1436
|
vec2 quickTwoSum(float a, float b) {
|
|
1462
1437
|
#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
|
|
1463
|
-
|
|
1464
|
-
|
|
1438
|
+
float sum = (a + b) * ONE;
|
|
1439
|
+
float err = b - (sum - a) * ONE;
|
|
1465
1440
|
#else
|
|
1466
|
-
|
|
1467
|
-
|
|
1441
|
+
float sum = a + b;
|
|
1442
|
+
float err = b - (sum - a);
|
|
1468
1443
|
#endif
|
|
1469
|
-
|
|
1444
|
+
return vec2(sum, err);
|
|
1470
1445
|
}
|
|
1471
|
-
|
|
1472
|
-
// General sum operation
|
|
1473
1446
|
vec2 twoSum(float a, float b) {
|
|
1474
|
-
|
|
1447
|
+
float s = (a + b);
|
|
1475
1448
|
#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
|
|
1476
|
-
|
|
1477
|
-
|
|
1449
|
+
float v = (s * ONE - a) * ONE;
|
|
1450
|
+
float err = (a - (s - v) * ONE) * ONE * ONE * ONE + (b - v);
|
|
1478
1451
|
#else
|
|
1479
|
-
|
|
1480
|
-
|
|
1452
|
+
float v = s - a;
|
|
1453
|
+
float err = (a - (s - v)) + (b - v);
|
|
1481
1454
|
#endif
|
|
1482
|
-
|
|
1455
|
+
return vec2(s, err);
|
|
1483
1456
|
}
|
|
1484
|
-
|
|
1485
1457
|
vec2 twoSub(float a, float b) {
|
|
1486
|
-
|
|
1458
|
+
float s = (a - b);
|
|
1487
1459
|
#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
|
|
1488
|
-
|
|
1489
|
-
|
|
1460
|
+
float v = (s * ONE - a) * ONE;
|
|
1461
|
+
float err = (a - (s - v) * ONE) * ONE * ONE * ONE - (b + v);
|
|
1490
1462
|
#else
|
|
1491
|
-
|
|
1492
|
-
|
|
1463
|
+
float v = s - a;
|
|
1464
|
+
float err = (a - (s - v)) - (b + v);
|
|
1493
1465
|
#endif
|
|
1494
|
-
|
|
1466
|
+
return vec2(s, err);
|
|
1495
1467
|
}
|
|
1496
|
-
|
|
1497
1468
|
vec2 twoSqr(float a) {
|
|
1498
|
-
|
|
1499
|
-
|
|
1469
|
+
float prod = a * a;
|
|
1470
|
+
vec2 a_fp64 = split(a);
|
|
1500
1471
|
#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
|
|
1501
|
-
|
|
1502
|
-
|
|
1472
|
+
float err = ((a_fp64.x * a_fp64.x - prod) * ONE + 2.0 * a_fp64.x *
|
|
1473
|
+
a_fp64.y * ONE * ONE) + a_fp64.y * a_fp64.y * ONE * ONE * ONE;
|
|
1503
1474
|
#else
|
|
1504
|
-
|
|
1475
|
+
float err = ((a_fp64.x * a_fp64.x - prod) + 2.0 * a_fp64.x * a_fp64.y) + a_fp64.y * a_fp64.y;
|
|
1505
1476
|
#endif
|
|
1506
|
-
|
|
1477
|
+
return vec2(prod, err);
|
|
1507
1478
|
}
|
|
1508
|
-
|
|
1509
1479
|
vec2 twoProd(float a, float b) {
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1480
|
+
float prod = a * b;
|
|
1481
|
+
vec2 a_fp64 = split(a);
|
|
1482
|
+
vec2 b_fp64 = split(b);
|
|
1483
|
+
float err = ((a_fp64.x * b_fp64.x - prod) + a_fp64.x * b_fp64.y +
|
|
1484
|
+
a_fp64.y * b_fp64.x) + a_fp64.y * b_fp64.y;
|
|
1485
|
+
return vec2(prod, err);
|
|
1516
1486
|
}
|
|
1517
|
-
|
|
1518
1487
|
vec2 sum_fp64(vec2 a, vec2 b) {
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1488
|
+
vec2 s, t;
|
|
1489
|
+
s = twoSum(a.x, b.x);
|
|
1490
|
+
t = twoSum(a.y, b.y);
|
|
1491
|
+
s.y += t.x;
|
|
1492
|
+
s = quickTwoSum(s.x, s.y);
|
|
1493
|
+
s.y += t.y;
|
|
1494
|
+
s = quickTwoSum(s.x, s.y);
|
|
1495
|
+
return s;
|
|
1527
1496
|
}
|
|
1528
|
-
|
|
1529
1497
|
vec2 sub_fp64(vec2 a, vec2 b) {
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1498
|
+
vec2 s, t;
|
|
1499
|
+
s = twoSub(a.x, b.x);
|
|
1500
|
+
t = twoSub(a.y, b.y);
|
|
1501
|
+
s.y += t.x;
|
|
1502
|
+
s = quickTwoSum(s.x, s.y);
|
|
1503
|
+
s.y += t.y;
|
|
1504
|
+
s = quickTwoSum(s.x, s.y);
|
|
1505
|
+
return s;
|
|
1538
1506
|
}
|
|
1539
|
-
|
|
1540
1507
|
vec2 mul_fp64(vec2 a, vec2 b) {
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
prod.y += a.x * b.y;
|
|
1508
|
+
vec2 prod = twoProd(a.x, b.x);
|
|
1509
|
+
prod.y += a.x * b.y;
|
|
1544
1510
|
#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
|
|
1545
|
-
|
|
1511
|
+
prod = split2(prod);
|
|
1546
1512
|
#endif
|
|
1547
|
-
|
|
1548
|
-
|
|
1513
|
+
prod = quickTwoSum(prod.x, prod.y);
|
|
1514
|
+
prod.y += a.y * b.x;
|
|
1549
1515
|
#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
|
|
1550
|
-
|
|
1516
|
+
prod = split2(prod);
|
|
1551
1517
|
#endif
|
|
1552
|
-
|
|
1553
|
-
|
|
1518
|
+
prod = quickTwoSum(prod.x, prod.y);
|
|
1519
|
+
return prod;
|
|
1554
1520
|
}
|
|
1555
|
-
|
|
1556
1521
|
vec2 div_fp64(vec2 a, vec2 b) {
|
|
1557
|
-
|
|
1522
|
+
float xn = 1.0 / b.x;
|
|
1558
1523
|
#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
|
|
1559
|
-
|
|
1524
|
+
vec2 yn = mul_fp64(a, vec2(xn, 0));
|
|
1560
1525
|
#else
|
|
1561
|
-
|
|
1526
|
+
vec2 yn = a * xn;
|
|
1562
1527
|
#endif
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1528
|
+
float diff = (sub_fp64(a, mul_fp64(b, yn))).x;
|
|
1529
|
+
vec2 prod = twoProd(xn, diff);
|
|
1530
|
+
return sum_fp64(yn, prod);
|
|
1566
1531
|
}
|
|
1567
|
-
|
|
1568
1532
|
vec2 sqrt_fp64(vec2 a) {
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
float yn = a.x * x;
|
|
1533
|
+
if (a.x == 0.0 && a.y == 0.0) return vec2(0.0, 0.0);
|
|
1534
|
+
if (a.x < 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1535
|
+
float x = 1.0 / sqrt(a.x);
|
|
1536
|
+
float yn = a.x * x;
|
|
1574
1537
|
#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
|
|
1575
|
-
|
|
1538
|
+
vec2 yn_sqr = twoSqr(yn) * ONE;
|
|
1576
1539
|
#else
|
|
1577
|
-
|
|
1540
|
+
vec2 yn_sqr = twoSqr(yn);
|
|
1578
1541
|
#endif
|
|
1579
|
-
|
|
1580
|
-
|
|
1542
|
+
float diff = sub_fp64(a, yn_sqr).x;
|
|
1543
|
+
vec2 prod = twoProd(x * 0.5, diff);
|
|
1581
1544
|
#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
|
|
1582
|
-
|
|
1545
|
+
return sum_fp64(split(yn), prod);
|
|
1583
1546
|
#else
|
|
1584
|
-
|
|
1547
|
+
return sum_fp64(vec2(yn, 0.0), prod);
|
|
1585
1548
|
#endif
|
|
1586
1549
|
}
|
|
1587
1550
|
`;
|
|
1588
1551
|
|
|
1589
1552
|
// ../../node_modules/@luma.gl/shadertools/dist/modules-webgl1/math/fp64/fp64-functions-glsl.js
|
|
1590
|
-
var fp64functionShader =
|
|
1591
|
-
const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
|
|
1553
|
+
var fp64functionShader = `const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
|
|
1592
1554
|
const vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);
|
|
1593
1555
|
const vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);
|
|
1594
1556
|
const vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);
|
|
@@ -1598,664 +1560,508 @@ const vec2 PI_16_FP64 = vec2(0.19634954631328583, -5.463923757886846e-9);
|
|
|
1598
1560
|
const vec2 PI_16_2_FP64 = vec2(0.39269909262657166, -1.0927847515773692e-8);
|
|
1599
1561
|
const vec2 PI_16_3_FP64 = vec2(0.5890486240386963, -1.4906100798128818e-9);
|
|
1600
1562
|
const vec2 PI_180_FP64 = vec2(0.01745329238474369, 1.3519960498364902e-10);
|
|
1601
|
-
|
|
1602
1563
|
const vec2 SIN_TABLE_0_FP64 = vec2(0.19509032368659973, -1.6704714833615242e-9);
|
|
1603
1564
|
const vec2 SIN_TABLE_1_FP64 = vec2(0.3826834261417389, 6.22335089017767e-9);
|
|
1604
1565
|
const vec2 SIN_TABLE_2_FP64 = vec2(0.5555702447891235, -1.1769521357507529e-8);
|
|
1605
1566
|
const vec2 SIN_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617041793133e-8);
|
|
1606
|
-
|
|
1607
1567
|
const vec2 COS_TABLE_0_FP64 = vec2(0.9807852506637573, 2.9739473106360492e-8);
|
|
1608
1568
|
const vec2 COS_TABLE_1_FP64 = vec2(0.9238795042037964, 2.8307490351764386e-8);
|
|
1609
1569
|
const vec2 COS_TABLE_2_FP64 = vec2(0.8314695954322815, 1.6870263741530778e-8);
|
|
1610
1570
|
const vec2 COS_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617152815436e-8);
|
|
1611
|
-
|
|
1612
|
-
const vec2
|
|
1613
|
-
const vec2
|
|
1614
|
-
const vec2
|
|
1615
|
-
const vec2
|
|
1616
|
-
const vec2
|
|
1617
|
-
const vec2
|
|
1618
|
-
const vec2
|
|
1619
|
-
const vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15); // 1/10!
|
|
1620
|
-
|
|
1571
|
+
const vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09);
|
|
1572
|
+
const vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09);
|
|
1573
|
+
const vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10);
|
|
1574
|
+
const vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11);
|
|
1575
|
+
const vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04, -2.725596874933456e-12);
|
|
1576
|
+
const vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13);
|
|
1577
|
+
const vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14);
|
|
1578
|
+
const vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15);
|
|
1621
1579
|
float nint(float d) {
|
|
1622
|
-
|
|
1623
|
-
|
|
1580
|
+
if (d == floor(d)) return d;
|
|
1581
|
+
return floor(d + 0.5);
|
|
1624
1582
|
}
|
|
1625
|
-
|
|
1626
1583
|
vec2 nint_fp64(vec2 a) {
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1584
|
+
float hi = nint(a.x);
|
|
1585
|
+
float lo;
|
|
1586
|
+
vec2 tmp;
|
|
1587
|
+
if (hi == a.x) {
|
|
1588
|
+
lo = nint(a.y);
|
|
1589
|
+
tmp = quickTwoSum(hi, lo);
|
|
1590
|
+
} else {
|
|
1591
|
+
lo = 0.0;
|
|
1592
|
+
if (abs(hi - a.x) == 0.5 && a.y < 0.0) {
|
|
1593
|
+
hi -= 1.0;
|
|
1594
|
+
}
|
|
1595
|
+
tmp = vec2(hi, lo);
|
|
1596
|
+
}
|
|
1597
|
+
return tmp;
|
|
1641
1598
|
}
|
|
1642
|
-
|
|
1643
|
-
/* k_power controls how much range reduction we would like to have
|
|
1644
|
-
Range reduction uses the following method:
|
|
1645
|
-
assume a = k_power * r + m * log(2), k and m being integers.
|
|
1646
|
-
Set k_power = 4 (we can choose other k to trade accuracy with performance.
|
|
1647
|
-
we only need to calculate exp(r) and using exp(a) = 2^m * exp(r)^k_power;
|
|
1648
|
-
*/
|
|
1649
|
-
|
|
1650
1599
|
vec2 exp_fp64(vec2 a) {
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
s = sum_fp64(s, t);
|
|
1677
|
-
p = mul_fp64(p, r);
|
|
1678
|
-
t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);
|
|
1679
|
-
|
|
1680
|
-
// s = sum_fp64(s, t);
|
|
1681
|
-
// p = mul_fp64(p, r);
|
|
1682
|
-
// t = mul_fp64(p, INVERSE_FACTORIAL_6_FP64);
|
|
1683
|
-
|
|
1684
|
-
// s = sum_fp64(s, t);
|
|
1685
|
-
// p = mul_fp64(p, r);
|
|
1686
|
-
// t = mul_fp64(p, INVERSE_FACTORIAL_7_FP64);
|
|
1687
|
-
|
|
1688
|
-
s = sum_fp64(s, t);
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
// At this point, s = exp(r) - 1; but after following 4 recursions, we will get exp(r) ^ 512 - 1.
|
|
1692
|
-
for (int i = 0; i < k_power; i++) {
|
|
1693
|
-
s = sum_fp64(s * 2.0, mul_fp64(s, s));
|
|
1694
|
-
}
|
|
1695
|
-
|
|
1600
|
+
const int k_power = 4;
|
|
1601
|
+
const float k = 16.0;
|
|
1602
|
+
const float inv_k = 1.0 / k;
|
|
1603
|
+
if (a.x <= -88.0) return vec2(0.0, 0.0);
|
|
1604
|
+
if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);
|
|
1605
|
+
if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);
|
|
1606
|
+
if (a.x == 1.0 && a.y == 0.0) return E_FP64;
|
|
1607
|
+
float m = floor(a.x / LOG2_FP64.x + 0.5);
|
|
1608
|
+
vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;
|
|
1609
|
+
vec2 s, t, p;
|
|
1610
|
+
p = mul_fp64(r, r);
|
|
1611
|
+
s = sum_fp64(r, p * 0.5);
|
|
1612
|
+
p = mul_fp64(p, r);
|
|
1613
|
+
t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);
|
|
1614
|
+
s = sum_fp64(s, t);
|
|
1615
|
+
p = mul_fp64(p, r);
|
|
1616
|
+
t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);
|
|
1617
|
+
s = sum_fp64(s, t);
|
|
1618
|
+
p = mul_fp64(p, r);
|
|
1619
|
+
t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);
|
|
1620
|
+
s = sum_fp64(s, t);
|
|
1621
|
+
for (int i = 0; i < k_power; i++) {
|
|
1622
|
+
s = sum_fp64(s * 2.0, mul_fp64(s, s));
|
|
1623
|
+
}
|
|
1696
1624
|
#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
|
|
1697
|
-
|
|
1625
|
+
s = sum_fp64(s, vec2(ONE, 0.0));
|
|
1698
1626
|
#else
|
|
1699
|
-
|
|
1627
|
+
s = sum_fp64(s, vec2(1.0, 0.0));
|
|
1700
1628
|
#endif
|
|
1701
|
-
|
|
1702
|
-
return s * pow(2.0, m);
|
|
1703
|
-
// return r;
|
|
1629
|
+
return s * pow(2.0, m);
|
|
1704
1630
|
}
|
|
1705
|
-
|
|
1706
1631
|
vec2 log_fp64(vec2 a)
|
|
1707
1632
|
{
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1633
|
+
if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);
|
|
1634
|
+
if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1635
|
+
vec2 x = vec2(log(a.x), 0.0);
|
|
1636
|
+
vec2 s;
|
|
1712
1637
|
#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
|
|
1713
|
-
|
|
1638
|
+
s = vec2(ONE, 0.0);
|
|
1714
1639
|
#else
|
|
1715
|
-
|
|
1640
|
+
s = vec2(1.0, 0.0);
|
|
1716
1641
|
#endif
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
return x;
|
|
1642
|
+
x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);
|
|
1643
|
+
return x;
|
|
1720
1644
|
}
|
|
1721
|
-
|
|
1722
1645
|
vec2 sin_taylor_fp64(vec2 a) {
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
r = mul_fp64(r, x);
|
|
1738
|
-
t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);
|
|
1739
|
-
s = sum_fp64(s, t);
|
|
1740
|
-
|
|
1741
|
-
/* keep the following commented code in case we need them
|
|
1742
|
-
for extra accuracy from the Taylor expansion*/
|
|
1743
|
-
|
|
1744
|
-
// r = mul_fp64(r, x);
|
|
1745
|
-
// t = mul_fp64(r, INVERSE_FACTORIAL_7_FP64);
|
|
1746
|
-
// s = sum_fp64(s, t);
|
|
1747
|
-
|
|
1748
|
-
// r = mul_fp64(r, x);
|
|
1749
|
-
// t = mul_fp64(r, INVERSE_FACTORIAL_9_FP64);
|
|
1750
|
-
// s = sum_fp64(s, t);
|
|
1751
|
-
|
|
1752
|
-
return s;
|
|
1646
|
+
vec2 r, s, t, x;
|
|
1647
|
+
if (a.x == 0.0 && a.y == 0.0) {
|
|
1648
|
+
return vec2(0.0, 0.0);
|
|
1649
|
+
}
|
|
1650
|
+
x = -mul_fp64(a, a);
|
|
1651
|
+
s = a;
|
|
1652
|
+
r = a;
|
|
1653
|
+
r = mul_fp64(r, x);
|
|
1654
|
+
t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);
|
|
1655
|
+
s = sum_fp64(s, t);
|
|
1656
|
+
r = mul_fp64(r, x);
|
|
1657
|
+
t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);
|
|
1658
|
+
s = sum_fp64(s, t);
|
|
1659
|
+
return s;
|
|
1753
1660
|
}
|
|
1754
|
-
|
|
1755
1661
|
vec2 cos_taylor_fp64(vec2 a) {
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
r = mul_fp64(r, x);
|
|
1771
|
-
t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);
|
|
1772
|
-
s = sum_fp64(s, t);
|
|
1773
|
-
|
|
1774
|
-
/* keep the following commented code in case we need them
|
|
1775
|
-
for extra accuracy from the Taylor expansion*/
|
|
1776
|
-
|
|
1777
|
-
// r = mul_fp64(r, x);
|
|
1778
|
-
// t = mul_fp64(r, INVERSE_FACTORIAL_8_FP64);
|
|
1779
|
-
// s = sum_fp64(s, t);
|
|
1780
|
-
|
|
1781
|
-
// r = mul_fp64(r, x);
|
|
1782
|
-
// t = mul_fp64(r, INVERSE_FACTORIAL_10_FP64);
|
|
1783
|
-
// s = sum_fp64(s, t);
|
|
1784
|
-
|
|
1785
|
-
return s;
|
|
1662
|
+
vec2 r, s, t, x;
|
|
1663
|
+
if (a.x == 0.0 && a.y == 0.0) {
|
|
1664
|
+
return vec2(1.0, 0.0);
|
|
1665
|
+
}
|
|
1666
|
+
x = -mul_fp64(a, a);
|
|
1667
|
+
r = x;
|
|
1668
|
+
s = sum_fp64(vec2(1.0, 0.0), r * 0.5);
|
|
1669
|
+
r = mul_fp64(r, x);
|
|
1670
|
+
t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);
|
|
1671
|
+
s = sum_fp64(s, t);
|
|
1672
|
+
r = mul_fp64(r, x);
|
|
1673
|
+
t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);
|
|
1674
|
+
s = sum_fp64(s, t);
|
|
1675
|
+
return s;
|
|
1786
1676
|
}
|
|
1787
|
-
|
|
1788
1677
|
void sincos_taylor_fp64(vec2 a, out vec2 sin_t, out vec2 cos_t) {
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));
|
|
1678
|
+
if (a.x == 0.0 && a.y == 0.0) {
|
|
1679
|
+
sin_t = vec2(0.0, 0.0);
|
|
1680
|
+
cos_t = vec2(1.0, 0.0);
|
|
1681
|
+
}
|
|
1682
|
+
sin_t = sin_taylor_fp64(a);
|
|
1683
|
+
cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));
|
|
1796
1684
|
}
|
|
1797
|
-
|
|
1798
1685
|
vec2 sin_fp64(vec2 a) {
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
int abs_k = int(abs(float(k)));
|
|
1833
|
-
|
|
1834
|
-
if (abs_k > 4) {
|
|
1835
|
-
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1836
|
-
} else {
|
|
1837
|
-
t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
|
|
1838
|
-
}
|
|
1839
|
-
|
|
1840
|
-
vec2 u = vec2(0.0, 0.0);
|
|
1841
|
-
vec2 v = vec2(0.0, 0.0);
|
|
1842
|
-
|
|
1686
|
+
if (a.x == 0.0 && a.y == 0.0) {
|
|
1687
|
+
return vec2(0.0, 0.0);
|
|
1688
|
+
}
|
|
1689
|
+
vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
|
|
1690
|
+
vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
|
|
1691
|
+
vec2 t;
|
|
1692
|
+
float q = floor(r.x / PI_2_FP64.x + 0.5);
|
|
1693
|
+
int j = int(q);
|
|
1694
|
+
if (j < -2 || j > 2) {
|
|
1695
|
+
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1696
|
+
}
|
|
1697
|
+
t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
|
|
1698
|
+
q = floor(t.x / PI_16_FP64.x + 0.5);
|
|
1699
|
+
int k = int(q);
|
|
1700
|
+
if (k == 0) {
|
|
1701
|
+
if (j == 0) {
|
|
1702
|
+
return sin_taylor_fp64(t);
|
|
1703
|
+
} else if (j == 1) {
|
|
1704
|
+
return cos_taylor_fp64(t);
|
|
1705
|
+
} else if (j == -1) {
|
|
1706
|
+
return -cos_taylor_fp64(t);
|
|
1707
|
+
} else {
|
|
1708
|
+
return -sin_taylor_fp64(t);
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1711
|
+
int abs_k = int(abs(float(k)));
|
|
1712
|
+
if (abs_k > 4) {
|
|
1713
|
+
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1714
|
+
} else {
|
|
1715
|
+
t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
|
|
1716
|
+
}
|
|
1717
|
+
vec2 u = vec2(0.0, 0.0);
|
|
1718
|
+
vec2 v = vec2(0.0, 0.0);
|
|
1843
1719
|
#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1720
|
+
if (abs(float(abs_k) - 1.0) < 0.5) {
|
|
1721
|
+
u = COS_TABLE_0_FP64;
|
|
1722
|
+
v = SIN_TABLE_0_FP64;
|
|
1723
|
+
} else if (abs(float(abs_k) - 2.0) < 0.5) {
|
|
1724
|
+
u = COS_TABLE_1_FP64;
|
|
1725
|
+
v = SIN_TABLE_1_FP64;
|
|
1726
|
+
} else if (abs(float(abs_k) - 3.0) < 0.5) {
|
|
1727
|
+
u = COS_TABLE_2_FP64;
|
|
1728
|
+
v = SIN_TABLE_2_FP64;
|
|
1729
|
+
} else if (abs(float(abs_k) - 4.0) < 0.5) {
|
|
1730
|
+
u = COS_TABLE_3_FP64;
|
|
1731
|
+
v = SIN_TABLE_3_FP64;
|
|
1732
|
+
}
|
|
1857
1733
|
#else
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1734
|
+
if (abs_k == 1) {
|
|
1735
|
+
u = COS_TABLE_0_FP64;
|
|
1736
|
+
v = SIN_TABLE_0_FP64;
|
|
1737
|
+
} else if (abs_k == 2) {
|
|
1738
|
+
u = COS_TABLE_1_FP64;
|
|
1739
|
+
v = SIN_TABLE_1_FP64;
|
|
1740
|
+
} else if (abs_k == 3) {
|
|
1741
|
+
u = COS_TABLE_2_FP64;
|
|
1742
|
+
v = SIN_TABLE_2_FP64;
|
|
1743
|
+
} else if (abs_k == 4) {
|
|
1744
|
+
u = COS_TABLE_3_FP64;
|
|
1745
|
+
v = SIN_TABLE_3_FP64;
|
|
1746
|
+
}
|
|
1871
1747
|
#endif
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
|
|
1902
|
-
}
|
|
1903
|
-
}
|
|
1904
|
-
|
|
1905
|
-
return result;
|
|
1748
|
+
vec2 sin_t, cos_t;
|
|
1749
|
+
sincos_taylor_fp64(t, sin_t, cos_t);
|
|
1750
|
+
vec2 result = vec2(0.0, 0.0);
|
|
1751
|
+
if (j == 0) {
|
|
1752
|
+
if (k > 0) {
|
|
1753
|
+
result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1754
|
+
} else {
|
|
1755
|
+
result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1756
|
+
}
|
|
1757
|
+
} else if (j == 1) {
|
|
1758
|
+
if (k > 0) {
|
|
1759
|
+
result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
|
|
1760
|
+
} else {
|
|
1761
|
+
result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
|
|
1762
|
+
}
|
|
1763
|
+
} else if (j == -1) {
|
|
1764
|
+
if (k > 0) {
|
|
1765
|
+
result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
|
|
1766
|
+
} else {
|
|
1767
|
+
result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
|
|
1768
|
+
}
|
|
1769
|
+
} else {
|
|
1770
|
+
if (k > 0) {
|
|
1771
|
+
result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1772
|
+
} else {
|
|
1773
|
+
result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
|
|
1774
|
+
}
|
|
1775
|
+
}
|
|
1776
|
+
return result;
|
|
1906
1777
|
}
|
|
1907
|
-
|
|
1908
1778
|
vec2 cos_fp64(vec2 a) {
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
int abs_k = int(abs(float(k)));
|
|
1943
|
-
|
|
1944
|
-
if (abs_k > 4) {
|
|
1945
|
-
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1946
|
-
} else {
|
|
1947
|
-
t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
|
|
1948
|
-
}
|
|
1949
|
-
|
|
1950
|
-
vec2 u = vec2(0.0, 0.0);
|
|
1951
|
-
vec2 v = vec2(0.0, 0.0);
|
|
1952
|
-
|
|
1779
|
+
if (a.x == 0.0 && a.y == 0.0) {
|
|
1780
|
+
return vec2(1.0, 0.0);
|
|
1781
|
+
}
|
|
1782
|
+
vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
|
|
1783
|
+
vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
|
|
1784
|
+
vec2 t;
|
|
1785
|
+
float q = floor(r.x / PI_2_FP64.x + 0.5);
|
|
1786
|
+
int j = int(q);
|
|
1787
|
+
if (j < -2 || j > 2) {
|
|
1788
|
+
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1789
|
+
}
|
|
1790
|
+
t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
|
|
1791
|
+
q = floor(t.x / PI_16_FP64.x + 0.5);
|
|
1792
|
+
int k = int(q);
|
|
1793
|
+
if (k == 0) {
|
|
1794
|
+
if (j == 0) {
|
|
1795
|
+
return cos_taylor_fp64(t);
|
|
1796
|
+
} else if (j == 1) {
|
|
1797
|
+
return -sin_taylor_fp64(t);
|
|
1798
|
+
} else if (j == -1) {
|
|
1799
|
+
return sin_taylor_fp64(t);
|
|
1800
|
+
} else {
|
|
1801
|
+
return -cos_taylor_fp64(t);
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
int abs_k = int(abs(float(k)));
|
|
1805
|
+
if (abs_k > 4) {
|
|
1806
|
+
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1807
|
+
} else {
|
|
1808
|
+
t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
|
|
1809
|
+
}
|
|
1810
|
+
vec2 u = vec2(0.0, 0.0);
|
|
1811
|
+
vec2 v = vec2(0.0, 0.0);
|
|
1953
1812
|
#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1813
|
+
if (abs(float(abs_k) - 1.0) < 0.5) {
|
|
1814
|
+
u = COS_TABLE_0_FP64;
|
|
1815
|
+
v = SIN_TABLE_0_FP64;
|
|
1816
|
+
} else if (abs(float(abs_k) - 2.0) < 0.5) {
|
|
1817
|
+
u = COS_TABLE_1_FP64;
|
|
1818
|
+
v = SIN_TABLE_1_FP64;
|
|
1819
|
+
} else if (abs(float(abs_k) - 3.0) < 0.5) {
|
|
1820
|
+
u = COS_TABLE_2_FP64;
|
|
1821
|
+
v = SIN_TABLE_2_FP64;
|
|
1822
|
+
} else if (abs(float(abs_k) - 4.0) < 0.5) {
|
|
1823
|
+
u = COS_TABLE_3_FP64;
|
|
1824
|
+
v = SIN_TABLE_3_FP64;
|
|
1825
|
+
}
|
|
1967
1826
|
#else
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1827
|
+
if (abs_k == 1) {
|
|
1828
|
+
u = COS_TABLE_0_FP64;
|
|
1829
|
+
v = SIN_TABLE_0_FP64;
|
|
1830
|
+
} else if (abs_k == 2) {
|
|
1831
|
+
u = COS_TABLE_1_FP64;
|
|
1832
|
+
v = SIN_TABLE_1_FP64;
|
|
1833
|
+
} else if (abs_k == 3) {
|
|
1834
|
+
u = COS_TABLE_2_FP64;
|
|
1835
|
+
v = SIN_TABLE_2_FP64;
|
|
1836
|
+
} else if (abs_k == 4) {
|
|
1837
|
+
u = COS_TABLE_3_FP64;
|
|
1838
|
+
v = SIN_TABLE_3_FP64;
|
|
1839
|
+
}
|
|
1981
1840
|
#endif
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
}
|
|
2012
|
-
|
|
2013
|
-
return result;
|
|
1841
|
+
vec2 sin_t, cos_t;
|
|
1842
|
+
sincos_taylor_fp64(t, sin_t, cos_t);
|
|
1843
|
+
vec2 result = vec2(0.0, 0.0);
|
|
1844
|
+
if (j == 0) {
|
|
1845
|
+
if (k > 0) {
|
|
1846
|
+
result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
|
|
1847
|
+
} else {
|
|
1848
|
+
result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
|
|
1849
|
+
}
|
|
1850
|
+
} else if (j == 1) {
|
|
1851
|
+
if (k > 0) {
|
|
1852
|
+
result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1853
|
+
} else {
|
|
1854
|
+
result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
|
|
1855
|
+
}
|
|
1856
|
+
} else if (j == -1) {
|
|
1857
|
+
if (k > 0) {
|
|
1858
|
+
result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1859
|
+
} else {
|
|
1860
|
+
result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1861
|
+
}
|
|
1862
|
+
} else {
|
|
1863
|
+
if (k > 0) {
|
|
1864
|
+
result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
|
|
1865
|
+
} else {
|
|
1866
|
+
result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
|
|
1867
|
+
}
|
|
1868
|
+
}
|
|
1869
|
+
return result;
|
|
2014
1870
|
}
|
|
2015
|
-
|
|
2016
1871
|
vec2 tan_fp64(vec2 a) {
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
|
|
2049
|
-
}
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
vec2 u = vec2(0.0, 0.0);
|
|
2053
|
-
vec2 v = vec2(0.0, 0.0);
|
|
2054
|
-
|
|
2055
|
-
vec2 sin_t, cos_t;
|
|
2056
|
-
vec2 s, c;
|
|
2057
|
-
sincos_taylor_fp64(t, sin_t, cos_t);
|
|
2058
|
-
|
|
2059
|
-
if (k == 0) {
|
|
2060
|
-
s = sin_t;
|
|
2061
|
-
c = cos_t;
|
|
2062
|
-
} else {
|
|
1872
|
+
vec2 sin_a;
|
|
1873
|
+
vec2 cos_a;
|
|
1874
|
+
if (a.x == 0.0 && a.y == 0.0) {
|
|
1875
|
+
return vec2(0.0, 0.0);
|
|
1876
|
+
}
|
|
1877
|
+
vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
|
|
1878
|
+
vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
|
|
1879
|
+
vec2 t;
|
|
1880
|
+
float q = floor(r.x / PI_2_FP64.x + 0.5);
|
|
1881
|
+
int j = int(q);
|
|
1882
|
+
if (j < -2 || j > 2) {
|
|
1883
|
+
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1884
|
+
}
|
|
1885
|
+
t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
|
|
1886
|
+
q = floor(t.x / PI_16_FP64.x + 0.5);
|
|
1887
|
+
int k = int(q);
|
|
1888
|
+
int abs_k = int(abs(float(k)));
|
|
1889
|
+
if (abs_k > 4) {
|
|
1890
|
+
return vec2(0.0 / 0.0, 0.0 / 0.0);
|
|
1891
|
+
} else {
|
|
1892
|
+
t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
|
|
1893
|
+
}
|
|
1894
|
+
vec2 u = vec2(0.0, 0.0);
|
|
1895
|
+
vec2 v = vec2(0.0, 0.0);
|
|
1896
|
+
vec2 sin_t, cos_t;
|
|
1897
|
+
vec2 s, c;
|
|
1898
|
+
sincos_taylor_fp64(t, sin_t, cos_t);
|
|
1899
|
+
if (k == 0) {
|
|
1900
|
+
s = sin_t;
|
|
1901
|
+
c = cos_t;
|
|
1902
|
+
} else {
|
|
2063
1903
|
#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
1904
|
+
if (abs(float(abs_k) - 1.0) < 0.5) {
|
|
1905
|
+
u = COS_TABLE_0_FP64;
|
|
1906
|
+
v = SIN_TABLE_0_FP64;
|
|
1907
|
+
} else if (abs(float(abs_k) - 2.0) < 0.5) {
|
|
1908
|
+
u = COS_TABLE_1_FP64;
|
|
1909
|
+
v = SIN_TABLE_1_FP64;
|
|
1910
|
+
} else if (abs(float(abs_k) - 3.0) < 0.5) {
|
|
1911
|
+
u = COS_TABLE_2_FP64;
|
|
1912
|
+
v = SIN_TABLE_2_FP64;
|
|
1913
|
+
} else if (abs(float(abs_k) - 4.0) < 0.5) {
|
|
1914
|
+
u = COS_TABLE_3_FP64;
|
|
1915
|
+
v = SIN_TABLE_3_FP64;
|
|
1916
|
+
}
|
|
2077
1917
|
#else
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
1918
|
+
if (abs_k == 1) {
|
|
1919
|
+
u = COS_TABLE_0_FP64;
|
|
1920
|
+
v = SIN_TABLE_0_FP64;
|
|
1921
|
+
} else if (abs_k == 2) {
|
|
1922
|
+
u = COS_TABLE_1_FP64;
|
|
1923
|
+
v = SIN_TABLE_1_FP64;
|
|
1924
|
+
} else if (abs_k == 3) {
|
|
1925
|
+
u = COS_TABLE_2_FP64;
|
|
1926
|
+
v = SIN_TABLE_2_FP64;
|
|
1927
|
+
} else if (abs_k == 4) {
|
|
1928
|
+
u = COS_TABLE_3_FP64;
|
|
1929
|
+
v = SIN_TABLE_3_FP64;
|
|
1930
|
+
}
|
|
2091
1931
|
#endif
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
return div_fp64(sin_a, cos_a);
|
|
1932
|
+
if (k > 0) {
|
|
1933
|
+
s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1934
|
+
c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
|
|
1935
|
+
} else {
|
|
1936
|
+
s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
|
|
1937
|
+
c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
if (j == 0) {
|
|
1941
|
+
sin_a = s;
|
|
1942
|
+
cos_a = c;
|
|
1943
|
+
} else if (j == 1) {
|
|
1944
|
+
sin_a = c;
|
|
1945
|
+
cos_a = -s;
|
|
1946
|
+
} else if (j == -1) {
|
|
1947
|
+
sin_a = -c;
|
|
1948
|
+
cos_a = s;
|
|
1949
|
+
} else {
|
|
1950
|
+
sin_a = -s;
|
|
1951
|
+
cos_a = -c;
|
|
1952
|
+
}
|
|
1953
|
+
return div_fp64(sin_a, cos_a);
|
|
2115
1954
|
}
|
|
2116
|
-
|
|
2117
1955
|
vec2 radians_fp64(vec2 degree) {
|
|
2118
|
-
|
|
1956
|
+
return mul_fp64(degree, PI_180_FP64);
|
|
2119
1957
|
}
|
|
2120
|
-
|
|
2121
1958
|
vec2 mix_fp64(vec2 a, vec2 b, float x) {
|
|
2122
|
-
|
|
2123
|
-
|
|
1959
|
+
vec2 range = sub_fp64(b, a);
|
|
1960
|
+
return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));
|
|
2124
1961
|
}
|
|
2125
|
-
|
|
2126
|
-
// Vector functions
|
|
2127
|
-
// vec2 functions
|
|
2128
1962
|
void vec2_sum_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
|
|
2129
|
-
|
|
2130
|
-
|
|
1963
|
+
out_val[0] = sum_fp64(a[0], b[0]);
|
|
1964
|
+
out_val[1] = sum_fp64(a[1], b[1]);
|
|
2131
1965
|
}
|
|
2132
|
-
|
|
2133
1966
|
void vec2_sub_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
|
|
2134
|
-
|
|
2135
|
-
|
|
1967
|
+
out_val[0] = sub_fp64(a[0], b[0]);
|
|
1968
|
+
out_val[1] = sub_fp64(a[1], b[1]);
|
|
2136
1969
|
}
|
|
2137
|
-
|
|
2138
1970
|
void vec2_mul_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
|
|
2139
|
-
|
|
2140
|
-
|
|
1971
|
+
out_val[0] = mul_fp64(a[0], b[0]);
|
|
1972
|
+
out_val[1] = mul_fp64(a[1], b[1]);
|
|
2141
1973
|
}
|
|
2142
|
-
|
|
2143
1974
|
void vec2_div_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
|
|
2144
|
-
|
|
2145
|
-
|
|
1975
|
+
out_val[0] = div_fp64(a[0], b[0]);
|
|
1976
|
+
out_val[1] = div_fp64(a[1], b[1]);
|
|
2146
1977
|
}
|
|
2147
|
-
|
|
2148
1978
|
void vec2_mix_fp64(vec2 x[2], vec2 y[2], float a, out vec2 out_val[2]) {
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
1979
|
+
vec2 range[2];
|
|
1980
|
+
vec2_sub_fp64(y, x, range);
|
|
1981
|
+
vec2 portion[2];
|
|
1982
|
+
portion[0] = range[0] * a;
|
|
1983
|
+
portion[1] = range[1] * a;
|
|
1984
|
+
vec2_sum_fp64(x, portion, out_val);
|
|
2155
1985
|
}
|
|
2156
|
-
|
|
2157
1986
|
vec2 vec2_length_fp64(vec2 x[2]) {
|
|
2158
|
-
|
|
1987
|
+
return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));
|
|
2159
1988
|
}
|
|
2160
|
-
|
|
2161
1989
|
void vec2_normalize_fp64(vec2 x[2], out vec2 out_val[2]) {
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
vec2_div_fp64(x, length_vec2, out_val);
|
|
1990
|
+
vec2 length = vec2_length_fp64(x);
|
|
1991
|
+
vec2 length_vec2[2];
|
|
1992
|
+
length_vec2[0] = length;
|
|
1993
|
+
length_vec2[1] = length;
|
|
1994
|
+
vec2_div_fp64(x, length_vec2, out_val);
|
|
2168
1995
|
}
|
|
2169
|
-
|
|
2170
1996
|
vec2 vec2_distance_fp64(vec2 x[2], vec2 y[2]) {
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
1997
|
+
vec2 diff[2];
|
|
1998
|
+
vec2_sub_fp64(x, y, diff);
|
|
1999
|
+
return vec2_length_fp64(diff);
|
|
2174
2000
|
}
|
|
2175
|
-
|
|
2176
2001
|
vec2 vec2_dot_fp64(vec2 a[2], vec2 b[2]) {
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
return sum_fp64(v[0], v[1]);
|
|
2002
|
+
vec2 v[2];
|
|
2003
|
+
v[0] = mul_fp64(a[0], b[0]);
|
|
2004
|
+
v[1] = mul_fp64(a[1], b[1]);
|
|
2005
|
+
return sum_fp64(v[0], v[1]);
|
|
2183
2006
|
}
|
|
2184
|
-
|
|
2185
|
-
// vec3 functions
|
|
2186
2007
|
void vec3_sub_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2008
|
+
for (int i = 0; i < 3; i++) {
|
|
2009
|
+
out_val[i] = sum_fp64(a[i], b[i]);
|
|
2010
|
+
}
|
|
2190
2011
|
}
|
|
2191
|
-
|
|
2192
2012
|
void vec3_sum_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2013
|
+
for (int i = 0; i < 3; i++) {
|
|
2014
|
+
out_val[i] = sum_fp64(a[i], b[i]);
|
|
2015
|
+
}
|
|
2196
2016
|
}
|
|
2197
|
-
|
|
2198
2017
|
vec2 vec3_length_fp64(vec2 x[3]) {
|
|
2199
|
-
|
|
2200
|
-
|
|
2018
|
+
return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),
|
|
2019
|
+
mul_fp64(x[2], x[2])));
|
|
2201
2020
|
}
|
|
2202
|
-
|
|
2203
2021
|
vec2 vec3_distance_fp64(vec2 x[3], vec2 y[3]) {
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2022
|
+
vec2 diff[3];
|
|
2023
|
+
vec3_sub_fp64(x, y, diff);
|
|
2024
|
+
return vec3_length_fp64(diff);
|
|
2207
2025
|
}
|
|
2208
|
-
|
|
2209
|
-
// vec4 functions
|
|
2210
2026
|
void vec4_fp64(vec4 a, out vec2 out_val[4]) {
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
out_val[3].x = a[3];
|
|
2221
|
-
out_val[3].y = 0.0;
|
|
2027
|
+
out_val[0].x = a[0];
|
|
2028
|
+
out_val[0].y = 0.0;
|
|
2029
|
+
out_val[1].x = a[1];
|
|
2030
|
+
out_val[1].y = 0.0;
|
|
2031
|
+
out_val[2].x = a[2];
|
|
2032
|
+
out_val[2].y = 0.0;
|
|
2033
|
+
out_val[3].x = a[3];
|
|
2034
|
+
out_val[3].y = 0.0;
|
|
2222
2035
|
}
|
|
2223
|
-
|
|
2224
2036
|
void vec4_scalar_mul_fp64(vec2 a[4], vec2 b, out vec2 out_val[4]) {
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2037
|
+
out_val[0] = mul_fp64(a[0], b);
|
|
2038
|
+
out_val[1] = mul_fp64(a[1], b);
|
|
2039
|
+
out_val[2] = mul_fp64(a[2], b);
|
|
2040
|
+
out_val[3] = mul_fp64(a[3], b);
|
|
2229
2041
|
}
|
|
2230
|
-
|
|
2231
2042
|
void vec4_sum_fp64(vec2 a[4], vec2 b[4], out vec2 out_val[4]) {
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2043
|
+
for (int i = 0; i < 4; i++) {
|
|
2044
|
+
out_val[i] = sum_fp64(a[i], b[i]);
|
|
2045
|
+
}
|
|
2235
2046
|
}
|
|
2236
|
-
|
|
2237
2047
|
void vec4_dot_fp64(vec2 a[4], vec2 b[4], out vec2 out_val) {
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));
|
|
2048
|
+
vec2 v[4];
|
|
2049
|
+
v[0] = mul_fp64(a[0], b[0]);
|
|
2050
|
+
v[1] = mul_fp64(a[1], b[1]);
|
|
2051
|
+
v[2] = mul_fp64(a[2], b[2]);
|
|
2052
|
+
v[3] = mul_fp64(a[3], b[3]);
|
|
2053
|
+
out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));
|
|
2246
2054
|
}
|
|
2247
|
-
|
|
2248
2055
|
void mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
}
|
|
2056
|
+
vec2 tmp[4];
|
|
2057
|
+
for (int i = 0; i < 4; i++)
|
|
2058
|
+
{
|
|
2059
|
+
for (int j = 0; j < 4; j++)
|
|
2060
|
+
{
|
|
2061
|
+
tmp[j] = b[j + i * 4];
|
|
2062
|
+
}
|
|
2063
|
+
vec4_dot_fp64(a, tmp, out_val[i]);
|
|
2064
|
+
}
|
|
2259
2065
|
}
|
|
2260
2066
|
`;
|
|
2261
2067
|
|