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,87 @@
1
1
  import { $gpuCallable, $internal, $resolve } from "../../shared/symbols.js";
2
2
  import { setName } from "../../shared/meta.js";
3
- import { snip } from "../../data/snippet.js";
4
- import { stitch } from "../resolve/stitch.js";
5
-
6
- //#region src/core/unroll/tgpuUnroll.ts
3
+ import { withValue } from "../../data/snippet.js";
7
4
  /**
8
- * The result of calling `tgpu.unroll(...)`. The code responsible for
9
- * generating shader code can check if the value of a snippet is
10
- * an instance of `UnrollableIterable`, and act accordingly.
11
- */
12
- var UnrollableIterable = class {
13
- [$internal] = true;
14
- snippet;
15
- constructor(snippet) {
16
- this.snippet = snippet;
17
- }
18
- [$resolve](_ctx) {
19
- return snip(stitch`${this.snippet}`, this.snippet.dataType, this.snippet.origin);
20
- }
21
- };
5
+ * The result of calling `tgpu.unroll(...)`. The code responsible for
6
+ * generating shader code can check if the value of a snippet is
7
+ * an instance of `UnrollableIterable`, and act accordingly.
8
+ */
9
+ export class UnrollableIterable {
10
+ [$internal] = true;
11
+ snippet;
12
+ constructor(snippet) {
13
+ this.snippet = snippet;
14
+ }
15
+ [$resolve](ctx) {
16
+ return ctx.resolveSnippet(this.snippet);
17
+ }
18
+ }
22
19
  /**
23
- * Marks an iterable to be unrolled by the shader generator when used in a for loop.
24
- *
25
- * @example
26
- * ```ts
27
- * const neighborOffsets = [d.vec2i(0, 1), d.vec2i(0, -1), d.vec2i(1, 0), d.vec2i(-1, 0)];
28
- *
29
- * // Unrolls into 4 blocks of code, one for each offset.
30
- * for (const offset of tgpu.unroll(neighborOffsets)) {
31
- * // ...
32
- * }
33
- * ```
34
- *
35
- * If you'd like to unroll over a range of numbers, use `tgpu.unroll(std.range(n))`.
36
- *
37
- * @example
38
- * ```ts
39
- * // (...)
40
- * const FBM_OCTAVES = 3;
41
- *
42
- * function fbm(pos: d.v3f): number {
43
- * 'use gpu';
44
- * let sum = d.f32();
45
- *
46
- * // i = 0, 1, 2
47
- * for (const i of tgpu.unroll(std.range(FBM_OCTAVES))) {
48
- * sum +=
49
- * noise3d(pos * (CLOUD_FREQUENCY * FBM_LACUNARITY ** i)) *
50
- * (CLOUD_AMPLITUDE * FBM_PERSISTENCE ** i);
51
- * }
52
- *
53
- * return sum;
54
- * }
55
- *
56
- * ```
57
- *
58
- * Generates:
59
- *
60
- * ```wgsl
61
- * // (...)
62
- *
63
- * fn fbm(pos: vec3f) -> f32 {
64
- * var sum = 0f;
65
- * // unrolled iteration #0
66
- * {
67
- * sum += noise3d(pos * 1.4f) * 1f;
68
- * }
69
- * // unrolled iteration #1
70
- * {
71
- * sum += noise3d(pos * 2.8f) * 0.5f;
72
- * }
73
- * // unrolled iteration #2
74
- * {
75
- * sum += noise3d(pos * 5.6f) * 0.25f;
76
- * }
77
- * return sum;
78
- * }
79
- * ```
80
- */
81
- const unroll = (() => {
82
- function jsImpl(iterable) {
83
- return iterable;
84
- }
85
- const impl = jsImpl;
86
- setName(impl, "unroll");
87
- impl.toString = () => "unroll";
88
- impl[$internal] = true;
89
- impl[$gpuCallable] = { call(_ctx, [value]) {
90
- return snip(new UnrollableIterable(value), value.dataType, value.origin);
91
- } };
92
- return impl;
20
+ * Marks an iterable to be unrolled by the shader generator when used in a for loop.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const neighborOffsets = [d.vec2i(0, 1), d.vec2i(0, -1), d.vec2i(1, 0), d.vec2i(-1, 0)];
25
+ *
26
+ * // Unrolls into 4 blocks of code, one for each offset.
27
+ * for (const offset of tgpu.unroll(neighborOffsets)) {
28
+ * // ...
29
+ * }
30
+ * ```
31
+ *
32
+ * If you'd like to unroll over a range of numbers, use `tgpu.unroll(std.range(n))`.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // (...)
37
+ * const FBM_OCTAVES = 3;
38
+ *
39
+ * function fbm(pos: d.v3f): number {
40
+ * 'use gpu';
41
+ * let sum = d.f32();
42
+ *
43
+ * // i = 0, 1, 2
44
+ * for (const i of tgpu.unroll(std.range(FBM_OCTAVES))) {
45
+ * sum +=
46
+ * noise3d(pos * (CLOUD_FREQUENCY * FBM_LACUNARITY ** i)) *
47
+ * (CLOUD_AMPLITUDE * FBM_PERSISTENCE ** i);
48
+ * }
49
+ *
50
+ * return sum;
51
+ * }
52
+ *
53
+ * ```
54
+ *
55
+ * Generates:
56
+ *
57
+ * ```wgsl
58
+ * // (...)
59
+ *
60
+ * fn fbm(pos: vec3f) -> f32 {
61
+ * var sum = 0f;
62
+ * // unrolled iteration #0
63
+ * sum += noise3d(pos * 1.4f) * 1f;
64
+ * // unrolled iteration #1
65
+ * sum += noise3d(pos * 2.8f) * 0.5f;
66
+ * // unrolled iteration #2
67
+ * sum += noise3d(pos * 5.6f) * 0.25f;
68
+ * // ---
69
+ * return sum;
70
+ * }
71
+ * ```
72
+ */
73
+ export const unroll = (() => {
74
+ function jsImpl(iterable) {
75
+ return iterable;
76
+ }
77
+ const impl = jsImpl;
78
+ setName(impl, 'unroll');
79
+ impl.toString = () => 'unroll';
80
+ impl[$internal] = true;
81
+ impl[$gpuCallable] = {
82
+ call(_ctx, [value]) {
83
+ return withValue(new UnrollableIterable(value), value);
84
+ },
85
+ };
86
+ return impl;
93
87
  })();
94
-
95
- //#endregion
96
- export { UnrollableIterable, unroll };
@@ -0,0 +1,3 @@
1
+ import { type SelfResolvable, type WithOwnSnippet } from '../types.ts';
2
+ export declare const valueProxyHandler: ProxyHandler<SelfResolvable & WithOwnSnippet>;
3
+ export declare function getGpuValueRecursively<T>(value: unknown): T;
@@ -1,44 +1,55 @@
1
- import { $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
2
- import { getOwnSnippet } from "../types.js";
3
1
  import { getGPUValue } from "../getGPUValue.js";
4
- import { accessProp } from "../tgsl/accessProp.js";
2
+ import { $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
5
3
  import { accessIndex } from "../tgsl/accessIndex.js";
6
-
7
- //#region src/core/valueProxyUtils.ts
8
- const valueProxyHandler = { get(target, prop) {
9
- if (prop in target) return Reflect.get(target, prop);
10
- if (prop === "toString" || prop === Symbol.toStringTag || prop === Symbol.toPrimitive) return () => target.toString();
11
- if (typeof prop === "symbol") return;
12
- const targetSnippet = getOwnSnippet(target);
13
- const index = Number(prop);
14
- if (!Number.isNaN(index)) {
15
- const accessed$1 = accessIndex(targetSnippet, index);
16
- if (!accessed$1) return;
17
- return new Proxy({
18
- [$internal]: true,
19
- [$resolve]: (ctx) => ctx.resolve(accessed$1.value, accessed$1.dataType),
20
- [$ownSnippet]: accessed$1,
21
- toString: () => `${String(target)}[${prop}]`
22
- }, valueProxyHandler);
23
- }
24
- const accessed = accessProp(targetSnippet, String(prop));
25
- if (!accessed) return;
26
- return new Proxy({
27
- [$internal]: true,
28
- [$resolve]: (ctx) => ctx.resolve(accessed.value, accessed.dataType),
29
- [$ownSnippet]: accessed,
30
- toString: () => `${String(target)}.${prop}`
31
- }, valueProxyHandler);
32
- } };
33
- function getGpuValueRecursively(value) {
34
- let unwrapped = value;
35
- while (true) {
36
- const gpuValue = getGPUValue(unwrapped);
37
- if (!gpuValue) break;
38
- unwrapped = gpuValue;
39
- }
40
- return unwrapped;
4
+ import { accessProp } from "../tgsl/accessProp.js";
5
+ import { getOwnSnippet } from "../types.js";
6
+ export const valueProxyHandler = {
7
+ get(target, prop) {
8
+ if (prop in target) {
9
+ return Reflect.get(target, prop);
10
+ }
11
+ if (prop === 'toString' || prop === Symbol.toStringTag || prop === Symbol.toPrimitive) {
12
+ return () => target.toString();
13
+ }
14
+ if (typeof prop === 'symbol') {
15
+ return undefined;
16
+ }
17
+ const targetSnippet = getOwnSnippet(target);
18
+ const index = Number(prop);
19
+ if (!Number.isNaN(index)) {
20
+ const accessed = accessIndex(targetSnippet, index);
21
+ if (!accessed) {
22
+ // Prop was not found, must be missing from this object
23
+ return undefined;
24
+ }
25
+ return new Proxy({
26
+ [$internal]: true,
27
+ [$resolve]: (ctx) => ctx.resolveSnippet(accessed),
28
+ [$ownSnippet]: accessed,
29
+ toString: () => `${String(target)}[${prop}]`,
30
+ }, valueProxyHandler);
31
+ }
32
+ const accessed = accessProp(targetSnippet, String(prop));
33
+ if (!accessed) {
34
+ // Prop was not found, must be missing from this object
35
+ return undefined;
36
+ }
37
+ return new Proxy({
38
+ [$internal]: true,
39
+ [$resolve]: (ctx) => ctx.resolveSnippet(accessed),
40
+ [$ownSnippet]: accessed,
41
+ toString: () => `${String(target)}.${prop}`,
42
+ }, valueProxyHandler);
43
+ },
44
+ };
45
+ export function getGpuValueRecursively(value) {
46
+ let unwrapped = value;
47
+ while (true) {
48
+ const gpuValue = getGPUValue(unwrapped);
49
+ if (!gpuValue) {
50
+ break;
51
+ }
52
+ unwrapped = gpuValue;
53
+ }
54
+ return unwrapped;
41
55
  }
42
-
43
- //#endregion
44
- export { getGpuValueRecursively, valueProxyHandler };
@@ -1,25 +1,26 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $gpuValueOf, $internal } from "../../shared/symbols.js";
3
- import { BaseData } from "../../data/wgslTypes.js";
4
- import { InferGPU } from "../../shared/repr.js";
5
- import { AnyData } from "../../data/dataTypes.js";
6
-
7
- //#region src/core/variable/tgpuVariable.d.ts
8
- type VariableScope = 'private' | 'workgroup';
9
- interface TgpuVar<TScope extends VariableScope = VariableScope, TDataType extends BaseData = BaseData> extends TgpuNamable {
10
- readonly resourceType: 'var';
11
- readonly [$gpuValueOf]: InferGPU<TDataType>;
12
- /**
13
- * @deprecated Use `.$` instead, works the same way.
14
- */
15
- value: InferGPU<TDataType>;
16
- $: InferGPU<TDataType>;
17
- readonly [$internal]: {
18
- /** Makes it differentiable on the type level. Does not exist at runtime. */
19
- dataType?: TDataType;
20
- /** Makes it differentiable on the type level. Does not exist at runtime. */
21
- scope?: TScope;
22
- };
1
+ import type { AnyData } from '../../data/dataTypes.ts';
2
+ import type { BaseData } from '../../data/wgslTypes.ts';
3
+ import type { TgpuNamable } from '../../shared/meta.ts';
4
+ import type { InferGPU } from '../../shared/repr.ts';
5
+ import type { TgpuSoul } from '../../shared/soul.ts';
6
+ import { $gpuValueOf, $internal, $soul } from '../../shared/symbols.ts';
7
+ export type VariableScope = 'private' | 'workgroup';
8
+ export interface TgpuVarSoul<TScope extends VariableScope = VariableScope, TDataType extends BaseData = BaseData> extends TgpuSoul<'var'> {
9
+ readonly scope: TScope;
10
+ readonly dataType: TDataType;
11
+ readonly initialValue: InferGPU<TDataType> | undefined;
12
+ }
13
+ export interface TgpuVar<TScope extends VariableScope = VariableScope, TDataType extends BaseData = BaseData> extends TgpuNamable {
14
+ readonly resourceType: 'var';
15
+ readonly [$gpuValueOf]: InferGPU<TDataType>;
16
+ $: InferGPU<TDataType>;
17
+ readonly [$soul]: TgpuVarSoul<TScope, TDataType>;
18
+ readonly [$internal]: {
19
+ /** Makes it differentiable on the type level. Does not exist at runtime. */
20
+ dataType?: TDataType;
21
+ /** Makes it differentiable on the type level. Does not exist at runtime. */
22
+ scope?: TScope;
23
+ };
23
24
  }
24
25
  /**
25
26
  * Defines a variable scoped to each entry function (private).
@@ -27,14 +28,12 @@ interface TgpuVar<TScope extends VariableScope = VariableScope, TDataType extend
27
28
  * @param dataType The schema of the held data's type
28
29
  * @param initialValue If not provided, the variable will be initialized to the dataType's "zero-value".
29
30
  */
30
- declare function privateVar<TDataType extends AnyData>(dataType: TDataType, initialValue?: InferGPU<TDataType>): TgpuVar<'private', TDataType>;
31
+ export declare function privateVar<TDataType extends AnyData>(dataType: TDataType, initialValue?: InferGPU<TDataType>): TgpuVar<'private', TDataType>;
31
32
  /**
32
33
  * Defines a variable scoped to the whole workgroup, shared between entry functions
33
34
  * of the same invocation.
34
35
  *
35
36
  * @param dataType The schema of the held data's type
36
37
  */
37
- declare function workgroupVar<TDataType extends AnyData>(dataType: TDataType): TgpuVar<'workgroup', TDataType>;
38
- declare function isVariable(value: unknown): value is TgpuVar;
39
- //#endregion
40
- export { TgpuVar, VariableScope, isVariable, privateVar, workgroupVar };
38
+ export declare function workgroupVar<TDataType extends AnyData>(dataType: TDataType): TgpuVar<'workgroup', TDataType>;
39
+ export declare function isVariable(value: unknown): value is TgpuVar;
@@ -1,103 +1,100 @@
1
- import { $gpuValueOf, $internal, $ownSnippet, $resolve } from "../../shared/symbols.js";
2
- import { getName, setName } from "../../shared/meta.js";
3
1
  import { snip } from "../../data/snippet.js";
4
2
  import { IllegalVarAccessError } from "../../errors.js";
5
- import { getExecMode, isInsideTgpuFn } from "../../execMode.js";
6
- import { assertExhaustive } from "../../shared/utilityTypes.js";
7
- import { valueProxyHandler } from "../valueProxyUtils.js";
8
-
9
- //#region src/core/variable/tgpuVariable.ts
3
+ import { isInsideTgpuFn } from "../../execMode.js";
4
+ import { makeDereferenceable } from "../../tgsl/makeDereferenceable.js";
5
+ import { makeResolvable } from "../../tgsl/makeResolvable.js";
6
+ import { getName, setName } from "../../shared/meta.js";
7
+ import { $gpuValueOf, $internal, $soul } from "../../shared/symbols.js";
10
8
  /**
11
- * Defines a variable scoped to each entry function (private).
12
- *
13
- * @param dataType The schema of the held data's type
14
- * @param initialValue If not provided, the variable will be initialized to the dataType's "zero-value".
15
- */
16
- function privateVar(dataType, initialValue) {
17
- return new TgpuVarImpl("private", dataType, initialValue);
9
+ * Defines a variable scoped to each entry function (private).
10
+ *
11
+ * @param dataType The schema of the held data's type
12
+ * @param initialValue If not provided, the variable will be initialized to the dataType's "zero-value".
13
+ */
14
+ export function privateVar(dataType, initialValue) {
15
+ return new TgpuVarImpl('private', dataType, initialValue);
18
16
  }
19
17
  /**
20
- * Defines a variable scoped to the whole workgroup, shared between entry functions
21
- * of the same invocation.
22
- *
23
- * @param dataType The schema of the held data's type
24
- */
25
- function workgroupVar(dataType) {
26
- return new TgpuVarImpl("workgroup", dataType);
18
+ * Defines a variable scoped to the whole workgroup, shared between entry functions
19
+ * of the same invocation.
20
+ *
21
+ * @param dataType The schema of the held data's type
22
+ */
23
+ export function workgroupVar(dataType) {
24
+ return new TgpuVarImpl('workgroup', dataType);
25
+ }
26
+ export function isVariable(value) {
27
+ return value instanceof TgpuVarImpl;
27
28
  }
28
- function isVariable(value) {
29
- return value instanceof TgpuVarImpl;
29
+ // --------------
30
+ // Implementation
31
+ // --------------
32
+ class TgpuVarImpl {
33
+ [$soul];
34
+ static {
35
+ const prototype = TgpuVarImpl.prototype;
36
+ prototype.resourceType = 'var';
37
+ prototype[$internal] = {};
38
+ makeDereferenceable(makeResolvable(prototype, {
39
+ asString() {
40
+ return `var:${getName(this) ?? '<unnamed>'}`;
41
+ },
42
+ resolve(ctx) {
43
+ const id = ctx.makeUniqueIdentifier(getName(this), 'global');
44
+ const init = this[$soul].initialValue
45
+ ? snip(this[$soul].initialValue, this[$soul].dataType, 'constant')
46
+ : undefined;
47
+ return ctx.gen.declareGlobalVar({
48
+ scope: this[$soul].scope,
49
+ id,
50
+ dataType: this[$soul].dataType,
51
+ init,
52
+ });
53
+ },
54
+ }), {
55
+ codegenMode: {
56
+ getBaseSnippet(trackingProxy) {
57
+ return snip(trackingProxy, this[$soul].dataType, this[$soul].scope,
58
+ /* possibleSideEffects */ false);
59
+ },
60
+ },
61
+ simulateMode: {
62
+ get(state) {
63
+ if (!state.vars[this[$soul].scope].has(this)) {
64
+ // Not initialized yet
65
+ state.vars[this[$soul].scope].set(this, this[$soul].initialValue);
66
+ }
67
+ return state.vars[this[$soul].scope].get(this);
68
+ },
69
+ set(state, value) {
70
+ state.vars[this[$soul].scope].set(this, value);
71
+ },
72
+ },
73
+ normalMode: {
74
+ get() {
75
+ throw new IllegalVarAccessError(isInsideTgpuFn()
76
+ ? `Cannot access variable '${getName(this) ?? '<unnamed>'}'. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation`
77
+ : 'TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`');
78
+ },
79
+ set(_value) {
80
+ throw new IllegalVarAccessError(isInsideTgpuFn()
81
+ ? `Cannot access variable ${getName(this) ?? '<unnamed>'}. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation`
82
+ : 'TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`');
83
+ },
84
+ },
85
+ });
86
+ }
87
+ constructor(scope, dataType, initialValue) {
88
+ this[$soul] = {
89
+ type: 'var',
90
+ scope,
91
+ dataType,
92
+ initialValue,
93
+ label: undefined,
94
+ };
95
+ }
96
+ $name(label) {
97
+ setName(this, label);
98
+ return this;
99
+ }
30
100
  }
31
- var TgpuVarImpl = class {
32
- [$internal] = {};
33
- resourceType;
34
- #scope;
35
- #dataType;
36
- #initialValue;
37
- constructor(scope, dataType, initialValue) {
38
- this.resourceType = "var";
39
- this.#scope = scope;
40
- this.#dataType = dataType;
41
- this.#initialValue = initialValue;
42
- }
43
- [$resolve](ctx) {
44
- const id = ctx.makeUniqueIdentifier(getName(this), "global");
45
- const init = this.#initialValue ? snip(this.#initialValue, this.#dataType, "constant") : void 0;
46
- return ctx.gen.declareGlobalVar({
47
- scope: this.#scope,
48
- id,
49
- dataType: this.#dataType,
50
- init
51
- });
52
- }
53
- $name(label) {
54
- setName(this, label);
55
- return this;
56
- }
57
- toString() {
58
- return `var:${getName(this) ?? "<unnamed>"}`;
59
- }
60
- get [$gpuValueOf]() {
61
- const dataType = this.#dataType;
62
- const origin = this.#scope;
63
- return new Proxy({
64
- [$internal]: true,
65
- get [$ownSnippet]() {
66
- return snip(this, dataType, origin);
67
- },
68
- [$resolve]: (ctx) => ctx.resolve(this),
69
- toString: () => `var:${getName(this) ?? "<unnamed>"}.$`
70
- }, valueProxyHandler);
71
- }
72
- get $() {
73
- const mode = getExecMode();
74
- const insideTgpuFn = isInsideTgpuFn();
75
- if (mode.type === "normal") throw new IllegalVarAccessError(insideTgpuFn ? `Cannot access variable '${getName(this) ?? "<unnamed>"}'. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation` : "TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`");
76
- if (mode.type === "codegen") return this[$gpuValueOf];
77
- if (mode.type === "simulate") {
78
- if (!mode.vars[this.#scope].has(this)) mode.vars[this.#scope].set(this, this.#initialValue);
79
- return mode.vars[this.#scope].get(this);
80
- }
81
- return assertExhaustive(mode, "tgpuVariable.ts#TgpuVarImpl/$");
82
- }
83
- set $(value) {
84
- const mode = getExecMode();
85
- const insideTgpuFn = isInsideTgpuFn();
86
- if (mode.type === "normal") throw new IllegalVarAccessError(insideTgpuFn ? `Cannot access ${String(this)}. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation` : "TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`");
87
- if (mode.type === "codegen") throw new Error("Unreachable tgpuVariable.ts#TgpuVarImpl/$");
88
- if (mode.type === "simulate") {
89
- mode.vars[this.#scope].set(this, value);
90
- return;
91
- }
92
- assertExhaustive(mode, "tgpuVariable.ts#TgpuVarImpl/$");
93
- }
94
- get value() {
95
- return this.$;
96
- }
97
- set value(v) {
98
- this.$ = v;
99
- }
100
- };
101
-
102
- //#endregion
103
- export { isVariable, privateVar, workgroupVar };
@@ -0,0 +1,9 @@
1
+ import type { AnyVertexAttribs, TgpuVertexAttrib } from '../../shared/vertexFormat.ts';
2
+ import type { TgpuVertexFn } from '../function/tgpuVertexFn.ts';
3
+ import type { INTERNAL_TgpuVertexAttrib, TgpuVertexLayout } from './vertexLayout.ts';
4
+ export interface ConnectAttributesToShaderResult {
5
+ usedVertexLayouts: TgpuVertexLayout[];
6
+ bufferDefinitions: GPUVertexBufferLayout[];
7
+ }
8
+ export declare function isAttribute(value: unknown): value is TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib;
9
+ export declare function connectAttributesToShader(shaderInputLayout: TgpuVertexFn.In, attributes: AnyVertexAttribs): ConnectAttributesToShaderResult;