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
@@ -1,237 +1,292 @@
1
- import { DEV, TEST } from "../shared/env.js";
2
- import { isMat, isPtr, isVec, isWgslStruct } from "../data/wgslTypes.js";
3
- import { safeStringify } from "../shared/stringify.js";
4
- import { getName } from "../shared/meta.js";
5
- import { UnknownData, undecorate } from "../data/dataTypes.js";
6
- import { isAlias, snip, withDataType } from "../data/snippet.js";
7
- import { WgslTypeError, invariant } from "../errors.js";
8
- import { stitch } from "../core/resolve/stitch.js";
9
- import { RefOperator, derefSnippet } from "../data/ref.js";
1
+ import { UnknownData } from "../data/dataTypes.js";
2
+ import { undecorate } from "../data/dataTypes.js";
3
+ import { derefSnippet, RefOperator } from "../data/ref.js";
10
4
  import { schemaCallWrapperGPU } from "../data/schemaCallWrapper.js";
5
+ import { snip, withDataType } from "../data/snippet.js";
6
+ import { isMat, isPtr, isVec, isWgslStruct, } from "../data/wgslTypes.js";
7
+ import { invariant, WgslTypeError } from "../errors.js";
8
+ import { getName } from "../shared/meta.js";
9
+ import { safeStringify } from "../shared/stringify.js";
11
10
  import { assertExhaustive } from "../shared/utilityTypes.js";
11
+ import { logger } from "../tgpuLogger.js";
12
12
  import { accessStructProp } from "./accessStructProp.js";
13
-
14
- //#region src/tgsl/conversion.ts
15
13
  const INFINITE_RANK = {
16
- rank: Number.POSITIVE_INFINITY,
17
- action: "none"
14
+ rank: Number.POSITIVE_INFINITY,
15
+ action: 'none',
18
16
  };
19
17
  function getAutoConversionRank(src, dest) {
20
- const trueSrc = undecorate(src);
21
- const trueDst = undecorate(dest);
22
- if (trueSrc.type === trueDst.type) {
23
- if (trueSrc.type === "struct" && trueSrc !== trueDst) return {
24
- rank: 1,
25
- action: "cast",
26
- targetType: dest
27
- };
28
- return {
29
- rank: 0,
30
- action: "none"
31
- };
32
- }
33
- if (trueSrc.type === "abstractFloat") {
34
- if (trueDst.type === "f32") return {
35
- rank: 1,
36
- action: "none"
37
- };
38
- if (trueDst.type === "f16") return {
39
- rank: 2,
40
- action: "none"
41
- };
42
- }
43
- if (trueSrc.type === "abstractInt") {
44
- if (trueDst.type === "i32") return {
45
- rank: 3,
46
- action: "none"
47
- };
48
- if (trueDst.type === "u32") return {
49
- rank: 4,
50
- action: "none"
51
- };
52
- if (trueDst.type === "abstractFloat") return {
53
- rank: 5,
54
- action: "none"
55
- };
56
- if (trueDst.type === "f32") return {
57
- rank: 6,
58
- action: "none"
59
- };
60
- if (trueDst.type === "f16") return {
61
- rank: 7,
62
- action: "none"
63
- };
64
- }
65
- if (isVec(trueSrc) && isVec(trueDst) && trueSrc.type[3] === trueDst.type[3]) return getAutoConversionRank(trueSrc.primitive, trueDst.primitive);
66
- if (isMat(trueSrc) && isMat(trueDst) && trueSrc.type[3] === trueDst.type[3]) return {
67
- rank: 0,
68
- action: "none"
69
- };
70
- return INFINITE_RANK;
18
+ const trueSrc = undecorate(src);
19
+ const trueDst = undecorate(dest);
20
+ if (trueSrc.type === trueDst.type) {
21
+ if (trueSrc.type === 'struct' && trueSrc !== trueDst) {
22
+ return { rank: 1, action: 'cast', targetType: dest };
23
+ }
24
+ return { rank: 0, action: 'none' };
25
+ }
26
+ if (trueSrc.type === 'abstractFloat') {
27
+ if (trueDst.type === 'f32')
28
+ return { rank: 1, action: 'none' };
29
+ if (trueDst.type === 'f16')
30
+ return { rank: 2, action: 'none' };
31
+ }
32
+ if (trueSrc.type === 'abstractInt') {
33
+ if (trueDst.type === 'i32')
34
+ return { rank: 3, action: 'none' };
35
+ if (trueDst.type === 'u32')
36
+ return { rank: 4, action: 'none' };
37
+ if (trueDst.type === 'abstractFloat')
38
+ return { rank: 5, action: 'none' };
39
+ if (trueDst.type === 'f32')
40
+ return { rank: 6, action: 'none' };
41
+ if (trueDst.type === 'f16')
42
+ return { rank: 7, action: 'none' };
43
+ }
44
+ if (isVec(trueSrc) &&
45
+ isVec(trueDst) &&
46
+ // Same length vectors
47
+ trueSrc.type[3] === trueDst.type[3]) {
48
+ return getAutoConversionRank(trueSrc.primitive, trueDst.primitive);
49
+ }
50
+ if (isMat(trueSrc) &&
51
+ isMat(trueDst) &&
52
+ // Same dimensions
53
+ trueSrc.type[3] === trueDst.type[3]) {
54
+ // Matrix conversion rank depends only on component type (always f32 for now)
55
+ return { rank: 0, action: 'none' };
56
+ }
57
+ return INFINITE_RANK;
71
58
  }
