typegpu 0.11.9 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +36 -36
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -5
  42. package/core/function/fnCore.js +148 -93
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +17 -22
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -53
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -215
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -197
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -126
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +271 -216
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -760
  350. package/types.d.ts +287 -222
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,56 +1,64 @@
1
- import { $getNameForward, $gpuCallable, $internal } from "../../shared/symbols.js";
2
- import { setName } from "../../shared/meta.js";
3
1
  import { WgslTypeError } from "../../errors.js";
4
- import { NormalState, isKnownAtComptime } from "../../types.js";
2
+ import { setName } from "../../shared/meta.js";
3
+ import { $getNameForward, $gpuCallable, $internal } from "../../shared/symbols.js";
5
4
  import { coerceToSnippet } from "../../tgsl/generationHelpers.js";
6
-
7
- //#region src/core/function/comptime.ts
5
+ import { isKnownAtComptime, NormalState } from "../../types.js";
6
+ export function isComptimeFn(value) {
7
+ return !!value?.[$internal]?.isComptime;
8
+ }
8
9
  /**
9
- * Creates a version of `func` that can called safely in a TypeGPU function to
10
- * precompute and inject a value into the final shader code.
11
- *
12
- * Note how the function passed into `comptime` doesn't have to be marked with
13
- * 'use gpu'. That's because the function doesn't execute on the GPU, it gets
14
- * executed before the shader code gets sent to the GPU.
15
- *
16
- * @example
17
- * ```ts
18
- * const color = tgpu.comptime((int: number) => {
19
- * const r = (int >> 16) & 0xff;
20
- * const g = (int >> 8) & 0xff;
21
- * const b = int & 0xff;
22
- * return d.vec3f(r / 255, g / 255, b / 255);
23
- * });
24
- *
25
- * const material = (diffuse: d.v3f): d.v3f => {
26
- * 'use gpu';
27
- * const albedo = color(0xff00ff);
28
- * return albedo.mul(diffuse);
29
- * };
30
- * ```
31
- */
32
- function comptime(func) {
33
- const impl = ((...args) => {
34
- return func(...args);
35
- });
36
- impl.toString = () => "comptime";
37
- impl[$getNameForward] = func;
38
- impl[$gpuCallable] = { call(ctx, args) {
39
- if (!args.every((s) => isKnownAtComptime(s))) throw new WgslTypeError(`Called comptime function with runtime-known values: ${args.filter((s) => !isKnownAtComptime(s)).map((s) => `'${s.value}'`).join(", ")}`);
40
- ctx.pushMode(new NormalState());
41
- try {
42
- return coerceToSnippet(func(...args.map((s) => s.value)));
43
- } finally {
44
- ctx.popMode();
45
- }
46
- } };
47
- impl.$name = (label) => {
48
- setName(func, label);
49
- return impl;
50
- };
51
- Object.defineProperty(impl, $internal, { value: { isComptime: true } });
52
- return impl;
10
+ * Creates a version of `func` that can called safely in a TypeGPU function to
11
+ * precompute and inject a value into the final shader code.
12
+ *
13
+ * Note how the function passed into `comptime` doesn't have to be marked with
14
+ * 'use gpu'. That's because the function doesn't execute on the GPU, it gets
15
+ * executed before the shader code gets sent to the GPU.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const color = tgpu.comptime((int: number) => {
20
+ * const r = (int >> 16) & 0xff;
21
+ * const g = (int >> 8) & 0xff;
22
+ * const b = int & 0xff;
23
+ * return d.vec3f(r / 255, g / 255, b / 255);
24
+ * });
25
+ *
26
+ * const material = (diffuse: d.v3f): d.v3f => {
27
+ * 'use gpu';
28
+ * const albedo = color(0xff00ff);
29
+ * return albedo.mul(diffuse);
30
+ * };
31
+ * ```
32
+ */
33
+ export function comptime(func) {
34
+ const impl = ((...args) => {
35
+ return func(...args);
36
+ });
37
+ impl.toString = () => 'comptime';
38
+ impl[$getNameForward] = func;
39
+ impl[$gpuCallable] = {
40
+ call(ctx, args) {
41
+ if (!args.every((s) => isKnownAtComptime(s))) {
42
+ throw new WgslTypeError(`Called comptime function with runtime-known values: ${args
43
+ .filter((s) => !isKnownAtComptime(s))
44
+ .map((s) => `'${s.value}'`)
45
+ .join(', ')}`);
46
+ }
47
+ ctx.pushMode(new NormalState());
48
+ try {
49
+ return coerceToSnippet(func(...args.map((s) => s.value)));
50
+ }
51
+ finally {
52
+ ctx.popMode();
53
+ }
54
+ },
55
+ };
56
+ impl.$name = (label) => {
57
+ setName(func, label);
58
+ return impl;
59
+ };
60
+ Object.defineProperty(impl, $internal, {
61
+ value: { isComptime: true },
62
+ });
63
+ return impl;
53
64
  }
54
-
55
- //#endregion
56
- export { comptime };
@@ -0,0 +1,16 @@
1
+ import { type MapValueToSnippet, type ResolvedSnippet } from '../../data/snippet.ts';
2
+ import { type BaseData } from '../../data/wgslTypes.ts';
3
+ import { type DualFn, type ResolutionCtx } from '../../types.ts';
4
+ import type { AnyFn } from './fnTypes.ts';
5
+ type MapValueToDataType<T> = {
6
+ [K in keyof T]: BaseData;
7
+ };
8
+ interface CallableSchemaOptions<T extends AnyFn> {
9
+ readonly name: string;
10
+ readonly schema: () => BaseData;
11
+ readonly normalImpl: T;
12
+ readonly codegenImpl: (ctx: ResolutionCtx, args: MapValueToSnippet<Parameters<T>>) => ResolvedSnippet;
13
+ readonly argTypes: (...inArgTypes: MapValueToDataType<Parameters<T>>) => (BaseData | BaseData[])[];
14
+ }
15
+ export declare function callableSchema<T extends AnyFn>(options: CallableSchemaOptions<T>): DualFn<T>;
16
+ export {};
@@ -1,44 +1,54 @@
1
- import { $gpuCallable } from "../../shared/symbols.js";
1
+ import { noSideEffects, snip, } from "../../data/snippet.js";
2
2
  import { isPtr } from "../../data/wgslTypes.js";
3
3
  import { setName } from "../../shared/meta.js";
4
- import { noSideEffects, snip } from "../../data/snippet.js";
5
- import { NormalState, isKnownAtComptime } from "../../types.js";
4
+ import { $gpuCallable } from "../../shared/symbols.js";
6
5
  import { tryConvertSnippet } from "../../tgsl/conversion.js";
7
-
8
- //#region src/core/function/createCallableSchema.ts
9
- function callableSchema(options) {
10
- const impl = ((...args) => {
11
- return options.normalImpl(...args);
12
- });
13
- setName(impl, options.name);
14
- impl.toString = () => options.name;
15
- impl[$gpuCallable] = {
16
- get strictSignature() {},
17
- call(ctx, args) {
18
- const argTypes = options.argTypes(...args.map((s) => {
19
- if (isPtr(s.dataType) && s.dataType.implicit) return s.dataType.inner;
20
- return s.dataType;
21
- }));
22
- const converted = args.map((s, idx) => {
23
- const argType = argTypes[idx];
24
- if (!argType) throw new Error("Function called with invalid arguments");
25
- return tryConvertSnippet(ctx, s, argType, false);
26
- });
27
- let result;
28
- if (converted.every((s) => isKnownAtComptime(s))) {
29
- ctx.pushMode(new NormalState());
30
- try {
31
- result = snip(options.normalImpl(...converted.map((s) => s.value)), options.schema(), "constant");
32
- } finally {
33
- ctx.popMode("normal");
34
- }
35
- } else result = options.codegenImpl(ctx, converted);
36
- if (!args.some((a) => a.possibleSideEffects)) return noSideEffects(result);
37
- return result;
38
- }
39
- };
40
- return impl;
6
+ import { isKnownAtComptime, NormalState } from "../../types.js";
7
+ export function callableSchema(options) {
8
+ const impl = ((...args) => {
9
+ return options.normalImpl(...args);
10
+ });
11
+ setName(impl, options.name);
12
+ impl.toString = () => options.name;
13
+ impl[$gpuCallable] = {
14
+ get strictSignature() {
15
+ return undefined;
16
+ },
17
+ call(ctx, args) {
18
+ const argTypes = options.argTypes(...args.map((s) => {
19
+ // Dereference implicit pointers
20
+ if (isPtr(s.dataType) && s.dataType.implicit) {
21
+ return s.dataType.inner;
22
+ }
23
+ return s.dataType;
24
+ }));
25
+ const converted = args.map((s, idx) => {
26
+ const argType = argTypes[idx];
27
+ if (!argType) {
28
+ throw new Error('Function called with invalid arguments');
29
+ }
30
+ return tryConvertSnippet(ctx, s, argType, false);
31
+ });
32
+ let result;
33
+ if (converted.every((s) => isKnownAtComptime(s))) {
34
+ ctx.pushMode(new NormalState());
35
+ try {
36
+ result = snip(options.normalImpl(...converted.map((s) => s.value)), options.schema(),
37
+ // Functions give up ownership of their return value
38
+ /* origin */ 'constant');
39
+ }
40
+ finally {
41
+ ctx.popMode('normal');
42
+ }
43
+ }
44
+ else {
45
+ result = options.codegenImpl(ctx, converted);
46
+ }
47
+ if (!args.some((a) => a.possibleSideEffects)) {
48
+ return noSideEffects(result);
49
+ }
50
+ return result;
51
+ },
52
+ };
53
+ return impl;
41
54
  }
42
-
43
- //#endregion
44
- export { callableSchema };
@@ -0,0 +1,44 @@
1
+ import { type MapValueToSnippet } from '../../data/snippet.ts';
2
+ import { type DualFn, type ResolutionCtx } from '../../types.ts';
3
+ import { type BaseData } from '../../data/wgslTypes.ts';
4
+ type MapValueToDataType<T> = {
5
+ [K in keyof T]: BaseData;
6
+ };
7
+ type AnyFn = (...args: never[]) => unknown;
8
+ interface DualImplOptions<T extends AnyFn> {
9
+ readonly name: string | undefined;
10
+ readonly normalImpl: T | string;
11
+ readonly codegenImpl: (ctx: ResolutionCtx, args: MapValueToSnippet<Parameters<T>>, returnType: BaseData) => string;
12
+ readonly signature: {
13
+ argTypes: (BaseData | BaseData[])[];
14
+ returnType: BaseData;
15
+ } | ((...inArgTypes: MapValueToDataType<Parameters<T>>) => {
16
+ argTypes: (BaseData | BaseData[])[];
17
+ returnType: BaseData;
18
+ });
19
+ /**
20
+ * Whether the function should skip trying to execute the "normal" implementation if
21
+ * all arguments are known at compile time.
22
+ * @default false
23
+ */
24
+ readonly noComptime?: boolean | undefined;
25
+ readonly ignoreImplicitCastWarning?: boolean | undefined;
26
+ /**
27
+ * Whether calling this function is a side-effect in itself, irrespective of
28
+ * its arguments. Examples:
29
+ *
30
+ * - `discard` -> `true` - it discards the fragment.
31
+ * - `workgroupBarrier()` -> `true` - the barrier synchronizes threads.
32
+ * - `sin(x)`, `abs(x)` -> `false` - these are purely value-producing; the
33
+ * call itself has no observable effect beyond the returned value.
34
+ *
35
+ * When `false`, the result inherits side-effects from its arguments: it
36
+ * only has `possibleSideEffects: true` if at least one argument does.
37
+ */
38
+ readonly sideEffects: boolean;
39
+ }
40
+ export declare class MissingCpuImplError extends Error {
41
+ constructor(message: string | undefined);
42
+ }
43
+ export declare function dualImpl<T extends AnyFn>(options: DualImplOptions<T>): DualFn<T>;
44
+ export {};
@@ -1,54 +1,75 @@
1
- import { $gpuCallable } from "../../shared/symbols.js";
2
- import { isPtr } from "../../data/wgslTypes.js";
3
- import { setName } from "../../shared/meta.js";
4
1
  import { snip } from "../../data/snippet.js";
5
- import { NormalState, isKnownAtComptime } from "../../types.js";
2
+ import { setName } from "../../shared/meta.js";
3
+ import { $gpuCallable } from "../../shared/symbols.js";
6
4
  import { tryConvertSnippet } from "../../tgsl/conversion.js";
7
5
  import { concretize } from "../../tgsl/generationHelpers.js";
8
-
9
- //#region src/core/function/dualImpl.ts
10
- var MissingCpuImplError = class extends Error {
11
- constructor(message) {
12
- super(message);
13
- this.name = this.constructor.name;
14
- }
15
- };
16
- function dualImpl(options) {
17
- const impl = ((...args) => {
18
- if (typeof options.normalImpl === "string") throw new MissingCpuImplError(options.normalImpl);
19
- return options.normalImpl(...args);
20
- });
21
- if (options.name) setName(impl, options.name);
22
- impl.toString = () => options.name ?? "<unknown>";
23
- impl[$gpuCallable] = {
24
- get strictSignature() {
25
- return typeof options.signature !== "function" ? options.signature : void 0;
26
- },
27
- call(ctx, args) {
28
- const { argTypes, returnType } = typeof options.signature === "function" ? options.signature(...args.map((s) => {
29
- if (isPtr(s.dataType) && s.dataType.implicit) return s.dataType.inner;
30
- return s.dataType;
31
- })) : options.signature;
32
- const converted = args.map((s, idx) => {
33
- const argType = argTypes[idx];
34
- if (!argType) throw new Error("Function called with invalid arguments");
35
- return tryConvertSnippet(ctx, s, argType, !options.ignoreImplicitCastWarning);
36
- });
37
- if (!options.noComptime && converted.every((s) => isKnownAtComptime(s)) && typeof options.normalImpl === "function") {
38
- ctx.pushMode(new NormalState());
39
- try {
40
- return snip(options.normalImpl(...converted.map((s) => s.value)), returnType, "constant");
41
- } catch (e) {
42
- if (!(e instanceof MissingCpuImplError)) throw e;
43
- } finally {
44
- ctx.popMode("normal");
45
- }
46
- }
47
- return snip(options.codegenImpl(ctx, converted), concretize(returnType), "runtime");
48
- }
49
- };
50
- return impl;
6
+ import { isKnownAtComptime, NormalState } from "../../types.js";
7
+ import { isPtr } from "../../data/wgslTypes.js";
8
+ export class MissingCpuImplError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = this.constructor.name;
12
+ }
13
+ }
14
+ export function dualImpl(options) {
15
+ const impl = ((...args) => {
16
+ if (typeof options.normalImpl === 'string') {
17
+ throw new MissingCpuImplError(options.normalImpl);
18
+ }
19
+ return options.normalImpl(...args);
20
+ });
21
+ if (options.name) {
22
+ setName(impl, options.name);
23
+ }
24
+ impl.toString = () => options.name ?? '<unknown>';
25
+ impl[$gpuCallable] = {
26
+ get strictSignature() {
27
+ return typeof options.signature !== 'function' ? options.signature : undefined;
28
+ },
29
+ call(ctx, args) {
30
+ const { argTypes, returnType } = typeof options.signature === 'function'
31
+ ? options.signature(...args.map((s) => {
32
+ // Dereference implicit pointers
33
+ if (isPtr(s.dataType) && s.dataType.implicit) {
34
+ return s.dataType.inner;
35
+ }
36
+ return s.dataType;
37
+ }))
38
+ : options.signature;
39
+ const converted = args.map((s, idx) => {
40
+ const argType = argTypes[idx];
41
+ if (!argType) {
42
+ throw new Error('Function called with invalid arguments');
43
+ }
44
+ return tryConvertSnippet(ctx, s, argType, !options.ignoreImplicitCastWarning);
45
+ });
46
+ if (!options.noComptime &&
47
+ converted.every((s) => isKnownAtComptime(s)) &&
48
+ typeof options.normalImpl === 'function') {
49
+ ctx.pushMode(new NormalState());
50
+ try {
51
+ return snip(options.normalImpl(...converted.map((s) => s.value)), returnType,
52
+ // Functions give up ownership of their return value
53
+ /* origin */ 'constant', options.sideEffects);
54
+ }
55
+ catch (e) {
56
+ // cpuImpl may in some cases be present but implemented only partially.
57
+ // In that case, if the MissingCpuImplError is thrown, we fallback to codegenImpl.
58
+ // If it is any other error, we just rethrow.
59
+ if (!(e instanceof MissingCpuImplError)) {
60
+ throw e;
61
+ }
62
+ }
63
+ finally {
64
+ ctx.popMode('normal');
65
+ }
66
+ }
67
+ const possibleSideEffects = options.sideEffects || args.some((a) => a.possibleSideEffects);
68
+ const concreteReturnType = concretize(returnType);
69
+ return snip(options.codegenImpl(ctx, converted, concreteReturnType), concreteReturnType,
70
+ // Functions give up ownership of their return value
71
+ /* origin */ 'runtime', possibleSideEffects);
72
+ },
73
+ };
74
+ return impl;
51
75
  }
52
-
53
- //#endregion
54
- export { MissingCpuImplError, dualImpl };
@@ -0,0 +1,26 @@
1
+ import { type Snippet } from '../../data/snippet.ts';
2
+ import { $internal, $repr } from '../../shared/symbols.ts';
3
+ import { type BaseData } from '../../data/wgslTypes.ts';
4
+ import type { FunctionArgumentAccess } from '../../types.ts';
5
+ /**
6
+ * Routes `(input) => { input.x }` style property access to the correct WGSL
7
+ * expression: positional args get a direct snippet, struct fields get
8
+ * `structArgName.fieldName`.
9
+ */
10
+ export declare class EntryInputRouter implements BaseData {
11
+ readonly [$internal]: Record<string, unknown>;
12
+ readonly type: "entry-input-router";
13
+ readonly [$repr]: never;
14
+ readonly structArg: FunctionArgumentAccess | undefined;
15
+ /** Maps schemaKey → { WGSL arg name, type } */
16
+ readonly positionalArgsMap: Map<string, FunctionArgumentAccess>;
17
+ constructor(structArg: FunctionArgumentAccess | undefined, positionalArgs: {
18
+ schemaKey: string;
19
+ arg: FunctionArgumentAccess;
20
+ }[]);
21
+ toString(): string;
22
+ accessProp(propName: string): Snippet | {
23
+ target: Snippet;
24
+ prop: string;
25
+ } | undefined;
26
+ }
@@ -1,35 +1,33 @@
1
- import { $internal } from "../../shared/symbols.js";
1
+ import {} from "../../data/snippet.js";
2
+ import { $internal, $repr } from "../../shared/symbols.js";
2
3
  import { isWgslStruct } from "../../data/wgslTypes.js";
3
-
4
- //#region src/core/function/entryInputRouter.ts
5
4
  /**
6
- * Routes `(input) => { input.x }` style property access to the correct WGSL
7
- * expression: positional args get a direct snippet, struct fields get
8
- * `structArgName.fieldName`.
9
- */
10
- var EntryInputRouter = class {
11
- [$internal] = {};
12
- type = "entry-input-router";
13
- structArg;
14
- /** Maps schemaKey → { WGSL arg name, type } */
15
- positionalArgsMap;
16
- constructor(structArg, positionalArgs) {
17
- this.structArg = structArg;
18
- this.positionalArgsMap = new Map(positionalArgs.map((a) => [a.schemaKey, a.arg]));
19
- }
20
- toString() {
21
- return "entry-input-router";
22
- }
23
- accessProp(propName) {
24
- const positionalEntry = this.positionalArgsMap.get(propName);
25
- if (positionalEntry) return positionalEntry();
26
- const structSnippet = this.structArg?.();
27
- if (structSnippet && isWgslStruct(structSnippet.dataType)) return {
28
- target: structSnippet,
29
- prop: propName
30
- };
31
- }
32
- };
33
-
34
- //#endregion
35
- export { EntryInputRouter };
5
+ * Routes `(input) => { input.x }` style property access to the correct WGSL
6
+ * expression: positional args get a direct snippet, struct fields get
7
+ * `structArgName.fieldName`.
8
+ */
9
+ export class EntryInputRouter {
10
+ [$internal] = {};
11
+ type = 'entry-input-router';
12
+ structArg;
13
+ /** Maps schemaKey → { WGSL arg name, type } */
14
+ positionalArgsMap;
15
+ constructor(structArg, positionalArgs) {
16
+ this.structArg = structArg;
17
+ this.positionalArgsMap = new Map(positionalArgs.map((a) => [a.schemaKey, a.arg]));
18
+ }
19
+ toString() {
20
+ return 'entry-input-router';
21
+ }
22
+ accessProp(propName) {
23
+ const positionalEntry = this.positionalArgsMap.get(propName);
24
+ if (positionalEntry) {
25
+ return positionalEntry();
26
+ }
27
+ const structSnippet = this.structArg?.();
28
+ if (structSnippet && isWgslStruct(structSnippet.dataType)) {
29
+ return { target: structSnippet, prop: propName };
30
+ }
31
+ return undefined;
32
+ }
33
+ }
@@ -0,0 +1,38 @@
1
+ interface FunctionArgsInfo {
2
+ args: ArgInfo[];
3
+ ret: ReturnInfo | undefined;
4
+ range: {
5
+ begin: number;
6
+ end: number;
7
+ };
8
+ }
9
+ interface ArgInfo {
10
+ identifier: string;
11
+ attributes: string[];
12
+ type: string | undefined;
13
+ }
14
+ interface ReturnInfo {
15
+ attributes: string[];
16
+ type: string;
17
+ }
18
+ /**
19
+ * Extracts info about arguments of a given WGSL function string.
20
+ * @example
21
+ * const code = `
22
+ * fn add(a: i32, @location(0) b: i32, c) -> i32 {
23
+ * return a + b + c;
24
+ * }`;
25
+ *
26
+ * extractArgs(code);
27
+ * // {
28
+ * // args: [
29
+ * // { identifier: 'a', attributes: [], type: 'i32' },
30
+ * // { identifier: 'b', attributes: ['@location(0)'], type: 'i32' },
31
+ * // { identifier: 'c', attributes: [], type: undefined }
32
+ * // ],
33
+ * // ret: { type: 'i32', attributes: [] },
34
+ * // range: { begin: 11, end: 51 }
35
+ * // }
36
+ */
37
+ export declare function extractArgs(rawCode: string): FunctionArgsInfo;
38
+ export {};