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,44 +1,46 @@
1
1
  import { f32 } from "../data/numeric.js";
2
- import { abs, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, cos, cosh, countLeadingZeros, exp, floor, log, log2, max, min, pow, sign, sin, sinh, sqrt, tan, tanh, trunc } from "../std/numeric.js";
3
-
4
- //#region src/tgsl/jsPolyfills.ts
5
- const mathToStd = new Map([
6
- [Math.abs, abs],
7
- [Math.acos, acos],
8
- [Math.acosh, acosh],
9
- [Math.asin, asin],
10
- [Math.asinh, asinh],
11
- [Math.atan, atan],
12
- [Math.atan2, atan2],
13
- [Math.atanh, atanh],
14
- [Math.ceil, ceil],
15
- [Math.cos, cos],
16
- [Math.cosh, cosh],
17
- [Math.exp, exp],
18
- [Math.floor, floor],
19
- [Math.fround, f32],
20
- [Math.clz32, countLeadingZeros],
21
- [Math.trunc, trunc],
22
- [Math.log, log],
23
- [Math.log2, log2],
24
- [Math.pow, pow],
25
- [Math.sign, sign],
26
- [Math.sin, sin],
27
- [Math.sinh, sinh],
28
- [Math.sqrt, sqrt],
29
- [Math.tan, tan],
30
- [Math.tanh, tanh],
31
- [Math.max, max],
32
- [Math.min, min]
2
+ import { abs, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, cos, cosh, countLeadingZeros, exp, floor, log, log2, max, min, pow, sign, sin, sinh, sqrt, tan, tanh, trunc, } from "../std/numeric.js";
3
+ export const mathToStd = new Map([
4
+ // -- one to one Math to WGSL correlation --
5
+ [Math.abs, abs],
6
+ [Math.acos, acos],
7
+ [Math.acosh, acosh],
8
+ [Math.asin, asin],
9
+ [Math.asinh, asinh],
10
+ [Math.atan, atan],
11
+ [Math.atan2, atan2],
12
+ [Math.atanh, atanh],
13
+ [Math.ceil, ceil],
14
+ [Math.cos, cos],
15
+ [Math.cosh, cosh],
16
+ [Math.exp, exp],
17
+ [Math.floor, floor],
18
+ [Math.fround, f32],
19
+ [Math.clz32, countLeadingZeros],
20
+ [Math.trunc, trunc],
21
+ [Math.log, log],
22
+ [Math.log2, log2],
23
+ [Math.pow, pow],
24
+ [Math.sign, sign],
25
+ [Math.sin, sin],
26
+ [Math.sinh, sinh],
27
+ [Math.sqrt, sqrt],
28
+ [Math.tan, tan],
29
+ [Math.tanh, tanh],
30
+ // -- varying in Math and two arg in WGSL, but we support varying in std --
31
+ [Math.max, max],
32
+ [Math.min, min],
33
+ // -- possible if we extend std --
34
+ // [Math.cbrt, ???],
35
+ // [Math.log10, ???],
36
+ // [Math.log1p, ???],
37
+ // [Math.f16round, ???],
38
+ // [Math.hypot, ???],
39
+ // [Math.expm1, ???],
40
+ // -- skipped --
41
+ // [Math.random, ???],
42
+ // [Math.imul, ???],
43
+ // [Math.round, ???], // round(2.5) is 3 in JS and 2 in WGSL
33
44
  ]);
34
- const supportedLogOps = () => [
35
- console.log,
36
- console.debug,
37
- console.info,
38
- console.warn,
39
- console.error,
40
- console.clear
41
- ];
42
-
43
- //#endregion
44
- export { mathToStd, supportedLogOps };
45
+ // deferring the array creation lets us handle console mocks
46
+ export const supportedLogOps = () => [console.log, console.debug, console.info, console.warn, console.error, console.clear];
@@ -0,0 +1,48 @@
1
+ import type { Snippet } from '../data/snippet.ts';
2
+ import type { SimulationState } from '../types.ts';
3
+ import type { makeResolvable } from './makeResolvable.ts';
4
+ /**
5
+ * WARNING: This is an API that touches a lot of internals, and is not stable
6
+ * (can change between patches). You should probably talk to the TypeGPU team
7
+ * before using this, maybe we can provide a better public API for your use case.
8
+ *
9
+ * Defines additional properties on `value` (mutates it) that makes TypeGPU
10
+ * understand how it should handle using .$ on that object. All dereferenceable
11
+ * value must also be made resolvable (through the makeResolvable API).
12
+ *
13
+ * `value` can in particular be the prototype of a class, meaning all instances
14
+ * of that class will be dereferenceable.
15
+ */
16
+ export declare function makeDereferenceable<T extends makeResolvable.Resolvable, TValue>(value: T, options: makeDereferenceable.Options<T, TValue>): T & {
17
+ $: TValue;
18
+ };
19
+ export declare namespace makeDereferenceable {
20
+ interface Options<T extends makeResolvable.Resolvable, TValue> {
21
+ normalMode: {
22
+ get(this: T): TValue;
23
+ set?(this: T, value: TValue): void;
24
+ };
25
+ codegenMode: {
26
+ /**
27
+ * Should return a representative value that is accessible on the GPU.
28
+ * If not provided, `codegenMode.getBaseSnippet` is used instead.
29
+ */
30
+ get(this: T): TValue;
31
+ } | {
32
+ /**
33
+ * Used if `codegenMode.get` is not defined. The snippet returned from
34
+ * this function should represent the value that exists on .$
35
+ *
36
+ * The value of the snippet should in most cases be `trackingProxy` that
37
+ * is provided as the argument.
38
+ * @param trackingProxy
39
+ */
40
+ getBaseSnippet(this: T, trackingProxy: TValue): Snippet;
41
+ };
42
+ /** @deprecated 'simulate' mode is planned to be removed in the future */
43
+ simulateMode?: {
44
+ get?(this: T, state: SimulationState): TValue;
45
+ set?(this: T, state: SimulationState, value: TValue): void;
46
+ };
47
+ }
48
+ }
@@ -0,0 +1,86 @@
1
+ import { $gpuValueOf, $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
2
+ import { valueProxyHandler } from "../core/valueProxyUtils.js";
3
+ import { getExecMode } from "../execMode.js";
4
+ import { assertExhaustive } from "../shared/utilityTypes.js";
5
+ /**
6
+ * WARNING: This is an API that touches a lot of internals, and is not stable
7
+ * (can change between patches). You should probably talk to the TypeGPU team
8
+ * before using this, maybe we can provide a better public API for your use case.
9
+ *
10
+ * Defines additional properties on `value` (mutates it) that makes TypeGPU
11
+ * understand how it should handle using .$ on that object. All dereferenceable
12
+ * value must also be made resolvable (through the makeResolvable API).
13
+ *
14
+ * `value` can in particular be the prototype of a class, meaning all instances
15
+ * of that class will be dereferenceable.
16
+ */
17
+ export function makeDereferenceable(value, options) {
18
+ Object.defineProperty(value, $gpuValueOf, {
19
+ get() {
20
+ if ('get' in options.codegenMode) {
21
+ return options.codegenMode.get.apply(this);
22
+ }
23
+ // oxlint-disable-next-line typescript/no-this-alias
24
+ const resource = this;
25
+ return new Proxy({
26
+ [$internal]: true,
27
+ get [$ownSnippet]() {
28
+ if (!('getBaseSnippet' in options.codegenMode)) {
29
+ throw new Error(`Expected 'getBaseSnippet' to be defined.`);
30
+ }
31
+ return options.codegenMode.getBaseSnippet.apply(resource, [this]);
32
+ },
33
+ [$resolve]: (ctx) => ctx.resolve(resource),
34
+ toString: () => `${resource.toString()}.$`,
35
+ }, valueProxyHandler);
36
+ },
37
+ });
38
+ Object.defineProperty(value, '$', {
39
+ get() {
40
+ const mode = getExecMode();
41
+ if (mode.type === 'codegen') {
42
+ return this[$gpuValueOf];
43
+ }
44
+ if (mode.type === 'simulate') {
45
+ if (options.simulateMode?.get) {
46
+ return options.simulateMode.get.apply(this, [mode]);
47
+ }
48
+ return options.normalMode.get.apply(this);
49
+ }
50
+ if (mode.type === 'normal') {
51
+ return options.normalMode.get.apply(this);
52
+ }
53
+ return assertExhaustive(mode, 'makeDereferenceable.ts#$ (get)');
54
+ },
55
+ set(value) {
56
+ const mode = getExecMode();
57
+ if (mode.type === 'normal') {
58
+ if (!options.normalMode.set) {
59
+ throw new Error(`'${this.toString()}' cannot be set in normal mode`);
60
+ }
61
+ options.normalMode.set.apply(this, [value]);
62
+ return;
63
+ }
64
+ if (mode.type === 'simulate') {
65
+ if (options.simulateMode?.set) {
66
+ options.simulateMode.set.apply(this, [mode, value]);
67
+ }
68
+ else if (options.normalMode.set) {
69
+ // Falling back to the 'normal' set
70
+ options.normalMode.set.apply(this, [value]);
71
+ }
72
+ else {
73
+ throw new Error(`'${this.toString()}' cannot be set in simulate mode`);
74
+ }
75
+ return;
76
+ }
77
+ if (mode.type === 'codegen') {
78
+ // The shader generator handles assignment, and does not defer to
79
+ // whatever's being assigned to generate the shader code.
80
+ throw new Error('Unreachable makeDerefenceable.ts#$ (set)');
81
+ }
82
+ return assertExhaustive(mode, 'makeDereferenceable.ts#$ (set)');
83
+ },
84
+ });
85
+ return value;
86
+ }
@@ -0,0 +1,22 @@
1
+ import { type ResolvedSnippet } from '../data/snippet.ts';
2
+ import type { ResolutionCtx, SelfResolvable } from '../types.ts';
3
+ /**
4
+ * WARNING: This is an API that touches a lot of internals, and is not stable
5
+ * (can change between patches). You should probably talk to the TypeGPU team
6
+ * before using this, maybe we can provide a better public API for your use case.
7
+ *
8
+ * Defines additional properties on `value` (mutates it) that makes TypeGPU
9
+ * understand how it should handle passing this object to the `tgpu.resolve`
10
+ * API, or just how to generate shader code from it to begin with.
11
+ *
12
+ * `value` can in particular be the prototype of a class, meaning all instances
13
+ * of that class will be resolvable.
14
+ */
15
+ export declare function makeResolvable<T extends object>(value: T, options: makeResolvable.Options<T>): T & SelfResolvable;
16
+ export declare namespace makeResolvable {
17
+ interface Options<T> {
18
+ resolve(this: T, ctx: ResolutionCtx): ResolvedSnippet;
19
+ asString(this: T): string;
20
+ }
21
+ type Resolvable = SelfResolvable;
22
+ }
@@ -0,0 +1,33 @@
1
+ import {} from "../data/snippet.js";
2
+ import { $internal, $resolve, isMarkedInternal } from "../shared/symbols.js";
3
+ /**
4
+ * WARNING: This is an API that touches a lot of internals, and is not stable
5
+ * (can change between patches). You should probably talk to the TypeGPU team
6
+ * before using this, maybe we can provide a better public API for your use case.
7
+ *
8
+ * Defines additional properties on `value` (mutates it) that makes TypeGPU
9
+ * understand how it should handle passing this object to the `tgpu.resolve`
10
+ * API, or just how to generate shader code from it to begin with.
11
+ *
12
+ * `value` can in particular be the prototype of a class, meaning all instances
13
+ * of that class will be resolvable.
14
+ */
15
+ export function makeResolvable(value, options) {
16
+ if (!isMarkedInternal(value)) {
17
+ Object.defineProperty(value, $internal, {
18
+ value: true,
19
+ writable: true,
20
+ });
21
+ }
22
+ Object.defineProperty(value, 'toString', {
23
+ value() {
24
+ return options.asString.apply(this);
25
+ },
26
+ });
27
+ Object.defineProperty(value, $resolve, {
28
+ value(ctx) {
29
+ return options.resolve.apply(this, [ctx]);
30
+ },
31
+ });
32
+ return value;
33
+ }
@@ -1,24 +1,84 @@
1
- import { ResolvedSnippet, Snippet } from "../data/snippet.js";
2
- import { GenerationCtx } from "./generationHelpers.js";
3
- import { ConstantDefinitionOptions, FunctionDefinitionOptions, VariableDefinitionOptions } from "./shaderGenerator_members.js";
4
- import { BaseData } from "../data/wgslTypes.js";
5
-
6
- //#region src/tgsl/shaderGenerator.d.ts
7
-
1
+ import type { Block } from 'tinyest';
2
+ import type { BaseData } from '../data/wgslTypes.ts';
3
+ import type { ResolvedSnippet, Snippet } from '../data/snippet.ts';
4
+ import type { VariableScope } from '../core/variable/tgpuVariable.ts';
5
+ import type { BindableBufferUsage, FunctionArgument, ResolutionCtx, ShaderStage } from '../types.ts';
6
+ export interface FunctionDefinitionOptions {
7
+ readonly functionType: 'normal' | ShaderStage;
8
+ readonly name: string;
9
+ readonly workgroupSize?: readonly number[] | undefined;
10
+ readonly args: readonly FunctionArgument[];
11
+ readonly body: Block;
12
+ determineReturnType(): BaseData;
13
+ }
14
+ export interface ConstantDefinitionOptions {
15
+ readonly id: string;
16
+ readonly dataType: BaseData;
17
+ readonly init: Snippet;
18
+ }
19
+ export interface VariableDefinitionOptions {
20
+ readonly scope: VariableScope | BindableBufferUsage | 'handle';
21
+ readonly id: string;
22
+ readonly dataType: BaseData;
23
+ readonly init: Snippet | undefined;
24
+ readonly group?: string | undefined;
25
+ readonly binding?: number | undefined;
26
+ }
27
+ export interface ResolvedStatement {
28
+ code: string;
29
+ /**
30
+ * True if the statement (or statements) in `code` define variables that would
31
+ * be scoped to the nearest block.
32
+ */
33
+ definesInNearestScope: boolean;
34
+ /**
35
+ * If not undefined, the execution of the statement (or statements) in `code`
36
+ * *ends* in a control flow statement that will always cause the subsequent
37
+ * statements to not be executed.
38
+ *
39
+ * For example, statements with code set to `return;`, `break;` and `continue;`
40
+ * will have this field set to 'return', 'break' and 'continue' respectively.
41
+ * So will any sequence of statements that end with them, or `return value;`
42
+ *
43
+ * However, the statement `if (cond) { return; }` has `endsWithControlFlow` set to `undefined`,
44
+ * because it's not guaranteed that including this code in a sequence will cause all
45
+ * subsequent statements to be unreachable.
46
+ */
47
+ endsWithControlFlow?: 'return' | 'break' | 'continue' | undefined;
48
+ }
49
+ /**
50
+ * **NOTE: This is an unstable API and may change in the future.**
51
+ *
52
+ * Used to instantiate generators, once per resolution context
53
+ */
54
+ export interface ShaderGeneratorClass<T extends ShaderGenerator = ShaderGenerator> {
55
+ new (): T;
56
+ }
57
+ /**
58
+ * Binary operators that can appear in WGSL
59
+ */
60
+ export type BinaryOperator = '=' | '^' | '|' | '&' | '*' | '/' | '%' | '+' | '-' | '<<' | '>>' | '<' | '>' | '<=' | '>=' | '==' | '!=' | '&&' | '||' | '+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '&=' | '|=' | '^=';
61
+ /**
62
+ * Represents generators that, once instantiated, will generate `wgsl` (as opposed to e.g. `glsl`)
63
+ */
64
+ export type WgslGeneratorClass = ShaderGeneratorClass<ShaderGenerator & {
65
+ languageKey: 'wgsl';
66
+ }>;
8
67
  /**
9
68
  * **NOTE: This is an unstable API and may change in the future.**
10
69
  *
11
70
  * An interface meant to be used by other systems to generate snippets of
12
71
  * shader code in the target language (WGSL, GLSL, etc.).
13
72
  */
14
- interface ShaderGenerator {
15
- initGenerator(ctx: GenerationCtx): void;
16
- declareGlobalConst(options: ConstantDefinitionOptions): ResolvedSnippet;
17
- declareGlobalVar(options: VariableDefinitionOptions): ResolvedSnippet;
18
- functionDefinition(options: FunctionDefinitionOptions): string;
19
- typeInstantiation(schema: BaseData, args: readonly Snippet[]): ResolvedSnippet;
20
- typeAnnotation(schema: BaseData): string;
21
- numericLiteral(value: number, schema: BaseData): ResolvedSnippet;
73
+ export interface ShaderGenerator {
74
+ readonly languageKey: string;
75
+ initGenerator(ctx: ResolutionCtx): void;
76
+ declareGlobalConst(options: ConstantDefinitionOptions): ResolvedSnippet;
77
+ declareGlobalVar(options: VariableDefinitionOptions): ResolvedSnippet;
78
+ functionDefinition(options: FunctionDefinitionOptions): string;
79
+ typeInstantiation(schema: BaseData, args: readonly Snippet[]): ResolvedSnippet;
80
+ numericLiteral(value: number, schema: BaseData): ResolvedSnippet;
81
+ emitTypeAnnotation(schema: BaseData): string;
82
+ emitCall(name: string, templateParams: readonly Snippet[], args: readonly Snippet[]): string;
83
+ emitBinaryOp(lhs: Snippet, op: BinaryOperator, rhs: Snippet): string;
22
84
  }
23
- //#endregion
24
- export { ShaderGenerator };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,11 +1,8 @@
1
- import { Snippet } from "../data/snippet.js";
2
- import { ShelllessImpl } from "../core/function/shelllessImpl.js";
3
-
4
- //#region src/tgsl/shellless.d.ts
1
+ import { type ShelllessImpl } from '../core/function/shelllessImpl.ts';
2
+ import type { Snippet } from '../data/snippet.ts';
5
3
  type AnyFn = (...args: never[]) => unknown;
6
- declare class ShelllessRepository {
7
- cache: Map<AnyFn, ShelllessImpl[]>;
8
- get(fn: AnyFn, argSnippets: Snippet[] | undefined): ShelllessImpl | undefined;
4
+ export declare class ShelllessRepository {
5
+ cache: Map<AnyFn, ShelllessImpl[]>;
6
+ get(fn: AnyFn, argSnippets: readonly Snippet[] | undefined): ShelllessImpl | undefined;
9
7
  }
10
- //#endregion
11
- export { ShelllessRepository };
8
+ export {};
package/tgsl/shellless.js CHANGED
@@ -1,48 +1,78 @@
1
- import { isPtr, isWgslArray, isWgslStruct } from "../data/wgslTypes.js";
2
- import { getFunctionMetadata, getName } from "../shared/meta.js";
1
+ import { createShelllessImpl } from "../core/function/shelllessImpl.js";
3
2
  import { UnknownData } from "../data/dataTypes.js";
4
- import { WgslTypeError } from "../errors.js";
5
3
  import { RefOperator } from "../data/ref.js";
4
+ import { isPtr, isWgslArray, isWgslStruct } from "../data/wgslTypes.js";
5
+ import { WgslTypeError } from "../errors.js";
6
+ import { getFunctionMetadata, getName } from "../shared/meta.js";
6
7
  import { concretize } from "./generationHelpers.js";
7
- import { createShelllessImpl } from "../core/function/shelllessImpl.js";
8
-
9
- //#region src/tgsl/shellless.ts
10
8
  function shallowEqualSchemas(a, b) {
11
- if (a.type !== b.type) return false;
12
- if (isPtr(a) && isPtr(b)) return a.access === b.access && a.addressSpace === b.addressSpace && a.implicit === b.implicit && shallowEqualSchemas(a.inner, b.inner);
13
- if (isWgslArray(a) && isWgslArray(b)) return a.elementCount === b.elementCount && shallowEqualSchemas(a.elementType, b.elementType);
14
- if (isWgslStruct(a) && isWgslStruct(b)) return a === b;
15
- return true;
9
+ if (a.type !== b.type)
10
+ return false;
11
+ if (isPtr(a) && isPtr(b)) {
12
+ return (a.access === b.access &&
13
+ a.addressSpace === b.addressSpace &&
14
+ a.implicit === b.implicit &&
15
+ shallowEqualSchemas(a.inner, b.inner));
16
+ }
17
+ if (isWgslArray(a) && isWgslArray(b)) {
18
+ return a.elementCount === b.elementCount && shallowEqualSchemas(a.elementType, b.elementType);
19
+ }
20
+ if (isWgslStruct(a) && isWgslStruct(b)) {
21
+ // Only structs with the same identity are considered equal
22
+ return a === b;
23
+ }
24
+ return true;
25
+ }
26
+ export class ShelllessRepository {
27
+ cache = new Map();
28
+ get(fn, argSnippets) {
29
+ const meta = getFunctionMetadata(fn);
30
+ if (!meta) {
31
+ return undefined;
32
+ }
33
+ if (!argSnippets && meta.ast.params.length > 0) {
34
+ throw new Error(`Cannot resolve '${getName(fn)}' directly, because it expects arguments. Either call it from another function, or wrap it in a shell`);
35
+ }
36
+ const argTypes = (argSnippets ?? []).map((s, index) => {
37
+ if (s.value instanceof RefOperator) {
38
+ if (s.dataType === UnknownData) {
39
+ throw new WgslTypeError(`d.ref() created with primitive types must be stored in a variable before use`);
40
+ }
41
+ return s.dataType;
42
+ }
43
+ if (s.dataType === UnknownData) {
44
+ throw new Error(`Passed illegal value ${s.value} as the #${index} argument to ${getName(fn) ?? '<unnamed>'}(...)\n` +
45
+ `Shellless functions can only accept arguments representing WGSL resources: constructible WGSL types, d.refs, samplers or texture views.\n` +
46
+ `Remember, that arguments such as samplers, texture views, accessors, slots etc. should be dereferenced via '.$' first.`);
47
+ }
48
+ let type = concretize(s.dataType);
49
+ if (isPtr(type) && type.implicit) {
50
+ // If the pointer was made implicitly (e.g. by assigning a reference to a const variable),
51
+ // then we dereference the pointer before passing it to the function. The main reason for this,
52
+ // is that in TypeScript, the type of the function accepts a value, not the value wrapped in
53
+ // d.ref<> (so it's not considered mutable from the perspective of the function)
54
+ // Example:
55
+ // const foo = layout.$.boids;
56
+ // bar(foo)
57
+ // ^^^
58
+ type = type.inner;
59
+ }
60
+ return type;
61
+ });
62
+ let cache = this.cache.get(fn);
63
+ if (cache) {
64
+ const variant = cache.find((v) => v.argTypes.length === argTypes.length &&
65
+ v.argTypes.every((t, i) => shallowEqualSchemas(t, argTypes[i])));
66
+ if (variant) {
67
+ return variant;
68
+ }
69
+ }
70
+ else {
71
+ cache = [];
72
+ this.cache.set(fn, cache);
73
+ }
74
+ const shellless = createShelllessImpl(argTypes, fn);
75
+ cache.push(shellless);
76
+ return shellless;
77
+ }
16
78
  }
17
- var ShelllessRepository = class {
18
- cache = /* @__PURE__ */ new Map();
19
- get(fn, argSnippets) {
20
- const meta = getFunctionMetadata(fn);
21
- if (!meta) return;
22
- if (!argSnippets && meta.ast.params.length > 0) throw new Error(`Cannot resolve '${getName(fn)}' directly, because it expects arguments. Either call it from another function, or wrap it in a shell`);
23
- const argTypes = (argSnippets ?? []).map((s, index) => {
24
- if (s.value instanceof RefOperator) {
25
- if (s.dataType === UnknownData) throw new WgslTypeError(`d.ref() created with primitive types must be stored in a variable before use`);
26
- return s.dataType;
27
- }
28
- if (s.dataType === UnknownData) throw new Error(`Passed illegal value ${s.value} as the #${index} argument to ${getName(fn) ?? "<unnamed>"}(...)\nShellless functions can only accept arguments representing WGSL resources: constructible WGSL types, d.refs, samplers or texture views.\nRemember, that arguments such as samplers, texture views, accessors, slots etc. should be dereferenced via '.$' first.`);
29
- let type = concretize(s.dataType);
30
- if (isPtr(type) && type.implicit) type = type.inner;
31
- return type;
32
- });
33
- let cache = this.cache.get(fn);
34
- if (cache) {
35
- const variant = cache.find((v) => v.argTypes.length === argTypes.length && v.argTypes.every((t, i) => shallowEqualSchemas(t, argTypes[i])));
36
- if (variant) return variant;
37
- } else {
38
- cache = [];
39
- this.cache.set(fn, cache);
40
- }
41
- const shellless = createShelllessImpl(argTypes, fn);
42
- cache.push(shellless);
43
- return shellless;
44
- }
45
- };
46
-
47
- //#endregion
48
- export { ShelllessRepository };