typegpu 0.11.8 → 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 +37 -38
  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 -0
  42. package/core/function/fnCore.js +148 -92
  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 +18 -20
  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 +90 -93
  85. package/core/resolve/externals.d.ts +25 -7
  86. package/core/resolve/externals.js +79 -62
  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 -55
  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 -454
  101. package/core/root/rootTypes.d.ts +461 -627
  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 -214
  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 -192
  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 -120
  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 +428 -398
  239. package/package.json +9 -3
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -624
  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 -100
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +18 -0
  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 +272 -193
  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 -747
  350. package/types.d.ts +287 -221
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,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 };
@@ -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>;
@@ -1,106 +1,130 @@
1
- import { $internal } from "../../shared/symbols.js";
2
1
  import { setName } from "../../shared/meta.js";
3
-
4
- //#region src/core/querySet/querySet.ts
5
- function INTERNAL_createQuerySet(group, type, count, rawQuerySet) {
6
- return new TgpuQuerySetImpl(group, type, count, rawQuerySet);
2
+ import { $internal, $soul } from "../../shared/symbols.js";
3
+ export function INTERNAL_createQuerySet(group, type, count, rawQuerySet) {
4
+ return new TgpuQuerySetImpl(group, type, count, rawQuerySet);
7
5
  }
8
- function isQuerySet(value) {
9
- const maybe = value;
10
- return maybe?.resourceType === "query-set" && !!maybe[$internal];
6
+ export function isQuerySet(value) {
7
+ const maybe = value;
8
+ return maybe?.resourceType === 'query-set' && !!maybe[$internal];
9
+ }
10
+ class TgpuQuerySetImpl {
11
+ resourceType = 'query-set';
12
+ #ownQuerySet;
13
+ #destroyed = false;
14
+ #available = true;
15
+ #readBuffer = undefined;
16
+ #resolveBuffer = undefined;
17
+ [$soul];
18
+ [$internal];
19
+ constructor(root, type, count, rawQuerySet) {
20
+ this.#ownQuerySet = !rawQuerySet;
21
+ this[$soul] = {
22
+ type: 'query-set',
23
+ device: root.device,
24
+ queryType: type,
25
+ count,
26
+ raw: rawQuerySet,
27
+ label: undefined,
28
+ };
29
+ // oxlint-disable-next-line typescript/no-this-alias
30
+ const self = this;
31
+ this[$internal] = {
32
+ get readBuffer() {
33
+ if (!self.#readBuffer) {
34
+ self.#readBuffer = self[$soul].device.createBuffer({
35
+ size: self.count * BigUint64Array.BYTES_PER_ELEMENT,
36
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
37
+ });
38
+ }
39
+ return self.#readBuffer;
40
+ },
41
+ get resolveBuffer() {
42
+ if (!self.#resolveBuffer) {
43
+ self.#resolveBuffer = self[$soul].device.createBuffer({
44
+ size: self.count * BigUint64Array.BYTES_PER_ELEMENT,
45
+ usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
46
+ });
47
+ }
48
+ return self.#resolveBuffer;
49
+ },
50
+ materialize: () => {
51
+ if (this.#destroyed) {
52
+ throw new Error('This QuerySet has been destroyed.');
53
+ }
54
+ const soul = this[$soul];
55
+ if (!soul.raw) {
56
+ soul.raw = soul.device.createQuerySet({
57
+ type: soul.queryType,
58
+ count: soul.count,
59
+ });
60
+ }
61
+ return soul.raw;
62
+ },
63
+ };
64
+ }
65
+ get type() {
66
+ return this[$soul].queryType;
67
+ }
68
+ get count() {
69
+ return this[$soul].count;
70
+ }
71
+ get querySet() {
72
+ return this[$internal].materialize();
73
+ }
74
+ get destroyed() {
75
+ return this.#destroyed;
76
+ }
77
+ get available() {
78
+ return this.#available;
79
+ }
80
+ $name(label) {
81
+ setName(this, label);
82
+ const raw = this[$soul].raw;
83
+ if (raw) {
84
+ raw.label = label;
85
+ }
86
+ return this;
87
+ }
88
+ resolve() {
89
+ if (this.#destroyed) {
90
+ throw new Error('This QuerySet has been destroyed.');
91
+ }
92
+ if (!this.#available) {
93
+ throw new Error('This QuerySet is busy resolving or reading.');
94
+ }
95
+ const commandEncoder = this[$soul].device.createCommandEncoder();
96
+ commandEncoder.resolveQuerySet(this.querySet, 0, this.count, this[$internal].resolveBuffer, 0);
97
+ this[$soul].device.queue.submit([commandEncoder.finish()]);
98
+ }
99
+ async read() {
100
+ if (!this.#resolveBuffer) {
101
+ throw new Error('QuerySet must be resolved before reading.');
102
+ }
103
+ this.#available = false;
104
+ try {
105
+ const commandEncoder = this[$soul].device.createCommandEncoder();
106
+ commandEncoder.copyBufferToBuffer(this[$internal].resolveBuffer, 0, this[$internal].readBuffer, 0, this.count * BigUint64Array.BYTES_PER_ELEMENT);
107
+ this[$soul].device.queue.submit([commandEncoder.finish()]);
108
+ const readBuffer = this[$internal].readBuffer;
109
+ await readBuffer.mapAsync(GPUMapMode.READ);
110
+ const data = new BigUint64Array(readBuffer.getMappedRange().slice());
111
+ readBuffer.unmap();
112
+ return Array.from(data);
113
+ }
114
+ finally {
115
+ this.#available = true;
116
+ }
117
+ }
118
+ destroy() {
119
+ if (this.#destroyed) {
120
+ return;
121
+ }
122
+ this.#destroyed = true;
123
+ if (this[$soul].raw && this.#ownQuerySet) {
124
+ this[$soul].raw.destroy();
125
+ }
126
+ this.#readBuffer?.destroy();
127
+ this.#resolveBuffer?.destroy();
128
+ this.#readBuffer = this.#resolveBuffer = undefined;
129
+ }
11
130
  }
