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,229 +1,295 @@
1
- import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
2
- import { Void } from "../../data/wgslTypes.js";
3
- import { PERF, getName, setName } from "../../shared/meta.js";
4
1
  import { snip } from "../../data/snippet.js";
5
- import { isGPUBuffer } from "../../types.js";
6
- import { isBindGroup } from "../../tgpuBindGroupLayout.js";
2
+ import { Void } from "../../data/wgslTypes.js";
7
3
  import { resolve } from "../../resolutionCtx.js";
8
- import { isGPUCommandEncoder, isGPUComputePassEncoder } from "./typeGuards.js";
4
+ import { getName, PERF, setName } from "../../shared/meta.js";
5
+ import { $getNameForward, $internal, $resolve, $soul } from "../../shared/symbols.js";
6
+ import { isBindGroup, isBindGroupLayout, } from "../../tgpuBindGroupLayout.js";
7
+ import { INTERNAL_adoptCommandEncoder, INTERNAL_createCommandEncoder, } from "../commandEncoder/commandEncoder.js";
8
+ import { INTERNAL_adoptComputePass } from "../commandEncoder/computePass.js";
9
+ import { emitComputeDispatch, finalizeOwnEncoder } from "./drawState.js";
10
+ import { isGPUCommandEncoder, isGPUComputePassEncoder, isTgpuCommandEncoder, isTgpuComputePass, } from "./typeGuards.js";
11
+ import { isGPUBuffer } from "../../types.js";
12
+ import { wgslEnableExtensions, wgslEnableExtensionToFeatureName } from "../../wgslExtensions.js";
9
13
  import { namespace } from "../resolve/namespace.js";
