typegpu 0.11.9 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +36 -36
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -5
  42. package/core/function/fnCore.js +148 -93
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +17 -22
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -53
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -215
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -197
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -126
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +271 -216
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -760
  350. package/types.d.ts +287 -222
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,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 };