typegpu 0.11.9 → 0.12.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.
Files changed (366) hide show
  1. package/bin.mjs +28 -6
  2. package/builtin.d.ts +51 -53
  3. package/builtin.js +30 -34
  4. package/common/fullScreenTriangle.d.ts +2 -10
  5. package/common/fullScreenTriangle.js +20 -28
  6. package/common/index.d.ts +2 -9
  7. package/common/index.js +3 -12
  8. package/common/writeSoA.d.ts +11 -12
  9. package/common/writeSoA.js +88 -76
  10. package/core/buffer/buffer.d.ts +79 -62
  11. package/core/buffer/buffer.js +283 -205
  12. package/core/buffer/bufferBinding.d.ts +71 -0
  13. package/core/buffer/bufferBinding.js +154 -0
  14. package/core/buffer/bufferUsage.d.ts +14 -45
  15. package/core/buffer/bufferUsage.js +1 -171
  16. package/core/buffer/laidOutBuffer.d.ts +25 -0
  17. package/core/buffer/laidOutBuffer.js +55 -0
  18. package/core/commandEncoder/attachments.d.ts +125 -0
  19. package/core/commandEncoder/attachments.js +29 -0
  20. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  21. package/core/commandEncoder/commandEncoder.js +56 -0
  22. package/core/commandEncoder/computePass.d.ts +58 -0
  23. package/core/commandEncoder/computePass.js +63 -0
  24. package/core/commandEncoder/renderPass.d.ts +121 -0
  25. package/core/commandEncoder/renderPass.js +196 -0
  26. package/core/constant/tgpuConstant.d.ts +26 -26
  27. package/core/constant/tgpuConstant.js +76 -65
  28. package/core/declare/tgpuDeclare.d.ts +3 -6
  29. package/core/declare/tgpuDeclare.js +36 -36
  30. package/core/function/autoIO.d.ts +61 -33
  31. package/core/function/autoIO.js +68 -73
  32. package/core/function/comptime.d.ts +11 -13
  33. package/core/function/comptime.js +60 -52
  34. package/core/function/createCallableSchema.d.ts +16 -0
  35. package/core/function/createCallableSchema.js +50 -40
  36. package/core/function/dualImpl.d.ts +44 -0
  37. package/core/function/dualImpl.js +71 -50
  38. package/core/function/entryInputRouter.d.ts +26 -0
  39. package/core/function/entryInputRouter.js +31 -33
  40. package/core/function/extractArgs.d.ts +38 -0
  41. package/core/function/extractArgs.js +202 -200
  42. package/core/function/fnCore.d.ts +44 -5
  43. package/core/function/fnCore.js +148 -93
  44. package/core/function/fnTypes.d.ts +31 -29
  45. package/core/function/fnTypes.js +1 -0
  46. package/core/function/ioSchema.d.ts +12 -10
  47. package/core/function/ioSchema.js +65 -47
  48. package/core/function/shelllessImpl.d.ts +9 -12
  49. package/core/function/shelllessImpl.js +17 -22
  50. package/core/function/templateUtils.d.ts +2 -0
  51. package/core/function/templateUtils.js +9 -8
  52. package/core/function/tgpuComputeFn.d.ts +26 -28
  53. package/core/function/tgpuComputeFn.js +47 -48
  54. package/core/function/tgpuFn.d.ts +34 -37
  55. package/core/function/tgpuFn.js +179 -153
  56. package/core/function/tgpuFragmentFn.d.ts +52 -53
  57. package/core/function/tgpuFragmentFn.js +63 -56
  58. package/core/function/tgpuVertexFn.d.ts +36 -39
  59. package/core/function/tgpuVertexFn.js +56 -53
  60. package/core/pipeline/computePipeline.d.ts +141 -53
  61. package/core/pipeline/computePipeline.js +291 -225
  62. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  63. package/core/pipeline/connectAttachmentToShader.js +25 -22
  64. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  65. package/core/pipeline/connectTargetsToShader.js +29 -27
  66. package/core/pipeline/drawState.d.ts +52 -0
  67. package/core/pipeline/drawState.js +225 -0
  68. package/core/pipeline/performanceTracker.d.ts +14 -0
  69. package/core/pipeline/performanceTracker.js +34 -0
  70. package/core/pipeline/pipelineUtils.d.ts +18 -0
  71. package/core/pipeline/pipelineUtils.js +54 -25
  72. package/core/pipeline/priors.d.ts +1 -0
  73. package/core/pipeline/priors.js +12 -0
  74. package/core/pipeline/renderPipeline.d.ts +246 -261
  75. package/core/pipeline/renderPipeline.js +487 -480
  76. package/core/pipeline/timeable.d.ts +28 -18
  77. package/core/pipeline/timeable.js +90 -52
  78. package/core/pipeline/typeGuards.d.ts +17 -0
  79. package/core/pipeline/typeGuards.js +52 -22
  80. package/core/pipeline/webgpuLimitations.d.ts +10 -0
  81. package/core/pipeline/webgpuLimitations.js +81 -0
  82. package/core/querySet/querySet.d.ts +26 -21
  83. package/core/querySet/querySet.js +127 -103
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  85. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  86. package/core/resolve/externals.d.ts +25 -8
  87. package/core/resolve/externals.js +78 -54
  88. package/core/resolve/namespace.d.ts +22 -25
  89. package/core/resolve/namespace.js +16 -21
  90. package/core/resolve/resolvableString.d.ts +7 -0
  91. package/core/resolve/resolvableString.js +13 -0
  92. package/core/resolve/resolveData.d.ts +10 -0
  93. package/core/resolve/resolveData.js +162 -121
  94. package/core/resolve/stitch.d.ts +8 -0
  95. package/core/resolve/stitch.js +23 -21
  96. package/core/resolve/tgpuResolve.d.ts +55 -53
  97. package/core/resolve/tgpuResolve.js +106 -53
  98. package/core/root/configurableImpl.d.ts +10 -0
  99. package/core/root/configurableImpl.js +17 -19
  100. package/core/root/init.d.ts +76 -38
  101. package/core/root/init.js +346 -455
  102. package/core/root/rootTypes.d.ts +461 -636
  103. package/core/root/rootTypes.js +1 -0
  104. package/core/sampler/sampler.d.ts +50 -31
  105. package/core/sampler/sampler.js +120 -113
  106. package/core/simulate/tgpuSimulate.d.ts +9 -12
  107. package/core/simulate/tgpuSimulate.js +68 -71
  108. package/core/slot/accessor.d.ts +36 -13
  109. package/core/slot/accessor.js +138 -91
  110. package/core/slot/internalSlots.d.ts +2 -0
  111. package/core/slot/internalSlots.js +1 -6
  112. package/core/slot/lazy.d.ts +2 -6
  113. package/core/slot/lazy.js +71 -39
  114. package/core/slot/slot.d.ts +2 -6
  115. package/core/slot/slot.js +45 -38
  116. package/core/slot/slotTypes.d.ts +78 -80
  117. package/core/slot/slotTypes.js +11 -16
  118. package/core/texture/externalTexture.d.ts +20 -11
  119. package/core/texture/externalTexture.js +46 -46
  120. package/core/texture/texture.d.ts +152 -97
  121. package/core/texture/texture.js +407 -314
  122. package/core/texture/textureFormats.d.ts +42 -23
  123. package/core/texture/textureFormats.js +104 -75
  124. package/core/texture/textureProps.d.ts +7 -10
  125. package/core/texture/textureProps.js +1 -0
  126. package/core/texture/textureUtils.d.ts +8 -0
  127. package/core/texture/textureUtils.js +185 -179
  128. package/core/texture/usageExtension.d.ts +21 -18
  129. package/core/texture/usageExtension.js +13 -17
  130. package/core/unroll/tgpuUnroll.d.ts +20 -19
  131. package/core/unroll/tgpuUnroll.js +82 -91
  132. package/core/valueProxyUtils.d.ts +3 -0
  133. package/core/valueProxyUtils.js +52 -41
  134. package/core/variable/tgpuVariable.d.ts +26 -27
  135. package/core/variable/tgpuVariable.js +93 -96
  136. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  137. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  138. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  139. package/core/vertexLayout/vertexAttribute.js +1 -0
  140. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  141. package/core/vertexLayout/vertexLayout.js +130 -99
  142. package/core/whitespaces.d.ts +2 -0
  143. package/core/whitespaces.js +16 -0
  144. package/data/alignIO.d.ts +7 -0
  145. package/data/alignIO.js +13 -13
  146. package/data/alignmentOf.d.ts +5 -8
  147. package/data/alignmentOf.js +90 -75
  148. package/data/array.d.ts +17 -9
  149. package/data/array.js +57 -40
  150. package/data/atomic.d.ts +2 -7
  151. package/data/atomic.js +26 -23
  152. package/data/attributes.d.ts +19 -21
  153. package/data/attributes.js +192 -132
  154. package/data/autoStruct.d.ts +36 -3
  155. package/data/autoStruct.js +84 -81
  156. package/data/compiledIO.d.ts +5 -0
  157. package/data/compiledIO.js +231 -215
  158. package/data/dataIO.d.ts +13 -11
  159. package/data/dataIO.js +643 -589
  160. package/data/dataTypes.d.ts +83 -65
  161. package/data/dataTypes.js +66 -68
  162. package/data/deepEqual.d.ts +2 -7
  163. package/data/deepEqual.js +80 -55
  164. package/data/disarray.d.ts +6 -10
  165. package/data/disarray.js +52 -46
  166. package/data/float16Conversion.d.ts +4 -0
  167. package/data/float16Conversion.js +7 -0
  168. package/data/generalizeFn.d.ts +25 -0
  169. package/data/generalizeFn.js +89 -0
  170. package/data/getLongestContiguousPrefix.d.ts +4 -8
  171. package/data/getLongestContiguousPrefix.js +6 -11
  172. package/data/index.d.ts +30 -31
  173. package/data/index.js +39 -172
  174. package/data/instanceToSchema.d.ts +24 -27
  175. package/data/instanceToSchema.js +1 -0
  176. package/data/isContiguous.d.ts +4 -8
  177. package/data/isContiguous.js +6 -11
  178. package/data/matrix.d.ts +21 -21
  179. package/data/matrix.js +513 -505
  180. package/data/numberOps.d.ts +5 -0
  181. package/data/numberOps.js +21 -21
  182. package/data/numeric.d.ts +21 -12
  183. package/data/numeric.js +287 -197
  184. package/data/offsetUtils.d.ts +9 -13
  185. package/data/offsetUtils.js +204 -144
  186. package/data/offsets.d.ts +8 -0
  187. package/data/offsets.js +33 -33
  188. package/data/partialIO.d.ts +13 -8
  189. package/data/partialIO.js +124 -113
  190. package/data/ptr.d.ts +12 -12
  191. package/data/ptr.js +42 -44
  192. package/data/ref.d.ts +40 -27
  193. package/data/ref.js +125 -95
  194. package/data/sampler.d.ts +99 -101
  195. package/data/sampler.js +17 -21
  196. package/data/schemaCallWrapper.d.ts +19 -0
  197. package/data/schemaCallWrapper.js +31 -26
  198. package/data/schemaMemoryLayout.d.ts +8 -0
  199. package/data/schemaMemoryLayout.js +213 -185
  200. package/data/sizeOf.d.ts +4 -8
  201. package/data/sizeOf.js +6 -11
  202. package/data/snippet.d.ts +96 -20
  203. package/data/snippet.js +75 -86
  204. package/data/struct.d.ts +4 -7
  205. package/data/struct.js +51 -39
  206. package/data/texture.d.ts +253 -250
  207. package/data/texture.js +238 -200
  208. package/data/unstruct.d.ts +2 -7
  209. package/data/unstruct.js +43 -37
  210. package/data/vector.d.ts +33 -21
  211. package/data/vector.js +234 -221
  212. package/data/vectorImpl.d.ts +231 -0
  213. package/data/vectorImpl.js +563 -515
  214. package/data/vectorOps.d.ts +25 -0
  215. package/data/vectorOps.js +118 -669
  216. package/data/vertexFormatData.d.ts +181 -184
  217. package/data/vertexFormatData.js +104 -106
  218. package/data/wgslTypes.d.ts +665 -600
  219. package/data/wgslTypes.js +220 -198
  220. package/errors.d.ts +50 -24
  221. package/errors.js +146 -126
  222. package/execMode.d.ts +16 -0
  223. package/execMode.js +47 -40
  224. package/extension.d.ts +13 -8
  225. package/extension.js +10 -16
  226. package/getGPUValue.d.ts +1 -0
  227. package/getGPUValue.js +2 -7
  228. package/index.d.ts +28 -68
  229. package/index.js +8 -28
  230. package/indexNamedExports.d.ts +69 -42
  231. package/indexNamedExports.js +25 -0
  232. package/internal.d.ts +16 -0
  233. package/internal.js +12 -0
  234. package/mathUtils.d.ts +5 -0
  235. package/mathUtils.js +7 -11
  236. package/memo.d.ts +11 -0
  237. package/memo.js +20 -22
  238. package/minify.d.ts +5 -0
  239. package/minify.js +93 -0
  240. package/nameUtils.d.ts +29 -0
  241. package/nameUtils.js +427 -394
  242. package/package.json +5 -1
  243. package/resolutionCtx.d.ts +162 -22
  244. package/resolutionCtx.js +911 -629
  245. package/serial/registry.d.ts +15 -0
  246. package/serial/registry.js +106 -0
  247. package/serial/restore.d.ts +49 -0
  248. package/serial/restore.js +68 -0
  249. package/serial/schema.d.ts +58 -0
  250. package/serial/schema.js +209 -0
  251. package/serial/types.d.ts +5 -0
  252. package/serial/types.js +1 -0
  253. package/shared/env.d.ts +9 -0
  254. package/shared/env.js +9 -12
  255. package/shared/generators.d.ts +4 -0
  256. package/shared/generators.js +10 -12
  257. package/shared/meta.d.ts +29 -14
  258. package/shared/meta.js +71 -55
  259. package/shared/normalizeMetadata.d.ts +32 -27
  260. package/shared/normalizeMetadata.js +23 -36
  261. package/shared/repr.d.ts +73 -55
  262. package/shared/repr.js +1 -0
  263. package/shared/soul.d.ts +17 -0
  264. package/shared/soul.js +1 -0
  265. package/shared/stringify.d.ts +2 -0
  266. package/shared/stringify.js +29 -20
  267. package/shared/symbols.d.ts +26 -20
  268. package/shared/symbols.js +79 -79
  269. package/shared/tseynit.d.ts +2 -0
  270. package/shared/tseynit.js +160 -75
  271. package/shared/utilityTypes.d.ts +30 -14
  272. package/shared/utilityTypes.js +2 -6
  273. package/shared/vertexFormat.d.ts +41 -43
  274. package/shared/vertexFormat.js +59 -62
  275. package/std/array.d.ts +2 -7
  276. package/std/array.js +18 -23
  277. package/std/atomic.d.ts +14 -18
  278. package/std/atomic.js +96 -95
  279. package/std/bitcast.d.ts +193 -10
  280. package/std/bitcast.js +309 -39
  281. package/std/boolean.d.ts +19 -33
  282. package/std/boolean.js +296 -292
  283. package/std/copy.d.ts +2 -7
  284. package/std/copy.js +27 -24
  285. package/std/derivative.d.ts +11 -15
  286. package/std/derivative.js +56 -79
  287. package/std/discard.d.ts +1 -6
  288. package/std/discard.js +7 -14
  289. package/std/environment.d.ts +19 -14
  290. package/std/environment.js +71 -51
  291. package/std/extensions.d.ts +2 -8
  292. package/std/extensions.js +10 -11
  293. package/std/index.d.ts +20 -24
  294. package/std/index.js +32 -187
  295. package/std/matrix.d.ts +6 -12
  296. package/std/matrix.js +60 -69
  297. package/std/numeric.d.ts +150 -146
  298. package/std/numeric.js +771 -727
  299. package/std/operators.d.ts +19 -27
  300. package/std/operators.js +195 -194
  301. package/std/packing.d.ts +5 -11
  302. package/std/packing.js +67 -75
  303. package/std/range.d.ts +6 -11
  304. package/std/range.js +48 -36
  305. package/std/subgroup.d.ts +33 -37
  306. package/std/subgroup.js +180 -217
  307. package/std/texture.d.ts +70 -38
  308. package/std/texture.js +176 -172
  309. package/taskQueue.d.ts +6 -0
  310. package/taskQueue.js +30 -0
  311. package/tgpu.d.ts +16 -0
  312. package/tgpu.js +17 -44
  313. package/tgpuBindGroupLayout.d.ts +132 -152
  314. package/tgpuBindGroupLayout.js +346 -268
  315. package/tgpuLogger.d.ts +34 -0
  316. package/tgpuLogger.js +64 -0
  317. package/tgpuUnstable.d.ts +16 -22
  318. package/tgpuUnstable.js +13 -35
  319. package/tgsl/accessIndex.d.ts +2 -0
  320. package/tgsl/accessIndex.js +76 -33
  321. package/tgsl/accessProp.d.ts +2 -0
  322. package/tgsl/accessProp.js +142 -101
  323. package/tgsl/accessStructProp.d.ts +5 -0
  324. package/tgsl/accessStructProp.js +13 -15
  325. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  326. package/tgsl/consoleLog/deserializers.js +119 -103
  327. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  328. package/tgsl/consoleLog/logGenerator.js +85 -80
  329. package/tgsl/consoleLog/serializers.d.ts +21 -0
  330. package/tgsl/consoleLog/serializers.js +119 -100
  331. package/tgsl/consoleLog/types.d.ts +40 -39
  332. package/tgsl/consoleLog/types.js +1 -0
  333. package/tgsl/conversion.d.ts +33 -0
  334. package/tgsl/conversion.js +271 -216
  335. package/tgsl/forOfUtils.d.ts +15 -0
  336. package/tgsl/forOfUtils.js +85 -70
  337. package/tgsl/generationHelpers.d.ts +22 -39
  338. package/tgsl/generationHelpers.js +85 -58
  339. package/tgsl/infixDispatch.d.ts +70 -0
  340. package/tgsl/infixDispatch.js +48 -46
  341. package/tgsl/jsPolyfills.d.ts +16 -19
  342. package/tgsl/jsPolyfills.js +44 -42
  343. package/tgsl/makeDereferenceable.d.ts +48 -0
  344. package/tgsl/makeDereferenceable.js +86 -0
  345. package/tgsl/makeResolvable.d.ts +22 -0
  346. package/tgsl/makeResolvable.js +33 -0
  347. package/tgsl/shaderGenerator.d.ts +77 -17
  348. package/tgsl/shaderGenerator.js +1 -0
  349. package/tgsl/shellless.d.ts +6 -9
  350. package/tgsl/shellless.js +73 -43
  351. package/tgsl/wgslGenerator.d.ts +66 -59
  352. package/tgsl/wgslGenerator.js +1345 -760
  353. package/types.d.ts +287 -222
  354. package/types.js +61 -44
  355. package/unwrapper.d.ts +31 -26
  356. package/unwrapper.js +1 -0
  357. package/wgslExtensions.d.ts +3 -5
  358. package/wgslExtensions.js +12 -16
  359. package/_virtual/rolldown_runtime.js +0 -13
  360. package/core/buffer/bufferShorthand.d.ts +0 -50
  361. package/core/buffer/bufferShorthand.js +0 -55
  362. package/core/pipeline/applyPipelineState.js +0 -37
  363. package/core/pipeline/limitsOverflow.js +0 -13
  364. package/package.js +0 -5
  365. package/tgsl/shaderGenerator_members.d.ts +0 -33
  366. package/tgsl/shaderGenerator_members.js +0 -12
