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
@@ -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,2 @@
1
+ import type { TgpuBindGroupLayout } from '../../tgpuBindGroupLayout.ts';
2
+ export declare function warnIfOverflow(layouts: TgpuBindGroupLayout[], limits: GPUSupportedLimits): void;
@@ -1,13 +1,16 @@
1
- //#region src/core/pipeline/limitsOverflow.ts
2
- function warnIfOverflow(layouts, limits) {
3
- const entries = Object.values(layouts).flatMap((layout) => Object.values(layout.entries)).filter((entry) => entry !== null);
4
- const uniform = entries.filter((entry) => "uniform" in entry).length;
5
- const storage = entries.filter((entry) => "storage" in entry).length;
6
- if (uniform > limits.maxUniformBuffersPerShaderStage) console.warn(`Total number of uniform buffers (${uniform}) exceeds maxUniformBuffersPerShaderStage (${limits.maxUniformBuffersPerShaderStage}). Consider:
1
+ import { logger } from "../../tgpuLogger.js";
2
+ export function warnIfOverflow(layouts, limits) {
3
+ const entries = Object.values(layouts)
4
+ .flatMap((layout) => Object.values(layout.entries))
5
+ .filter((entry) => entry !== null);
6
+ const uniform = entries.filter((entry) => 'uniform' in entry).length;
7
+ const storage = entries.filter((entry) => 'storage' in entry).length;
8
+ if (uniform > limits.maxUniformBuffersPerShaderStage) {
9
+ logger.warn('webgpu-limits-exceeded', `Total number of uniform buffers (${uniform}) exceeds maxUniformBuffersPerShaderStage (${limits.maxUniformBuffersPerShaderStage}). Consider:
7
10
  1. Grouping some of the uniforms into one using 'd.struct',
8
11
  2. Increasing the limit when requesting a device or creating a root.`);
9
- if (storage > limits.maxStorageBuffersPerShaderStage) console.warn(`Total number of storage buffers (${storage}) exceeds maxStorageBuffersPerShaderStage (${limits.maxStorageBuffersPerShaderStage}).`);
12
+ }
13
+ if (storage > limits.maxStorageBuffersPerShaderStage) {
14
+ logger.warn('webgpu-limits-exceeded', `Total number of storage buffers (${storage}) exceeds maxStorageBuffersPerShaderStage (${limits.maxStorageBuffersPerShaderStage}).`);
15
+ }
10
16
  }
11
-
12
- //#endregion
13
- export { warnIfOverflow };
@@ -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
+ }