10
- import { applyBindGroups } from "./applyPipelineState.js";
11
- import { logDataFromGPU } from "../../tgsl/consoleLog/deserializers.js";
12
- import { wgslEnableExtensionToFeatureName, wgslEnableExtensions } from "../../wgslExtensions.js";
13
- import { resolveIndirectOffset } from "./pipelineUtils.js";
14
- import { createWithPerformanceCallback, createWithTimestampWrites, setupTimestampWrites, triggerPerformanceCallback } from "./timeable.js";
15
-
16
- //#region src/core/pipeline/computePipeline.ts
17
- function INTERNAL_createComputePipeline(branch, slotBindings, descriptor) {
18
- return new TgpuComputePipelineImpl(new ComputePipelineCore(branch, slotBindings, descriptor), {});
14
+ import { warnIfOverflow } from "./limitsOverflow.js";
15
+ import { collectBindGroupPairs, DISPATCH_INDIRECT_SIZE, resolveIndirectOffset, restoreTimestampPriors, } from "./pipelineUtils.js";
16
+ import { invariant } from "../../errors.js";
17
+ import { createWithPerformanceCallback, createWithTimestampWrites, } from "./timeable.js";
18
+ import { nonTransferablePriorsOf } from "./priors.js";
19
+ import { NullPerformanceTracker, PerformanceTrackerImpl, } from "./performanceTracker.js";
20
+ import { logger } from "../../tgpuLogger.js";
21
+ export function INTERNAL_createComputePipeline(root, slotBindings, descriptor) {
22
+ return new TgpuComputePipelineImpl(new ComputePipelineCore(root, slotBindings, descriptor), {});
23
+ }
24
+ export function INTERNAL_restoreComputePipeline(soul, ctx) {
25
+ invariant(soul.raw, 'A compute pipeline soul is only complete once materialized.');
26
+ const root = ctx.getRoot(soul.device);
27
+ const core = ComputePipelineCore.precompiled(root, {
28
+ pipeline: soul.raw,
29
+ usedBindGroupLayouts: soul.usedBindGroupLayouts ?? [],
30
+ // The catchall group is already one of `bindGroups`, keyed by the layout it was resolved with
31
+ catchall: undefined,
32
+ logResources: undefined,
33
+ });
34
+ const pipeline = new TgpuComputePipelineImpl(core, {
35
+ bindGroupLayoutMap: new Map(soul.bindGroups),
36
+ });
37
+ return restoreTimestampPriors(pipeline, soul);
38
+ }
39
+ class TgpuComputePipelineImpl {
40
+ [$internal];
41
+ [$soul];
42
+ resourceType = 'compute-pipeline';
43
+ [$getNameForward];
44
+ constructor(core, priors) {
45
+ this[$soul] = {
46
+ type: 'compute-pipeline',
47
+ device: core.root.device,
48
+ raw: undefined,
49
+ label: undefined,
50
+ };
51
+ this[$internal] = {
52
+ core,
53
+ priors,
54
+ root: core.root,
55
+ materialize: () => {
56
+ const soul = this[$soul];
57
+ if (!soul.raw) {
58
+ const memo = core.unwrap();
59
+ soul.raw = memo.pipeline;
60
+ soul.usedBindGroupLayouts = memo.usedBindGroupLayouts;
61
+ soul.bindGroups = collectBindGroupPairs(memo.usedBindGroupLayouts, memo.catchall, priors.bindGroupLayoutMap);
62
+ soul.timestampWrites = priors.timestampWrites;
63
+ soul.performanceCallback = priors.performanceCallback;
64
+ soul.nonTransferablePriors = nonTransferablePriorsOf(priors);
65
+ }
66
+ return soul.raw;
67
+ },
68
+ };
69
+ this[$getNameForward] = core;
70
+ }
71
+ [$resolve](ctx) {
72
+ return ctx.resolve(this[$internal].core);
73
+ }
74
+ toString() {
75
+ return `computePipeline:${getName(this) ?? '<unnamed>'}`;
76
+ }
77
+ #withPriors(patch) {
78
+ const { core, priors } = this[$internal];
79
+ return new TgpuComputePipelineImpl(core, { ...priors, ...patch });
80
+ }
81
+ with(first, bindGroup) {
82
+ const internals = this[$internal];
83
+ if (isTgpuComputePass(first)) {
84
+ return this.#withPriors({ pass: first, encoder: undefined });
85
+ }
86
+ if (isTgpuCommandEncoder(first)) {
87
+ return this.#withPriors({ pass: undefined, encoder: first });
88
+ }
89
+ if (isGPUComputePassEncoder(first)) {
90
+ return this.#withPriors({
91
+ pass: INTERNAL_adoptComputePass(internals.root, first),
92
+ encoder: undefined,
93
+ });
94
+ }
95
+ if (isGPUCommandEncoder(first)) {
96
+ return this.#withPriors({
97
+ pass: undefined,
98
+ encoder: INTERNAL_adoptCommandEncoder(internals.root, first),
99
+ });
100
+ }
101
+ if (isBindGroup(first) || isBindGroupLayout(first)) {
102
+ const [layout, group] = isBindGroup(first)
103
+ ? [first.layout, first]
104
+ : [first, bindGroup];
105
+ return this.#withPriors({
106
+ bindGroupLayoutMap: new Map([
107
+ ...(internals.priors.bindGroupLayoutMap ?? []),
108
+ [layout, group],
109
+ ]),
110
+ });
111
+ }
112
+ throw new Error('Unsupported value passed into .with()');
113
+ }
114
+ withPerformanceCallback(callback) {
115
+ const internals = this[$internal];
116
+ if (internals.priors.timestampWrites) {
117
+ return this.#withPriors({ performanceCallback: callback });
118
+ }
119
+ const querySet = internals.core.performanceCallbackQuerySet;
120
+ if (!querySet) {
121
+ logger.warn('webgpu-feature-missing', 'Performance callback cannot be used because the timestamp-query feature is not enabled on the root.');
122
+ return this;
123
+ }
124
+ return this.#withPriors(createWithPerformanceCallback(internals.priors, callback, querySet));
125
+ }
126
+ withTimestampWrites(options) {
127
+ const internals = this[$internal];
128
+ return this.#withPriors(createWithTimestampWrites(internals.priors, options, internals.root));
129
+ }
130
+ dispatchWorkgroups(x, y, z) {
131
+ this.#execute((pass) => pass.dispatchWorkgroups(x, y, z));
132
+ }
133
+ dispatchWorkgroupsIndirect(indirectBuffer, start) {
134
+ const rawBuffer = isGPUBuffer(indirectBuffer) ? indirectBuffer : indirectBuffer.buffer;
135
+ const offset = resolveIndirectOffset(indirectBuffer, start, DISPATCH_INDIRECT_SIZE, 'dispatchWorkgroupsIndirect');
136
+ this.#execute((pass) => pass.dispatchWorkgroupsIndirect(rawBuffer, offset));
137
+ }
138
+ initAsync() {
139
+ return this[$internal].core.initAsync();
140
+ }
141
+ initSync() {
142
+ this[$internal].core.initSync();
143
+ }
144
+ #execute(dispatch) {
145
+ const { core, priors, root } = this[$internal];
146
+ if (priors.pass) {
147
+ emitComputeDispatch(root, priors.pass[$internal], this, dispatch);
148
+ return;
149
+ }
150
+ const encoder = priors.encoder ?? INTERNAL_createCommandEncoder(root);
151
+ const pass = encoder.beginComputePass({
152
+ label: getName(core) ?? '<unnamed>',
153
+ timestampWrites: priors.timestampWrites,
154
+ });
155
+ emitComputeDispatch(root, pass[$internal], this, dispatch, /* ownsPass */ true);
156
+ pass.end();
157
+ finalizeOwnEncoder(encoder, core, core.unwrap().logResources, priors);
158
+ }
159
+ $name(label) {
160
+ setName(this, label);
161
+ return this;
162
+ }
163
+ }
164
+ class ComputePipelineCore {
165
+ [$internal] = true;
166
+ root;
167
+ #performanceTracker;
168
+ #initAsyncPromise;
169
+ #memo;
170
+ #slotBindings;
171
+ #descriptor;
172
+ #performanceCallbackQuerySet;
173
+ constructor(root, slotBindings, descriptor) {
174
+ this.root = root;
175
+ this.#slotBindings = slotBindings;
176
+ this.#descriptor = descriptor;
177
+ this.#performanceTracker = PERF?.enabled
178
+ ? new PerformanceTrackerImpl()
179
+ : new NullPerformanceTracker();
180
+ }
181
+ static precompiled(root, memo) {
182
+ const core = new ComputePipelineCore(root, [], undefined);
183
+ core.#memo = memo;
184
+ return core;
185
+ }
186
+ [$resolve](ctx) {
187
+ const descriptor = this.#descriptor;
188
+ if (!descriptor) {
189
+ // Precompiled pipelines have nothing to contribute to the shader
190
+ return snip('', Void, /* origin */ 'runtime');
191
+ }
192
+ return ctx.withSlots(this.#slotBindings, () => {
193
+ ctx.resolve(descriptor.compute);
194
+ return snip('', Void, /* origin */ 'runtime');
195
+ });
196
+ }
197
+ toString() {
198
+ return 'computePipelineCore';
199
+ }
200
+ get performanceCallbackQuerySet() {
201
+ if (!this.root.enabledFeatures.has('timestamp-query')) {
202
+ return undefined;
203
+ }
204
+ return (this.#performanceCallbackQuerySet ??= this.root.createQuerySet('timestamp', 2));
205
+ }
206
+ /**
207
+ * @privateRemarks
208
+ * This function cannot be a regular async function
209
+ * because when called multiple times before the promise finishes,
210
+ * we want it to return the same promise each time.
211
+ */
212
+ initAsync() {
213
+ if (this.#memo !== undefined) {
214
+ // the pipeline was already resolved & compiled
215
+ return Promise.resolve();
216
+ }
217
+ if (this.#initAsyncPromise === undefined) {
218
+ // the pipeline did not start resolution & compilation
219
+ const device = this.root.device;
220
+ const { resolutionResult, module } = this.resolveAndCreateShaderModule();
221
+ const { usedBindGroupLayouts, catchall, logResources } = resolutionResult;
222
+ this.#initAsyncPromise = device
223
+ .createComputePipelineAsync({
224
+ label: getName(this) ?? '<unnamed>',
225
+ layout: device.createPipelineLayout({
226
+ label: `${getName(this) ?? '<unnamed>'} - Pipeline Layout`,
227
+ bindGroupLayouts: usedBindGroupLayouts.map((l) => this.root.unwrap(l)),
228
+ }),
229
+ compute: { module },
230
+ })
231
+ .then((pipeline) => {
232
+ this.#memo = { pipeline, usedBindGroupLayouts, catchall, logResources };
233
+ this.#performanceTracker.measureCompile(device);
234
+ })
235
+ .finally(() => {
236
+ this.#initAsyncPromise = undefined;
237
+ });
238
+ }
239
+ return this.#initAsyncPromise;
240
+ }
241
+ initSync() {
242
+ if (this.#memo !== undefined) {
243
+ return;
244
+ }
245
+ if (this.#initAsyncPromise !== undefined) {
246
+ throw new Error("'pipeline.initAsync()' was called and is not yet resolved.");
247
+ }
248
+ const device = this.root.device;
249
+ const { resolutionResult, module } = this.resolveAndCreateShaderModule();
250
+ const { usedBindGroupLayouts, catchall, logResources } = resolutionResult;
251
+ this.#memo = {
252
+ pipeline: device.createComputePipeline({
253
+ label: getName(this) ?? '<unnamed>',
254
+ layout: device.createPipelineLayout({
255
+ label: `${getName(this) ?? '<unnamed>'} - Pipeline Layout`,
256
+ bindGroupLayouts: usedBindGroupLayouts.map((l) => this.root.unwrap(l)),
257
+ }),
258
+ compute: { module },
259
+ }),
260
+ usedBindGroupLayouts,
261
+ catchall,
262
+ logResources,
263
+ };
264
+ this.#performanceTracker.measureCompile(device);
265
+ }
266
+ unwrap() {
267
+ this.initSync();
268
+ return this.#memo;
269
+ }
270
+ resolveAndCreateShaderModule() {
271
+ const device = this.root.device;
272
+ const enableExtensions = wgslEnableExtensions.filter((extension) => this.root.enabledFeatures.has(wgslEnableExtensionToFeatureName[extension]));
273
+ // Resolving code
274
+ const ns = namespace({ names: this.root.nameRegistrySetting });
275
+ const resolutionResult = this.#performanceTracker.measureResolve(() => resolve(this, {
276
+ namespace: ns,
277
+ minify: this.root.minify,
278
+ enableExtensions,
279
+ shaderGenerator: this.root.shaderGeneratorClass
280
+ ? new this.root.shaderGeneratorClass()
281
+ : undefined,
282
+ root: this.root,
283
+ }));
284
+ const { code, usedBindGroupLayouts, catchall } = resolutionResult;
285
+ if (catchall !== undefined) {
286
+ usedBindGroupLayouts[catchall[0]]?.$name(`${getName(this) ?? '<unnamed>'} - Automatic Bind Group & Layout`);
287
+ }
288
+ warnIfOverflow(usedBindGroupLayouts, device.limits);
289
+ const module = device.createShaderModule({
290
+ label: `${getName(this) ?? '<unnamed>'} - Shader`,
291
+ code,
292
+ });
293
+ return { resolutionResult, module };
294
+ }
19
295
  }