@@ -0,0 +1,5 @@
1
+ export declare const smoothstepScalar: (edge0: number, edge1: number, x: number) => number;
2
+ export declare const clampScalar: (value: number, low: number, high: number) => number;
3
+ export declare function bitcastU32toF32Impl(n: number): number;
4
+ export declare function bitcastU32toI32Impl(n: number): number;
5
+ export declare function bitcastF32toU32Impl(n: number): number;
package/data/numberOps.js CHANGED
@@ -1,24 +1,24 @@
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 = clampScalar((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);
11
- };
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);
8
+ export const clampScalar = (value, low, high) => Math.min(Math.max(low, value), high);
9
+ const buf32 = new ArrayBuffer(4);
10
+ const f32arr = new Float32Array(buf32);
11
+ const u32arr = new Uint32Array(buf32);
12
+ const i32arr = new Int32Array(buf32);
13
+ export function bitcastU32toF32Impl(n) {
14
+ u32arr[0] = n;
15
+ return f32arr[0];
16
+ }
17
+ export function bitcastU32toI32Impl(n) {
18
+ u32arr[0] = n;
19
+ return i32arr[0];
16
20
  }
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);
21
+ export function bitcastF32toU32Impl(n) {
22
+ f32arr[0] = n;
23
+ return u32arr[0];
21
24
  }
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,230 +1,320 @@
1
1
  import { $internal } from "../shared/symbols.js";
