typegpu 0.11.8 → 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 +37 -38
  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 -0
  42. package/core/function/fnCore.js +148 -92
  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 +18 -20
  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 +90 -93
  85. package/core/resolve/externals.d.ts +25 -7
  86. package/core/resolve/externals.js +79 -62
  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 -55
  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 -454
  101. package/core/root/rootTypes.d.ts +461 -627
  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 -214
  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 -192
  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 -120
  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 +428 -398
  239. package/package.json +9 -3
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -624
  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 -100
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +18 -0
  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 +272 -193
  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 -747
  350. package/types.d.ts +287 -221
  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,96 +1,93 @@
1
- import { $gpuValueOf, $internal, $ownSnippet, $resolve } from "../../shared/symbols.js";
2
1
  import { snip } from "../../data/snippet.js";
3
- import { inCodegenMode } from "../../execMode.js";
4
- import { valueProxyHandler } from "../valueProxyUtils.js";
5
- import { mergeExternals, replaceExternalsInWgsl } from "../resolve/externals.js";
6
-
7
- //#region src/core/rawCodeSnippet/tgpuRawCodeSnippet.ts
2
+ import { makeDereferenceable } from "../../tgsl/makeDereferenceable.js";
3
+ import { makeResolvable } from "../../tgsl/makeResolvable.js";
4
+ import { $gpuValueOf, $internal } from "../../shared/symbols.js";
5
+ import { replaceExternalsInWgsl } from "../resolve/externals.js";
8
6
  /**
9
- * An advanced API that creates a typed shader expression which
10
- * can be injected into the final shader bundle upon use.
11
- *
12
- * @param expression The code snippet that will be injected in place of `foo.$`
13
- * @param type The type of the expression
14
- * @param [origin='runtime'] Where the value originates from.
15
- *
16
- * **-- Which origin to choose?**
17
- *
18
- * Usually 'runtime' (the default) is a safe bet, but if you're sure that the expression or
19
- * computation is constant (either a reference to a constant, a numeric literal,
20
- * or an operation on constants), then pass 'constant' as it might lead to better
21
- * optimizations.
22
- *
23
- * If what the expression is a direct reference to an existing value (e.g. a uniform, a
24
- * storage binding, ...), then choose from 'uniform', 'mutable', 'readonly', 'workgroup',
25
- * 'private' or 'handle' depending on the address space of the referred value.
26
- *
27
- * @example
28
- * ```ts
29
- * // An identifier that we know will be in the
30
- * // final shader bundle, but we cannot
31
- * // refer to it in any other way.
32
- * const existingGlobal = tgpu['~unstable']
33
- * .rawCodeSnippet('EXISTING_GLOBAL', d.f32, 'constant');
34
- *
35
- * const foo = () => {
36
- * 'use gpu';
37
- * return existingGlobal.$ * 2;
38
- * };
39
- *
40
- * const wgsl = tgpu.resolve([foo]);
41
- * // fn foo() -> f32 {
42
- * // return EXISTING_GLOBAL * 2;
43
- * // }
44
- * ```
45
- */
46
- function rawCodeSnippet(expression, type, origin = "runtime") {
47
- return new TgpuRawCodeSnippetImpl(expression, type, origin);
7
+ * An advanced API that creates a typed shader expression which
8
+ * can be injected into the final shader bundle upon use.
9
+ *
10
+ * @param expression The code snippet that will be injected in place of `foo.$`
11
+ * @param type The type of the expression
12
+ * @param [origin='runtime'] Where the value originates from.
13
+ * @param [possibleSideEffects=true] Whether generating this snippet may produce a WGSL expression with observable side-effects (e.g. calling a barrier, discarding a fragment, or writing to memory).
14
+ *
15
+ * **-- Which origin to choose?**
16
+ *
17
+ * Usually 'runtime' (the default) is a safe bet, but if you're sure that the expression or
18
+ * computation is constant (either a reference to a constant, a numeric literal,
19
+ * or an operation on constants), then pass 'constant' as it might lead to better
20
+ * optimizations.
21
+ *
22
+ * If what the expression is a direct reference to an existing value (e.g. a uniform, a
23
+ * storage binding, ...), then choose from 'uniform', 'mutable', 'readonly', 'workgroup',
24
+ * 'private' or 'handle' depending on the address space of the referred value.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * // An identifier that we know will be in the
29
+ * // final shader bundle, but we cannot
30
+ * // refer to it in any other way.
31
+ * const existingGlobal = tgpu['~unstable']
32
+ * .rawCodeSnippet('EXISTING_GLOBAL', d.f32, 'constant', false);
33
+ *
34
+ * const foo = () => {
35
+ * 'use gpu';
36
+ * return existingGlobal.$ * 2;
37
+ * };
38
+ *
39
+ * const wgsl = tgpu.resolve([foo]);
40
+ * // fn foo() -> f32 {
41
+ * // return EXISTING_GLOBAL * 2;
42
+ * // }
43
+ * ```
44
+ */
45
+ export function rawCodeSnippet(expression, type, origin = 'runtime', possibleSideEffects = true) {
46
+ return new TgpuRawCodeSnippetImpl(expression, type, origin, possibleSideEffects);
47
+ }
48
+ // --------------
49
+ // Implementation
50
+ // --------------
51
+ class TgpuRawCodeSnippetImpl {
52
+ dataType;
53
+ origin;
54
+ possibleSideEffects;
55
+ #expression;
56
+ #externals;
57
+ static {
58
+ TgpuRawCodeSnippetImpl.prototype[$internal] = true;
59
+ makeDereferenceable(makeResolvable(TgpuRawCodeSnippetImpl.prototype, {
60
+ asString() {
61
+ return `raw(${String(this.dataType)}): "${this.#expression}"`;
62
+ },
63
+ resolve(ctx) {
64
+ const replacedExpression = replaceExternalsInWgsl(ctx, this.#externals ?? {}, this.#expression);
65
+ return snip(replacedExpression, this.dataType, this.origin, this.possibleSideEffects);
66
+ },
67
+ }), {
68
+ codegenMode: {
69
+ getBaseSnippet(trackingProxy) {
70
+ return snip(trackingProxy, this.dataType, this.origin, this.possibleSideEffects);
71
+ },
72
+ },
73
+ normalMode: {
74
+ get() {
75
+ throw new Error('Raw code snippets can only be used on the GPU.');
76
+ },
77
+ },
78
+ });
79
+ }
80
+ constructor(expression, type, origin, possibleSideEffects) {
81
+ this.dataType = type;
82
+ this.origin = origin;
83
+ this.possibleSideEffects = possibleSideEffects;
84
+ this.#expression = expression;
85
+ }
86
+ $uses(dependencyMap) {
87
+ if (this.#externals !== undefined) {
88
+ throw new Error("Cannot call '$uses' multiple times. If you wish to override dependencies, use slots or accessors instead.");
89
+ }
90
+ this.#externals = dependencyMap;
91
+ return this;
92
+ }
48
93
  }
49
- var TgpuRawCodeSnippetImpl = class {
50
- [$internal];
51
- dataType;
52
- origin;
53
- #expression;
54
- #externalsToApply;
55
- constructor(expression, type, origin) {
56
- this[$internal] = true;
57
- this.dataType = type;
58
- this.origin = origin;
59
- this.#expression = expression;
60
- this.#externalsToApply = [];
61
- }
62
- $uses(dependencyMap) {
63
- this.#externalsToApply.push(dependencyMap);
64
- return this;
65
- }
66
- [$resolve](ctx) {
67
- const externalMap = {};
68
- for (const externals of this.#externalsToApply) mergeExternals(externalMap, externals);
69
- return snip(replaceExternalsInWgsl(ctx, externalMap, this.#expression), this.dataType, this.origin);
70
- }
71
- toString() {
72
- return `raw(${String(this.dataType)}): "${this.#expression}"`;
73
- }
74
- get [$gpuValueOf]() {
75
- const dataType = this.dataType;
76
- const origin = this.origin;
77
- return new Proxy({
78
- [$internal]: true,
79
- get [$ownSnippet]() {
80
- return snip(this, dataType, origin);
81
- },
82
- [$resolve]: (ctx) => ctx.resolve(this),
83
- toString: () => `raw(${String(this.dataType)}): "${this.#expression}".$`
84
- }, valueProxyHandler);
85
- }
86
- get $() {
87
- if (!inCodegenMode()) throw new Error("Raw code snippets can only be used on the GPU.");
88
- return this[$gpuValueOf];
89
- }
90
- get value() {
91
- return this.$;
92
- }
93
- };
94
-
95
- //#endregion
96
- export { rawCodeSnippet };
@@ -1,11 +1,29 @@
1
- import "../../types.js";
2
-
3
- //#region src/core/resolve/externals.d.ts
4
-
1
+ import { type ResolutionCtx } from '../../types.ts';
2
+ import type { FnExternals } from '../function/fnCore.ts';
5
3
  /**
6
4
  * A key-value mapping where keys represent identifiers within shader code,
7
5
  * and values can either be another ExternalMap, or be any type that can be resolved to a code string.
8
6
  */
9
- type ExternalMap = Record<string, unknown>;
10
- //#endregion
11
- export { ExternalMap };
7
+ export type ExternalMap = Record<string, unknown>;
8
+ /**
9
+ * Merges function externals into one map.
10
+ */
11
+ export declare function mergeFunctionExternals(fnExternals: FnExternals): ExternalMap;
12
+ export declare function addArgTypesToExternals(implementation: string, argTypes: unknown[], core: {
13
+ setExternals: (key: 'args', externals: ExternalMap) => void;
14
+ }): void;
15
+ export declare function addReturnTypeToExternals(implementation: string, returnType: unknown, core: {
16
+ setExternals: (key: 'out', externals: ExternalMap) => void;
17
+ }): void;
18
+ export declare const anyIdent: RegExp;
19
+ export declare const boundedPropChain: RegExp;
20
+ /**
21
+ * Replaces all occurrences of external names in WGSL code with their resolved values.
22
+ * It adds all necessary definitions to the resolution context.
23
+ * @param ctx - The resolution context.
24
+ * @param externalMap - The external map. Assumes that keys don't contain dots.
25
+ * @param wgsl - The WGSL code.
26
+ *
27
+ * @returns The WGSL code with all external names replaced with their resolved values.
28
+ */
29
+ export declare function replaceExternalsInWgsl(ctx: ResolutionCtx, externalMap: ExternalMap, wgsl: string): string;
@@ -1,72 +1,89 @@
1
- import { isWgslStruct } from "../../data/wgslTypes.js";
2
- import { getName, hasTinyestMetadata, setName } from "../../shared/meta.js";
3
1
  import { isLooseData } from "../../data/dataTypes.js";
2
+ import { isWgslStruct } from "../../data/wgslTypes.js";
3
+ import { getName, hasTinyestMetadata, isNamable, setName } from "../../shared/meta.js";
4
+ import { logger } from "../../tgpuLogger.js";
4
5
  import { isWgsl } from "../../types.js";
5
-
6
- //#region src/core/resolve/externals.ts
7
6
  function isResolvable(value) {
8
- return isWgsl(value) || isLooseData(value) || hasTinyestMetadata(value);
7
+ return isWgsl(value) || isLooseData(value) || hasTinyestMetadata(value);
9
8
  }
10
9
  /**
11
- * Merges two external maps into one.
12
- * If the external value is a namable object, it is given a name if it does not already have one.
13
- * @param existing - The existing external map.
14
- * @param newExternals - The new external map.
15
- *
16
- * NOTE:
17
- * This function attempts to avoid accidental reference modification
18
- * by performing a shallow copy before each modification,
19
- * but it cannot avoid `existing` modification.
20
- * Make sure that `existing` is created internally, instead of being passed in by users.
21
- */
22
- function mergeExternals(existing, newExternals) {
23
- for (const [key, value] of Object.entries(newExternals)) {
24
- const existingValue = existing[key];
25
- if (existingValue !== null && typeof existingValue === "object" && value !== null && typeof value === "object" && !isResolvable(existingValue) && !isResolvable(value)) {
26
- const copiedValue = { ...existingValue };
27
- mergeExternals(copiedValue, value);
28
- existing[key] = copiedValue;
29
- } else existing[key] = value;
30
- if (value && (typeof value === "object" || typeof value === "function") && getName(value) === void 0) setName(value, key);
31
- }
32
- }
33
- function addArgTypesToExternals(implementation, argTypes, applyExternals) {
34
- const argTypeNames = [...implementation.matchAll(/:\s*(?<arg>.*?)\s*[,)]/g)].map((found) => found ? found[1] : void 0);
35
- applyExternals(Object.fromEntries(argTypes.flatMap((argType, i) => {
36
- const argTypeName = argTypeNames ? argTypeNames[i] : void 0;
37
- return isWgslStruct(argType) && argTypeName !== void 0 ? [[argTypeName, argType]] : [];
38
- })));
10
+ * Merges function externals into one map.
11
+ */
12
+ export function mergeFunctionExternals(fnExternals) {
13
+ const base = fnExternals.pluginProvided ?? fnExternals.userProvided ?? {};
14
+ // avoid calling any of the getters
15
+ const result = Object.defineProperties({}, Object.getOwnPropertyDescriptors(base));
16
+ for (const flatExternal of [fnExternals.args, fnExternals.out].filter((e) => e !== undefined)) {
17
+ for (const [key, value] of Object.entries(flatExternal)) {
18
+ if (key in result && result[key] !== value) {
19
+ throw new Error(`Key '${key}' appears in externals despite already being used for argument/return type. Please rename this external.`);
20
+ }
21
+ result[key] = value;
22
+ }
23
+ }
24
+ return result;
39
25
  }
40
- function addReturnTypeToExternals(implementation, returnType, applyExternals) {
41
- const matched = implementation.match(/->\s(?<output>[\w\d_]+)\s{/);
42
- const outputName = matched ? matched[1]?.trim() : void 0;
43
- if (isWgslStruct(returnType) && outputName && !/\s/g.test(outputName)) applyExternals({ [outputName]: returnType });
26
+ export function addArgTypesToExternals(implementation, argTypes, core) {
27
+ const argTypeNames = [...implementation.matchAll(/:\s*(?<arg>.*?)\s*[,)]/g)].map((found) => found?.[1]);
28
+ const args = Object.fromEntries(argTypes.flatMap((argType, i) => {
29
+ const argTypeName = argTypeNames?.[i];
30
+ return isWgslStruct(argType) && argTypeName !== undefined ? [[argTypeName, argType]] : [];
31
+ }));
32
+ core.setExternals('args', args);
44
33
  }
45
- function identifierRegex(name) {
46
- return new RegExp(`(?<![\\w\\$_.])${name.replaceAll(".", "\\.").replaceAll("$", "\\$")}(?![\\w\\$_])`, "g");
34
+ export function addReturnTypeToExternals(implementation, returnType, core) {
35
+ const matched = implementation.match(/->\s(?<output>[\w\d_]+)\s{/);
36
+ const outputName = matched ? matched[1]?.trim() : undefined;
37
+ if (isWgslStruct(returnType) && outputName && !/\s/g.test(outputName)) {
38
+ core.setExternals('out', { [outputName]: returnType });
39
+ }
47
40
  }
41
+ export const anyIdent = /([$_\p{XID_Start}][$\p{XID_Continue}]*)/u; // WGSL ident, modified to include $
42
+ const anyPropChain = new RegExp(`(${anyIdent.source})(\\.${anyIdent.source})*`, 'ug');
43
+ export const boundedPropChain = new RegExp(`(?<![\\p{XID_Continue}\\$.])${anyPropChain.source}(?![\\p{XID_Continue}\\$])`, 'ug');
48
44
  /**
49
- * Replaces all occurrences of external names in WGSL code with their resolved values.
50
- * It adds all necessary definitions to the resolution context.
51
- * @param ctx - The resolution context.
52
- * @param externalMap - The external map.
53
- * @param wgsl - The WGSL code.
54
- *
55
- * @returns The WGSL code with all external names replaced with their resolved values.
56
- */
57
- function replaceExternalsInWgsl(ctx, externalMap, wgsl) {
58
- return Object.entries(externalMap).reduce((acc, [externalName, external]) => {
59
- const externalRegex = identifierRegex(externalName);
60
- if (wgsl && externalName !== "Out" && externalName !== "in" && !externalRegex.test(wgsl)) console.warn(`The external '${externalName}' wasn't used in the resolved template.`);
61
- if (isResolvable(external)) return acc.replaceAll(externalRegex, ctx.resolve(external).value);
62
- if (external !== null && typeof external === "object") {
63
- const foundProperties = [...wgsl.matchAll(new RegExp(`${externalName.replaceAll(".", "\\.").replaceAll("$", "\\$")}\\.(?<prop>.*?)(?![\\w\\$_])`, "g"))].map((found) => found[1]);
64
- return [...new Set(foundProperties)].reduce((innerAcc, prop) => prop && prop in external ? replaceExternalsInWgsl(ctx, { [`${externalName}.${prop}`]: external[prop] }, innerAcc) : innerAcc, acc);
65
- }
66
- console.warn(`During resolution, the external '${externalName}' has been omitted. Only TGPU resources, 'use gpu' functions, primitives, and plain JS objects can be used as externals.`);
67
- return acc;
68
- }, wgsl);
45
+ * Replaces all occurrences of external names in WGSL code with their resolved values.
46
+ * It adds all necessary definitions to the resolution context.
47
+ * @param ctx - The resolution context.
48
+ * @param externalMap - The external map. Assumes that keys don't contain dots.
49
+ * @param wgsl - The WGSL code.
50
+ *
51
+ * @returns The WGSL code with all external names replaced with their resolved values.
52
+ */
53
+ export function replaceExternalsInWgsl(ctx, externalMap, wgsl) {
54
+ const keys = Object.keys(externalMap);
55
+ if (keys.length === 0) {
56
+ return wgsl;
57
+ }
58
+ const maybeInvalidKey = keys.find((key) => key.includes('.'));
59
+ if (maybeInvalidKey) {
60
+ throw new Error(`External key '${maybeInvalidKey}' contains invalid character '.'`);
61
+ }
62
+ return wgsl.replaceAll(boundedPropChain, (match) => {
63
+ const chain = match.split('.');
64
+ if (!Object.hasOwn(externalMap, chain.at(0))) {
65
+ // this prop access does not start with an external
66
+ return match;
67
+ }
68
+ let currentItem = externalMap;
69
+ let suffix = '';
70
+ for (const [i, elem] of chain.entries()) {
71
+ currentItem = currentItem[elem];
72
+ if (isResolvable(currentItem) || typeof currentItem === 'string') {
73
+ suffix = chain
74
+ .slice(i + 1)
75
+ .map((s) => `.${s}`)
76
+ .join('');
77
+ if (isNamable(currentItem) && getName(currentItem) === undefined) {
78
+ setName(currentItem, chain.slice(0, i + 1).join('_'));
79
+ }
80
+ break;
81
+ }
82
+ if (typeof currentItem !== 'object' || currentItem === null || i === chain.length - 1) {
83
+ logger.warn('external-omitted', `During resolution, the external '${chain.slice(0, i + 1).join('.')}' has been omitted. Only TGPU resources, 'use gpu' functions, primitives, and plain JS objects can be used as externals.`);
84
+ return match;
85
+ }
86
+ }
87
+ return ctx.resolve(currentItem).value + suffix;
88
+ });
69
89
  }