72
59
  function getImplicitConversionRank(src, dest) {
73
- const trueSrc = undecorate(src);
74
- const trueDst = undecorate(dest);
75
- if (isPtr(trueSrc) && trueSrc.implicit && getAutoConversionRank(trueSrc.inner, trueDst).rank < Number.POSITIVE_INFINITY) return {
76
- rank: 0,
77
- action: "deref"
78
- };
79
- if (isPtr(trueDst) && getAutoConversionRank(trueSrc, trueDst.inner).rank < Number.POSITIVE_INFINITY) return {
80
- rank: 1,
81
- action: "ref"
82
- };
83
- const primitivePreference = {
84
- f32: 0,
85
- f16: 1,
86
- i32: 2,
87
- u32: 3,
88
- bool: 4
89
- };
90
- if (trueSrc.type in primitivePreference && trueDst.type in primitivePreference) {
91
- const srcType = trueSrc.type;
92
- const destType = trueDst.type;
93
- if (srcType !== destType) {
94
- const srcPref = primitivePreference[srcType];
95
- return {
96
- rank: primitivePreference[destType] < srcPref ? 10 : 20,
97
- action: "cast",
98
- targetType: trueDst
99
- };
100
- }
101
- }
102
- if ((trueSrc.type === "u32" || trueSrc.type === "i32") && trueDst.type === "abstractFloat") return {
103
- rank: 1,
104
- action: "cast",
105
- targetType: trueDst.concretized
106
- };
107
- if (trueSrc.type === "abstractFloat") {
108
- if (trueDst.type === "i32") return {
109
- rank: 2,
110
- action: "cast",
111
- targetType: trueDst
112
- };
113
- if (trueDst.type === "u32") return {
114
- rank: 3,
115
- action: "cast",
116
- targetType: trueDst
117
- };
118
- }
119
- return INFINITE_RANK;
60
+ const trueSrc = undecorate(src);
61
+ const trueDst = undecorate(dest);
62
+ if (isPtr(trueSrc) &&
63
+ // Only dereferencing implicit pointers, otherwise we'd have a types mismatch between TS and WGSL
64
+ trueSrc.implicit &&
65
+ getAutoConversionRank(trueSrc.inner, trueDst).rank < Number.POSITIVE_INFINITY) {
66
+ return { rank: 0, action: 'deref' };
67
+ }
68
+ if (isPtr(trueDst) &&
69
+ getAutoConversionRank(trueSrc, trueDst.inner).rank < Number.POSITIVE_INFINITY) {
70
+ return { rank: 1, action: 'ref' };
71
+ }
72
+ const primitivePreference = {
73
+ f32: 0,
74
+ f16: 1,
75
+ i32: 2,
76
+ u32: 3,
77
+ bool: 4,
78
+ };
79
+ if (trueSrc.type in primitivePreference && trueDst.type in primitivePreference) {
80
+ const srcType = trueSrc.type;
81
+ const destType = trueDst.type;
82
+ if (srcType !== destType) {
83
+ const srcPref = primitivePreference[srcType];
84
+ const destPref = primitivePreference[destType];
85
+ const rank = destPref < srcPref ? 10 : 20;
86
+ return { rank: rank, action: 'cast', targetType: trueDst };
87
+ }
88
+ }
89
+ if ((trueSrc.type === 'u32' || trueSrc.type === 'i32') && trueDst.type === 'abstractFloat') {
90
+ // When one of the types is a float (abstract or not), we don't want to cast it to a non-float type,
91
+ // which would cause it to lose precision. We instead choose the common type to be f32.
92
+ return { rank: 1, action: 'cast', targetType: trueDst.concretized };
93
+ }
94
+ if (trueSrc.type === 'abstractFloat') {
95
+ if (trueDst.type === 'i32') {
96
+ return { rank: 2, action: 'cast', targetType: trueDst };
97
+ }
98
+ if (trueDst.type === 'u32') {
99
+ return { rank: 3, action: 'cast', targetType: trueDst };
100
+ }
101
+ }
102
+ return INFINITE_RANK;
120
103
  }