2
- import { FiniteMathAssumptionError } from "../errors.js";
2
+ import { isBool, } from "./wgslTypes.js";
3
3
  import { callableSchema } from "../core/function/createCallableSchema.js";
4
-
5
- //#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";
6
7
  const boolCast = callableSchema({
7
- name: "bool",
8
- schema: () => bool,
9
- argTypes: (arg) => arg ? [arg] : [],
10
- normalImpl(v) {
11
- if (v === void 0) return false;
12
- if (typeof v === "boolean") return v;
13
- return !!v;
14
- },
15
- codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(bool, v ? [v] : [])
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
+ },
16
36
  });
17
37
  /**
18
- * A schema that represents a boolean value. (equivalent to `bool` in WGSL)
19
- *
20
- * Can also be called to cast a value to a bool in accordance with WGSL casting rules.
21
- *
22
- * @example
23
- * const value = bool(); // false
24
- * @example
25
- * const value = bool(0); // false
26
- * @example
27
- * const value = bool(-0); // false
28
- * @example
29
- * const value = bool(21.37); // true
30
- */
31
- const bool = Object.assign(boolCast, {
32
- [$internal]: {},
33
- 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',
34
54
  });
35
55
  const u32Cast = callableSchema({
36
- name: "u32",
37
- schema: () => u32,
38
- argTypes: (arg) => arg ? [arg] : [],
39
- normalImpl(v) {
40
- if (v === void 0) return 0;
41
- if (typeof v === "boolean") return v ? 1 : 0;
42
- if (!Number.isFinite(v)) throw new FiniteMathAssumptionError(v, u32);
43
- if (!Number.isInteger(v)) {
44
- const truncated = Math.trunc(v);
45
- if (truncated < 0) return 0;
46
- if (truncated > 4294967295) return 4294967295;
47
- return truncated;
48
- }
49
- return (v & 4294967295) >>> 0;
50
- },
51
- codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(u32, v ? [v] : [])
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] : []),
52
83
  });