70
-
71
- //#endregion
72
- export { addArgTypesToExternals, addReturnTypeToExternals, mergeExternals, replaceExternalsInWgsl };
@@ -1,29 +1,26 @@
1
- import { $internal } from "../../shared/symbols.js";
2
- import { ResolvedSnippet } from "../../data/snippet.js";
3
- import { ShelllessRepository } from "../../tgsl/shellless.js";
4
- import { TgpuLazy, TgpuSlot } from "../slot/slotTypes.js";
5
-
6
- //#region src/core/resolve/namespace.d.ts
1
+ import type { ResolvedSnippet } from '../../data/snippet.ts';
2
+ import { $internal } from '../../shared/symbols.ts';
3
+ import { ShelllessRepository } from '../../tgsl/shellless.ts';
4
+ import type { TgpuLazy, TgpuSlot } from '../slot/slotTypes.ts';
7
5
  type SlotToValueMap = Map<TgpuSlot<unknown>, unknown>;
8
- interface NamespaceInternal {
9
- readonly takenGlobalIdentifiers: Set<string>;
10
- readonly shelllessRepo: ShelllessRepository;
11
- readonly strategy: 'random' | 'strict';
12
- memoizedResolves: WeakMap<object, {
13
- slotToValueMap: SlotToValueMap;
14
- result: ResolvedSnippet;
15
- }[]>;
16
- memoizedLazy: WeakMap<TgpuLazy<unknown>, {
17
- slotToValueMap: SlotToValueMap;
18
- result: unknown;
19
- }[]>;
6
+ export interface NamespaceInternal {
7
+ readonly takenGlobalIdentifiers: Set<string>;
8
+ readonly shelllessRepo: ShelllessRepository;
9
+ readonly strategy: 'random' | 'strict';
10
+ memoizedResolves: WeakMap<object, {
11
+ slotToValueMap: SlotToValueMap;
12
+ result: ResolvedSnippet;
13
+ }[]>;
14
+ memoizedLazy: WeakMap<TgpuLazy<unknown>, {
15
+ slotToValueMap: SlotToValueMap;
16
+ result: unknown;
17
+ }[]>;
20
18
  }
21
- interface Namespace {
22
- readonly [$internal]: NamespaceInternal;
19
+ export interface Namespace {
20
+ readonly [$internal]: NamespaceInternal;
23
21
  }
24
- interface NamespaceOptions {
25
- names?: 'random' | 'strict' | undefined;
22
+ export interface NamespaceOptions {
23
+ names?: 'random' | 'strict' | undefined;
26
24
  }
27
- declare function namespace(options?: NamespaceOptions): Namespace;
28
- //#endregion
29
- export { Namespace, namespace };
25
+ export declare function namespace(options?: NamespaceOptions): Namespace;
26
+ export {};
@@ -1,24 +1,19 @@
1
- import { $internal } from "../../shared/symbols.js";
2
1
  import { bannedTokens, builtins } from "../../nameUtils.js";
2
+ import { $internal } from "../../shared/symbols.js";
3
3
  import { ShelllessRepository } from "../../tgsl/shellless.js";
4
-
5
- //#region src/core/resolve/namespace.ts
6
- var NamespaceImpl = class {
7
- [$internal];
8
- constructor(strategy) {
9
- this[$internal] = {
10
- strategy,
11
- takenGlobalIdentifiers: new Set([...bannedTokens, ...builtins]),
12
- shelllessRepo: new ShelllessRepository(),
13
- memoizedResolves: /* @__PURE__ */ new WeakMap(),
14
- memoizedLazy: /* @__PURE__ */ new WeakMap()
15
- };
16
- }
17
- };
18
- function namespace(options) {
19
- const { names = "strict" } = options ?? {};
20
- return new NamespaceImpl(names);
4
+ class NamespaceImpl {
5
+ [$internal];
6
+ constructor(strategy) {
7
+ this[$internal] = {
8
+ strategy,
9
+ takenGlobalIdentifiers: new Set([...bannedTokens, ...builtins]),
10
+ shelllessRepo: new ShelllessRepository(),
11
+ memoizedResolves: new WeakMap(),
12
+ memoizedLazy: new WeakMap(),
13
+ };
14
+ }
15
+ }
16
+ export function namespace(options) {
17
+ const { names = 'strict' } = options ?? {};
18
+ return new NamespaceImpl(names);
21
19
  }
22
-
23
- //#endregion
24
- export { namespace };
@@ -0,0 +1,7 @@
1
+ import { $internal, $resolve } from '../../shared/symbols.ts';
2
+ export declare class ResolvableString {
3
+ #private;
4
+ [$internal]: boolean;
5
+ constructor(value: string);
6
+ [$resolve](): import("../../internal.ts").Snippet;
7
+ }
@@ -0,0 +1,13 @@
1
+ import { UnknownData } from "../../data/dataTypes.js";
2
+ import { snip } from "../../data/snippet.js";
3
+ import { $internal, $resolve } from "../../shared/symbols.js";
4
+ export class ResolvableString {
5
+ [$internal] = true;
6
+ #value;
7
+ constructor(value) {
8
+ this.#value = value;
9
+ }
10
+ [$resolve]() {
11
+ return snip(this.#value, UnknownData, 'runtime', true);
12
+ }
13
+ }
@@ -0,0 +1,10 @@
1
+ import { type AnyData } from '../../data/dataTypes.ts';
2
+ import type { ResolutionCtx } from '../../types.ts';
3
+ /**
4
+ * Resolves a WGSL data-type schema to a string.
5
+ * @param ctx - The resolution context.
6
+ * @param data - The data-type to resolve.
7
+ *
8
+ * @returns The resolved data-type string.
9
+ */
10
+ export declare function resolveData(ctx: ResolutionCtx, data: AnyData): string;