20
- const _lastAppliedCompute = /* @__PURE__ */ new WeakMap();
21
- var TgpuComputePipelineImpl = class TgpuComputePipelineImpl {
22
- [$internal];
23
- resourceType = "compute-pipeline";
24
- [$getNameForward];
25
- #core;
26
- #priors;
27
- constructor(core, priors) {
28
- this.#core = core;
29
- this.#priors = priors;
30
- this[$internal] = {
31
- get rawPipeline() {
32
- return core.unwrap().pipeline;
33
- },
34
- get priors() {
35
- return priors;
36
- },
37
- get root() {
38
- return core.root;
39
- }
40
- };
41
- this[$getNameForward] = core;
42
- }
43
- [$resolve](ctx) {
44
- return ctx.resolve(this.#core);
45
- }
46
- toString() {
47
- return `computePipeline:${getName(this) ?? "<unnamed>"}`;
48
- }
49
- get rawPipeline() {
50
- return this.#core.unwrap().pipeline;
51
- }
52
- with(first, bindGroup) {
53
- if (isGPUComputePassEncoder(first)) return new TgpuComputePipelineImpl(this.#core, {
54
- ...this.#priors,
55
- externalPass: first,
56
- externalEncoder: void 0
57
- });
58
- if (isGPUCommandEncoder(first)) return new TgpuComputePipelineImpl(this.#core, {
59
- ...this.#priors,
60
- externalEncoder: first,
61
- externalPass: void 0
62
- });
63
- if (isBindGroup(first)) return new TgpuComputePipelineImpl(this.#core, {
64
- ...this.#priors,
65
- bindGroupLayoutMap: new Map([...this.#priors.bindGroupLayoutMap ?? [], [first.layout, first]])
66
- });
67
- return new TgpuComputePipelineImpl(this.#core, {
68
- ...this.#priors,
69
- bindGroupLayoutMap: new Map([...this.#priors.bindGroupLayoutMap ?? [], [first, bindGroup]])
70
- });
71
- }
72
- withPerformanceCallback(callback) {
73
- if (this.#priors.timestampWrites) return new TgpuComputePipelineImpl(this.#core, {
74
- ...this.#priors,
75
- performanceCallback: callback
76
- });
77
- const querySet = this.#core.performanceCallbackQuerySet;
78
- if (!querySet) {
79
- console.warn("Performance callback cannot be used because the timestamp-query feature is not enabled on the root.");
80
- return this;
81
- }
82
- const newPriors = createWithPerformanceCallback(this.#priors, callback, querySet);
83
- return new TgpuComputePipelineImpl(this.#core, newPriors);
84
- }
85
- withTimestampWrites(options) {
86
- const newPriors = createWithTimestampWrites(this.#priors, options, this.#core.root);
87
- return new TgpuComputePipelineImpl(this.#core, newPriors);
88
- }
89
- dispatchWorkgroups(x, y, z) {
90
- this._executeComputePass((pass) => pass.dispatchWorkgroups(x, y, z));
91
- }
92
- dispatchWorkgroupsIndirect(indirectBuffer, start) {
93
- const DISPATCH_SIZE = 12;
94
- const rawBuffer = isGPUBuffer(indirectBuffer) ? indirectBuffer : indirectBuffer.buffer;
95
- const offset = resolveIndirectOffset(indirectBuffer, start, DISPATCH_SIZE, "dispatchWorkgroupsIndirect");
96
- this._executeComputePass((pass) => pass.dispatchWorkgroupsIndirect(rawBuffer, offset));
97
- }
98
- _applyComputeState(pass) {
99
- const memo = this.#core.unwrap();
100
- const { root } = this.#core;
101
- pass.setPipeline(memo.pipeline);
102
- applyBindGroups(pass, root, memo.usedBindGroupLayouts, memo.catchall, (layout) => this.#priors.bindGroupLayoutMap?.get(layout));
103
- }
104
- _executeComputePass(dispatch) {
105
- const { root } = this.#core;
106
- if (this.#priors.externalPass) {
107
- if (_lastAppliedCompute.get(this.#priors.externalPass) !== this) {
108
- this._applyComputeState(this.#priors.externalPass);
109
- _lastAppliedCompute.set(this.#priors.externalPass, this);
110
- }
111
- dispatch(this.#priors.externalPass);
112
- return;
113
- }
114
- if (this.#priors.externalEncoder) {
115
- const passDescriptor$1 = {
116
- label: getName(this.#core) ?? "<unnamed>",
117
- ...setupTimestampWrites(this.#priors, root)
118
- };
119
- const pass$1 = this.#priors.externalEncoder.beginComputePass(passDescriptor$1);
120
- this._applyComputeState(pass$1);
121
- dispatch(pass$1);
122
- pass$1.end();
123
- return;
124
- }
125
- const memo = this.#core.unwrap();
126
- const passDescriptor = {
127
- label: getName(this.#core) ?? "<unnamed>",
128
- ...setupTimestampWrites(this.#priors, root)
129
- };
130
- const commandEncoder = root.device.createCommandEncoder();
131
- const pass = commandEncoder.beginComputePass(passDescriptor);
132
- this._applyComputeState(pass);
133
- dispatch(pass);
134
- pass.end();
135
- root.device.queue.submit([commandEncoder.finish()]);
136
- if (memo.logResources) logDataFromGPU(memo.logResources);
137
- if (this.#priors.performanceCallback) triggerPerformanceCallback({
138
- root,
139
- priors: this.#priors
140
- });
141
- }
142
- $name(label) {
143
- setName(this, label);
144
- return this;
145
- }
146
- };
147
- var ComputePipelineCore = class {
148
- [$internal] = true;
149
- root;
150
- _memo;
151
- #slotBindings;
152
- #descriptor;
153
- #performanceCallbackQuerySet;
154
- constructor(root, slotBindings, descriptor) {
155
- this.root = root;
156
- this.#slotBindings = slotBindings;
157
- this.#descriptor = descriptor;
158
- }
159
- [$resolve](ctx) {
160
- return ctx.withSlots(this.#slotBindings, () => {
161
- ctx.resolve(this.#descriptor.compute);
162
- return snip("", Void, "runtime");
163
- });
164
- }
165
- toString() {
166
- return "computePipelineCore";
167
- }
168
- get performanceCallbackQuerySet() {
169
- if (!this.root.enabledFeatures.has("timestamp-query")) return;
170
- return this.#performanceCallbackQuerySet ??= this.root.createQuerySet("timestamp", 2);
171
- }
172
- unwrap() {
173
- if (this._memo === void 0) {
174
- const device = this.root.device;
175
- const enableExtensions = wgslEnableExtensions.filter((extension) => this.root.enabledFeatures.has(wgslEnableExtensionToFeatureName[extension]));
176
- let resolutionResult;
177
- let resolveMeasure;
178
- const ns = namespace({ names: this.root.nameRegistrySetting });
179
- if (PERF?.enabled) {
180
- const resolveStart = performance.mark("typegpu:resolution:start");
181
- resolutionResult = resolve(this, {
182
- namespace: ns,
183
- enableExtensions,
184
- shaderGenerator: this.root.shaderGenerator,
185
- root: this.root
186
- });
187
- resolveMeasure = performance.measure("typegpu:resolution", { start: resolveStart.name });
188
- } else resolutionResult = resolve(this, {
189
- namespace: ns,
190
- enableExtensions,
191
- shaderGenerator: this.root.shaderGenerator,
192
- root: this.root
193
- });
194
- const { code, usedBindGroupLayouts, catchall, logResources } = resolutionResult;
195
- if (catchall !== void 0) usedBindGroupLayouts[catchall[0]]?.$name(`${getName(this) ?? "<unnamed>"} - Automatic Bind Group & Layout`);
196
- const module = device.createShaderModule({
197
- label: `${getName(this) ?? "<unnamed>"} - Shader`,
198
- code
199
- });
200
- this._memo = {
201
- pipeline: device.createComputePipeline({
202
- label: getName(this) ?? "<unnamed>",
203
- layout: device.createPipelineLayout({
204
- label: `${getName(this) ?? "<unnamed>"} - Pipeline Layout`,
205
- bindGroupLayouts: usedBindGroupLayouts.map((l) => this.root.unwrap(l))
206
- }),
207
- compute: { module }
208
- }),
209
- usedBindGroupLayouts,
210
- catchall,
211
- logResources
212
- };
213
- if (PERF?.enabled) (async () => {
214
- const start = performance.mark("typegpu:compile-start");
215
- await device.queue.onSubmittedWorkDone();
216
- const compileMeasure = performance.measure("typegpu:compiled", { start: start.name });
217
- PERF?.record("resolution", {
218
- resolveDuration: resolveMeasure?.duration,
219
- compileDuration: compileMeasure.duration,
220
- wgslSize: code.length
221
- });
222
- })();
223
- }
224
- return this._memo;
225
- }
226
- };
227
-
228
- //#endregion
229
- export { INTERNAL_createComputePipeline };
@@ -0,0 +1,4 @@
1
+ import { type BaseData } from '../../data/wgslTypes.ts';
2
+ import type { ColorAttachment } from '../commandEncoder/attachments.ts';
3
+ import type { AnyFragmentColorAttachment } from './renderPipeline.ts';
4
+ export declare function connectAttachmentToShader(fragmentOut: BaseData, attachment: AnyFragmentColorAttachment): ColorAttachment[];
@@ -1,26 +1,29 @@
1
- import { isWgslStruct } from "../../data/wgslTypes.js";
2
1
  import { isBuiltin } from "../../data/attributes.js";
3
-
4
- //#region src/core/pipeline/connectAttachmentToShader.ts
2
+ import { isVoid, isWgslStruct } from "../../data/wgslTypes.js";
5
3
  function isColorAttachment(value) {
6
- return !!value?.view;
4
+ return !!value?.view;
7
5
  }
8
- function connectAttachmentToShader(fragmentOut, attachment) {
9
- if (isBuiltin(fragmentOut)) return [];
10
- if (isWgslStruct(fragmentOut)) {
11
- const result = [];
12
- for (const key of Object.keys(fragmentOut.propTypes)) {
13
- const outputValue = fragmentOut.propTypes[key];
14
- if (isBuiltin(outputValue)) continue;
15
- const matching = attachment[key];
16
- if (!matching) throw new Error(`A color attachment by the name of '${key}' was not provided to the shader.`);
17
- result.push(matching);
18
- }
19
- return result;
20
- }
21
- if (!isColorAttachment(attachment)) throw new Error("Expected a single color attachment, not a record.");
22
- return [attachment];
6
+ export function connectAttachmentToShader(fragmentOut, attachment) {
7
+ if (isVoid(fragmentOut) || isBuiltin(fragmentOut)) {
8
+ return [];
9
+ }
10
+ if (isWgslStruct(fragmentOut)) {
11
+ const result = [];
12
+ for (const key of Object.keys(fragmentOut.propTypes)) {
13
+ const outputValue = fragmentOut.propTypes[key];
14
+ if (isBuiltin(outputValue)) {
15
+ continue;
16
+ }
17
+ const matching = attachment[key];
18
+ if (!matching) {
19
+ throw new Error(`A color attachment by the name of '${key}' was not provided to the shader.`);
20
+ }
21
+ result.push(matching);
22
+ }
23
+ return result;
24
+ }
25
+ if (!isColorAttachment(attachment)) {
26
+ throw new Error('Expected a single color attachment, not a record.');
27
+ }
28
+ return [attachment];
23
29
  }
24
-
25
- //#endregion
26
- export { connectAttachmentToShader };
@@ -0,0 +1,3 @@
1
+ import { type BaseData } from '../../data/wgslTypes.ts';
2
+ import type { AnyFragmentTargets } from './renderPipeline.ts';
3
+ export declare function connectTargetsToShader(fragmentOut: BaseData, targets: AnyFragmentTargets): (GPUColorTargetState | null)[];
@@ -1,29 +1,31 @@
1
- import { isVoid, isWgslStruct } from "../../data/wgslTypes.js";
2
1
  import { isBuiltin } from "../../data/attributes.js";
3
-
4
- //#region src/core/pipeline/connectTargetsToShader.ts
5
- function connectTargetsToShader(fragmentOut, targets) {
6
- let presentationFormat;
7
- if (isVoid(fragmentOut) || isBuiltin(fragmentOut)) return [null];
8
- if (isWgslStruct(fragmentOut)) {
9
- const result = [];
10
- for (const key of Object.keys(fragmentOut.propTypes)) {
11
- const outputValue = fragmentOut.propTypes[key];
12
- if (isBuiltin(outputValue)) continue;
13
- const matchingTarget = targets[key];
14
- result.push({
15
- ...matchingTarget,
16
- format: matchingTarget?.format ?? (presentationFormat ??= navigator.gpu.getPreferredCanvasFormat())
17
- });
18
- }
19
- return result;
20
- }
21
- const singleTarget = targets;
22
- return [{
23
- ...singleTarget,
24
- format: singleTarget?.format ?? (presentationFormat ??= navigator.gpu.getPreferredCanvasFormat())
25
- }];
2
+ import { isVoid, isWgslStruct } from "../../data/wgslTypes.js";
3
+ export function connectTargetsToShader(fragmentOut, targets) {
4
+ let presentationFormat;
5
+ if (isVoid(fragmentOut) || isBuiltin(fragmentOut)) {
6
+ return [null];
7
+ }
8
+ if (isWgslStruct(fragmentOut)) {
9
+ const result = [];
10
+ for (const key of Object.keys(fragmentOut.propTypes)) {
11
+ const outputValue = fragmentOut.propTypes[key];
12
+ if (isBuiltin(outputValue)) {
13
+ continue;
14
+ }
15
+ const matchingTarget = targets[key];
16
+ result.push({
17
+ ...matchingTarget,
18
+ format: matchingTarget?.format ??
19
+ (presentationFormat ??= navigator.gpu.getPreferredCanvasFormat()),
20
+ });
21
+ }
22
+ return result;
23
+ }
24
+ const singleTarget = targets;
25
+ return [
26
+ {
27
+ ...singleTarget,
28
+ format: singleTarget?.format ?? (presentationFormat ??= navigator.gpu.getPreferredCanvasFormat()),
29
+ },
30
+ ];
26
31
  }
27
-
28
- //#endregion
29
- export { connectTargetsToShader };