53
84
  /**
54
- * A schema that represents an unsigned 32-bit integer value. (equivalent to `u32` in WGSL)
55
- *
56
- * Can also be called to cast a value to an u32 in accordance with WGSL casting rules.
57
- *
58
- * @example
59
- * const value = u32(); // 0
60
- * @example
61
- * const value = u32(7); // 7
62
- * @example
63
- * const value = u32(3.14); // 3
64
- * @example
65
- * const value = u32(-1); // 4294967295
66
- * @example
67
- * const value = u32(-3.1); // 0
68
- */
69
- const u32 = Object.assign(u32Cast, {
70
- [$internal]: {},
71
- 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',
72
103
  });
73
104
  const i32Cast = callableSchema({
74
- name: "i32",
75
- schema: () => i32,
76
- argTypes: (arg) => arg ? [arg] : [],
77
- normalImpl(v) {
78
- if (v === void 0) return 0;
79
- if (typeof v === "boolean") return v ? 1 : 0;
80
- if (!Number.isFinite(v)) throw new FiniteMathAssumptionError(v, i32);
81
- return v | 0;
82
- },
83
- codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(i32, v ? [v] : [])
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] : []),
84
121
  });
85
- const u16 = {
86
- [$internal]: {},
87
- type: "u16"
122
+ export const u16 = {
123
+ [$internal]: {},
124
+ type: 'u16',
88
125
  };
89
126
  /**
90
- * A schema that represents a signed 32-bit integer value. (equivalent to `i32` in WGSL)
91
- *
92
- * Can also be called to cast a value to an i32 in accordance with WGSL casting rules.
93
- *
94
- * @example
95
- * const value = i32(); // 0
96
- * @example
97
- * const value = i32(3.14); // 3
98
- * @example
99
- * const value = i32(-3.9); // -3
100
- * @example
101
- * const value = i32(10000000000) // 1410065408
102
- */
103
- const i32 = Object.assign(i32Cast, {
104
- [$internal]: {},
105
- 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',
106
143
  });
107
144
  const f32Cast = callableSchema({
108
- name: "f32",
109
- schema: () => f32,
110
- argTypes: (arg) => arg ? [arg] : [],
111
- normalImpl(v) {
112
- if (v === void 0) return 0;
113
- if (typeof v === "boolean") return v ? 1 : 0;
114
- if (!Number.isFinite(v)) throw new FiniteMathAssumptionError(v, f32);
115
- return Math.fround(v);
116
- },
117
- codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(f32, v ? [v] : [])
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] : []),
118
161
  });
