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
@@ -0,0 +1,52 @@
1
+ import type { BaseData } from '../../data/wgslTypes.ts';
2
+ import { type TgpuBindGroup, type TgpuBindGroupLayout } from '../../tgpuBindGroupLayout.ts';
3
+ import type { LogResources } from '../../tgsl/consoleLog/types.ts';
4
+ import type { IndexFlag, TgpuBuffer, VertexFlag } from '../buffer/buffer.ts';
5
+ import type { TgpuCommandEncoder } from '../commandEncoder/commandEncoder.ts';
6
+ import type { ComputePassInternals } from '../commandEncoder/computePass.ts';
7
+ import type { RenderPassInternals } from '../commandEncoder/renderPass.ts';
8
+ import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
9
+ import type { TgpuVertexLayout } from '../vertexLayout/vertexLayout.ts';
10
+ import type { TgpuComputePipeline } from './computePipeline.ts';
11
+ import type { TgpuRenderPipeline } from './renderPipeline.ts';
12
+ import { type TimestampWritesPriors } from './timeable.ts';
13
+ export interface VertexBufferEntry {
14
+ buffer: (TgpuBuffer<BaseData> & VertexFlag) | GPUBuffer;
15
+ offset?: number | undefined;
16
+ size?: number | undefined;
17
+ }
18
+ export interface IndexBufferEntry {
19
+ buffer: (TgpuBuffer<BaseData> & IndexFlag) | GPUBuffer;
20
+ indexFormat: GPUIndexFormat;
21
+ offsetBytes?: number | undefined;
22
+ sizeBytes?: number | undefined;
23
+ }
24
+ export declare class RenderDrawState {
25
+ readonly bindGroups: Map<TgpuBindGroupLayout<Record<string, import("../../tgpuBindGroupLayout.ts").TgpuLayoutEntry | null>>, TgpuBindGroup | GPUBindGroup>;
26
+ readonly vertexBuffers: Map<TgpuVertexLayout<import("../../data/wgslTypes.ts").WgslArray<BaseData> | import("../../data/dataTypes.ts").Disarray<BaseData>>, VertexBufferEntry>;
27
+ currentPipeline: TgpuRenderPipeline | undefined;
28
+ indexBuffer: IndexBufferEntry | undefined;
29
+ stencilReference: GPUStencilValue | undefined;
30
+ /** What the raw pass holds, starting at the WebGPU default; survives executeBundles */
31
+ appliedStencilReference: GPUStencilValue;
32
+ version: number;
33
+ /** Raw access via `root.unwrap(pass)` can mutate state invisibly, disabling deduplication */
34
+ rawAccessed: boolean;
35
+ }
36
+ export declare class ComputeDrawState {
37
+ readonly bindGroups: Map<TgpuBindGroupLayout<Record<string, import("../../tgpuBindGroupLayout.ts").TgpuLayoutEntry | null>>, TgpuBindGroup | GPUBindGroup>;
38
+ currentPipeline: TgpuComputePipeline | undefined;
39
+ version: number;
40
+ rawAccessed: boolean;
41
+ }
42
+ export declare function recordBindGroup(state: RenderDrawState | ComputeDrawState, first: TgpuBindGroup | TgpuBindGroupLayout, bindGroup: TgpuBindGroup | GPUBindGroup | undefined): void;
43
+ /** Writes the pipeline and its bound resources into pass state; later set* calls overwrite them */
44
+ export declare function stampRenderPipeline(state: RenderDrawState, pipeline: TgpuRenderPipeline): void;
45
+ /** The compute counterpart of {@link stampRenderPipeline} */
46
+ export declare function stampComputePipeline(state: ComputeDrawState, pipeline: TgpuComputePipeline): void;
47
+ export declare function requireIndexBuffer(indexBuffer: IndexBufferEntry | undefined): void;
48
+ export declare function finalizeOwnEncoder(encoder: TgpuCommandEncoder, core: object, logResources: LogResources | undefined, priors: TimestampWritesPriors & {
49
+ readonly encoder?: TgpuCommandEncoder | undefined;
50
+ }): void;
51
+ export declare function emitRenderDraw(root: ExperimentalTgpuRoot, passInternals: RenderPassInternals, pipeline: TgpuRenderPipeline, usesIndexBuffer: boolean, emit: (rawPass: GPURenderPassEncoder | GPURenderBundleEncoder) => void, ownsPass?: boolean): void;
52
+ export declare function emitComputeDispatch(root: ExperimentalTgpuRoot, passInternals: ComputePassInternals, pipeline: TgpuComputePipeline, emit: (rawPass: GPUComputePassEncoder) => void, ownsPass?: boolean): void;
@@ -0,0 +1,225 @@
1
+ import { MissingBindGroupsError, MissingVertexBuffersError } from "../../errors.js";
2
+ import { $internal } from "../../shared/symbols.js";
3
+ import { logger } from "../../tgpuLogger.js";
4
+ import { isBindGroup, } from "../../tgpuBindGroupLayout.js";
5
+ import { logDataFromGPU } from "../../tgsl/consoleLog/deserializers.js";
6
+ import { isBuffer } from "../../types.js";
7
+ import { queueTimestampResolve } from "./timeable.js";
8
+ export class RenderDrawState {
9
+ bindGroups = new Map();
10
+ vertexBuffers = new Map();
11
+ currentPipeline;
12
+ indexBuffer;
13
+ stencilReference;
14
+ /** What the raw pass holds, starting at the WebGPU default; survives executeBundles */
15
+ appliedStencilReference = 0;
16
+ version = 0;
17
+ /** Raw access via `root.unwrap(pass)` can mutate state invisibly, disabling deduplication */
18
+ rawAccessed = false;
19
+ }
20
+ export class ComputeDrawState {
21
+ bindGroups = new Map();
22
+ currentPipeline;
23
+ version = 0;
24
+ rawAccessed = false;
25
+ }
26
+ export function recordBindGroup(state, first, bindGroup) {
27
+ if (isBindGroup(first)) {
28
+ state.bindGroups.set(first.layout, first);
29
+ }
30
+ else {
31
+ state.bindGroups.set(first, bindGroup);
32
+ }
33
+ state.version++;
34
+ }
35
+ /** Writes the pipeline and its bound resources into pass state; later set* calls overwrite them */
36
+ export function stampRenderPipeline(state, pipeline) {
37
+ const { priors } = pipeline[$internal];
38
+ state.currentPipeline = pipeline;
39
+ if (priors.bindGroupLayoutMap) {
40
+ for (const [layout, group] of priors.bindGroupLayoutMap) {
41
+ state.bindGroups.set(layout, group);
42
+ }
43
+ }
44
+ if (priors.vertexLayoutMap) {
45
+ for (const [layout, buffer] of priors.vertexLayoutMap) {
46
+ state.vertexBuffers.set(layout, { buffer, offset: undefined, size: undefined });
47
+ }
48
+ }
49
+ if (priors.indexBuffer) {
50
+ state.indexBuffer = priors.indexBuffer;
51
+ }
52
+ if (priors.stencilReference !== undefined) {
53
+ state.stencilReference = priors.stencilReference;
54
+ }
55
+ state.version++;
56
+ }
57
+ /** The compute counterpart of {@link stampRenderPipeline} */
58
+ export function stampComputePipeline(state, pipeline) {
59
+ const { priors } = pipeline[$internal];
60
+ state.currentPipeline = pipeline;
61
+ if (priors.bindGroupLayoutMap) {
62
+ for (const [layout, group] of priors.bindGroupLayoutMap) {
63
+ state.bindGroups.set(layout, group);
64
+ }
65
+ }
66
+ state.version++;
67
+ }
68
+ function applyIndexBuffer(encoder, root, entry) {
69
+ const { buffer, indexFormat, offsetBytes, sizeBytes } = entry;
70
+ if (isBuffer(buffer)) {
71
+ encoder.setIndexBuffer(root.unwrap(buffer), indexFormat, offsetBytes, sizeBytes);
72
+ }
73
+ else {
74
+ encoder.setIndexBuffer(buffer, indexFormat, offsetBytes, sizeBytes);
75
+ }
76
+ }
77
+ function applyBindGroups(encoder, root, usedBindGroupLayouts, catchall, resolveBindGroup) {
78
+ const missingBindGroups = new Set(usedBindGroupLayouts);
79
+ usedBindGroupLayouts.forEach((layout, idx) => {
80
+ if (catchall && idx === catchall[0]) {
81
+ encoder.setBindGroup(idx, root.unwrap(catchall[1]));
82
+ missingBindGroups.delete(layout);
83
+ }
84
+ else {
85
+ const bindGroup = resolveBindGroup(layout);
86
+ if (bindGroup !== undefined) {
87
+ missingBindGroups.delete(layout);
88
+ if (isBindGroup(bindGroup)) {
89
+ encoder.setBindGroup(idx, root.unwrap(bindGroup));
90
+ }
91
+ else {
92
+ encoder.setBindGroup(idx, bindGroup);
93
+ }
94
+ }
95
+ }
96
+ });
97
+ if (missingBindGroups.size > 0) {
98
+ throw new MissingBindGroupsError(missingBindGroups);
99
+ }
100
+ }
101
+ function applyVertexBuffers(encoder, root, usedVertexLayouts, resolveVertexBuffer) {
102
+ const missingVertexLayouts = new Set();
103
+ usedVertexLayouts.forEach((vertexLayout, idx) => {
104
+ const entry = resolveVertexBuffer(vertexLayout);
105
+ if (!entry || !entry.buffer) {
106
+ missingVertexLayouts.add(vertexLayout);
107
+ }
108
+ else if (isBuffer(entry.buffer)) {
109
+ encoder.setVertexBuffer(idx, root.unwrap(entry.buffer), entry.offset, entry.size);
110
+ }
111
+ else {
112
+ encoder.setVertexBuffer(idx, entry.buffer, entry.offset, entry.size);
113
+ }
114
+ });
115
+ if (missingVertexLayouts.size > 0) {
116
+ throw new MissingVertexBuffersError(missingVertexLayouts);
117
+ }
118
+ }
119
+ function applyRenderPipelineState(encoder, root, pipeline, passState) {
120
+ const memo = pipeline[$internal].core.unwrap();
121
+ encoder.setPipeline(memo.pipeline);
122
+ applyBindGroups(encoder, root, memo.usedBindGroupLayouts, memo.catchall, (layout) => passState.bindGroups.get(layout));
123
+ applyVertexBuffers(encoder, root, memo.usedVertexLayouts, (vertexLayout) => passState.vertexBuffers.get(vertexLayout));
124
+ if (passState.indexBuffer !== undefined) {
125
+ applyIndexBuffer(encoder, root, passState.indexBuffer);
126
+ }
127
+ if (typeof encoder.setStencilReference === 'function' &&
128
+ passState.stencilReference !== undefined) {
129
+ if (passState.rawAccessed || passState.stencilReference !== passState.appliedStencilReference) {
130
+ encoder.setStencilReference(passState.stencilReference);
131
+ passState.appliedStencilReference = passState.stencilReference;
132
+ }
133
+ }
134
+ }
135
+ function applyComputePipelineState(encoder, root, pipeline, passState) {
136
+ const memo = pipeline[$internal].core.unwrap();
137
+ encoder.setPipeline(memo.pipeline);
138
+ applyBindGroups(encoder, root, memo.usedBindGroupLayouts, memo.catchall, (layout) => passState.bindGroups.get(layout));
139
+ }
140
+ export function requireIndexBuffer(indexBuffer) {
141
+ if (!indexBuffer) {
142
+ throw new Error('No index buffer is set. Call pipeline.withIndexBuffer or pass.setIndexBuffer before drawing indexed geometry.');
143
+ }
144
+ }
145
+ function warnAboutUnreachableSubmission(core, what) {
146
+ logger.warnOnce('suspicious', core, what, `${what} is ignored when recording into a raw GPUCommandEncoder, since there is no submission to report after. Use root['~unstable'].createCommandEncoder() instead.`);
147
+ }
148
+ /** Returns false when there is no encoder to defer the read to, meaning the output is lost */
149
+ function queueLogDrain(encoder, logResources) {
150
+ if (!encoder || encoder[$internal].adopted) {
151
+ return false;
152
+ }
153
+ encoder[$internal].afterSubmit.set(logResources, () => logDataFromGPU(logResources));
154
+ return true;
155
+ }
156
+ export function finalizeOwnEncoder(encoder, core, logResources, priors) {
157
+ if (logResources && !queueLogDrain(encoder, logResources)) {
158
+ warnAboutUnreachableSubmission(core, 'Shader console.log output');
159
+ }
160
+ if (priors.performanceCallback && !queueTimestampResolve(encoder, priors)) {
161
+ warnAboutUnreachableSubmission(core, 'The performance callback');
162
+ }
163
+ if (priors.encoder === undefined) {
164
+ encoder.submit();
165
+ }
166
+ }
167
+ const PassKindWording = {
168
+ render: {
169
+ into: 'drawing into a render pass',
170
+ intoRaw: 'drawing into a raw render pass',
171
+ begin: 'beginRenderPass',
172
+ },
173
+ compute: {
174
+ into: 'dispatching into a compute pass',
175
+ intoRaw: 'dispatching into a raw compute pass',
176
+ begin: 'beginComputePass',
177
+ },
178
+ };
179
+ function reportIgnoredPriors(core, owner, hasTimestampWrites, logResources, passKind, hasAttachments = false) {
180
+ const wording = PassKindWording[passKind];
181
+ if (hasAttachments) {
182
+ logger.warnOnce('suspicious', core, 'attachments', `Pipeline-level attachments are ignored when ${wording.into}. Pass \`colorAttachments\` and \`depthStencilAttachment\` to encoder.${wording.begin} instead.`);
183
+ }
184
+ if (hasTimestampWrites) {
185
+ logger.warnOnce('suspicious', core, 'timestampWrites', `Pipeline-level timestamp writes are ignored when ${wording.into}. Pass \`timestampWrites\` to encoder.${wording.begin} instead.`);
186
+ }
187
+ if (logResources && !queueLogDrain(owner, logResources)) {
188
+ logger.warnOnce('suspicious', core, 'logs', `Shader console.log output is ignored when ${wording.intoRaw} encoder, since there is no submission to read it back after.`);
189
+ }
190
+ }
191
+ export function emitRenderDraw(root, passInternals, pipeline, usesIndexBuffer, emit, ownsPass = false) {
192
+ const { state, rawPass } = passInternals;
193
+ const { core, priors } = pipeline[$internal];
194
+ if (state.currentPipeline !== pipeline) {
195
+ stampRenderPipeline(state, pipeline);
196
+ }
197
+ if (usesIndexBuffer) {
198
+ requireIndexBuffer(state.indexBuffer);
199
+ }
200
+ const memo = core.unwrap();
201
+ if (!ownsPass) {
202
+ reportIgnoredPriors(core, passInternals.owner, !!priors.timestampWrites, memo.logResources, 'render', !!priors.colorAttachment || !!priors.depthStencilAttachment);
203
+ }
204
+ if (state.rawAccessed || passInternals.appliedVersion !== state.version) {
205
+ applyRenderPipelineState(rawPass, root, pipeline, state);
206
+ passInternals.appliedVersion = state.version;
207
+ }
208
+ emit(rawPass);
209
+ }
210
+ export function emitComputeDispatch(root, passInternals, pipeline, emit, ownsPass = false) {
211
+ const { state, rawPass } = passInternals;
212
+ const { core, priors } = pipeline[$internal];
213
+ if (state.currentPipeline !== pipeline) {
214
+ stampComputePipeline(state, pipeline);
215
+ }
216
+ const memo = core.unwrap();
217
+ if (!ownsPass) {
218
+ reportIgnoredPriors(core, passInternals.owner, !!priors.timestampWrites, memo.logResources, 'compute');
219
+ }
220
+ if (state.rawAccessed || passInternals.appliedVersion !== state.version) {
221
+ applyComputePipelineState(rawPass, root, pipeline, state);
222
+ passInternals.appliedVersion = state.version;
223
+ }
224
+ emit(rawPass);
225
+ }
@@ -0,0 +1,14 @@
1
+ import type { ResolutionResult } from '../../resolutionCtx.ts';
2
+ export interface PerformanceTracker {
3
+ measureResolve(callback: () => ResolutionResult): ResolutionResult;
4
+ measureCompile(device: GPUDevice): void;
5
+ }
6
+ export declare class PerformanceTrackerImpl implements PerformanceTracker {
7
+ #private;
8
+ measureResolve(callback: () => ResolutionResult): ResolutionResult;
9
+ measureCompile(device: GPUDevice): void;
10
+ }
11
+ export declare class NullPerformanceTracker implements PerformanceTracker {
12
+ measureResolve(callback: () => ResolutionResult): ResolutionResult;
13
+ measureCompile(): void;
14
+ }
@@ -0,0 +1,34 @@
1
+ import { PERF } from "../../shared/meta.js";
2
+ export class PerformanceTrackerImpl {
3
+ #resolveMeasure;
4
+ #wgslSize;
5
+ measureResolve(callback) {
6
+ const resolveStart = performance.mark('typegpu:resolution:start');
7
+ const result = callback();
8
+ this.#resolveMeasure = performance.measure('typegpu:resolution', {
9
+ start: resolveStart.name,
10
+ });
11
+ this.#wgslSize = result.code.length;
12
+ return result;
13
+ }
14
+ measureCompile(device) {
15
+ void (async () => {
16
+ const start = performance.mark('typegpu:compile-start');
17
+ await device.queue.onSubmittedWorkDone();
18
+ const compileMeasure = performance.measure('typegpu:compiled', {
19
+ start: start.name,
20
+ });
21
+ PERF?.record('resolution', {
22
+ resolveDuration: this.#resolveMeasure?.duration,
23
+ compileDuration: compileMeasure.duration,
24
+ wgslSize: this.#wgslSize,
25
+ });
26
+ })();
27
+ }
28
+ }
29
+ export class NullPerformanceTracker {
30
+ measureResolve(callback) {
31
+ return callback();
32
+ }
33
+ measureCompile() { }
34
+ }
@@ -0,0 +1,18 @@
1
+ import type { IndirectFlag, TgpuBuffer } from '../buffer/buffer.ts';
2
+ import { type PrimitiveOffsetInfo } from '../../data/offsetUtils.ts';
3
+ import type { BaseData } from '../../data/wgslTypes.ts';
4
+ import type { TgpuBindGroup, TgpuBindGroupLayout } from '../../tgpuBindGroupLayout.ts';
5
+ import type { TgpuVertexLayout } from '../vertexLayout/vertexLayout.ts';
6
+ import type { Timeable, TimestampWritesPriors } from './timeable.ts';
7
+ export declare const DISPATCH_INDIRECT_SIZE = 12;
8
+ export declare const DRAW_INDIRECT_SIZE = 16;
9
+ export declare const DRAW_INDEXED_INDIRECT_SIZE = 20;
10
+ export declare function collectBindGroupPairs(layouts: TgpuBindGroupLayout[], catchall: [number, TgpuBindGroup] | undefined, map: Map<TgpuBindGroupLayout, TgpuBindGroup | GPUBindGroup> | undefined): [TgpuBindGroupLayout, TgpuBindGroup | GPUBindGroup][];
11
+ export declare function collectVertexBufferPairs<Buffer>(layouts: TgpuVertexLayout[], map: Map<TgpuVertexLayout, Buffer> | undefined): [TgpuVertexLayout, Buffer][];
12
+ export declare function restoreTimestampPriors<T extends Timeable>(pipeline: T, priors: {
13
+ readonly timestampWrites?: TimestampWritesPriors['timestampWrites'] | undefined;
14
+ readonly performanceCallback?: TimestampWritesPriors['performanceCallback'] | undefined;
15
+ }): T;
16
+ type IndirectOperation = 'dispatchWorkgroupsIndirect' | 'drawIndirect' | 'drawIndexedIndirect';
17
+ export declare function resolveIndirectOffset(indirectBuffer: (TgpuBuffer<BaseData> & IndirectFlag) | GPUBuffer, start: PrimitiveOffsetInfo | number | undefined, requiredSize: number, operation: IndirectOperation): number;
18
+ export {};
@@ -1,31 +1,60 @@
1
- import { isGPUBuffer } from "../../types.js";
2
- import { sizeOf } from "../../data/sizeOf.js";
3
1
  import { memoryLayoutOf } from "../../data/offsetUtils.js";