12
- var TgpuQuerySetImpl = class {
13
- resourceType = "query-set";
14
- type;
15
- count;
16
- #rawQuerySet;
17
- #device;
18
- #querySet;
19
- #ownQuerySet;
20
- #destroyed = false;
21
- #available = true;
22
- #readBuffer = void 0;
23
- #resolveBuffer = void 0;
24
- constructor(root, type, count, rawQuerySet) {
25
- this.#device = root.device;
26
- this.type = type;
27
- this.count = count;
28
- this.#rawQuerySet = rawQuerySet;
29
- this.#ownQuerySet = !rawQuerySet;
30
- this.#querySet = rawQuerySet;
31
- }
32
- get querySet() {
33
- if (this.#destroyed) throw new Error("This QuerySet has been destroyed.");
34
- if (this.#rawQuerySet) return this.#rawQuerySet;
35
- if (this.#querySet) return this.#querySet;
36
- this.#querySet = this.#device.createQuerySet({
37
- type: this.type,
38
- count: this.count
39
- });
40
- return this.#querySet;
41
- }
42
- get destroyed() {
43
- return this.#destroyed;
44
- }
45
- get available() {
46
- return this.#available;
47
- }
48
- get [$internal]() {
49
- const self = this;
50
- return {
51
- get readBuffer() {
52
- if (!self.#readBuffer) self.#readBuffer = self.#device.createBuffer({
53
- size: self.count * BigUint64Array.BYTES_PER_ELEMENT,
54
- usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
55
- });
56
- return self.#readBuffer;
57
- },
58
- get resolveBuffer() {
59
- if (!self.#resolveBuffer) self.#resolveBuffer = self.#device.createBuffer({
60
- size: self.count * BigUint64Array.BYTES_PER_ELEMENT,
61
- usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC
62
- });
63
- return self.#resolveBuffer;
64
- }
65
- };
66
- }
67
- $name(label) {
68
- setName(this, label);
69
- if (this.#querySet) this.#querySet.label = label;
70
- return this;
71
- }
72
- resolve() {
73
- if (this.#destroyed) throw new Error("This QuerySet has been destroyed.");
74
- if (!this.#available) throw new Error("This QuerySet is busy resolving or reading.");
75
- const commandEncoder = this.#device.createCommandEncoder();
76
- commandEncoder.resolveQuerySet(this.querySet, 0, this.count, this[$internal].resolveBuffer, 0);
77
- this.#device.queue.submit([commandEncoder.finish()]);
78
- }
79
- async read() {
80
- if (!this.#resolveBuffer) throw new Error("QuerySet must be resolved before reading.");
81
- this.#available = false;
82
- try {
83
- const commandEncoder = this.#device.createCommandEncoder();
84
- commandEncoder.copyBufferToBuffer(this[$internal].resolveBuffer, 0, this[$internal].readBuffer, 0, this.count * BigUint64Array.BYTES_PER_ELEMENT);
85
- this.#device.queue.submit([commandEncoder.finish()]);
86
- const readBuffer = this[$internal].readBuffer;
87
- await readBuffer.mapAsync(GPUMapMode.READ);
88
- const data = new BigUint64Array(readBuffer.getMappedRange().slice());
89
- readBuffer.unmap();
90
- return Array.from(data);
91
- } finally {
92
- this.#available = true;
93
- }
94
- }
95
- destroy() {
96
- if (this.#destroyed) return;
97
- this.#destroyed = true;
98
- if (this.#querySet && this.#ownQuerySet) this.#querySet.destroy();
99
- this.#readBuffer?.destroy();
100
- this.#resolveBuffer?.destroy();
101
- this.#readBuffer = this.#resolveBuffer = void 0;
102
- }
103
- };
104
-
105
- //#endregion
106
- export { INTERNAL_createQuerySet, isQuerySet };
@@ -1,22 +1,18 @@
1
- import { $gpuValueOf } from "../../shared/symbols.js";
2
- import { Origin } from "../../data/snippet.js";
3
- import { BaseData } from "../../data/wgslTypes.js";
4
- import { InferGPU } from "../../shared/repr.js";
5
- import { AnyData } from "../../data/dataTypes.js";
6
-
7
- //#region src/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts
8
-
1
+ import type { AnyData } from '../../data/dataTypes.ts';
2
+ import { type Origin } from '../../data/snippet.ts';
3
+ import type { BaseData } from '../../data/wgslTypes.ts';
4
+ import type { InferGPU } from '../../shared/repr.ts';
5
+ import { $gpuValueOf } from '../../shared/symbols.ts';
9
6
  /**
10
7
  * Extra declaration that will be included in final WGSL code
11
8
  * when resolving objects that use it.
12
9
  */
13
- interface TgpuRawCodeSnippet<TDataType extends BaseData> {
14
- $: InferGPU<TDataType>;
15
- value: InferGPU<TDataType>;
16
- readonly [$gpuValueOf]: InferGPU<TDataType>;
17
- $uses(dependencyMap: Record<string, unknown>): this;
10
+ export interface TgpuRawCodeSnippet<TDataType extends BaseData> {
11
+ $: InferGPU<TDataType>;
12
+ readonly [$gpuValueOf]: InferGPU<TDataType>;
13
+ $uses(dependencyMap: Record<string, unknown>): this;
18
14
  }
19
- type RawCodeSnippetOrigin = Exclude<Origin, 'function' | 'local-def' | 'argument' | 'constant-immutable-def' | 'runtime-immutable-def'>;
15
+ export type RawCodeSnippetOrigin = Exclude<Origin, 'function' | 'local-def' | 'argument' | 'constant-immutable-def' | 'runtime-immutable-def'>;
20
16
  /**
21
17
  * An advanced API that creates a typed shader expression which
22
18
  * can be injected into the final shader bundle upon use.
@@ -24,6 +20,7 @@ type RawCodeSnippetOrigin = Exclude<Origin, 'function' | 'local-def' | 'argument
24
20
  * @param expression The code snippet that will be injected in place of `foo.$`
25
21
  * @param type The type of the expression
26
22
  * @param [origin='runtime'] Where the value originates from.
23
+ * @param [possibleSideEffects=true] Whether generating this snippet may produce a WGSL expression with observable side-effects (e.g. calling a barrier, discarding a fragment, or writing to memory).
27
24
  *
28
25
  * **-- Which origin to choose?**
29
26
  *
@@ -42,7 +39,7 @@ type RawCodeSnippetOrigin = Exclude<Origin, 'function' | 'local-def' | 'argument
42
39
  * // final shader bundle, but we cannot
43
40
  * // refer to it in any other way.
44
41
  * const existingGlobal = tgpu['~unstable']
45
- * .rawCodeSnippet('EXISTING_GLOBAL', d.f32, 'constant');
42
+ * .rawCodeSnippet('EXISTING_GLOBAL', d.f32, 'constant', false);
46
43
  *
47
44
  * const foo = () => {
48
45
  * 'use gpu';
@@ -55,6 +52,4 @@ type RawCodeSnippetOrigin = Exclude<Origin, 'function' | 'local-def' | 'argument
55
52
  * // }
56
53
  * ```
57
54
  */
58
- declare function rawCodeSnippet<TDataType extends AnyData>(expression: string, type: TDataType, origin?: RawCodeSnippetOrigin | undefined): TgpuRawCodeSnippet<TDataType>;
59
- //#endregion
60
- export { RawCodeSnippetOrigin, TgpuRawCodeSnippet, rawCodeSnippet };
55
+ export declare function rawCodeSnippet<TDataType extends AnyData>(expression: string, type: TDataType, origin?: RawCodeSnippetOrigin | undefined, possibleSideEffects?: boolean | undefined): TgpuRawCodeSnippet<TDataType>;