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,205 +1,207 @@
1
- //#region src/core/function/extractArgs.ts
1
+ import { blankSpaces, lineBreaks } from "../whitespaces.js";
2
2
  /**
3
- * Extracts info about arguments of a given WGSL function string.
4
- * @example
5
- * const code = `
6
- * fn add(a: i32, @location(0) b: i32, c) -> i32 {
7
- * return a + b + c;
8
- * }`;
9
- *
10
- * extractArgs(code);
11
- * // {
12
- * // args: [
13
- * // { identifier: 'a', attributes: [], type: 'i32' },
14
- * // { identifier: 'b', attributes: ['@location(0)'], type: 'i32' },
15
- * // { identifier: 'c', attributes: [], type: undefined }
16
- * // ],
17
- * // ret: { type: 'i32', attributes: [] },
18
- * // range: { begin: 11, end: 51 }
19
- * // }
20
- */
21
- function extractArgs(rawCode) {
22
- const { strippedCode, argRange: range } = strip(rawCode);
23
- const code = new ParsableString(strippedCode);
24
- code.consume("(");
25
- const args = [];
26
- while (!code.isAt(")")) {
27
- const attributes = [];
28
- while (code.isAt("@")) {
29
- code.parseUntil(closingParenthesis, parentheses);
30
- code.consume(")");
31
- attributes.push(code.lastParsed);
32
- }
33
- code.parseUntil(identifierEndSymbols);
34
- const identifier = code.lastParsed;
35
- let maybeType;
36
- if (code.isAt(":")) {
37
- code.consume(":");
38
- code.parseUntil(typeEndSymbols, angleBrackets);
39
- maybeType = code.lastParsed;
40
- }
41
- args.push({
42
- identifier,
43
- attributes,
44
- type: maybeType
45
- });
46
- if (code.isAt(",")) code.consume(",");
47
- }
48
- code.consume(")");
49
- let maybeRet;
50
- if (code.isAt("->")) {
51
- code.consume("->");
52
- const attributes = [];
53
- while (code.isAt("@")) {
54
- code.parseUntil(closingParenthesis, parentheses);
55
- code.consume(")");
56
- attributes.push(code.lastParsed);
57
- }
58
- maybeRet = {
59
- type: code.str.slice(code.pos),
60
- attributes
61
- };
62
- }
63
- return {
64
- args,
65
- ret: maybeRet,
66
- range: {
67
- begin: range[0],
68
- end: range[1]
69
- }
70
- };
3
+ * Extracts info about arguments of a given WGSL function string.
4
+ * @example
5
+ * const code = `
6
+ * fn add(a: i32, @location(0) b: i32, c) -> i32 {
7
+ * return a + b + c;
8
+ * }`;
9
+ *
10
+ * extractArgs(code);
11
+ * // {
12
+ * // args: [
13
+ * // { identifier: 'a', attributes: [], type: 'i32' },
14
+ * // { identifier: 'b', attributes: ['@location(0)'], type: 'i32' },
15
+ * // { identifier: 'c', attributes: [], type: undefined }
16
+ * // ],
17
+ * // ret: { type: 'i32', attributes: [] },
18
+ * // range: { begin: 11, end: 51 }
19
+ * // }
20
+ */
21
+ export function extractArgs(rawCode) {
22
+ const { strippedCode, argRange: range } = strip(rawCode);
23
+ const code = new ParsableString(strippedCode);
24
+ code.consume('(');
25
+ const args = [];
26
+ while (!code.isAt(')')) {
27
+ // In each loop iteration, process all the attributes, the identifier and the potential type of a single argument.
28
+ const attributes = [];
29
+ while (code.isAt('@')) {
30
+ code.parseUntil(closingParenthesis, parentheses);
31
+ code.consume(')');
32
+ attributes.push(code.lastParsed);
33
+ }
34
+ code.parseUntil(identifierEndSymbols);
35
+ const identifier = code.lastParsed;
36
+ let maybeType;
37
+ if (code.isAt(':')) {
38
+ code.consume(':');
39
+ code.parseUntil(typeEndSymbols, angleBrackets);
40
+ maybeType = code.lastParsed;
41
+ }
42
+ args.push({
43
+ identifier,
44
+ attributes,
45
+ type: maybeType,
46
+ });
47
+ if (code.isAt(',')) {
48
+ code.consume(',');
49
+ }
50
+ }
51
+ code.consume(')');
52
+ let maybeRet;
53
+ if (code.isAt('->')) {
54
+ code.consume('->');
55
+ const attributes = [];
56
+ while (code.isAt('@')) {
57
+ code.parseUntil(closingParenthesis, parentheses);
58
+ code.consume(')');
59
+ attributes.push(code.lastParsed);
60
+ }
61
+ maybeRet = { type: code.str.slice(code.pos), attributes };
62
+ }
63
+ return {
64
+ args,
65
+ ret: maybeRet,
66
+ range: { begin: range[0], end: range[1] },
67
+ };
71
68
  }
72
69
  /**
73
- * Strips comments, whitespaces, the name and the body of the function.
74
- * @example
75
- * const code = `
76
- * fn add( a, // first argument
77
- * @location(0) b : i32 ) -> i32 {
78
- * return a + b; // returns the sum
79
- * }`;
80
- *
81
- * strip(code); // "(a,@location(0)b:i32)->i32"
82
- */
70
+ * Strips comments, whitespaces, the name and the body of the function.
71
+ * @example
72
+ * const code = `
73
+ * fn add( a, // first argument
74
+ * @location(0) b : i32 ) -> i32 {
75
+ * return a + b; // returns the sum
76
+ * }`;
77
+ *
78
+ * strip(code); // "(a,@location(0)b:i32)->i32"
79
+ */
83
80
  function strip(rawCode) {
84
- const code = new ParsableString(rawCode);
85
- let strippedCode = "";
86
- let argsStart;
87
- while (!code.isFinished()) {
88
- if (code.isAt(blankSpaces)) {
89
- code.advanceBy(1);
90
- continue;
91
- }
92
- if (code.isAt("//")) {
93
- code.consume("//");
94
- code.parseUntil(lineBreaks);
95
- code.advanceBy(1);
96
- continue;
97
- }
98
- if (code.isAt("/*")) {
99
- code.parseUntil(openingCommentBlock, commentBlocks);
100
- code.consume("*/");
101
- continue;
102
- }
103
- if (code.isAt("{")) return {
104
- strippedCode,
105
- argRange: [argsStart, code.pos]
106
- };
107
- if (code.isAt("(") && argsStart === void 0) argsStart = code.pos;
108
- if (argsStart !== void 0) strippedCode += code.str[code.pos];
109
- code.advanceBy(1);
110
- }
111
- throw new Error("Invalid wgsl code!");
81
+ const code = new ParsableString(rawCode);
82
+ let strippedCode = '';
83
+ let argsStart;
84
+ while (!code.isFinished()) {
85
+ // parse character by character while ignoring comments and blankspaces until you find a `{`.
86
+ // skip any blankspace
87
+ if (code.isAt(blankSpaces)) {
88
+ code.advanceBy(1); // the blankspace character
89
+ continue;
90
+ }
91
+ // skip line comments
92
+ if (code.isAt('//')) {
93
+ code.consume('//');
94
+ code.parseUntil(lineBreaks);
95
+ code.advanceBy(1); // the line break
96
+ continue;
97
+ }
98
+ // skip block comments
99
+ if (code.isAt('/*')) {
100
+ code.parseUntil(openingCommentBlock, commentBlocks);
101
+ code.consume('*/');
102
+ continue;
103
+ }
104
+ if (code.isAt('{')) {
105
+ return {
106
+ strippedCode,
107
+ argRange: [argsStart, code.pos],
108
+ };
109
+ }
110
+ if (code.isAt('(') && argsStart === undefined) {
111
+ argsStart = code.pos;
112
+ }
113
+ if (argsStart !== undefined) {
114
+ strippedCode += code.str[code.pos];
115
+ }
116
+ code.advanceBy(1); // parsed character
117
+ }
118
+ throw new Error('Invalid wgsl code!');
112
119
  }
113
- var ParsableString = class {
114
- str;
115
- #parseStartPos;
116
- #pos;
117
- constructor(str) {
118
- this.str = str;
119
- this.#pos = 0;
120
- }
121
- get pos() {
122
- return this.#pos;
123
- }
124
- /**
125
- * This property is equivalent to the substring of `this.str`
126
- * from the position of the last `parseUntil` call, to the current position.
127
- */
128
- get lastParsed() {
129
- if (this.#parseStartPos === void 0) throw new Error("Parse was not called yet!");
130
- return this.str.slice(this.#parseStartPos, this.pos);
131
- }
132
- isFinished() {
133
- return this.#pos >= this.str.length;
134
- }
135
- isAt(substr) {
136
- if (typeof substr === "string") {
137
- for (let i = 0; i < substr.length; i++) if (this.str[this.#pos + i] !== substr[i]) return false;
138
- return true;
139
- }
140
- for (const elem of substr) if (this.isAt(elem)) return true;
141
- return false;
142
- }
143
- /**
144
- * @param toFind a set of strings either of which satisfy the search.
145
- * @param brackets a pair of brackets that has to be closed for result to be valid. This includes the found character(s).
146
- * @example
147
- * // internal state:
148
- * // '(@attribute(0) identifier: type)'
149
- * // ^
150
- * this.parse(new Set(')'), ['(', ')']);
151
- * // internal state:
152
- * // '(@attribute(0) identifier: type)'
153
- * // ^
154
- */
155
- parseUntil(toFind, brackets) {
156
- this.#parseStartPos = this.#pos;
157
- let openedBrackets = 0;
158
- while (this.#pos < this.str.length) {
159
- if (brackets && this.isAt(brackets[0])) openedBrackets += 1;
160
- if (brackets && this.isAt(brackets[1])) openedBrackets -= 1;
161
- if (openedBrackets === 0) {
162
- if (this.isAt(toFind)) return this.#pos;
163
- }
164
- this.#pos += 1;
165
- }
166
- throw new Error("Reached the end of the string without finding a match!");
167
- }
168
- advanceBy(steps) {
169
- this.#pos += steps;
170
- }
171
- consume(str) {
172
- if (!this.isAt(str)) throw new Error(`Expected '${str}' at position ${this.#pos}, but found '${this.str.slice(this.#pos, this.#pos + str.length)}'`);
173
- this.advanceBy(str.length);
174
- }
175
- };
176
- const lineBreaks = new Set([
177
- "\n",
178
- "\v",
179
- "\f",
180
- "\r",
181
- "…",
182
- "\u2028",
183
- "\u2029"
184
- ]);
185
- const blankSpaces = new Set([
186
- ...lineBreaks,
187
- " ",
188
- " ",
189
- "‎",
190
- "‏"
191
- ]);
192
- const closingParenthesis = new Set([")"]);
193
- const identifierEndSymbols = new Set([
194
- ":",
195
- ",",
196
- ")"
197
- ]);
198
- const typeEndSymbols = new Set([",", ")"]);
199
- const openingCommentBlock = new Set(["*/"]);
200
- const parentheses = ["(", ")"];
201
- const angleBrackets = ["<", ">"];
202
- const commentBlocks = ["/*", "*/"];
203
-
204
- //#endregion
205
- export { extractArgs };
120
+ class ParsableString {
121
+ str;
122
+ #parseStartPos;
123
+ #pos;
124
+ constructor(str) {
125
+ this.str = str;
126
+ this.#pos = 0;
127
+ }
128
+ get pos() {
129
+ return this.#pos;
130
+ }
131
+ /**
132
+ * This property is equivalent to the substring of `this.str`
133
+ * from the position of the last `parseUntil` call, to the current position.
134
+ */
135
+ get lastParsed() {
136
+ if (this.#parseStartPos === undefined) {
137
+ throw new Error('Parse was not called yet!');
138
+ }
139
+ return this.str.slice(this.#parseStartPos, this.pos);
140
+ }
141
+ isFinished() {
142
+ return this.#pos >= this.str.length;
143
+ }
144
+ isAt(substr) {
145
+ if (typeof substr === 'string') {
146
+ for (let i = 0; i < substr.length; i++) {
147
+ if (this.str[this.#pos + i] !== substr[i]) {
148
+ return false;
149
+ }
150
+ }
151
+ return true;
152
+ }
153
+ for (const elem of substr) {
154
+ if (this.isAt(elem)) {
155
+ return true;
156
+ }
157
+ }
158
+ return false;
159
+ }
160
+ /**
161
+ * @param toFind a set of strings either of which satisfy the search.
162
+ * @param brackets a pair of brackets that has to be closed for result to be valid. This includes the found character(s).
163
+ * @example
164
+ * // internal state:
165
+ * // '(@attribute(0) identifier: type)'
166
+ * // ^
167
+ * this.parse(new Set(')'), ['(', ')']);
168
+ * // internal state:
169
+ * // '(@attribute(0) identifier: type)'
170
+ * // ^
171
+ */
172
+ parseUntil(toFind, brackets) {
173
+ this.#parseStartPos = this.#pos;
174
+ let openedBrackets = 0;
175
+ while (this.#pos < this.str.length) {
176
+ if (brackets && this.isAt(brackets[0])) {
177
+ openedBrackets += 1;
178
+ }
179
+ if (brackets && this.isAt(brackets[1])) {
180
+ openedBrackets -= 1;
181
+ }
182
+ if (openedBrackets === 0) {
183
+ if (this.isAt(toFind)) {
184
+ return this.#pos;
185
+ }
186
+ }
187
+ this.#pos += 1;
188
+ }
189
+ throw new Error('Reached the end of the string without finding a match!');
190
+ }
191
+ advanceBy(steps) {
192
+ this.#pos += steps;
193
+ }
194
+ consume(str) {
195
+ if (!this.isAt(str)) {
196
+ throw new Error(`Expected '${str}' at position ${this.#pos}, but found '${this.str.slice(this.#pos, this.#pos + str.length)}'`);
197
+ }
198
+ this.advanceBy(str.length);
199
+ }
200
+ }
201
+ const closingParenthesis = new Set([')']);
202
+ const identifierEndSymbols = new Set([':', ',', ')']);
203
+ const typeEndSymbols = new Set([',', ')']);
204
+ const openingCommentBlock = new Set(['*/']);
205
+ const parentheses = ['(', ')'];
206
+ const angleBrackets = ['<', '>'];
207
+ const commentBlocks = ['/*', '*/'];
@@ -1,5 +1,44 @@
1
- import "../../data/snippet.js";
2
- import "./fnTypes.js";
3
- import "../../types.js";
4
- import "../../data/wgslTypes.js";
5
- import "../resolve/externals.js";
1
+ import { type ResolvedSnippet } from '../../data/snippet.ts';
2
+ import { type BaseData } from '../../data/wgslTypes.ts';
3
+ import type { ResolutionCtx, ShaderStage } from '../../types.ts';
4
+ import { type ExternalMap } from '../resolve/externals.ts';
5
+ import type { Implementation, SeparatedEntryArgs } from './fnTypes.ts';
6
+ export type FnExternals = {
7
+ /**
8
+ * Externals provided by calling `$uses()`.
9
+ */
10
+ userProvided?: ExternalMap;
11
+ /**
12
+ * Externals provided by unplugin-typegpu via function metadata.
13
+ */
14
+ pluginProvided?: ExternalMap;
15
+ /**
16
+ * Function arguments, for example `{ S: Schema }` in `tgpu.fn([Schema])('(arg: S) => {}')`,
17
+ * or { in: { position: 'position' } } in `fragmentFn({ in: { position: d.builtin.position }, out: d.vec4f, })('...')`
18
+ */
19
+ args?: ExternalMap;
20
+ /**
21
+ * Function return type, for example `{ Out: ... }` in both rawWgsl entrypoint functions and `vertexFnShell(in, Out)`.
22
+ */
23
+ out?: ExternalMap;
24
+ };
25
+ export interface FnCore {
26
+ setExternals: (key: keyof FnExternals, newExternal: ExternalMap) => void;
27
+ resolve(ctx: ResolutionCtx,
28
+ /**
29
+ * The argument types can be AutoStruct if they're determined based on usage
30
+ * (like in auto-entry functions).
31
+ */
32
+ argTypes: BaseData[],
33
+ /**
34
+ * The return type of the function. If undefined, the type should be inferred
35
+ * from the implementation (relevant for shellless functions).
36
+ */
37
+ returnType: BaseData | undefined,
38
+ /**
39
+ * For entry functions: positional args and optional data struct.
40
+ * When provided, takes precedence over `argTypes` for WGSL header generation.
41
+ */
42
+ entryInput?: SeparatedEntryArgs): ResolvedSnippet;
43
+ }
44
+ export declare function createFnCore(implementation: Implementation, functionType: 'normal' | ShaderStage, workgroupSize?: number[]): FnCore;