typegpu 0.11.8 → 0.12.0

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.
Files changed (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +37 -38
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -0
  42. package/core/function/fnCore.js +148 -92
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +18 -20
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +90 -93
  85. package/core/resolve/externals.d.ts +25 -7
  86. package/core/resolve/externals.js +79 -62
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -55
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -454
  101. package/core/root/rootTypes.d.ts +461 -627
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -214
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -192
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -120
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +428 -398
  239. package/package.json +9 -3
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -624
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -100
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +18 -0
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +272 -193
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -747
  350. package/types.d.ts +287 -221
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -0,0 +1,6 @@
1
+ export declare const smoothstepScalar: (edge0: number, edge1: number, x: number) => number;
2
+ export declare const clamp: (value: number, low: number, high: number) => number;
3
+ export declare const divInteger: (lhs: number, rhs: number) => number;
4
+ export declare function bitcastU32toF32Impl(n: number): number;
5
+ export declare function bitcastU32toI32Impl(n: number): number;
6
+ export declare function bitcastF32toU32Impl(n: number): number;
package/data/numberOps.js CHANGED
@@ -1,24 +1,30 @@
1
- //#region src/data/numberOps.ts
2
- const smoothstepScalar = (edge0, edge1, x) => {
3
- if (edge0 === edge1) return 0;
4
- const t = clamp((x - edge0) / (edge1 - edge0), 0, 1);
5
- return t * t * (3 - 2 * t);
1
+ export const smoothstepScalar = (edge0, edge1, x) => {
2
+ if (edge0 === edge1) {
3
+ return 0; // WGSL spec says this is an indeterminate value
4
+ }
5
+ const t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
6
+ return t * t * (3 - 2 * t);
6
7
  };
7
- const clamp = (value, low, high) => Math.min(Math.max(low, value), high);
8
- const divInteger = (lhs, rhs) => {
9
- if (rhs === 0) return lhs;
10
- return Math.trunc(lhs / rhs);
8
+ export const clamp = (value, low, high) => Math.min(Math.max(low, value), high);
9
+ export const divInteger = (lhs, rhs) => {
10
+ if (rhs === 0) {
11
+ return lhs;
12
+ }
13
+ return Math.trunc(lhs / rhs);
11
14
  };
12
- function bitcastU32toF32Impl(n) {
13
- const dataView = /* @__PURE__ */ new DataView(/* @__PURE__ */ new ArrayBuffer(4));
14
- dataView.setUint32(0, n, true);
15
- return dataView.getFloat32(0, true);
15
+ const buf32 = new ArrayBuffer(4);
16
+ const f32arr = new Float32Array(buf32);
17
+ const u32arr = new Uint32Array(buf32);
18
+ const i32arr = new Int32Array(buf32);
19
+ export function bitcastU32toF32Impl(n) {
20
+ u32arr[0] = n;
21
+ return f32arr[0];
16
22
  }
17
- function bitcastU32toI32Impl(n) {
18
- const dataView = /* @__PURE__ */ new DataView(/* @__PURE__ */ new ArrayBuffer(4));
19
- dataView.setUint32(0, n, true);
20
- return dataView.getInt32(0, true);
23
+ export function bitcastU32toI32Impl(n) {
24
+ u32arr[0] = n;
25
+ return i32arr[0];
26
+ }
27
+ export function bitcastF32toU32Impl(n) {
28
+ f32arr[0] = n;
29
+ return u32arr[0];
21
30
  }
22
-
23
- //#endregion
24
- export { bitcastU32toF32Impl, bitcastU32toI32Impl, clamp, divInteger, smoothstepScalar };
package/data/numeric.d.ts CHANGED
@@ -1,7 +1,4 @@
1
- import { Bool, F16, F32, I32, U16, U32 } from "./wgslTypes.js";
2
-
3
- //#region src/data/numeric.d.ts
4
-
1
+ import { type AbstractFloat, type AbstractInt, type Bool, type F16, type F32, type I32, type U16, type U32 } from './wgslTypes.ts';
5
2
  /**
6
3
  * A schema that represents a boolean value. (equivalent to `bool` in WGSL)
7
4
  *
@@ -16,7 +13,7 @@ import { Bool, F16, F32, I32, U16, U32 } from "./wgslTypes.js";
16
13
  * @example
17
14
  * const value = bool(21.37); // true
18
15
  */
19
- declare const bool: Bool;
16
+ export declare const bool: Bool;
20
17
  /**
21
18
  * A schema that represents an unsigned 32-bit integer value. (equivalent to `u32` in WGSL)
22
19
  *
@@ -33,8 +30,8 @@ declare const bool: Bool;
33
30
  * @example
34
31
  * const value = u32(-3.1); // 0
35
32
  */
36
- declare const u32: U32;
37
- declare const u16: U16;
33
+ export declare const u32: U32;
34
+ export declare const u16: U16;
38
35
  /**
39
36
  * A schema that represents a signed 32-bit integer value. (equivalent to `i32` in WGSL)
40
37
  *
@@ -49,7 +46,7 @@ declare const u16: U16;
49
46
  * @example
50
47
  * const value = i32(10000000000) // 1410065408
51
48
  */
52
- declare const i32: I32;
49
+ export declare const i32: I32;
53
50
  /**
54
51
  * A schema that represents a 32-bit float value. (equivalent to `f32` in WGSL)
55
52
  *
@@ -62,7 +59,19 @@ declare const i32: I32;
62
59
  * @example
63
60
  * const value = f32(true); // 1
64
61
  */
65
- declare const f32: F32;
62
+ export declare const f32: F32;
63
+ /**
64
+ * Convert a JavaScript number (treated as float32) to **binary16** bit pattern.
65
+ * @param x 32-bit floating-point value
66
+ * @returns 16-bit half-precision encoding (stored in a JS number)
67
+ */
68
+ export declare function toHalfBits(x: number): number;
69
+ /**
70
+ * Convert a **binary16** encoded bit pattern back to JavaScript number.
71
+ * @param h 16-bit half-precision bits
72
+ * @returns JavaScript number (64-bit float) with same numerical value
73
+ */
74
+ export declare function fromHalfBits(h: number): number;
66
75
  /**
67
76
  * A schema that represents a 16-bit float value. (equivalent to `f16` in WGSL)
68
77
  *
@@ -77,6 +86,6 @@ declare const f32: F32;
77
86
  * @example
78
87
  * const value = f16(21877.5); // 21872
79
88
  */
80
- declare const f16: F16;
81
- //#endregion
82
- export { bool, f16, f32, i32, u16, u32 };
89
+ export declare const f16: F16;
90
+ export declare const abstractInt: AbstractInt;
91
+ export declare const abstractFloat: AbstractFloat;
package/data/numeric.js CHANGED
@@ -1,225 +1,320 @@
1
1
  import { $internal } from "../shared/symbols.js";
2
+ import { isBool, } from "./wgslTypes.js";
2
3
  import { callableSchema } from "../core/function/createCallableSchema.js";
3
-
4
- //#region src/data/numeric.ts
4
+ import { FiniteMathAssumptionError, SignatureNotSupportedError, WgslTypeError } from "../errors.js";
5
+ import { isSnippetNumeric } from "./snippet.js";
6
+ import { UnknownData } from "./dataTypes.js";
5
7
  const boolCast = callableSchema({
6
- name: "bool",
7
- schema: () => bool,
8
- argTypes: (arg) => arg ? [arg] : [],
9
- normalImpl(v) {
10
- if (v === void 0) return false;
11
- if (typeof v === "boolean") return v;
12
- return !!v;
13
- },
14
- codegenImpl: (ctx, args) => ctx.gen.typeInstantiation(bool, args)
8
+ name: 'bool',
9
+ schema: () => bool,
10
+ argTypes: (arg) => (arg ? [arg] : []),
11
+ normalImpl(v = false) {
12
+ if (typeof v === 'boolean') {
13
+ return v;
14
+ }
15
+ if (typeof v === 'number') {
16
+ if (!Number.isFinite(v)) {
17
+ throw new FiniteMathAssumptionError(v, bool);
18
+ }
19
+ return Boolean(v);
20
+ }
21
+ throw new Error(`Invalid argument type for 'd.bool'. Got '${typeof v}', expected number or boolean`);
22
+ },
23
+ codegenImpl: (ctx, [v]) => {
24
+ // check if zero arguments were passed
25
+ if (v === undefined) {
26
+ return ctx.gen.typeInstantiation(bool, []);
27
+ }
28
+ if (isBool(v.dataType) || isSnippetNumeric(v)) {
29
+ return ctx.gen.typeInstantiation(bool, [v]);
30
+ }
31
+ if (v.dataType === UnknownData) {
32
+ throw new WgslTypeError("Unknown argument type for 'd.bool'.");
33
+ }
34
+ throw new SignatureNotSupportedError([v.dataType], [bool, u32, i32, f32, f16]);
35
+ },
15
36
  });
16
37
  /**
17
- * A schema that represents a boolean value. (equivalent to `bool` in WGSL)
18
- *
19
- * Can also be called to cast a value to a bool in accordance with WGSL casting rules.
20
- *
21
- * @example
22
- * const value = bool(); // false
23
- * @example
24
- * const value = bool(0); // false
25
- * @example
26
- * const value = bool(-0); // false
27
- * @example
28
- * const value = bool(21.37); // true
29
- */
30
- const bool = Object.assign(boolCast, {
31
- [$internal]: {},
32
- type: "bool"
38
+ * A schema that represents a boolean value. (equivalent to `bool` in WGSL)
39
+ *
40
+ * Can also be called to cast a value to a bool in accordance with WGSL casting rules.
41
+ *
42
+ * @example
43
+ * const value = bool(); // false
44
+ * @example
45
+ * const value = bool(0); // false
46
+ * @example
47
+ * const value = bool(-0); // false
48
+ * @example
49
+ * const value = bool(21.37); // true
50
+ */
51
+ export const bool = Object.assign(boolCast, {
52
+ [$internal]: {},
53
+ type: 'bool',
33
54
  });
34
55
  const u32Cast = callableSchema({
35
- name: "u32",
36
- schema: () => u32,
37
- argTypes: (arg) => arg ? [arg] : [],
38
- normalImpl(v) {
39
- if (v === void 0) return 0;
40
- if (typeof v === "boolean") return v ? 1 : 0;
41
- if (!Number.isInteger(v)) {
42
- const truncated = Math.trunc(v);
43
- if (truncated < 0) return 0;
44
- if (truncated > 4294967295) return 4294967295;
45
- return truncated;
46
- }
47
- return (v & 4294967295) >>> 0;
48
- },
49
- codegenImpl: (ctx, args) => ctx.gen.typeInstantiation(u32, args)
56
+ name: 'u32',
57
+ schema: () => u32,
58
+ argTypes: (arg) => (arg ? [arg] : []),
59
+ normalImpl(v) {
60
+ if (v === undefined) {
61
+ return 0;
62
+ }
63
+ if (typeof v === 'boolean') {
64
+ return v ? 1 : 0;
65
+ }
66
+ if (!Number.isFinite(v)) {
67
+ throw new FiniteMathAssumptionError(v, u32);
68
+ }
69
+ if (!Number.isInteger(v)) {
70
+ const truncated = Math.trunc(v);
71
+ if (truncated < 0) {
72
+ return 0;
73
+ }
74
+ if (truncated > 0xffffffff) {
75
+ return 0xffffffff;
76
+ }
77
+ return truncated;
78
+ }
79
+ // Integer input: treat as bit reinterpretation (i32 -> u32)
80
+ return (v & 0xffffffff) >>> 0;
81
+ },
82
+ codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(u32, v ? [v] : []),
50
83
  });
51
84
  /**
52
- * A schema that represents an unsigned 32-bit integer value. (equivalent to `u32` in WGSL)
53
- *
54
- * Can also be called to cast a value to an u32 in accordance with WGSL casting rules.
55
- *
56
- * @example
57
- * const value = u32(); // 0
58
- * @example
59
- * const value = u32(7); // 7
60
- * @example
61
- * const value = u32(3.14); // 3
62
- * @example
63
- * const value = u32(-1); // 4294967295
64
- * @example
65
- * const value = u32(-3.1); // 0
66
- */
67
- const u32 = Object.assign(u32Cast, {
68
- [$internal]: {},
69
- type: "u32"
85
+ * A schema that represents an unsigned 32-bit integer value. (equivalent to `u32` in WGSL)
86
+ *
87
+ * Can also be called to cast a value to an u32 in accordance with WGSL casting rules.
88
+ *
89
+ * @example
90
+ * const value = u32(); // 0
91
+ * @example
92
+ * const value = u32(7); // 7
93
+ * @example
94
+ * const value = u32(3.14); // 3
95
+ * @example
96
+ * const value = u32(-1); // 4294967295
97
+ * @example
98
+ * const value = u32(-3.1); // 0
99
+ */
100
+ export const u32 = Object.assign(u32Cast, {
101
+ [$internal]: {},
102
+ type: 'u32',
70
103
  });
71
104
  const i32Cast = callableSchema({
72
- name: "i32",
73
- schema: () => i32,
74
- argTypes: (arg) => arg ? [arg] : [],
75
- normalImpl(v) {
76
- if (v === void 0) return 0;
77
- if (typeof v === "boolean") return v ? 1 : 0;
78
- return v | 0;
79
- },
80
- codegenImpl: (ctx, args) => ctx.gen.typeInstantiation(i32, args)
105
+ name: 'i32',
106
+ schema: () => i32,
107
+ argTypes: (arg) => (arg ? [arg] : []),
108
+ normalImpl(v) {
109
+ if (v === undefined) {
110
+ return 0;
111
+ }
112
+ if (typeof v === 'boolean') {
113
+ return v ? 1 : 0;
114
+ }
115
+ if (!Number.isFinite(v)) {
116
+ throw new FiniteMathAssumptionError(v, i32);
117
+ }
118
+ return v | 0;
119
+ },
120
+ codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(i32, v ? [v] : []),
81
121
  });
82
- const u16 = {
83
- [$internal]: {},
84
- type: "u16"
122
+ export const u16 = {
123
+ [$internal]: {},
124
+ type: 'u16',
85
125
  };
86
126
  /**
87
- * A schema that represents a signed 32-bit integer value. (equivalent to `i32` in WGSL)
88
- *
89
- * Can also be called to cast a value to an i32 in accordance with WGSL casting rules.
90
- *
91
- * @example
92
- * const value = i32(); // 0
93
- * @example
94
- * const value = i32(3.14); // 3
95
- * @example
96
- * const value = i32(-3.9); // -3
97
- * @example
98
- * const value = i32(10000000000) // 1410065408
99
- */
100
- const i32 = Object.assign(i32Cast, {
101
- [$internal]: {},
102
- type: "i32"
127
+ * A schema that represents a signed 32-bit integer value. (equivalent to `i32` in WGSL)
128
+ *
129
+ * Can also be called to cast a value to an i32 in accordance with WGSL casting rules.
130
+ *
131
+ * @example
132
+ * const value = i32(); // 0
133
+ * @example
134
+ * const value = i32(3.14); // 3
135
+ * @example
136
+ * const value = i32(-3.9); // -3
137
+ * @example
138
+ * const value = i32(10000000000) // 1410065408
139
+ */
140
+ export const i32 = Object.assign(i32Cast, {
141
+ [$internal]: {},
142
+ type: 'i32',
103
143
  });
104
144
  const f32Cast = callableSchema({
105
- name: "f32",
106
- schema: () => f32,
107
- argTypes: (arg) => arg ? [arg] : [],
108
- normalImpl(v) {
109
- if (v === void 0) return 0;
110
- if (typeof v === "boolean") return v ? 1 : 0;
111
- return Math.fround(v);
112
- },
113
- codegenImpl: (ctx, args) => ctx.gen.typeInstantiation(f32, args)
145
+ name: 'f32',
146
+ schema: () => f32,
147
+ argTypes: (arg) => (arg ? [arg] : []),
148
+ normalImpl(v) {
149
+ if (v === undefined) {
150
+ return 0;
151
+ }
152
+ if (typeof v === 'boolean') {
153
+ return v ? 1 : 0;
154
+ }
155
+ if (!Number.isFinite(v)) {
156
+ throw new FiniteMathAssumptionError(v, f32);
157
+ }
158
+ return Math.fround(v);
159
+ },
160
+ codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(f32, v ? [v] : []),
114
161
  });
115
162
  /**
116
- * A schema that represents a 32-bit float value. (equivalent to `f32` in WGSL)
117
- *
118
- * Can also be called to cast a value to an f32.
119
- *
120
- * @example
121
- * const value = f32(); // 0
122
- * @example
123
- * const value = f32(1.23); // 1.23
124
- * @example
125
- * const value = f32(true); // 1
126
- */
127
- const f32 = Object.assign(f32Cast, {
128
- [$internal]: {},
129
- type: "f32"
163
+ * A schema that represents a 32-bit float value. (equivalent to `f32` in WGSL)
164
+ *
165
+ * Can also be called to cast a value to an f32.
166
+ *
167
+ * @example
168
+ * const value = f32(); // 0
169
+ * @example
170
+ * const value = f32(1.23); // 1.23
171
+ * @example
172
+ * const value = f32(true); // 1
173
+ */
174
+ export const f32 = Object.assign(f32Cast, {
175
+ [$internal]: {},
176
+ type: 'f32',
130
177
  });
131
- const buf32 = /* @__PURE__ */ new ArrayBuffer(4);
178
+ // helpers for floating point conversion
179
+ const buf32 = new ArrayBuffer(4);
132
180
  const f32arr = new Float32Array(buf32);
133
181
  const u32arr = new Uint32Array(buf32);
134
182
  /**
135
- * Convert a JavaScript number (treated as float32) to **binary16** bit pattern.
136
- * @param x 32-bit floating-point value
137
- * @returns 16-bit half-precision encoding (stored in a JS number)
138
- */
139
- function toHalfBits(x) {
140
- f32arr[0] = x;
141
- const bits = u32arr[0];
142
- const sign = bits >>> 31 & 1;
143
- let exp = bits >>> 23 & 255;
144
- let mant = bits & 8388607;
145
- if (exp === 255) return sign << 15 | 31744 | (mant ? 512 : 0);
146
- exp = exp - 127 + 15;
147
- if (exp <= 0) {
148
- if (exp < -10) return sign << 15;
149
- mant = (mant | 8388608) >> 1 - exp;
150
- mant = mant + 4096 >> 13;
151
- return sign << 15 | mant;
152
- }
153
- if (exp >= 31) return sign << 15 | 31744;
154
- mant = mant + 4096;
155
- if (mant & 8388608) {
156
- mant = 0;
157
- ++exp;
158
- if (exp >= 31) return sign << 15 | 31744;
159
- }
160
- return sign << 15 | exp << 10 | mant >> 13;
183
+ * Convert a JavaScript number (treated as float32) to **binary16** bit pattern.
184
+ * @param x 32-bit floating-point value
185
+ * @returns 16-bit half-precision encoding (stored in a JS number)
186
+ */
187
+ export function toHalfBits(x) {
188
+ f32arr[0] = x; // Write value; shared buffer now contains raw bits.
189
+ const bits = u32arr[0]; // Read those bits as unsigned int.
190
+ // 1. Extract sign, exponent, and mantissa from the 32‑bit layout.
191
+ const sign = (bits >>> 31) & 0x1; // Bit 31 is the sign.
192
+ let exp = (bits >>> 23) & 0xff; // Bits 30‑23 form the biased exponent.
193
+ const mant = bits & 0x7fffff; // Bits 22‑0 are the significand.
194
+ // 2. Handle special values (NaN, ±∞) before re‑biasing.
195
+ if (exp === 0xff) {
196
+ // Preserve the quiet‑NaN bit if mant≠0; otherwise this is ±∞.
197
+ return (sign << 15) | 0x7c00 | (mant ? 0x0200 : 0);
198
+ }
199
+ // 3. Re‑bias the exponent from 127 → 15 (binary32 → binary16).
200
+ exp = exp - 127 + 15;
201
+ // 4. Underflow: exponent 0 yields sub‑normals or signed zero.
202
+ if (exp <= 0) {
203
+ // Below the smallest representable subnormal magnitude, round to ±0.
204
+ if (exp < -10) {
205
+ return sign << 15;
206
+ }
207
+ // Produce a sub‑normal: prepend the hidden 1, then round to nearest,
208
+ // ties to even. `shift` is the number of low bits dropped from the
209
+ // 24‑bit significand; the bit just below it is the rounding bit and
210
+ // everything under that forms the sticky bit.
211
+ const full = mant | 0x800000; // 24-bit significand incl. the implicit 1.
212
+ const shift = 14 - exp; // in [14, 24]
213
+ const roundBit = (full >>> (shift - 1)) & 1;
214
+ const sticky = full & ((1 << (shift - 1)) - 1) ? 1 : 0;
215
+ let half = full >>> shift;
216
+ if (roundBit & (sticky | (half & 1))) {
217
+ half += 1; // A carry here promotes to the smallest normal — that's fine,
218
+ // the bit pattern (exp field 1, mant 0) is exactly 2^-14.
219
+ }
220
+ return (sign << 15) | half;
221
+ }
222
+ // 5. Overflow: if the biased exponent is 31 (0x1f) or higher, the number
223
+ // cannot be represented in half precision, so we return ±∞.
224
+ if (exp >= 0x1f) {
225
+ return (sign << 15) | 0x7c00; // ±∞
226
+ }
227
+ // 6. Normalised number: round mantissa to nearest, ties to even, then pack.
228
+ const roundBit = (mant >>> 12) & 1;
229
+ const sticky = mant & 0xfff ? 1 : 0;
230
+ let half = mant >>> 13;
231
+ if (roundBit & (sticky | (half & 1))) {
232
+ half += 1;
233
+ }
234
+ if (half === 0x400) {
235
+ // The carry propagated out of the 10‑bit mantissa; it overflowed.
236
+ half = 0; // Rounded up to 1.0 × 2^(exp+1).
237
+ ++exp; // Increment exponent (may overflow to ±∞).
238
+ if (exp >= 0x1f) {
239
+ return (sign << 15) | 0x7c00;
240
+ }
241
+ }
242
+ return (sign << 15) | (exp << 10) | half;
161
243
  }
162
244
  /**
163
- * Convert a **binary16** encoded bit pattern back to JavaScript number.
164
- * @param h 16-bit half-precision bits
165
- * @returns JavaScript number (64-bit float) with same numerical value
166
- */
167
- function fromHalfBits(h) {
168
- const sign = h & 32768 ? -1 : 1;
169
- const exp = h >> 10 & 31;
170
- const mant = h & 1023;
171
- if (exp === 0) return mant ? sign * mant * 2 ** -24 : sign * 0;
172
- if (exp === 31) return mant ? NaN : sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
173
- return sign * (1 + mant / 1024) * 2 ** (exp - 15);
245
+ * Convert a **binary16** encoded bit pattern back to JavaScript number.
246
+ * @param h 16-bit half-precision bits
247
+ * @returns JavaScript number (64-bit float) with same numerical value
248
+ */
249
+ export function fromHalfBits(h) {
250
+ const sign = h & 0x8000 ? -1 : 1; // Sign multiplier (preserves −0).
251
+ const exp = (h >> 10) & 0x1f; // 5‑bit exponent.
252
+ const mant = h & 0x03ff; // 10‑bit significand.
253
+ // 1. Zero and sub‑normals.
254
+ if (exp === 0) {
255
+ // oxlint-disable-next-line oxc/erasing-op -- negative zero exists
256
+ return mant ? sign * mant * 2 ** -24 : sign * 0;
257
+ }
258
+ // 2. Special cases (exp == 31).
259
+ if (exp === 0x1f) {
260
+ return mant ? Number.NaN : sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
261
+ }
262
+ // 3. Normalised numbers.
263
+ return sign * (1 + mant / 1024) * 2 ** (exp - 15);
174
264
  }
175
265
  function roundToF16(x) {
176
- return fromHalfBits(toHalfBits(x));
266
+ return fromHalfBits(toHalfBits(x));
177
267
  }
178
268
  const f16Cast = callableSchema({
179
- name: "f16",
180
- schema: () => f16,
181
- argTypes: (arg) => arg ? [arg] : [],
182
- normalImpl(v) {
183
- if (v === void 0) return 0;
184
- if (typeof v === "boolean") return v ? 1 : 0;
185
- return roundToF16(v);
186
- },
187
- codegenImpl: (ctx, args) => ctx.gen.typeInstantiation(f16, args)
269
+ name: 'f16',
270
+ schema: () => f16,
271
+ argTypes: (arg) => (arg ? [arg] : []),
272
+ normalImpl(v) {
273
+ if (v === undefined) {
274
+ return 0;
275
+ }
276
+ if (typeof v === 'boolean') {
277
+ return v ? 1 : 0;
278
+ }
279
+ if (!Number.isFinite(v)) {
280
+ throw new FiniteMathAssumptionError(v, f16);
281
+ }
282
+ return roundToF16(v);
283
+ },
284
+ // TODO: make usage of f16() in GPU mode check for feature availability and throw if not available
285
+ codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(f16, v ? [v] : []),
188
286
  });
189
287
  /**
190
- * A schema that represents a 16-bit float value. (equivalent to `f16` in WGSL)
191
- *
192
- * Can also be called to cast a value to an f16.
193
- *
194
- * @example
195
- * const value = f16(); // 0
196
- * @example
197
- * const value = f32(1.23); // 1.23
198
- * @example
199
- * const value = f16(true); // 1
200
- * @example
201
- * const value = f16(21877.5); // 21872
202
- */
203
- const f16 = Object.assign(f16Cast, {
204
- [$internal]: {},
205
- type: "f16"
288
+ * A schema that represents a 16-bit float value. (equivalent to `f16` in WGSL)
289
+ *
290
+ * Can also be called to cast a value to an f16.
291
+ *
292
+ * @example
293
+ * const value = f16(); // 0
294
+ * @example
295
+ * const value = f32(1.23); // 1.23
296
+ * @example
297
+ * const value = f16(true); // 1
298
+ * @example
299
+ * const value = f16(21877.5); // 21872
300
+ */
301
+ export const f16 = Object.assign(f16Cast, {
302
+ [$internal]: {},
303
+ type: 'f16',
206
304
  });
207
- const abstractInt = {
208
- [$internal]: {},
209
- type: "abstractInt",
210
- toString() {
211
- return "abstractInt";
212
- },
213
- concretized: i32
305
+ export const abstractInt = {
306
+ [$internal]: {},
307
+ type: 'abstractInt',
308
+ toString() {
309
+ return 'abstractInt';
310
+ },
311
+ concretized: i32,
214
312
  };
215
- const abstractFloat = {
216
- [$internal]: {},
217
- type: "abstractFloat",
218
- toString() {
219
- return "abstractFloat";
220
- },
221
- concretized: f32
313
+ export const abstractFloat = {
314
+ [$internal]: {},
315
+ type: 'abstractFloat',
316
+ toString() {
317
+ return 'abstractFloat';
318
+ },
319
+ concretized: f32,
222
320
  };
223
-
224
- //#endregion
225
- export { abstractFloat, abstractInt, bool, f16, f32, i32, u16, u32 };