119
162
  /**
120
- * A schema that represents a 32-bit float value. (equivalent to `f32` in WGSL)
121
- *
122
- * Can also be called to cast a value to an f32.
123
- *
124
- * @example
125
- * const value = f32(); // 0
126
- * @example
127
- * const value = f32(1.23); // 1.23
128
- * @example
129
- * const value = f32(true); // 1
130
- */
131
- const f32 = Object.assign(f32Cast, {
132
- [$internal]: {},
133
- 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',
134
177
  });
135
- const buf32 = /* @__PURE__ */ new ArrayBuffer(4);
178
+ // helpers for floating point conversion
179
+ const buf32 = new ArrayBuffer(4);
136
180
  const f32arr = new Float32Array(buf32);
137
181
  const u32arr = new Uint32Array(buf32);
138
182
  /**
139
- * Convert a JavaScript number (treated as float32) to **binary16** bit pattern.
140
- * @param x 32-bit floating-point value
141
- * @returns 16-bit half-precision encoding (stored in a JS number)
142
- */
143
- function toHalfBits(x) {
144
- f32arr[0] = x;
145
- const bits = u32arr[0];
146
- const sign = bits >>> 31 & 1;
147
- let exp = bits >>> 23 & 255;
148
- let mant = bits & 8388607;
149
- if (exp === 255) return sign << 15 | 31744 | (mant ? 512 : 0);
150
- exp = exp - 127 + 15;
151
- if (exp <= 0) {
152
- if (exp < -10) return sign << 15;
153
- mant = (mant | 8388608) >> 1 - exp;
154
- mant = mant + 4096 >> 13;
155
- return sign << 15 | mant;
156
- }
157
- if (exp >= 31) return sign << 15 | 31744;
158
- mant = mant + 4096;
159
- if (mant & 8388608) {
160
- mant = 0;
161
- ++exp;
162
- if (exp >= 31) return sign << 15 | 31744;
163
- }
164
- 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;
165
243
  }
