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,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 {};