121
104
  function getConversionRank(src, dest, allowImplicit) {
122
- const autoRank = getAutoConversionRank(src, dest);
123
- if (autoRank.rank < Number.POSITIVE_INFINITY) return autoRank;
124
- if (allowImplicit) return getImplicitConversionRank(src, dest);
125
- return INFINITE_RANK;
105
+ const autoRank = getAutoConversionRank(src, dest);
106
+ if (autoRank.rank < Number.POSITIVE_INFINITY) {
107
+ return autoRank;
108
+ }
109
+ if (allowImplicit) {
110
+ return getImplicitConversionRank(src, dest);
111
+ }
112
+ return INFINITE_RANK;
126
113
  }
127
114
  function findBestType(types, uniqueTypes, allowImplicit) {
128
- let bestResult;
129
- for (const targetType of uniqueTypes) {
130
- /**
131
- * The type we end up converting to. Will be different than `targetType` if `targetType === abstractFloat`
132
- */
133
- let destType = targetType;
134
- const details = [];
135
- let sum = 0;
136
- for (const sourceType of types) {
137
- const conversion = getConversionRank(sourceType, targetType, allowImplicit);
138
- sum += conversion.rank;
139
- if (conversion.rank === Number.POSITIVE_INFINITY) break;
140
- details.push(conversion);
141
- if (conversion.action === "cast") destType = conversion.targetType;
142
- }
143
- if (sum < (bestResult?.sum ?? Number.POSITIVE_INFINITY)) bestResult = {
144
- type: destType,
145
- details,
146
- sum
147
- };
148
- }
149
- if (!bestResult) return;
150
- const actions = bestResult.details.map((detail, index) => ({
151
- sourceIndex: index,
152
- action: detail.action,
153
- ...detail.action === "cast" && { targetType: detail.targetType }
154
- }));
155
- return {
156
- targetType: bestResult.type,
157
- actions,
158
- hasImplicitConversions: actions.some((action) => action.action === "cast")
159
- };
115
+ let bestResult;
116
+ for (const targetType of uniqueTypes) {
117
+ /**
118
+ * The type we end up converting to. Will be different than `targetType` if `targetType === abstractFloat`
119
+ */
120
+ let destType = targetType;
121
+ const details = [];
122
+ let sum = 0;
123
+ for (const sourceType of types) {
124
+ const conversion = getConversionRank(sourceType, targetType, allowImplicit);
125
+ sum += conversion.rank;
126
+ if (conversion.rank === Number.POSITIVE_INFINITY) {
127
+ break;
128
+ }
129
+ details.push(conversion);
130
+ if (conversion.action === 'cast') {
131
+ destType = conversion.targetType;
132
+ }
133
+ }
134
+ if (sum < (bestResult?.sum ?? Number.POSITIVE_INFINITY)) {
135
+ bestResult = { type: destType, details, sum };
136
+ }
137
+ }
138
+ if (!bestResult) {
139
+ return undefined;
140
+ }
141
+ const actions = bestResult.details.map((detail, index) => ({
142
+ sourceIndex: index,
143
+ action: detail.action,
144
+ ...(detail.action === 'cast' && {
145
+ targetType: detail.targetType,
146
+ }),
147
+ }));
148
+ return {
149
+ targetType: bestResult.type,
150
+ actions,
151
+ hasImplicitConversions: actions.some((action) => action.action === 'cast'),
152
+ };
160
153
  }
