@luma.gl/shadertools 9.3.6 → 9.4.0-alpha.1
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 +6555 -2373
- package/dist/dist.min.js +2984 -237
- package/dist/index.cjs +4356 -268
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +13 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/preprocessor/preprocessor.d.ts +11 -1
- package/dist/lib/preprocessor/preprocessor.d.ts.map +1 -1
- package/dist/lib/preprocessor/preprocessor.js +47 -2
- package/dist/lib/preprocessor/preprocessor.js.map +1 -1
- package/dist/lib/shader-assembler.d.ts +10 -10
- package/dist/lib/shader-assembler.d.ts.map +1 -1
- package/dist/lib/shader-assembler.js +36 -20
- package/dist/lib/shader-assembler.js.map +1 -1
- package/dist/lib/shader-assembly/assemble-shaders.d.ts +28 -7
- package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -1
- package/dist/lib/shader-assembly/assemble-shaders.js +133 -15
- package/dist/lib/shader-assembly/assemble-shaders.js.map +1 -1
- package/dist/lib/shader-assembly/platform-info.d.ts +2 -0
- package/dist/lib/shader-assembly/platform-info.d.ts.map +1 -1
- package/dist/lib/shader-assembly/shader-hooks.d.ts +1 -1
- package/dist/lib/shader-assembly/shader-hooks.d.ts.map +1 -1
- package/dist/lib/shader-assembly/shader-hooks.js +6 -3
- package/dist/lib/shader-assembly/shader-hooks.js.map +1 -1
- package/dist/lib/shader-assembly/shader-injections.d.ts +4 -1
- package/dist/lib/shader-assembly/shader-injections.d.ts.map +1 -1
- package/dist/lib/shader-assembly/shader-injections.js +68 -11
- package/dist/lib/shader-assembly/shader-injections.js.map +1 -1
- package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts +15 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.js +412 -0
- package/dist/lib/shader-assembly/shader-plugin-varyings.js.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts +12 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts.map +1 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js +237 -0
- package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js.map +1 -0
- package/dist/lib/shader-module/shader-module.d.ts +3 -0
- package/dist/lib/shader-module/shader-module.d.ts.map +1 -1
- package/dist/lib/shader-module/shader-module.js.map +1 -1
- package/dist/lib/shader-module/shader-pass-pipeline.d.ts +14 -0
- package/dist/lib/shader-module/shader-pass-pipeline.d.ts.map +1 -0
- package/dist/lib/shader-module/shader-pass-pipeline.js +5 -0
- package/dist/lib/shader-module/shader-pass-pipeline.js.map +1 -0
- package/dist/lib/shader-module/shader-pass.d.ts +21 -4
- package/dist/lib/shader-module/shader-pass.d.ts.map +1 -1
- package/dist/lib/shader-plugin.d.ts +68 -0
- package/dist/lib/shader-plugin.d.ts.map +1 -0
- package/dist/lib/shader-plugin.js +98 -0
- package/dist/lib/shader-plugin.js.map +1 -0
- package/dist/lib/utils/assert.js +1 -1
- package/dist/lib/utils/assert.js.map +1 -1
- package/dist/modules/color/float-colors.d.ts +111 -5
- package/dist/modules/color/float-colors.d.ts.map +1 -1
- package/dist/modules/color/float-colors.js +200 -34
- package/dist/modules/color/float-colors.js.map +1 -1
- package/dist/modules/engine/clip/clip.d.ts +12 -0
- package/dist/modules/engine/clip/clip.d.ts.map +1 -0
- package/dist/modules/engine/clip/clip.js +129 -0
- package/dist/modules/engine/clip/clip.js.map +1 -0
- package/dist/modules/engine/filter/filter.d.ts +12 -0
- package/dist/modules/engine/filter/filter.d.ts.map +1 -0
- package/dist/modules/engine/filter/filter.js +88 -0
- package/dist/modules/engine/filter/filter.js.map +1 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts +3 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts.map +1 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.js +1892 -0
- package/dist/modules/geospatial/dggs/dggs-wgsl.js.map +1 -0
- package/dist/modules/geospatial/dggs/dggs.d.ts +6 -0
- package/dist/modules/geospatial/dggs/dggs.d.ts.map +1 -0
- package/dist/modules/geospatial/dggs/dggs.js +10 -0
- package/dist/modules/geospatial/dggs/dggs.js.map +1 -0
- package/dist/modules/lighting/water-material/water-material.d.ts +28 -0
- package/dist/modules/lighting/water-material/water-material.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/water-material.js +179 -0
- package/dist/modules/lighting/water-material/water-material.js.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts +3 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.js +232 -0
- package/dist/modules/lighting/water-material/water-shaders-glsl.js.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts +2 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts.map +1 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.js +230 -0
- package/dist/modules/lighting/water-material/water-shaders-wgsl.js.map +1 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts +2 -1
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts.map +1 -1
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js +268 -0
- package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +50 -3
- package/src/lib/preprocessor/preprocessor.ts +68 -3
- package/src/lib/shader-assembler.ts +49 -20
- package/src/lib/shader-assembly/assemble-shaders.ts +242 -30
- package/src/lib/shader-assembly/platform-info.ts +2 -0
- package/src/lib/shader-assembly/shader-hooks.ts +7 -3
- package/src/lib/shader-assembly/shader-injections.ts +96 -11
- package/src/lib/shader-assembly/shader-plugin-varyings.ts +524 -0
- package/src/lib/shader-assembly/shader-plugin-vertex-inputs.ts +279 -0
- package/src/lib/shader-module/shader-module.ts +3 -0
- package/src/lib/shader-module/shader-pass-pipeline.ts +19 -0
- package/src/lib/shader-module/shader-pass.ts +29 -4
- package/src/lib/shader-plugin.ts +214 -0
- package/src/lib/utils/assert.ts +1 -1
- package/src/modules/color/float-colors.ts +272 -37
- package/src/modules/engine/clip/clip.ts +149 -0
- package/src/modules/engine/filter/filter.ts +107 -0
- package/src/modules/geospatial/dggs/dggs-wgsl.ts +1892 -0
- package/src/modules/geospatial/dggs/dggs.ts +12 -0
- package/src/modules/lighting/water-material/water-material.ts +234 -0
- package/src/modules/lighting/water-material/water-shaders-glsl.ts +233 -0
- package/src/modules/lighting/water-material/water-shaders-wgsl.ts +230 -0
- package/src/modules/math/fp64/fp64-arithmetic-wgsl.ts +268 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
+
/** WGSL source for fp64 arithmetic helpers and raw binary64-to-Float32 subtraction. */
|
|
5
6
|
export const fp64arithmeticWGSL = /* wgsl */ `\
|
|
6
7
|
struct Fp64ArithmeticUniforms {
|
|
7
8
|
ONE: f32,
|
|
@@ -10,11 +11,278 @@ struct Fp64ArithmeticUniforms {
|
|
|
10
11
|
|
|
11
12
|
@group(0) @binding(auto) var<uniform> fp64arithmetic : Fp64ArithmeticUniforms;
|
|
12
13
|
|
|
14
|
+
struct Fp64Bits {
|
|
15
|
+
sign: u32,
|
|
16
|
+
exponent: i32,
|
|
17
|
+
significand: vec2u,
|
|
18
|
+
isZero: bool,
|
|
19
|
+
isInf: bool,
|
|
20
|
+
isNan: bool,
|
|
21
|
+
};
|
|
22
|
+
|
|
13
23
|
fn fp64_nan(seed: f32) -> f32 {
|
|
14
24
|
let nanBits = 0x7fc00000u | select(0u, 1u, seed < 0.0);
|
|
15
25
|
return bitcast<f32>(nanBits);
|
|
16
26
|
}
|
|
17
27
|
|
|
28
|
+
fn fp64_u64_is_zero(value: vec2u) -> bool {
|
|
29
|
+
return value.x == 0u && value.y == 0u;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
fn fp64_u64_compare(a: vec2u, b: vec2u) -> i32 {
|
|
33
|
+
if (a.x != b.x) {
|
|
34
|
+
return select(-1, 1, a.x > b.x);
|
|
35
|
+
}
|
|
36
|
+
if (a.y != b.y) {
|
|
37
|
+
return select(-1, 1, a.y > b.y);
|
|
38
|
+
}
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fn fp64_u64_add(a: vec2u, b: vec2u) -> vec2u {
|
|
43
|
+
let low = a.y + b.y;
|
|
44
|
+
let carry = select(0u, 1u, low < a.y);
|
|
45
|
+
return vec2u(a.x + b.x + carry, low);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
fn fp64_u64_sub(a: vec2u, b: vec2u) -> vec2u {
|
|
49
|
+
let borrow = select(0u, 1u, a.y < b.y);
|
|
50
|
+
return vec2u(a.x - b.x - borrow, a.y - b.y);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
fn fp64_u64_shift_left(value: vec2u, shift: u32) -> vec2u {
|
|
54
|
+
if (shift == 0u) {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
if (shift < 32u) {
|
|
58
|
+
return vec2u((value.x << shift) | (value.y >> (32u - shift)), value.y << shift);
|
|
59
|
+
}
|
|
60
|
+
if (shift == 32u) {
|
|
61
|
+
return vec2u(value.y, 0u);
|
|
62
|
+
}
|
|
63
|
+
if (shift < 64u) {
|
|
64
|
+
return vec2u(value.y << (shift - 32u), 0u);
|
|
65
|
+
}
|
|
66
|
+
return vec2u(0u);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
fn fp64_u64_shift_right(value: vec2u, shift: u32) -> vec2u {
|
|
70
|
+
if (shift == 0u) {
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
if (shift < 32u) {
|
|
74
|
+
return vec2u(value.x >> shift, (value.y >> shift) | (value.x << (32u - shift)));
|
|
75
|
+
}
|
|
76
|
+
if (shift == 32u) {
|
|
77
|
+
return vec2u(0u, value.x);
|
|
78
|
+
}
|
|
79
|
+
if (shift < 64u) {
|
|
80
|
+
return vec2u(0u, value.x >> (shift - 32u));
|
|
81
|
+
}
|
|
82
|
+
return vec2u(0u);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fn fp64_u64_get_bit(value: vec2u, bitIndex: u32) -> bool {
|
|
86
|
+
if (bitIndex >= 64u) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
if (bitIndex >= 32u) {
|
|
90
|
+
return ((value.x >> (bitIndex - 32u)) & 1u) != 0u;
|
|
91
|
+
}
|
|
92
|
+
return ((value.y >> bitIndex) & 1u) != 0u;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
fn fp64_u64_has_bits_below(value: vec2u, bitCount: u32) -> bool {
|
|
96
|
+
if (bitCount == 0u) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (bitCount >= 64u) {
|
|
100
|
+
return !fp64_u64_is_zero(value);
|
|
101
|
+
}
|
|
102
|
+
if (bitCount > 32u) {
|
|
103
|
+
let highBitCount = bitCount - 32u;
|
|
104
|
+
let highMask = (1u << highBitCount) - 1u;
|
|
105
|
+
return value.y != 0u || (value.x & highMask) != 0u;
|
|
106
|
+
}
|
|
107
|
+
if (bitCount == 32u) {
|
|
108
|
+
return value.y != 0u;
|
|
109
|
+
}
|
|
110
|
+
let lowMask = (1u << bitCount) - 1u;
|
|
111
|
+
return (value.y & lowMask) != 0u;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fn fp64_u64_shift_right_sticky(value: vec2u, shift: u32) -> vec2u {
|
|
115
|
+
var shifted = fp64_u64_shift_right(value, shift);
|
|
116
|
+
if (fp64_u64_has_bits_below(value, shift)) {
|
|
117
|
+
shifted.y = shifted.y | 1u;
|
|
118
|
+
}
|
|
119
|
+
return shifted;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
fn fp64_u64_count_leading_zeros(value: vec2u) -> u32 {
|
|
123
|
+
if (value.x != 0u) {
|
|
124
|
+
return countLeadingZeros(value.x);
|
|
125
|
+
}
|
|
126
|
+
return 32u + countLeadingZeros(value.y);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
fn fp64_round_shift_right_to_u32(value: vec2u, shift: u32) -> u32 {
|
|
130
|
+
if (shift == 0u) {
|
|
131
|
+
return value.y;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
let truncated = fp64_u64_shift_right(value, shift);
|
|
135
|
+
var rounded = truncated.y;
|
|
136
|
+
let guard = fp64_u64_get_bit(value, shift - 1u);
|
|
137
|
+
let hasTrailingBits = fp64_u64_has_bits_below(value, shift - 1u);
|
|
138
|
+
if (guard && (hasTrailingBits || (rounded & 1u) == 1u)) {
|
|
139
|
+
rounded = rounded + 1u;
|
|
140
|
+
}
|
|
141
|
+
return rounded;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
fn fp64_make_f32_bits_from_u64(sign: u32, significand: vec2u, baseExponent: i32) -> u32 {
|
|
145
|
+
if (fp64_u64_is_zero(significand)) {
|
|
146
|
+
return sign << 31u;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
let leadingZeros = fp64_u64_count_leading_zeros(significand);
|
|
150
|
+
let mostSignificantBit = 63u - leadingZeros;
|
|
151
|
+
var exponent = baseExponent + i32(mostSignificantBit);
|
|
152
|
+
|
|
153
|
+
if (exponent > 127) {
|
|
154
|
+
return (sign << 31u) | 0x7f800000u;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (exponent >= -126) {
|
|
158
|
+
let shift = i32(mostSignificantBit) - 23;
|
|
159
|
+
var significand24: u32;
|
|
160
|
+
if (shift > 0) {
|
|
161
|
+
significand24 = fp64_round_shift_right_to_u32(significand, u32(shift));
|
|
162
|
+
} else {
|
|
163
|
+
significand24 = fp64_u64_shift_left(significand, u32(-shift)).y;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (significand24 >= 0x1000000u) {
|
|
167
|
+
significand24 = significand24 >> 1u;
|
|
168
|
+
exponent = exponent + 1;
|
|
169
|
+
if (exponent > 127) {
|
|
170
|
+
return (sign << 31u) | 0x7f800000u;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return (sign << 31u) | (u32(exponent + 127) << 23u) | (significand24 & 0x7fffffu);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
let scaleExponent = baseExponent + 149;
|
|
178
|
+
var mantissa: u32;
|
|
179
|
+
if (scaleExponent >= 0) {
|
|
180
|
+
mantissa = fp64_u64_shift_left(significand, u32(scaleExponent)).y;
|
|
181
|
+
} else {
|
|
182
|
+
mantissa = fp64_round_shift_right_to_u32(significand, u32(-scaleExponent));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (mantissa >= 0x800000u) {
|
|
186
|
+
return (sign << 31u) | 0x00800000u;
|
|
187
|
+
}
|
|
188
|
+
return (sign << 31u) | mantissa;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
fn fp64_decode_bits(bits: vec2u) -> Fp64Bits {
|
|
192
|
+
let sign = bits.x >> 31u;
|
|
193
|
+
let exponentBits = (bits.x >> 20u) & 0x7ffu;
|
|
194
|
+
let fractionHigh = bits.x & 0xfffffu;
|
|
195
|
+
let fractionLow = bits.y;
|
|
196
|
+
let fraction = vec2u(fractionHigh, fractionLow);
|
|
197
|
+
|
|
198
|
+
if (exponentBits == 0x7ffu) {
|
|
199
|
+
let isInf = fp64_u64_is_zero(fraction);
|
|
200
|
+
return Fp64Bits(sign, 0, vec2u(0u), false, isInf, !isInf);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (exponentBits == 0u) {
|
|
204
|
+
let isZero = fp64_u64_is_zero(fraction);
|
|
205
|
+
return Fp64Bits(sign, -1022, fraction, isZero, false, false);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return Fp64Bits(sign, i32(exponentBits) - 1023, vec2u((1u << 20u) | fractionHigh, fractionLow), false, false, false);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
fn fp64_finite_magnitude_compare(a: Fp64Bits, b: Fp64Bits) -> i32 {
|
|
212
|
+
if (a.exponent != b.exponent) {
|
|
213
|
+
return select(-1, 1, a.exponent > b.exponent);
|
|
214
|
+
}
|
|
215
|
+
return fp64_u64_compare(a.significand, b.significand);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
fn fp64_add_aligned_magnitudes_to_f32_bits(sign: u32, larger: Fp64Bits, smaller: Fp64Bits) -> u32 {
|
|
219
|
+
let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);
|
|
220
|
+
let smallSignificand = fp64_u64_shift_right_sticky(
|
|
221
|
+
fp64_u64_shift_left(smaller.significand, 3u),
|
|
222
|
+
u32(larger.exponent - smaller.exponent)
|
|
223
|
+
);
|
|
224
|
+
let resultSignificand = fp64_u64_add(largeSignificand, smallSignificand);
|
|
225
|
+
return fp64_make_f32_bits_from_u64(sign, resultSignificand, larger.exponent - 55);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
fn fp64_sub_aligned_magnitudes_to_f32_bits(sign: u32, larger: Fp64Bits, smaller: Fp64Bits) -> u32 {
|
|
229
|
+
let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);
|
|
230
|
+
let smallSignificand = fp64_u64_shift_right_sticky(
|
|
231
|
+
fp64_u64_shift_left(smaller.significand, 3u),
|
|
232
|
+
u32(larger.exponent - smaller.exponent)
|
|
233
|
+
);
|
|
234
|
+
let resultSignificand = fp64_u64_sub(largeSignificand, smallSignificand);
|
|
235
|
+
return fp64_make_f32_bits_from_u64(sign, resultSignificand, larger.exponent - 55);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Subtract two raw binary64 values and round the exact result once to f32.
|
|
239
|
+
// The input words are canonical high/low words: .x contains sign/exponent/high
|
|
240
|
+
// fraction bits, and .y contains the low 32 fraction bits.
|
|
241
|
+
fn sub_fp64u32_to_f32_bits(aBits: vec2u, bBits: vec2u) -> u32 {
|
|
242
|
+
let a = fp64_decode_bits(aBits);
|
|
243
|
+
let b = fp64_decode_bits(bBits);
|
|
244
|
+
let bSubtractionSign = b.sign ^ 1u;
|
|
245
|
+
|
|
246
|
+
if (a.isNan || b.isNan) {
|
|
247
|
+
return 0x7fc00000u;
|
|
248
|
+
}
|
|
249
|
+
if (a.isInf && b.isInf) {
|
|
250
|
+
if (a.sign == bSubtractionSign) {
|
|
251
|
+
return (a.sign << 31u) | 0x7f800000u;
|
|
252
|
+
}
|
|
253
|
+
return 0x7fc00000u;
|
|
254
|
+
}
|
|
255
|
+
if (a.isInf) {
|
|
256
|
+
return (a.sign << 31u) | 0x7f800000u;
|
|
257
|
+
}
|
|
258
|
+
if (b.isInf) {
|
|
259
|
+
return (bSubtractionSign << 31u) | 0x7f800000u;
|
|
260
|
+
}
|
|
261
|
+
if (a.isZero && b.isZero) {
|
|
262
|
+
return select(0u, 0x80000000u, a.sign == 1u && b.sign == 0u);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
let magnitudeComparison = fp64_finite_magnitude_compare(a, b);
|
|
266
|
+
if (a.sign == bSubtractionSign) {
|
|
267
|
+
if (magnitudeComparison >= 0) {
|
|
268
|
+
return fp64_add_aligned_magnitudes_to_f32_bits(a.sign, a, b);
|
|
269
|
+
}
|
|
270
|
+
return fp64_add_aligned_magnitudes_to_f32_bits(a.sign, b, a);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (magnitudeComparison == 0) {
|
|
274
|
+
return 0u;
|
|
275
|
+
}
|
|
276
|
+
if (magnitudeComparison > 0) {
|
|
277
|
+
return fp64_sub_aligned_magnitudes_to_f32_bits(a.sign, a, b);
|
|
278
|
+
}
|
|
279
|
+
return fp64_sub_aligned_magnitudes_to_f32_bits(bSubtractionSign, b, a);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
fn sub_fp64u32_to_f32(aBits: vec2u, bBits: vec2u) -> f32 {
|
|
283
|
+
return bitcast<f32>(sub_fp64u32_to_f32_bits(aBits, bBits));
|
|
284
|
+
}
|
|
285
|
+
|
|
18
286
|
fn fp64_runtime_zero() -> f32 {
|
|
19
287
|
return fp64arithmetic.ONE * 0.0;
|
|
20
288
|
}
|