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,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 "./webgpuLimitations.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 };