161
- function getBestConversion(types, targetTypes) {
162
- if (types.length === 0) return void 0;
163
- const uniqueTargetTypes = [...new Set((targetTypes || types).map(undecorate))];
164
- const explicitResult = findBestType(types, uniqueTargetTypes, false);
165
- if (explicitResult) return explicitResult;
166
- const implicitResult = findBestType(types, uniqueTargetTypes, true);
167
- if (implicitResult) return implicitResult;
154
+ export function getBestConversion(types, targetTypes) {
155
+ if (types.length === 0)
156
+ return undefined;
157
+ const uniqueTargetTypes = [...new Set((targetTypes || types).map(undecorate))];
158
+ const explicitResult = findBestType(types, uniqueTargetTypes, false);
159
+ if (explicitResult) {
160
+ return explicitResult;
161
+ }
162
+ const implicitResult = findBestType(types, uniqueTargetTypes, true);
163
+ if (implicitResult) {
164
+ return implicitResult;
165
+ }
166
+ return undefined;
168
167
  }
169
168
  function applyActionToSnippet(ctx, snippet, action, targetType) {
170
- if (action.action === "none") {
171
- if (targetType === snippet.dataType) return snippet;
172
- return withDataType(targetType, snippet);
173
- }
174
- switch (action.action) {
175
- case "ref": return snip(new RefOperator(snippet, targetType), targetType, snippet.origin);
176
- case "deref": return derefSnippet(snippet);
177
- case "cast":
178
- if (isWgslStruct(snippet.dataType) && isWgslStruct(targetType)) {
179
- const typeName = getName(snippet.dataType) ?? "<unnamed>";
180
- const targetName = getName(targetType) ?? "<unnamed>";
181
- if (!isAlias(snippet)) throw new Error(`Cannot resolve struct cast from '${typeName}' to '${targetName}'. Store the value to a variable first, then cast it.`);
182
- const propSnips = Object.entries(targetType.propTypes).map(([key, dataType]) => {
183
- const accessedProp = accessStructProp(snippet, key);
184
- if (!accessedProp) throw new Error(`Cannot auto-convert struct '${typeName}' to '${targetName}' because the property '${key}' is missing.`);
185
- const converted = convertToCommonType(ctx, [accessedProp], [dataType]);
186
- if (!converted || !converted[0]) throw new Error(`Cannot auto-convert struct '${typeName}' to '${targetName}' because type '${getName(accessedProp.dataType) ?? "<unnamed>"}' is not convertible to '${getName(undecorate(dataType)) ?? "<unnamed>"}'.`);
187
- return converted[0];
188
- });
189
- const targetSnippet = ctx.resolve(targetType).value;
190
- return snip(`${targetSnippet}(${propSnips.map((snip$1) => snip$1.value).join(", ")})`, targetType, "runtime", false);
191
- }
192
- return schemaCallWrapperGPU(ctx, targetType, snippet);
193
- default: assertExhaustive(action.action, "applyActionToSnippet");
194
- }
169
+ if (action.action === 'none') {
170
+ if (targetType === snippet.dataType) {
171
+ return snippet;
172
+ }
173
+ return withDataType(targetType, snippet);
174
+ }
175
+ switch (action.action) {
176
+ case 'ref':
177
+ return snip(new RefOperator(snippet, targetType), targetType, snippet.origin, snippet.possibleSideEffects);
178
+ case 'deref':
179
+ return derefSnippet(snippet);
180
+ case 'cast': {
181
+ if (isWgslStruct(snippet.dataType) && isWgslStruct(targetType)) {
182
+ const typeName = getName(snippet.dataType) ?? '<unnamed>';
183
+ const targetName = getName(targetType) ?? '<unnamed>';
184
+ // Struct to struct casting
185
+ if (snippet.possibleSideEffects) {
186
+ throw new Error(`Cannot resolve struct cast from '${typeName}' to '${targetName}'. Store the value to a variable first, then cast it.`);
187
+ }
188
+ const propSnips = Object.entries(targetType.propTypes).map(([key, dataType]) => {
189
+ const accessedProp = accessStructProp(snippet, key);
190
+ if (!accessedProp) {
191
+ throw new Error(`Cannot auto-convert struct '${typeName}' to '${targetName}' because the property '${key}' is missing.`);
192
+ }
193
+ const converted = convertToCommonType(ctx, [accessedProp], [dataType]);
194
+ if (!converted || !converted[0]) {
195
+ throw new Error(`Cannot auto-convert struct '${typeName}' to '${targetName}' because type '${getName(accessedProp.dataType) ?? '<unnamed>'}' is not convertible to '${getName(undecorate(dataType)) ?? '<unnamed>'}'.`);
196
+ }
197
+ return converted[0];
198
+ });
199
+ const targetSnippet = ctx.resolve(targetType).value;
200
+ return snip(`${targetSnippet}(${propSnips.map((snip) => snip.value).join(', ')})`, targetType, 'runtime', false);
201
+ }
202
+ // Casting means calling the schema with the snippet as an argument.
203
+ return schemaCallWrapperGPU(ctx, targetType, snippet);
204
+ }
205
+ default: {
206
+ assertExhaustive(action.action, 'applyActionToSnippet');
207
+ }
208
+ }
209
+ }
210
+ /**
211
+ * Unifies input types to a common type.
212
+ */
213
+ export function unify(inTypes, restrictTo) {
214
+ if (inTypes.some((type) => type === UnknownData)) {
215
+ return undefined;
216
+ }
217
+ const conversion = getBestConversion(inTypes, restrictTo);
218
+ if (!conversion) {
219
+ return undefined;
220
+ }
221
+ return inTypes.map((type) => (isVec(type) || isMat(type) ? type : conversion.targetType));
195
222
  }
196
- function unify(inTypes, restrictTo) {
197
- if (inTypes.some((type) => type === UnknownData)) return;
198
- const conversion = getBestConversion(inTypes, restrictTo);
199
- if (!conversion) return;
200
- return inTypes.map((type) => isVec(type) || isMat(type) ? type : conversion.targetType);
223
+ /**
224
+ * Unifies input types to a common type.
225
+ * Unlike `unify`, it does not allow implicit conversions.
226
+ */
227
+ export function unifyStrict(inTypes, restrictTo) {
228
+ if (inTypes.some((type) => type === UnknownData)) {
229
+ return undefined;
230
+ }
231
+ const uniqueTargetTypes = [...new Set((restrictTo || inTypes).map(undecorate))];
232
+ const conversion = findBestType(inTypes, uniqueTargetTypes, false);
233
+ if (!conversion) {
234
+ return undefined;
235
+ }
236
+ return inTypes.map((type) => (isVec(type) || isMat(type) ? type : conversion.targetType));
201
237
  }
202
- function convertToCommonType(ctx, values, restrictTo, verbose = true) {
203
- const types = values.map((value) => value.dataType);
204
- if (types.some((type) => type === UnknownData)) return;
205
- if (DEV && Array.isArray(restrictTo) && restrictTo.length === 0) console.warn("convertToCommonType was called with an empty restrictTo array, which prevents any conversions from being made. If you intend to allow all conversions, pass undefined instead. If this was intended call the function conditionally since the result will always be undefined.");
206
- const conversion = getBestConversion(types, restrictTo);
207
- if (!conversion) return;
208
- if ((TEST || DEV) && verbose && conversion.hasImplicitConversions) console.warn(`Implicit conversions from [\n${values.map((v) => ` ${ctx.resolveSnippet(v).value}: ${safeStringify(v.dataType)}`).join(",\n")}\n] to ${conversion.targetType.type} are supported, but not recommended.
238
+ export function convertToCommonType(ctx, values, restrictTo, verbose = true) {
239
+ const types = values.map((value) => value.dataType);
240
+ if (types.some((type) => type === UnknownData)) {
241
+ return undefined;
242
+ }
243
+ // Calling convertToCommonType with an empty restrictTo array
244
+ // prevents any conversions from being made. If you intend to allow
245
+ // all conversions, pass undefined instead. If this was intended call
246
+ // the function conditionally since the result will always be undefined.
247
+ invariant(!(Array.isArray(restrictTo) && restrictTo.length === 0), "Internal error, expected 'restrictTo' to not be an empty array.");
248
+ const conversion = getBestConversion(types, restrictTo);
249
+ if (!conversion) {
250
+ return undefined;
251
+ }
252
+ if (verbose && conversion.hasImplicitConversions) {
253
+ logger.warn('implicit-conversion', `Implicit conversions from [\n${values
254
+ .map((v) => ` ${ctx.resolveSnippet(v).value}: ${safeStringify(v.dataType)}`)
255
+ .join(',\n')}\n] to ${conversion.targetType.type} are supported, but not recommended.
209
256
  Consider using explicit conversions instead.`);
210
- return values.map((value, index) => {
211
- const action = conversion.actions[index];
212
- invariant(action, "Action should not be undefined");
213
- return applyActionToSnippet(ctx, value, action, conversion.targetType);
214
- });
257
+ }
258
+ return values.map((value, index) => {
259
+ const action = conversion.actions[index];
260
+ invariant(action, 'Action should not be undefined');
261
+ return applyActionToSnippet(ctx, value, action, conversion.targetType);
262
+ });
215
263
  }
216
- function tryConvertSnippet(ctx, snippet, targetDataTypes, verbose = true) {
217
- const targets = Array.isArray(targetDataTypes) ? targetDataTypes : [targetDataTypes];
218
- const { value, dataType, origin } = snippet;
219
- if (targets.length === 1) {
220
- const target = targets[0];
221
- if (target === dataType) return snip(value, target, origin);
222
- if (dataType === UnknownData) return snip(stitch`${snip(value, target, origin)}`, target, origin);
223
- }
224
- const converted = convertToCommonType(ctx, [snippet], targets, verbose);
225
- if (converted) return converted[0];
226
- throw new WgslTypeError(`Cannot convert value of type '${String(dataType)}' to any of the target types: [${targets.map((t) => t.type).join(", ")}]`);
264
+ export function tryConvertSnippet(ctx, snippet, targetDataTypes, verbose = true) {
265
+ const targets = Array.isArray(targetDataTypes) ? targetDataTypes : [targetDataTypes];
266
+ const { value, dataType, origin, possibleSideEffects } = snippet;
267
+ if (targets.length === 1) {
268
+ const target = targets[0];
269
+ if (target === dataType) {
270
+ return snip(value, target, origin, possibleSideEffects);
271
+ }
272
+ if (dataType === UnknownData) {
273
+ // Commit unknown to the expected type.
274
+ return ctx.resolveSnippet(snip(value, target, origin, possibleSideEffects));
275
+ }
276
+ }
277
+ const converted = convertToCommonType(ctx, [snippet], targets, verbose);
278
+ if (converted) {
279
+ return converted[0];
280
+ }
281
+ throw new WgslTypeError(`Cannot convert value of type '${String(dataType)}' to any of the target types: [${targets.map((t) => t.type).join(', ')}]`);
227
282
  }
228
- function convertStructValues(ctx, structType, values) {
229
- return Object.entries(structType.propTypes).map(([key, targetType]) => {
230
- const val = values[key];
231
- if (!val) throw new Error(`Missing property ${key}`);
232
- return convertToCommonType(ctx, [val], [targetType])?.[0] ?? val;
233
- });
283
+ export function convertStructValues(ctx, structType, values) {
284
+ return Object.entries(structType.propTypes).map(([key, targetType]) => {
285
+ const val = values[key];
286
+ if (!val) {
287
+ throw new Error(`Missing property ${key}`);
288
+ }
289
+ const converted = convertToCommonType(ctx, [val], [targetType]);
290
+ return converted?.[0] ?? val;
291
+ });
234
292
  }
235
-
236
- //#endregion
237
- export { convertStructValues, convertToCommonType, getBestConversion, tryConvertSnippet, unify };
@@ -0,0 +1,15 @@
1
+ import { type Snippet } from '../data/snippet.ts';
2
+ import * as wgsl from '../data/wgslTypes.ts';
3
+ import type { ResolutionCtx } from '../types.ts';
4
+ export declare function getLoopVarKind(elementSnippet: Snippet): "let" | "const";
5
+ export declare function getElementSnippet(iterableSnippet: Snippet, index: Snippet): Snippet;
6
+ /**
7
+ * Determines the type of the element as accessible inside of the `for .. of` loop body
8
+ */
9
+ export declare function getElementType(elementSnippet: Snippet, iterableSnippet: Snippet): wgsl.BaseData;
10
+ export declare function getRangeSnippets(ctx: ResolutionCtx, iterableSnippet: Snippet, unroll?: boolean): {
11
+ start: Snippet;
12
+ end: Snippet;
13
+ step: Snippet;
14
+ comparison: '<' | '>';
15
+ };