4
-
5
- //#region src/core/pipeline/pipelineUtils.ts
2
+ import { sizeOf } from "../../data/sizeOf.js";
3
+ import { isGPUBuffer } from "../../types.js";
4
+ import { logger } from "../../tgpuLogger.js";
5
+ export const DISPATCH_INDIRECT_SIZE = 12; // 3 x u32 (x, y, z)
6
+ export const DRAW_INDIRECT_SIZE = 16; // 4 x 4
7
+ export const DRAW_INDEXED_INDIRECT_SIZE = 20; // 5 x 4
8
+ export function collectBindGroupPairs(layouts, catchall, map) {
9
+ return layouts.flatMap((layout, idx) => {
10
+ const resource = catchall && idx === catchall[0] ? catchall[1] : map?.get(layout);
11
+ return resource ? [[layout, resource]] : [];
12
+ });
13
+ }
14
+ export function collectVertexBufferPairs(layouts, map) {
15
+ return layouts.flatMap((layout) => {
16
+ const resource = map?.get(layout);
17
+ return resource ? [[layout, resource]] : [];
18
+ });
19
+ }
20
+ export function restoreTimestampPriors(pipeline, priors) {
21
+ let result = pipeline;
22
+ if (priors.timestampWrites) {
23
+ result = result.withTimestampWrites(priors.timestampWrites);
24
+ }
25
+ if (priors.performanceCallback) {
26
+ result = result.withPerformanceCallback(priors.performanceCallback);
27
+ }
28
+ return result;
29
+ }
6
30
  const IndirectOperationToRequiredData = {
7
- dispatchWorkgroupsIndirect: "3 x u32",
8
- drawIndirect: "4 x u32",
9
- drawIndexedIndirect: "3 x u32, i32, u32"
31
+ dispatchWorkgroupsIndirect: '3 x u32',
32
+ drawIndirect: '4 x u32',
33
+ drawIndexedIndirect: '3 x u32, i32, u32',
10
34
  };
