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,22 +1,32 @@
1
- import { TgpuQuerySet } from "../querySet/querySet.js";
2
- import "../root/rootTypes.js";
3
-
4
- //#region src/core/pipeline/timeable.d.ts
5
- interface Timeable {
6
- withPerformanceCallback(callback: (start: bigint, end: bigint) => void | Promise<void>): this;
7
- withTimestampWrites(options: {
8
- querySet: TgpuQuerySet<'timestamp'> | GPUQuerySet;
9
- beginningOfPassWriteIndex?: number;
10
- endOfPassWriteIndex?: number;
11
- }): this;
1
+ import { type TgpuQuerySet } from '../querySet/querySet.ts';
2
+ import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
3
+ import type { TgpuCommandEncoder } from '../commandEncoder/commandEncoder.ts';
4
+ export interface Timeable {
5
+ /**
6
+ * Attaches a callback reporting the GPU-side start and end timestamps of the pipeline's pass.
7
+ * Repeated executions within one command encoder write to the same query set indices,
8
+ * so the callback fires once, with the timestamps of the last execution.
9
+ */
10
+ withPerformanceCallback(callback: (start: bigint, end: bigint) => void | Promise<void>): this;
11
+ withTimestampWrites(options: {
12
+ querySet: TgpuQuerySet<'timestamp'> | GPUQuerySet;
13
+ beginningOfPassWriteIndex?: number;
14
+ endOfPassWriteIndex?: number;
15
+ }): this;
12
16
  }
13
- type TimestampWritesPriors = {
14
- readonly timestampWrites?: {
17
+ export type TimestampWritesPriors = {
18
+ readonly timestampWrites?: {
19
+ querySet: TgpuQuerySet<'timestamp'> | GPUQuerySet;
20
+ beginningOfPassWriteIndex?: number;
21
+ endOfPassWriteIndex?: number;
22
+ };
23
+ readonly performanceCallback?: (start: bigint, end: bigint) => void | Promise<void>;
24
+ };
25
+ export declare function createWithPerformanceCallback<T extends TimestampWritesPriors>(currentPriors: T, callback: (start: bigint, end: bigint) => void | Promise<void>, querySet: TgpuQuerySet<'timestamp'>): T;
26
+ export declare function createWithTimestampWrites<T extends TimestampWritesPriors>(currentPriors: T, options: {
15
27
  querySet: TgpuQuerySet<'timestamp'> | GPUQuerySet;
16
28
  beginningOfPassWriteIndex?: number;
17
29
  endOfPassWriteIndex?: number;
18
- };
19
- readonly performanceCallback?: (start: bigint, end: bigint) => void | Promise<void>;
20
- };
21
- //#endregion
22
- export { Timeable, TimestampWritesPriors };
30
+ }, root: ExperimentalTgpuRoot): T;
31
+ /** Returns false when the encoder is one we cannot defer work to, meaning the callback never fires */
32
+ export declare function queueTimestampResolve(encoder: TgpuCommandEncoder, priors: TimestampWritesPriors): boolean;
@@ -1,57 +1,95 @@
1
- import { $internal } from "../../shared/symbols.js";
2
1
  import { isQuerySet } from "../querySet/querySet.js";
3
-
4
- //#region src/core/pipeline/timeable.ts
5
- function createWithPerformanceCallback(currentPriors, callback, querySet) {
6
- if (!currentPriors.timestampWrites) return {
7
- ...currentPriors,
8
- performanceCallback: callback,
9
- timestampWrites: {
10
- querySet,
11
- beginningOfPassWriteIndex: 0,
12
- endOfPassWriteIndex: 1
13
- }
14
- };
15
- return {
16
- ...currentPriors,
17
- performanceCallback: callback
18
- };
2
+ import { $internal } from "../../shared/symbols.js";
3
+ import { logger } from "../../tgpuLogger.js";
4
+ export function createWithPerformanceCallback(currentPriors, callback, querySet) {
5
+ if (!currentPriors.timestampWrites) {
6
+ return {
7
+ ...currentPriors,
8
+ performanceCallback: callback,
9
+ timestampWrites: {
10
+ querySet,
11
+ beginningOfPassWriteIndex: 0,
12
+ endOfPassWriteIndex: 1,
13
+ },
14
+ };
15
+ }
16
+ return {
17
+ ...currentPriors,
18
+ performanceCallback: callback,
19
+ };
19
20
  }
20
- function createWithTimestampWrites(currentPriors, options, root) {
21
- if (!root.enabledFeatures.has("timestamp-query")) throw new Error("Timestamp writes require the \"timestamp-query\" feature to be enabled on GPU device.");
22
- const timestampWrites = { querySet: options.querySet };
23
- if (options.beginningOfPassWriteIndex !== void 0) timestampWrites.beginningOfPassWriteIndex = options.beginningOfPassWriteIndex;
24
- if (options.endOfPassWriteIndex !== void 0) timestampWrites.endOfPassWriteIndex = options.endOfPassWriteIndex;
25
- return {
26
- ...currentPriors,
27
- timestampWrites
28
- };
21
+ export function createWithTimestampWrites(currentPriors, options, root) {
22
+ if (!root.enabledFeatures.has('timestamp-query')) {
23
+ throw new Error('Timestamp writes require the "timestamp-query" feature to be enabled on GPU device.');
24
+ }
25
+ const timestampWrites = {
26
+ querySet: options.querySet,
27
+ };
28
+ if (options.beginningOfPassWriteIndex !== undefined) {
29
+ timestampWrites.beginningOfPassWriteIndex = options.beginningOfPassWriteIndex;
30
+ }
31
+ if (options.endOfPassWriteIndex !== undefined) {
32
+ timestampWrites.endOfPassWriteIndex = options.endOfPassWriteIndex;
33
+ }
34
+ return {
35
+ ...currentPriors,
36
+ timestampWrites,
37
+ };
29
38
  }
30
- function setupTimestampWrites(priors, root) {
31
- if (!priors.timestampWrites) return {};
32
- const { querySet, beginningOfPassWriteIndex, endOfPassWriteIndex } = priors.timestampWrites;
33
- const timestampWrites = { querySet: isQuerySet(querySet) ? root.unwrap(querySet) : querySet };
34
- if (beginningOfPassWriteIndex !== void 0) timestampWrites.beginningOfPassWriteIndex = beginningOfPassWriteIndex;
35
- if (endOfPassWriteIndex !== void 0) timestampWrites.endOfPassWriteIndex = endOfPassWriteIndex;
36
- return { timestampWrites };
39
+ const pendingTimestampReads = new WeakMap();
40
+ async function readTimestamps(querySet, registrations) {
41
+ if (!querySet.available) {
42
+ return;
43
+ }
44
+ const result = await querySet.read();
45
+ for (const { priors, callback } of registrations) {
46
+ const start = result[priors.timestampWrites?.beginningOfPassWriteIndex ?? 0];
47
+ const end = result[priors.timestampWrites?.endOfPassWriteIndex ?? 1];
48
+ if (start === undefined || end === undefined) {
49
+ throw new Error('QuerySet did not return valid timestamps.');
50
+ }
51
+ await callback(start, end);
52
+ }
37
53
  }
38
- function triggerPerformanceCallback({ root, priors }) {
39
- const querySet = priors.timestampWrites?.querySet;
40
- const callback = priors.performanceCallback;
41
- if (!querySet) throw new Error("Cannot dispatch workgroups with performance callback without a query set.");
42
- if (!isQuerySet(querySet)) throw new Error("Performance callback with raw GPUQuerySet is not supported. Use TgpuQuerySet instead.");
43
- const commandEncoder = root.device.createCommandEncoder();
44
- commandEncoder.resolveQuerySet(root.unwrap(querySet), 0, querySet.count, querySet[$internal].resolveBuffer, 0);
45
- root.device.queue.submit([commandEncoder.finish()]);
46
- root.device.queue.onSubmittedWorkDone().then(async () => {
47
- if (!querySet.available) return;
48
- const result = await querySet.read();
49
- const start = result[priors.timestampWrites?.beginningOfPassWriteIndex ?? 0];
50
- const end = result[priors.timestampWrites?.endOfPassWriteIndex ?? 1];
51
- if (start === void 0 || end === void 0) throw new Error("QuerySet did not return valid timestamps.");
52
- await callback(start, end);
53
- });
54
+ /** Returns false when the encoder is one we cannot defer work to, meaning the callback never fires */
55
+ export function queueTimestampResolve(encoder, priors) {
56
+ const querySet = priors.timestampWrites?.querySet;
57
+ const callback = priors.performanceCallback;
58
+ if (!querySet) {
59
+ throw new Error('Cannot dispatch workgroups with performance callback without a query set.');
60
+ }
61
+ if (!isQuerySet(querySet)) {
62
+ throw new Error('Performance callback with raw GPUQuerySet is not supported. Use TgpuQuerySet instead.');
63
+ }
64
+ const internals = encoder[$internal];
65
+ if (internals.adopted) {
66
+ return false;
67
+ }
68
+ const { root } = internals;
69
+ // recorded at submission time to capture the last pass written into this encoder
70
+ internals.beforeFinish.set(querySet, (rawEncoder) => {
71
+ rawEncoder.resolveQuerySet(root.unwrap(querySet), 0, querySet.count, querySet[$internal].resolveBuffer, 0);
72
+ });
73
+ let byQuerySet = pendingTimestampReads.get(encoder);
74
+ if (!byQuerySet) {
75
+ byQuerySet = new Map();
76
+ pendingTimestampReads.set(encoder, byQuerySet);
77
+ }
78
+ let registrations = byQuerySet.get(querySet);
79
+ if (!registrations) {
80
+ const regs = [];
81
+ registrations = regs;
82
+ byQuerySet.set(querySet, regs);
83
+ internals.afterSubmit.set(querySet, () => {
84
+ byQuerySet.delete(querySet);
85
+ void readTimestamps(querySet, regs);
86
+ });
87
+ }
88
+ if (registrations.some((reg) => reg.priors === priors)) {
89
+ logger.warnOnce('suspicious', querySet, 'repeated-timed-execution', 'Repeated executions of a timed pipeline within one command encoder write to the same query set indices, so the performance callback reports only the last execution.');
90
+ }
91
+ else {
92
+ registrations.push({ priors, callback });
93
+ }
94
+ return true;
54
95
  }
55
-
56
- //#endregion
57
- export { createWithPerformanceCallback, createWithTimestampWrites, setupTimestampWrites, triggerPerformanceCallback };
@@ -0,0 +1,17 @@
1
+ import type { TgpuCommandEncoder } from '../commandEncoder/commandEncoder.ts';
2
+ import type { TgpuComputePass } from '../commandEncoder/computePass.ts';
3
+ import type { TgpuRenderCommands, TgpuRenderPass } from '../commandEncoder/renderPass.ts';
4
+ import type { TgpuComputePipeline } from './computePipeline.ts';
5
+ import type { TgpuRenderPipeline } from './renderPipeline.ts';
6
+ export declare function isComputePipeline(value: unknown): value is TgpuComputePipeline;
7
+ export declare function isRenderPipeline(value: unknown): value is TgpuRenderPipeline;
8
+ export declare function isPipeline(value: unknown): value is TgpuComputePipeline | TgpuRenderPipeline;
9
+ export declare function isTgpuCommandEncoder(value: unknown): value is TgpuCommandEncoder;
10
+ export declare function isTgpuRenderPass(value: unknown): value is TgpuRenderPass;
11
+ export declare function isTgpuRenderCommands(value: unknown): value is TgpuRenderCommands;
12
+ export declare function isTgpuComputePass(value: unknown): value is TgpuComputePass;
13
+ export declare function isGPUCanvasContext(value: unknown): value is GPUCanvasContext;
14
+ export declare function isGPUCommandEncoder(value: unknown): value is GPUCommandEncoder;
15
+ export declare function isGPUComputePassEncoder(value: unknown): value is GPUComputePassEncoder;
16
+ export declare function isGPURenderPassEncoder(value: unknown): value is GPURenderPassEncoder;
17
+ export declare function isGPURenderBundleEncoder(value: unknown): value is GPURenderBundleEncoder;
@@ -1,29 +1,59 @@
1
- import { $internal } from "../../shared/symbols.js";
2
-
3
- //#region src/core/pipeline/typeGuards.ts
4
- function isComputePipeline(value) {
5
- const maybe = value;
6
- return maybe?.resourceType === "compute-pipeline" && !!maybe[$internal];
1
+ import { isMarkedInternal } from "../../shared/symbols.js";
2
+ export function isComputePipeline(value) {
3
+ const maybe = value;
4
+ return maybe?.resourceType === 'compute-pipeline' && isMarkedInternal(maybe);
7
5
  }
8
- function isRenderPipeline(value) {
9
- const maybe = value;
10
- return maybe?.resourceType === "render-pipeline" && !!maybe[$internal];
6
+ export function isRenderPipeline(value) {
7
+ const maybe = value;
8
+ return maybe?.resourceType === 'render-pipeline' && isMarkedInternal(maybe);
11
9
  }
12
- function isPipeline(value) {
13
- return isRenderPipeline(value) || isComputePipeline(value);
10
+ export function isPipeline(value) {
11
+ return isRenderPipeline(value) || isComputePipeline(value);
14
12
  }
15
- function isGPUCommandEncoder(value) {
16
- return !!value && typeof value === "object" && "beginRenderPass" in value && "beginComputePass" in value;
13
+ export function isTgpuCommandEncoder(value) {
14
+ const maybe = value;
15
+ return maybe?.resourceType === 'command-encoder' && isMarkedInternal(maybe);
17
16
  }
18
- function isGPUComputePassEncoder(value) {
19
- return !!value && typeof value === "object" && "dispatchWorkgroups" in value && !("beginRenderPass" in value);
17
+ export function isTgpuRenderPass(value) {
18
+ const maybe = value;
19
+ return maybe?.resourceType === 'render-pass' && isMarkedInternal(maybe);
20
20
  }
21
- function isGPURenderPassEncoder(value) {
22
- return !!value && typeof value === "object" && "executeBundles" in value && "draw" in value;
21
+ export function isTgpuRenderCommands(value) {
22
+ const maybe = value;
23
+ return ((maybe?.resourceType === 'render-pass' || maybe?.resourceType === 'render-bundle-encoder') &&
24
+ isMarkedInternal(maybe));
23
25
  }
24
- function isGPURenderBundleEncoder(value) {
25
- return !!value && typeof value === "object" && "draw" in value && "finish" in value && !("executeBundles" in value) && !("beginRenderPass" in value) && !("dispatchWorkgroups" in value);
26
+ export function isTgpuComputePass(value) {
27
+ const maybe = value;
28
+ return maybe?.resourceType === 'compute-pass' && isMarkedInternal(maybe);
29
+ }
30
+ export function isGPUCanvasContext(value) {
31
+ return typeof value?.getCurrentTexture === 'function';
32
+ }
33
+ export function isGPUCommandEncoder(value) {
34
+ const maybe = value;
35
+ return (!isMarkedInternal(maybe) &&
36
+ typeof maybe?.beginRenderPass === 'function' &&
37
+ typeof maybe?.beginComputePass === 'function');
38
+ }
39
+ export function isGPUComputePassEncoder(value) {
40
+ const maybe = value;
41
+ return (!isMarkedInternal(maybe) &&
42
+ typeof maybe?.dispatchWorkgroups === 'function' &&
43
+ maybe?.beginRenderPass === undefined);
44
+ }
45
+ export function isGPURenderPassEncoder(value) {
46
+ const maybe = value;
47
+ return (!isMarkedInternal(maybe) &&
48
+ typeof maybe?.executeBundles === 'function' &&
49
+ typeof maybe?.draw === 'function');
50
+ }
51
+ export function isGPURenderBundleEncoder(value) {
52
+ const maybe = value;
53
+ return (!isMarkedInternal(maybe) &&
54
+ typeof maybe?.draw === 'function' &&
55
+ typeof maybe?.finish === 'function' &&
56
+ maybe?.executeBundles === undefined &&
57
+ maybe?.beginRenderPass === undefined &&
58
+ maybe?.dispatchWorkgroups === undefined);
26
59
  }
27
-
28
- //#endregion
29
- export { isComputePipeline, isGPUCommandEncoder, isGPUComputePassEncoder, isGPURenderBundleEncoder, isGPURenderPassEncoder, isPipeline, isRenderPipeline };
@@ -0,0 +1,10 @@
1
+ import { type BaseData } from '../../data/wgslTypes.ts';
2
+ import type { TgpuBindGroupLayout } from '../../tgpuBindGroupLayout.ts';
3
+ /**
4
+ * Warns if layout exceeds supported buffer count limits.
5
+ */
6
+ export declare function warnIfOverflow(layouts: TgpuBindGroupLayout[], limits: GPUSupportedLimits): void;
7
+ /**
8
+ * See https://www.w3.org/TR/WGSL/#address-space-layout-constraints
9
+ */
10
+ export declare function warnIfNotUniformAligned(schema: BaseData): void;
@@ -0,0 +1,81 @@
1
+ import { alignmentOf } from "../../data/alignmentOf.js";
2
+ import { memoryLayoutOf } from "../../data/offsetUtils.js";
3
+ import { sizeOf } from "../../data/sizeOf.js";
4
+ import { isWgslArray, isWgslStruct } from "../../data/wgslTypes.js";
5
+ import { invariant } from "../../errors.js";
6
+ import { roundUp } from "../../mathUtils.js";
7
+ import { getName } from "../../shared/meta.js";
8
+ import { logger } from "../../tgpuLogger.js";
9
+ /**
10
+ * Warns if layout exceeds supported buffer count limits.
11
+ */
12
+ export function warnIfOverflow(layouts, limits) {
13
+ const entries = Object.values(layouts)
14
+ .flatMap((layout) => Object.values(layout.entries))
15
+ .filter((entry) => entry !== null);
16
+ const uniform = entries.filter((entry) => 'uniform' in entry).length;
17
+ const storage = entries.filter((entry) => 'storage' in entry).length;
18
+ if (uniform > limits.maxUniformBuffersPerShaderStage) {
19
+ logger.warn('webgpu-limits-exceeded', `Total number of uniform buffers (${uniform}) exceeds maxUniformBuffersPerShaderStage (${limits.maxUniformBuffersPerShaderStage}). Consider:
20
+ 1. Grouping some of the uniforms into one using 'd.struct',
21
+ 2. Increasing the limit when requesting a device or creating a root.`);
22
+ }
23
+ if (storage > limits.maxStorageBuffersPerShaderStage) {
24
+ logger.warn('webgpu-limits-exceeded', `Total number of storage buffers (${storage}) exceeds maxStorageBuffersPerShaderStage (${limits.maxStorageBuffersPerShaderStage}).`);
25
+ }
26
+ }
27
+ function requiredAlignOf(schema) {
28
+ if (isWgslStruct(schema) || isWgslArray(schema)) {
29
+ return roundUp(alignmentOf(schema), 16);
30
+ }
31
+ return alignmentOf(schema);
32
+ }
33
+ /**
34
+ * See https://www.w3.org/TR/WGSL/#address-space-layout-constraints
35
+ */
36
+ export function warnIfNotUniformAligned(schema) {
37
+ if (isWgslArray(schema)) {
38
+ warnIfNotUniformAligned(schema.elementType);
39
+ const stride = roundUp(sizeOf(schema.elementType), alignmentOf(schema.elementType));
40
+ if (stride % 16 !== 0) {
41
+ logger.warn('uniform-schema-misaligned', `\
42
+ Schema '${getName(schema.elementType) ?? '<unnamed>'}' is used in an array in a uniform buffer, and its stride (${stride}) is not a multiple of 16.
43
+ This is not portable (see https://www.w3.org/TR/WGSL/#address-space-layout-constraints), and will break on some devices.
44
+ To address this, put the element schema in a struct and wrap the prop in 'd.align(16, ...)', or use a different schema like 'vec4f'.`);
45
+ }
46
+ }
47
+ if (isWgslStruct(schema)) {
48
+ Object.values(schema.propTypes).forEach(warnIfNotUniformAligned);
49
+ Object.entries(schema.propTypes).forEach(([key, value]) => {
50
+ const offset = memoryLayoutOf(schema, (schema) => schema[key]).offset;
51
+ const requiredAlignment = requiredAlignOf(value);
52
+ if (offset % requiredAlignment) {
53
+ logger.warn('uniform-schema-misaligned', `\
54
+ Schema '${getName(schema) ?? '<unnamed>'}' is used in a uniform buffer, and its property '${key}' does not meet required alignment (offset is ${offset}, required alignment is ${requiredAlignment}).
55
+ This is not portable (see https://www.w3.org/TR/WGSL/#address-space-layout-constraints), and will break on some devices.
56
+ To address this, wrap the property '${key}' in 'd.align(${requiredAlignment}, ...)'.`);
57
+ }
58
+ });
59
+ const keys = Object.keys(schema.propTypes);
60
+ for (let i = 0; i < keys.length - 1; i++) {
61
+ const thisKey = keys[i];
62
+ const nextKey = keys[i + 1];
63
+ invariant(thisKey && nextKey);
64
+ const thisValue = schema.propTypes[thisKey];
65
+ invariant(thisValue);
66
+ if (!isWgslStruct(thisValue)) {
67
+ continue;
68
+ }
69
+ const minimumDifference = roundUp(sizeOf(thisValue), 16);
70
+ const thisKeyOffset = memoryLayoutOf(schema, (schema) => schema[thisKey]).offset;
71
+ const nextKeyOffset = memoryLayoutOf(schema, (schema) => schema[nextKey]).offset;
72
+ const difference = nextKeyOffset - thisKeyOffset;
73
+ if (minimumDifference > difference) {
74
+ logger.warn('uniform-schema-misaligned', `\
75
+ Schema '${getName(schema) ?? '<unnamed>'}' is used in a uniform buffer, and the difference between memory offsets of '${thisKey}' and '${nextKey}' props (${difference}) is less than recommended (${minimumDifference}).
76
+ This is not portable (see https://www.w3.org/TR/WGSL/#address-space-layout-constraints), and will break on some devices.
77
+ To address this, wrap the '${thisKey}' prop in 'd.size(${minimumDifference}, ...)'.`);
78
+ }
79
+ }
80
+ }
81
+ }
@@ -1,22 +1,27 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $internal } from "../../shared/symbols.js";
3
- import "../root/rootTypes.js";
4
-
5
- //#region src/core/querySet/querySet.d.ts
6
- interface TgpuQuerySet<T extends GPUQueryType> extends TgpuNamable {
7
- readonly resourceType: 'query-set';
8
- readonly type: T;
9
- readonly count: number;
10
- readonly querySet: GPUQuerySet;
11
- readonly destroyed: boolean;
12
- readonly available: boolean;
13
- readonly [$internal]: {
14
- readonly readBuffer: GPUBuffer;
15
- readonly resolveBuffer: GPUBuffer;
16
- };
17
- resolve(): void;
18
- read(): Promise<bigint[]>;
19
- destroy(): void;
1
+ import { type TgpuNamable } from '../../shared/meta.ts';
2
+ import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
3
+ import type { TgpuDeviceOwningSoul } from '../../shared/soul.ts';
4
+ import { $internal, $soul } from '../../shared/symbols.ts';
5
+ export interface TgpuQuerySetSoul<T extends GPUQueryType = GPUQueryType> extends TgpuDeviceOwningSoul<'query-set', GPUQuerySet> {
6
+ readonly queryType: T;
7
+ readonly count: number;
20
8
  }
21
- //#endregion
22
- export { TgpuQuerySet };
9
+ export interface TgpuQuerySet<T extends GPUQueryType> extends TgpuNamable {
10
+ readonly resourceType: 'query-set';
11
+ readonly type: T;
12
+ readonly count: number;
13
+ readonly querySet: GPUQuerySet;
14
+ readonly destroyed: boolean;
15
+ readonly available: boolean;
16
+ readonly [$soul]: TgpuQuerySetSoul<T>;
17
+ readonly [$internal]: {
18
+ readonly readBuffer: GPUBuffer;
19
+ readonly resolveBuffer: GPUBuffer;
20
+ readonly materialize: () => GPUQuerySet;
21
+ };
22
+ resolve(): void;
23
+ read(): Promise<bigint[]>;
24
+ destroy(): void;
25
+ }
26
+ export declare function INTERNAL_createQuerySet<T extends GPUQueryType>(group: ExperimentalTgpuRoot, type: T, count: number, rawQuerySet?: GPUQuerySet): TgpuQuerySet<T>;
27
+ export declare function isQuerySet<T extends GPUQueryType>(value: unknown): value is TgpuQuerySet<T>;