166
244
  /**
167
- * Convert a **binary16** encoded bit pattern back to JavaScript number.
168
- * @param h 16-bit half-precision bits
169
- * @returns JavaScript number (64-bit float) with same numerical value
170
- */
171
- function fromHalfBits(h) {
172
- const sign = h & 32768 ? -1 : 1;
173
- const exp = h >> 10 & 31;
174
- const mant = h & 1023;
175
- if (exp === 0) return mant ? sign * mant * 2 ** -24 : sign * 0;
176
- if (exp === 31) return mant ? NaN : sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
177
- 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);
178
264
  }
179
265
  function roundToF16(x) {
180
- return fromHalfBits(toHalfBits(x));
266
+ return fromHalfBits(toHalfBits(x));
181
267
  }
182
268
  const f16Cast = callableSchema({
183
- name: "f16",
184
- schema: () => f16,
185
- argTypes: (arg) => arg ? [arg] : [],
186
- normalImpl(v) {
187
- if (v === void 0) return 0;
188
- if (typeof v === "boolean") return v ? 1 : 0;
189
- if (!Number.isFinite(v)) throw new FiniteMathAssumptionError(v, f16);
190
- return roundToF16(v);
191
- },
192
- codegenImpl: (ctx, [v]) => ctx.gen.typeInstantiation(f16, v ? [v] : [])
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] : []),
193
286
  });