11
35
  function validateIndirectBufferSize(bufferSize, offset, requiredBytes, operation) {
12
- if (offset + requiredBytes > bufferSize) throw new Error(`Buffer too small for ${operation}. Required: ${requiredBytes} bytes at offset ${offset}, but buffer is only ${bufferSize} bytes.`);
13
- if (offset % 4 !== 0) throw new Error(`Indirect buffer offset must be a multiple of 4. Got: ${offset}`);
36
+ if (offset + requiredBytes > bufferSize) {
37
+ throw new Error(`Buffer too small for ${operation}. Required: ${requiredBytes} bytes at offset ${offset}, but buffer is only ${bufferSize} bytes.`);
38
+ }
39
+ if (offset % 4 !== 0) {
40
+ throw new Error(`Indirect buffer offset must be a multiple of 4. Got: ${offset}`);
41
+ }
14
42
  }
15
- function resolveIndirectOffset(indirectBuffer, start, requiredSize, operation) {
16
- if (isGPUBuffer(indirectBuffer)) {
17
- const offset$1 = typeof start === "number" ? start : start?.offset ?? 0;
18
- validateIndirectBufferSize(indirectBuffer.size, offset$1, requiredSize, operation);
19
- return offset$1;
20
- }
21
- const { offset, contiguous } = start ? typeof start === "number" ? {
22
- offset: start,
23
- contiguous: requiredSize
24
- } : start : memoryLayoutOf(indirectBuffer.dataType);
25
- validateIndirectBufferSize(sizeOf(indirectBuffer.dataType), offset, requiredSize, operation);
26
- if (contiguous < requiredSize) console.warn(`${operation}: Starting at offset ${offset}, only ${contiguous} contiguous bytes are available before padding. '${operation}' requires ${requiredSize} bytes (${IndirectOperationToRequiredData[operation]}). Reading across padding may result in undefined behavior.`);
27
- return offset;
43
+ export function resolveIndirectOffset(indirectBuffer, start, requiredSize, operation) {
44
+ if (isGPUBuffer(indirectBuffer)) {
45
+ const offset = typeof start === 'number' ? start : (start?.offset ?? 0);
46
+ validateIndirectBufferSize(indirectBuffer.size, offset, requiredSize, operation);
47
+ return offset;
48
+ }
49
+ const offsetInfo = start
50
+ ? typeof start === 'number'
51
+ ? { offset: start, contiguous: requiredSize }
52
+ : start
53
+ : memoryLayoutOf(indirectBuffer.dataType);
54
+ const { offset, contiguous } = offsetInfo;
55
+ validateIndirectBufferSize(sizeOf(indirectBuffer.dataType), offset, requiredSize, operation);
56
+ if (contiguous < requiredSize) {
57
+ logger.warn('suspicious', `${operation}: Starting at offset ${offset}, only ${contiguous} contiguous bytes are available before padding. '${operation}' requires ${requiredSize} bytes (${IndirectOperationToRequiredData[operation]}). Reading across padding may result in undefined behavior.`);
58
+ }
59
+ return offset;
28
60
  }
29
-
30
- //#endregion
31
- export { resolveIndirectOffset };
@@ -0,0 +1 @@
1
+ export declare function nonTransferablePriorsOf(priors: object): string[];
@@ -0,0 +1,12 @@
1
+ // GPU objects like query sets cross runtimes as shareable host objects, performanceCallback crosses only if it is a worklet
2
+ const TRANSFERABLE_PRIORS = new Set([
3
+ 'bindGroupLayoutMap',
4
+ 'vertexLayoutMap',
5
+ 'indexBuffer',
6
+ 'stencilReference',
7
+ 'timestampWrites',
8
+ 'performanceCallback',
9
+ ]);
10
+ export function nonTransferablePriorsOf(priors) {
11
+ return Object.keys(priors).filter((key) => !TRANSFERABLE_PRIORS.has(key) && priors[key] !== undefined);
12
+ }