194
287
  /**
195
- * A schema that represents a 16-bit float value. (equivalent to `f16` in WGSL)
196
- *
197
- * Can also be called to cast a value to an f16.
198
- *
199
- * @example
200
- * const value = f16(); // 0
201
- * @example
202
- * const value = f32(1.23); // 1.23
203
- * @example
204
- * const value = f16(true); // 1
205
- * @example
206
- * const value = f16(21877.5); // 21872
207
- */
208
- const f16 = Object.assign(f16Cast, {
209
- [$internal]: {},
210
- 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',
211
304
  });
212
- const abstractInt = {
213
- [$internal]: {},
214
- type: "abstractInt",
215
- toString() {
216
- return "abstractInt";
217
- },
218
- concretized: i32
305
+ export const abstractInt = {
306
+ [$internal]: {},
307
+ type: 'abstractInt',
308
+ toString() {
309
+ return 'abstractInt';
310
+ },
311
+ concretized: i32,
219
312
  };
220
- const abstractFloat = {
221
- [$internal]: {},
222
- type: "abstractFloat",
223
- toString() {
224
- return "abstractFloat";
225
- },
226
- concretized: f32
313
+ export const abstractFloat = {
314
+ [$internal]: {},
315
+ type: 'abstractFloat',
316
+ toString() {
317
+ return 'abstractFloat';
318
+ },
319
+ concretized: f32,
227
320
  };
228
-
229
- //#endregion
230
- export { abstractFloat, abstractInt, bool, f16, f32, i32, u16, u32 };