typegpu 0.11.9 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/bin.mjs +28 -6
  2. package/builtin.d.ts +51 -53
  3. package/builtin.js +30 -34
  4. package/common/fullScreenTriangle.d.ts +2 -10
  5. package/common/fullScreenTriangle.js +20 -28
  6. package/common/index.d.ts +2 -9
  7. package/common/index.js +3 -12
  8. package/common/writeSoA.d.ts +11 -12
  9. package/common/writeSoA.js +88 -76
  10. package/core/buffer/buffer.d.ts +79 -62
  11. package/core/buffer/buffer.js +283 -205
  12. package/core/buffer/bufferBinding.d.ts +71 -0
  13. package/core/buffer/bufferBinding.js +154 -0
  14. package/core/buffer/bufferUsage.d.ts +14 -45
  15. package/core/buffer/bufferUsage.js +1 -171
  16. package/core/buffer/laidOutBuffer.d.ts +25 -0
  17. package/core/buffer/laidOutBuffer.js +55 -0
  18. package/core/commandEncoder/attachments.d.ts +125 -0
  19. package/core/commandEncoder/attachments.js +29 -0
  20. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  21. package/core/commandEncoder/commandEncoder.js +56 -0
  22. package/core/commandEncoder/computePass.d.ts +58 -0
  23. package/core/commandEncoder/computePass.js +63 -0
  24. package/core/commandEncoder/renderPass.d.ts +121 -0
  25. package/core/commandEncoder/renderPass.js +196 -0
  26. package/core/constant/tgpuConstant.d.ts +26 -26
  27. package/core/constant/tgpuConstant.js +76 -65
  28. package/core/declare/tgpuDeclare.d.ts +3 -6
  29. package/core/declare/tgpuDeclare.js +36 -36
  30. package/core/function/autoIO.d.ts +61 -33
  31. package/core/function/autoIO.js +68 -73
  32. package/core/function/comptime.d.ts +11 -13
  33. package/core/function/comptime.js +60 -52
  34. package/core/function/createCallableSchema.d.ts +16 -0
  35. package/core/function/createCallableSchema.js +50 -40
  36. package/core/function/dualImpl.d.ts +44 -0
  37. package/core/function/dualImpl.js +71 -50
  38. package/core/function/entryInputRouter.d.ts +26 -0
  39. package/core/function/entryInputRouter.js +31 -33
  40. package/core/function/extractArgs.d.ts +38 -0
  41. package/core/function/extractArgs.js +202 -200
  42. package/core/function/fnCore.d.ts +44 -5
  43. package/core/function/fnCore.js +148 -93
  44. package/core/function/fnTypes.d.ts +31 -29
  45. package/core/function/fnTypes.js +1 -0
  46. package/core/function/ioSchema.d.ts +12 -10
  47. package/core/function/ioSchema.js +65 -47
  48. package/core/function/shelllessImpl.d.ts +9 -12
  49. package/core/function/shelllessImpl.js +17 -22
  50. package/core/function/templateUtils.d.ts +2 -0
  51. package/core/function/templateUtils.js +9 -8
  52. package/core/function/tgpuComputeFn.d.ts +26 -28
  53. package/core/function/tgpuComputeFn.js +47 -48
  54. package/core/function/tgpuFn.d.ts +34 -37
  55. package/core/function/tgpuFn.js +179 -153
  56. package/core/function/tgpuFragmentFn.d.ts +52 -53
  57. package/core/function/tgpuFragmentFn.js +63 -56
  58. package/core/function/tgpuVertexFn.d.ts +36 -39
  59. package/core/function/tgpuVertexFn.js +56 -53
  60. package/core/pipeline/computePipeline.d.ts +141 -53
  61. package/core/pipeline/computePipeline.js +291 -225
  62. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  63. package/core/pipeline/connectAttachmentToShader.js +25 -22
  64. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  65. package/core/pipeline/connectTargetsToShader.js +29 -27
  66. package/core/pipeline/drawState.d.ts +52 -0
  67. package/core/pipeline/drawState.js +225 -0
  68. package/core/pipeline/performanceTracker.d.ts +14 -0
  69. package/core/pipeline/performanceTracker.js +34 -0
  70. package/core/pipeline/pipelineUtils.d.ts +18 -0
  71. package/core/pipeline/pipelineUtils.js +54 -25
  72. package/core/pipeline/priors.d.ts +1 -0
  73. package/core/pipeline/priors.js +12 -0
  74. package/core/pipeline/renderPipeline.d.ts +246 -261
  75. package/core/pipeline/renderPipeline.js +487 -480
  76. package/core/pipeline/timeable.d.ts +28 -18
  77. package/core/pipeline/timeable.js +90 -52
  78. package/core/pipeline/typeGuards.d.ts +17 -0
  79. package/core/pipeline/typeGuards.js +52 -22
  80. package/core/pipeline/webgpuLimitations.d.ts +10 -0
  81. package/core/pipeline/webgpuLimitations.js +81 -0
  82. package/core/querySet/querySet.d.ts +26 -21
  83. package/core/querySet/querySet.js +127 -103
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  85. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  86. package/core/resolve/externals.d.ts +25 -8
  87. package/core/resolve/externals.js +78 -54
  88. package/core/resolve/namespace.d.ts +22 -25
  89. package/core/resolve/namespace.js +16 -21
  90. package/core/resolve/resolvableString.d.ts +7 -0
  91. package/core/resolve/resolvableString.js +13 -0
  92. package/core/resolve/resolveData.d.ts +10 -0
  93. package/core/resolve/resolveData.js +162 -121
  94. package/core/resolve/stitch.d.ts +8 -0
  95. package/core/resolve/stitch.js +23 -21
  96. package/core/resolve/tgpuResolve.d.ts +55 -53
  97. package/core/resolve/tgpuResolve.js +106 -53
  98. package/core/root/configurableImpl.d.ts +10 -0
  99. package/core/root/configurableImpl.js +17 -19
  100. package/core/root/init.d.ts +76 -38
  101. package/core/root/init.js +346 -455
  102. package/core/root/rootTypes.d.ts +461 -636
  103. package/core/root/rootTypes.js +1 -0
  104. package/core/sampler/sampler.d.ts +50 -31
  105. package/core/sampler/sampler.js +120 -113
  106. package/core/simulate/tgpuSimulate.d.ts +9 -12
  107. package/core/simulate/tgpuSimulate.js +68 -71
  108. package/core/slot/accessor.d.ts +36 -13
  109. package/core/slot/accessor.js +138 -91
  110. package/core/slot/internalSlots.d.ts +2 -0
  111. package/core/slot/internalSlots.js +1 -6
  112. package/core/slot/lazy.d.ts +2 -6
  113. package/core/slot/lazy.js +71 -39
  114. package/core/slot/slot.d.ts +2 -6
  115. package/core/slot/slot.js +45 -38
  116. package/core/slot/slotTypes.d.ts +78 -80
  117. package/core/slot/slotTypes.js +11 -16
  118. package/core/texture/externalTexture.d.ts +20 -11
  119. package/core/texture/externalTexture.js +46 -46
  120. package/core/texture/texture.d.ts +152 -97
  121. package/core/texture/texture.js +407 -314
  122. package/core/texture/textureFormats.d.ts +42 -23
  123. package/core/texture/textureFormats.js +104 -75
  124. package/core/texture/textureProps.d.ts +7 -10
  125. package/core/texture/textureProps.js +1 -0
  126. package/core/texture/textureUtils.d.ts +8 -0
  127. package/core/texture/textureUtils.js +185 -179
  128. package/core/texture/usageExtension.d.ts +21 -18
  129. package/core/texture/usageExtension.js +13 -17
  130. package/core/unroll/tgpuUnroll.d.ts +20 -19
  131. package/core/unroll/tgpuUnroll.js +82 -91
  132. package/core/valueProxyUtils.d.ts +3 -0
  133. package/core/valueProxyUtils.js +52 -41
  134. package/core/variable/tgpuVariable.d.ts +26 -27
  135. package/core/variable/tgpuVariable.js +93 -96
  136. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  137. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  138. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  139. package/core/vertexLayout/vertexAttribute.js +1 -0
  140. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  141. package/core/vertexLayout/vertexLayout.js +130 -99
  142. package/core/whitespaces.d.ts +2 -0
  143. package/core/whitespaces.js +16 -0
  144. package/data/alignIO.d.ts +7 -0
  145. package/data/alignIO.js +13 -13
  146. package/data/alignmentOf.d.ts +5 -8
  147. package/data/alignmentOf.js +90 -75
  148. package/data/array.d.ts +17 -9
  149. package/data/array.js +57 -40
  150. package/data/atomic.d.ts +2 -7
  151. package/data/atomic.js +26 -23
  152. package/data/attributes.d.ts +19 -21
  153. package/data/attributes.js +192 -132
  154. package/data/autoStruct.d.ts +36 -3
  155. package/data/autoStruct.js +84 -81
  156. package/data/compiledIO.d.ts +5 -0
  157. package/data/compiledIO.js +231 -215
  158. package/data/dataIO.d.ts +13 -11
  159. package/data/dataIO.js +643 -589
  160. package/data/dataTypes.d.ts +83 -65
  161. package/data/dataTypes.js +66 -68
  162. package/data/deepEqual.d.ts +2 -7
  163. package/data/deepEqual.js +80 -55
  164. package/data/disarray.d.ts +6 -10
  165. package/data/disarray.js +52 -46
  166. package/data/float16Conversion.d.ts +4 -0
  167. package/data/float16Conversion.js +7 -0
  168. package/data/generalizeFn.d.ts +25 -0
  169. package/data/generalizeFn.js +89 -0
  170. package/data/getLongestContiguousPrefix.d.ts +4 -8
  171. package/data/getLongestContiguousPrefix.js +6 -11
  172. package/data/index.d.ts +30 -31
  173. package/data/index.js +39 -172
  174. package/data/instanceToSchema.d.ts +24 -27
  175. package/data/instanceToSchema.js +1 -0
  176. package/data/isContiguous.d.ts +4 -8
  177. package/data/isContiguous.js +6 -11
  178. package/data/matrix.d.ts +21 -21
  179. package/data/matrix.js +513 -505
  180. package/data/numberOps.d.ts +5 -0
  181. package/data/numberOps.js +21 -21
  182. package/data/numeric.d.ts +21 -12
  183. package/data/numeric.js +287 -197
  184. package/data/offsetUtils.d.ts +9 -13
  185. package/data/offsetUtils.js +204 -144
  186. package/data/offsets.d.ts +8 -0
  187. package/data/offsets.js +33 -33
  188. package/data/partialIO.d.ts +13 -8
  189. package/data/partialIO.js +124 -113
  190. package/data/ptr.d.ts +12 -12
  191. package/data/ptr.js +42 -44
  192. package/data/ref.d.ts +40 -27
  193. package/data/ref.js +125 -95
  194. package/data/sampler.d.ts +99 -101
  195. package/data/sampler.js +17 -21
  196. package/data/schemaCallWrapper.d.ts +19 -0
  197. package/data/schemaCallWrapper.js +31 -26
  198. package/data/schemaMemoryLayout.d.ts +8 -0
  199. package/data/schemaMemoryLayout.js +213 -185
  200. package/data/sizeOf.d.ts +4 -8
  201. package/data/sizeOf.js +6 -11
  202. package/data/snippet.d.ts +96 -20
  203. package/data/snippet.js +75 -86
  204. package/data/struct.d.ts +4 -7
  205. package/data/struct.js +51 -39
  206. package/data/texture.d.ts +253 -250
  207. package/data/texture.js +238 -200
  208. package/data/unstruct.d.ts +2 -7
  209. package/data/unstruct.js +43 -37
  210. package/data/vector.d.ts +33 -21
  211. package/data/vector.js +234 -221
  212. package/data/vectorImpl.d.ts +231 -0
  213. package/data/vectorImpl.js +563 -515
  214. package/data/vectorOps.d.ts +25 -0
  215. package/data/vectorOps.js +118 -669
  216. package/data/vertexFormatData.d.ts +181 -184
  217. package/data/vertexFormatData.js +104 -106
  218. package/data/wgslTypes.d.ts +665 -600
  219. package/data/wgslTypes.js +220 -198
  220. package/errors.d.ts +50 -24
  221. package/errors.js +146 -126
  222. package/execMode.d.ts +16 -0
  223. package/execMode.js +47 -40
  224. package/extension.d.ts +13 -8
  225. package/extension.js +10 -16
  226. package/getGPUValue.d.ts +1 -0
  227. package/getGPUValue.js +2 -7
  228. package/index.d.ts +28 -68
  229. package/index.js +8 -28
  230. package/indexNamedExports.d.ts +69 -42
  231. package/indexNamedExports.js +25 -0
  232. package/internal.d.ts +16 -0
  233. package/internal.js +12 -0
  234. package/mathUtils.d.ts +5 -0
  235. package/mathUtils.js +7 -11
  236. package/memo.d.ts +11 -0
  237. package/memo.js +20 -22
  238. package/minify.d.ts +5 -0
  239. package/minify.js +93 -0
  240. package/nameUtils.d.ts +29 -0
  241. package/nameUtils.js +427 -394
  242. package/package.json +5 -1
  243. package/resolutionCtx.d.ts +162 -22
  244. package/resolutionCtx.js +911 -629
  245. package/serial/registry.d.ts +15 -0
  246. package/serial/registry.js +106 -0
  247. package/serial/restore.d.ts +49 -0
  248. package/serial/restore.js +68 -0
  249. package/serial/schema.d.ts +58 -0
  250. package/serial/schema.js +209 -0
  251. package/serial/types.d.ts +5 -0
  252. package/serial/types.js +1 -0
  253. package/shared/env.d.ts +9 -0
  254. package/shared/env.js +9 -12
  255. package/shared/generators.d.ts +4 -0
  256. package/shared/generators.js +10 -12
  257. package/shared/meta.d.ts +29 -14
  258. package/shared/meta.js +71 -55
  259. package/shared/normalizeMetadata.d.ts +32 -27
  260. package/shared/normalizeMetadata.js +23 -36
  261. package/shared/repr.d.ts +73 -55
  262. package/shared/repr.js +1 -0
  263. package/shared/soul.d.ts +17 -0
  264. package/shared/soul.js +1 -0
  265. package/shared/stringify.d.ts +2 -0
  266. package/shared/stringify.js +29 -20
  267. package/shared/symbols.d.ts +26 -20
  268. package/shared/symbols.js +79 -79
  269. package/shared/tseynit.d.ts +2 -0
  270. package/shared/tseynit.js +160 -75
  271. package/shared/utilityTypes.d.ts +30 -14
  272. package/shared/utilityTypes.js +2 -6
  273. package/shared/vertexFormat.d.ts +41 -43
  274. package/shared/vertexFormat.js +59 -62
  275. package/std/array.d.ts +2 -7
  276. package/std/array.js +18 -23
  277. package/std/atomic.d.ts +14 -18
  278. package/std/atomic.js +96 -95
  279. package/std/bitcast.d.ts +193 -10
  280. package/std/bitcast.js +309 -39
  281. package/std/boolean.d.ts +19 -33
  282. package/std/boolean.js +296 -292
  283. package/std/copy.d.ts +2 -7
  284. package/std/copy.js +27 -24
  285. package/std/derivative.d.ts +11 -15
  286. package/std/derivative.js +56 -79
  287. package/std/discard.d.ts +1 -6
  288. package/std/discard.js +7 -14
  289. package/std/environment.d.ts +19 -14
  290. package/std/environment.js +71 -51
  291. package/std/extensions.d.ts +2 -8
  292. package/std/extensions.js +10 -11
  293. package/std/index.d.ts +20 -24
  294. package/std/index.js +32 -187
  295. package/std/matrix.d.ts +6 -12
  296. package/std/matrix.js +60 -69
  297. package/std/numeric.d.ts +150 -146
  298. package/std/numeric.js +771 -727
  299. package/std/operators.d.ts +19 -27
  300. package/std/operators.js +195 -194
  301. package/std/packing.d.ts +5 -11
  302. package/std/packing.js +67 -75
  303. package/std/range.d.ts +6 -11
  304. package/std/range.js +48 -36
  305. package/std/subgroup.d.ts +33 -37
  306. package/std/subgroup.js +180 -217
  307. package/std/texture.d.ts +70 -38
  308. package/std/texture.js +176 -172
  309. package/taskQueue.d.ts +6 -0
  310. package/taskQueue.js +30 -0
  311. package/tgpu.d.ts +16 -0
  312. package/tgpu.js +17 -44
  313. package/tgpuBindGroupLayout.d.ts +132 -152
  314. package/tgpuBindGroupLayout.js +346 -268
  315. package/tgpuLogger.d.ts +34 -0
  316. package/tgpuLogger.js +64 -0
  317. package/tgpuUnstable.d.ts +16 -22
  318. package/tgpuUnstable.js +13 -35
  319. package/tgsl/accessIndex.d.ts +2 -0
  320. package/tgsl/accessIndex.js +76 -33
  321. package/tgsl/accessProp.d.ts +2 -0
  322. package/tgsl/accessProp.js +142 -101
  323. package/tgsl/accessStructProp.d.ts +5 -0
  324. package/tgsl/accessStructProp.js +13 -15
  325. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  326. package/tgsl/consoleLog/deserializers.js +119 -103
  327. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  328. package/tgsl/consoleLog/logGenerator.js +85 -80
  329. package/tgsl/consoleLog/serializers.d.ts +21 -0
  330. package/tgsl/consoleLog/serializers.js +119 -100
  331. package/tgsl/consoleLog/types.d.ts +40 -39
  332. package/tgsl/consoleLog/types.js +1 -0
  333. package/tgsl/conversion.d.ts +33 -0
  334. package/tgsl/conversion.js +271 -216
  335. package/tgsl/forOfUtils.d.ts +15 -0
  336. package/tgsl/forOfUtils.js +85 -70
  337. package/tgsl/generationHelpers.d.ts +22 -39
  338. package/tgsl/generationHelpers.js +85 -58
  339. package/tgsl/infixDispatch.d.ts +70 -0
  340. package/tgsl/infixDispatch.js +48 -46
  341. package/tgsl/jsPolyfills.d.ts +16 -19
  342. package/tgsl/jsPolyfills.js +44 -42
  343. package/tgsl/makeDereferenceable.d.ts +48 -0
  344. package/tgsl/makeDereferenceable.js +86 -0
  345. package/tgsl/makeResolvable.d.ts +22 -0
  346. package/tgsl/makeResolvable.js +33 -0
  347. package/tgsl/shaderGenerator.d.ts +77 -17
  348. package/tgsl/shaderGenerator.js +1 -0
  349. package/tgsl/shellless.d.ts +6 -9
  350. package/tgsl/shellless.js +73 -43
  351. package/tgsl/wgslGenerator.d.ts +66 -59
  352. package/tgsl/wgslGenerator.js +1345 -760
  353. package/types.d.ts +287 -222
  354. package/types.js +61 -44
  355. package/unwrapper.d.ts +31 -26
  356. package/unwrapper.js +1 -0
  357. package/wgslExtensions.d.ts +3 -5
  358. package/wgslExtensions.js +12 -16
  359. package/_virtual/rolldown_runtime.js +0 -13
  360. package/core/buffer/bufferShorthand.d.ts +0 -50
  361. package/core/buffer/bufferShorthand.js +0 -55
  362. package/core/pipeline/applyPipelineState.js +0 -37
  363. package/core/pipeline/limitsOverflow.js +0 -13
  364. package/package.js +0 -5
  365. package/tgsl/shaderGenerator_members.d.ts +0 -33
  366. package/tgsl/shaderGenerator_members.js +0 -12
@@ -0,0 +1,29 @@
1
+ import { $internal } from "../../shared/symbols.js";
2
+ import { isQuerySet } from "../querySet/querySet.js";
3
+ import { isGPUCanvasContext } from "../pipeline/typeGuards.js";
4
+ import { isTexture, isTextureView, } from "../texture/texture.js";
5
+ export function unwrapAttachmentView(root, view) {
6
+ if (isTexture(view)) {
7
+ return root.unwrap(view).createView();
8
+ }
9
+ if (isTextureView(view)) {
10
+ return root.unwrap(view);
11
+ }
12
+ if (isGPUCanvasContext(view)) {
13
+ return view.getCurrentTexture().createView();
14
+ }
15
+ return view;
16
+ }
17
+ export function unwrapTimestampWrites(root, timestampWrites) {
18
+ const { querySet, beginningOfPassWriteIndex, endOfPassWriteIndex } = timestampWrites;
19
+ const result = {
20
+ querySet: isQuerySet(querySet) ? root.unwrap(querySet) : querySet,
21
+ };
22
+ if (beginningOfPassWriteIndex !== undefined) {
23
+ result.beginningOfPassWriteIndex = beginningOfPassWriteIndex;
24
+ }
25
+ if (endOfPassWriteIndex !== undefined) {
26
+ result.endOfPassWriteIndex = endOfPassWriteIndex;
27
+ }
28
+ return result;
29
+ }
@@ -0,0 +1,53 @@
1
+ import { $internal } from '../../shared/symbols.ts';
2
+ import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
3
+ import { type TgpuComputePass, type TgpuComputePassDescriptor } from './computePass.ts';
4
+ import { type TgpuRenderPass, type TgpuRenderPassDescriptor } from './renderPass.ts';
5
+ export interface CommandEncoderInternals {
6
+ readonly rawEncoder: GPUCommandEncoder;
7
+ readonly root: ExperimentalTgpuRoot;
8
+ /** A caller-owned raw encoder, so submission is out of our hands and no work can be deferred */
9
+ readonly adopted: boolean;
10
+ /** Commands recorded just before the encoder is finished, keyed for deduplication */
11
+ readonly beforeFinish: Map<object, (rawEncoder: GPUCommandEncoder) => void>;
12
+ /** Callbacks run once the recorded commands have been submitted, keyed for deduplication */
13
+ readonly afterSubmit: Map<object, () => void>;
14
+ }
15
+ /**
16
+ * The TypeGPU equivalent of {@link GPUCommandEncoder}, for batching multiple
17
+ * passes (and draws within them) into a single submission.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const encoder = root['~unstable'].createCommandEncoder();
22
+ * const pass = encoder.beginRenderPass({
23
+ * colorAttachments: [{ view: msaaTexture, resolveTarget: context }],
24
+ * });
25
+ * scenePipeline.with(pass).draw(vertexCount);
26
+ * skyPipeline.with(pass).draw(3);
27
+ * pass.end();
28
+ * encoder.submit();
29
+ * ```
30
+ *
31
+ * For anything not covered by the typed surface (e.g. texture copies), grab
32
+ * the raw encoder via `root.unwrap(encoder)`.
33
+ */
34
+ export interface TgpuCommandEncoder {
35
+ readonly [$internal]: CommandEncoderInternals;
36
+ readonly resourceType: 'command-encoder';
37
+ /**
38
+ * Begins recording a render pass. Attachment views accept TypeGPU textures,
39
+ * texture views and canvas contexts, next to raw {@link GPUTextureView}s.
40
+ */
41
+ beginRenderPass(descriptor: TgpuRenderPassDescriptor): TgpuRenderPass;
42
+ /** Begins recording a compute pass */
43
+ beginComputePass(descriptor?: TgpuComputePassDescriptor): TgpuComputePass;
44
+ /** Finishes the recording and submits the resulting command buffer to the device queue */
45
+ submit(): void;
46
+ /**
47
+ * Escape hatch: finishes the recording without submitting, for manual
48
+ * multi-encoder batching via `device.queue.submit([...])`.
49
+ */
50
+ finish(descriptor?: GPUCommandBufferDescriptor): GPUCommandBuffer;
51
+ }
52
+ export declare function INTERNAL_createCommandEncoder(root: ExperimentalTgpuRoot, descriptor?: GPUCommandEncoderDescriptor): TgpuCommandEncoder;
53
+ export declare function INTERNAL_adoptCommandEncoder(root: ExperimentalTgpuRoot, rawEncoder: GPUCommandEncoder): TgpuCommandEncoder;
@@ -0,0 +1,56 @@
1
+ import { $internal } from "../../shared/symbols.js";
2
+ import { logger } from "../../tgpuLogger.js";
3
+ import { INTERNAL_beginComputePass, } from "./computePass.js";
4
+ import { INTERNAL_beginRenderPass, } from "./renderPass.js";
5
+ export function INTERNAL_createCommandEncoder(root, descriptor) {
6
+ return new TgpuCommandEncoderImpl(root, root.device.createCommandEncoder(descriptor), false);
7
+ }
8
+ export function INTERNAL_adoptCommandEncoder(root, rawEncoder) {
9
+ return new TgpuCommandEncoderImpl(root, rawEncoder, true);
10
+ }
11
+ // --------------
12
+ // Implementation
13
+ // --------------
14
+ class TgpuCommandEncoderImpl {
15
+ [$internal];
16
+ resourceType = 'command-encoder';
17
+ constructor(root, rawEncoder, adopted) {
18
+ this[$internal] = {
19
+ rawEncoder,
20
+ root,
21
+ adopted,
22
+ beforeFinish: new Map(),
23
+ afterSubmit: new Map(),
24
+ };
25
+ }
26
+ beginRenderPass(descriptor) {
27
+ return INTERNAL_beginRenderPass(this, descriptor);
28
+ }
29
+ beginComputePass(descriptor) {
30
+ return INTERNAL_beginComputePass(this, descriptor);
31
+ }
32
+ #recordPendingCommands() {
33
+ const { rawEncoder, beforeFinish } = this[$internal];
34
+ for (const record of beforeFinish.values()) {
35
+ record(rawEncoder);
36
+ }
37
+ beforeFinish.clear();
38
+ }
39
+ submit() {
40
+ const { rawEncoder, root, afterSubmit } = this[$internal];
41
+ this.#recordPendingCommands();
42
+ root.device.queue.submit([rawEncoder.finish()]);
43
+ for (const hook of afterSubmit.values()) {
44
+ hook();
45
+ }
46
+ afterSubmit.clear();
47
+ }
48
+ finish(descriptor) {
49
+ const { rawEncoder, root, afterSubmit } = this[$internal];
50
+ this.#recordPendingCommands();
51
+ if (afterSubmit.size > 0) {
52
+ logger.warnOnce('suspicious', root, 'finishWithPendingWork', 'Shader console.log output and performance callbacks do not fire for command buffers produced by encoder.finish(). Use encoder.submit() instead.');
53
+ }
54
+ return rawEncoder.finish(descriptor);
55
+ }
56
+ }
@@ -0,0 +1,58 @@
1
+ import type { PrimitiveOffsetInfo } from '../../data/offsetUtils.ts';
2
+ import type { AnyWgslData } from '../../data/wgslTypes.ts';
3
+ import { $internal } from '../../shared/symbols.ts';
4
+ import type { TgpuBindGroup, TgpuBindGroupLayout, TgpuLayoutEntry } from '../../tgpuBindGroupLayout.ts';
5
+ import type { IndirectFlag, TgpuBuffer } from '../buffer/buffer.ts';
6
+ import { ComputeDrawState } from '../pipeline/drawState.ts';
7
+ import type { TgpuComputePipeline } from '../pipeline/computePipeline.ts';
8
+ import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
9
+ import { type TgpuPassTimestampWrites } from './attachments.ts';
10
+ import type { TgpuCommandEncoder } from './commandEncoder.ts';
11
+ /**
12
+ * The TypeGPU equivalent of {@link GPUComputePassDescriptor}.
13
+ * Query sets accept TypeGPU query sets next to raw {@link GPUQuerySet}s.
14
+ */
15
+ export interface TgpuComputePassDescriptor {
16
+ label?: string | undefined;
17
+ timestampWrites?: TgpuPassTimestampWrites | undefined;
18
+ }
19
+ export interface ComputePassInternals {
20
+ readonly rawPass: GPUComputePassEncoder;
21
+ readonly state: ComputeDrawState;
22
+ /** Undefined for raw pass encoders the caller owns */
23
+ readonly owner: TgpuCommandEncoder | undefined;
24
+ appliedVersion: number | undefined;
25
+ }
26
+ /**
27
+ * A compute pass recording into a {@link TgpuCommandEncoder}.
28
+ *
29
+ * Dispatch either by binding TypeGPU pipelines to it
30
+ * (`pipeline.with(pass).dispatchWorkgroups(...)`), or proxy-style via
31
+ * `pass.setPipeline(pipeline)` followed by `pass.dispatchWorkgroups(...)`.
32
+ *
33
+ * Call `end()` when done recording.
34
+ */
35
+ export interface TgpuComputePass {
36
+ readonly [$internal]: ComputePassInternals;
37
+ readonly resourceType: 'compute-pass';
38
+ /** Sets the current {@link TgpuComputePipeline} for subsequent dispatches */
39
+ setPipeline(pipeline: TgpuComputePipeline): void;
40
+ /** Associates a bind group with the layout it was created from */
41
+ setBindGroup(bindGroup: TgpuBindGroup): void;
42
+ /** Associates a bind group with the given layout */
43
+ setBindGroup<Entries extends Record<string, TgpuLayoutEntry | null>>(bindGroupLayout: TgpuBindGroupLayout<Entries>, bindGroup: TgpuBindGroup<Entries> | GPUBindGroup): void;
44
+ dispatchWorkgroups(x: number, y?: number, z?: number): void;
45
+ /**
46
+ * Dispatches compute workgroups using parameters read from a buffer.
47
+ * The buffer must contain 3 consecutive u32 values (x, y, z workgroup counts).
48
+ * To get the correct offset within complex data structures, use `d.memoryLayoutOf(...)`.
49
+ *
50
+ * @param indirectBuffer - Buffer marked with 'indirect' usage containing dispatch parameters or raw GPUBuffer
51
+ * @param start - PrimitiveOffsetInfo pointing to the first dispatch parameter. If not provided, starts at offset 0. To obtain safe offsets, use `d.memoryLayoutOf(...)`.
52
+ */
53
+ dispatchWorkgroupsIndirect<T extends AnyWgslData>(indirectBuffer: (TgpuBuffer<T> & IndirectFlag) | GPUBuffer, start?: PrimitiveOffsetInfo | number): void;
54
+ /** Completes the recording of this compute pass */
55
+ end(): void;
56
+ }
57
+ export declare function INTERNAL_beginComputePass(encoder: TgpuCommandEncoder, descriptor?: TgpuComputePassDescriptor): TgpuComputePass;
58
+ export declare function INTERNAL_adoptComputePass(root: ExperimentalTgpuRoot, rawPass: GPUComputePassEncoder): TgpuComputePass;
@@ -0,0 +1,63 @@
1
+ import { $internal } from "../../shared/symbols.js";
2
+ import { isGPUBuffer } from "../../types.js";
3
+ import { DISPATCH_INDIRECT_SIZE, resolveIndirectOffset } from "../pipeline/pipelineUtils.js";
4
+ import { ComputeDrawState, emitComputeDispatch, recordBindGroup, stampComputePipeline, } from "../pipeline/drawState.js";
5
+ import { unwrapTimestampWrites } from "./attachments.js";
6
+ // --------------
7
+ // Implementation
8
+ // --------------
9
+ export function INTERNAL_beginComputePass(encoder, descriptor) {
10
+ const { rawEncoder, root } = encoder[$internal];
11
+ const rawDescriptor = {};
12
+ if (descriptor?.label !== undefined) {
13
+ rawDescriptor.label = descriptor.label;
14
+ }
15
+ if (descriptor?.timestampWrites !== undefined) {
16
+ rawDescriptor.timestampWrites = unwrapTimestampWrites(root, descriptor.timestampWrites);
17
+ }
18
+ return new TgpuComputePassImpl(root, rawEncoder.beginComputePass(rawDescriptor), encoder);
19
+ }
20
+ export function INTERNAL_adoptComputePass(root, rawPass) {
21
+ const adopted = new TgpuComputePassImpl(root, rawPass, undefined);
22
+ adopted[$internal].state.rawAccessed = true;
23
+ return adopted;
24
+ }
25
+ class TgpuComputePassImpl {
26
+ [$internal];
27
+ resourceType = 'compute-pass';
28
+ #root;
29
+ constructor(root, rawPass, owner) {
30
+ this.#root = root;
31
+ this[$internal] = {
32
+ rawPass,
33
+ state: new ComputeDrawState(),
34
+ owner,
35
+ appliedVersion: undefined,
36
+ };
37
+ }
38
+ #emit(emit) {
39
+ const internals = this[$internal];
40
+ const pipeline = internals.state.currentPipeline;
41
+ if (!pipeline) {
42
+ throw new Error('Cannot dispatch without a call to pass.setPipeline');
43
+ }
44
+ emitComputeDispatch(this.#root, internals, pipeline, emit);
45
+ }
46
+ setPipeline(pipeline) {
47
+ stampComputePipeline(this[$internal].state, pipeline);
48
+ }
49
+ setBindGroup(first, bindGroup) {
50
+ recordBindGroup(this[$internal].state, first, bindGroup);
51
+ }
52
+ dispatchWorkgroups(x, y, z) {
53
+ this.#emit((rawPass) => rawPass.dispatchWorkgroups(x, y, z));
54
+ }
55
+ dispatchWorkgroupsIndirect(indirectBuffer, start) {
56
+ const rawBuffer = isGPUBuffer(indirectBuffer) ? indirectBuffer : indirectBuffer.buffer;
57
+ const offset = resolveIndirectOffset(indirectBuffer, start, DISPATCH_INDIRECT_SIZE, 'dispatchWorkgroupsIndirect');
58
+ this.#emit((rawPass) => rawPass.dispatchWorkgroupsIndirect(rawBuffer, offset));
59
+ }
60
+ end() {
61
+ this[$internal].rawPass.end();
62
+ }
63
+ }
@@ -0,0 +1,121 @@
1
+ import type { Disarray } from '../../data/dataTypes.ts';
2
+ import type { PrimitiveOffsetInfo } from '../../data/offsetUtils.ts';
3
+ import type { BaseData, WgslArray } from '../../data/wgslTypes.ts';
4
+ import { $internal } from '../../shared/symbols.ts';
5
+ import type { TgpuBindGroup, TgpuBindGroupLayout, TgpuLayoutEntry } from '../../tgpuBindGroupLayout.ts';
6
+ import type { IndexFlag, IndirectFlag, TgpuBuffer, VertexFlag } from '../buffer/buffer.ts';
7
+ import { RenderDrawState } from '../pipeline/drawState.ts';
8
+ import type { TgpuRenderPipeline } from '../pipeline/renderPipeline.ts';
9
+ import { type TgpuQuerySet } from '../querySet/querySet.ts';
10
+ import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
11
+ import type { TgpuCommandEncoder } from './commandEncoder.ts';
12
+ import type { TgpuVertexLayout } from '../vertexLayout/vertexLayout.ts';
13
+ import { type ColorAttachment, type DepthStencilAttachment, type TgpuPassTimestampWrites } from './attachments.ts';
14
+ /**
15
+ * The TypeGPU equivalent of {@link GPURenderPassDescriptor}. Attachment views accept
16
+ * TypeGPU textures, texture views and canvas contexts (next to raw {@link GPUTextureView}s),
17
+ * and query sets accept {@link TgpuQuerySet}.
18
+ *
19
+ * Load/store operations default to `loadOp: 'clear'`, `storeOp: 'store'`
20
+ * (and `depthClearValue: 1` for depth attachments). For depth/stencil attachments,
21
+ * defaults are derived from the view's format and aspect. A raw {@link GPUTextureView}
22
+ * with no explicit operations is assumed to be depth-only; provide explicit
23
+ * operations for raw stencil or depth-stencil views.
24
+ */
25
+ export interface TgpuRenderPassDescriptor {
26
+ label?: string | undefined;
27
+ colorAttachments?: ColorAttachment | readonly (ColorAttachment | null)[] | undefined;
28
+ depthStencilAttachment?: DepthStencilAttachment | undefined;
29
+ occlusionQuerySet?: TgpuQuerySet<'occlusion'> | GPUQuerySet | undefined;
30
+ timestampWrites?: TgpuPassTimestampWrites | undefined;
31
+ maxDrawCount?: number | undefined;
32
+ }
33
+ export interface RenderPassInternals<TRaw extends GPURenderPassEncoder | GPURenderBundleEncoder = GPURenderPassEncoder | GPURenderBundleEncoder> {
34
+ readonly rawPass: TRaw;
35
+ readonly state: RenderDrawState;
36
+ /** Undefined for bundle encoders and for raw pass encoders the caller owns */
37
+ readonly owner: TgpuCommandEncoder | undefined;
38
+ appliedVersion: number | undefined;
39
+ }
40
+ /**
41
+ * The draw-recording surface shared by render passes and render bundle encoders,
42
+ * mirroring {@link GPURenderCommandsMixin}.
43
+ *
44
+ * Draw either by binding TypeGPU pipelines to it (`pipeline.with(pass).draw(...)`),
45
+ * or proxy-style via `pass.setPipeline(pipeline)` followed by `pass.draw(...)`.
46
+ * Pipeline resolution is lazy: shaders compile on the first draw.
47
+ */
48
+ export interface TgpuRenderCommands {
49
+ readonly [$internal]: RenderPassInternals;
50
+ readonly resourceType: 'render-pass' | 'render-bundle-encoder';
51
+ /** Sets the current {@link TgpuRenderPipeline} for subsequent draw calls */
52
+ setPipeline(pipeline: TgpuRenderPipeline): void;
53
+ /** Associates a bind group with the layout it was created from */
54
+ setBindGroup(bindGroup: TgpuBindGroup): void;
55
+ /** Associates a bind group with the given layout */
56
+ setBindGroup<Entries extends Record<string, TgpuLayoutEntry | null>>(bindGroupLayout: TgpuBindGroupLayout<Entries>, bindGroup: TgpuBindGroup<Entries> | GPUBindGroup): void;
57
+ /** Binds a vertex buffer to the given vertex layout */
58
+ setVertexBuffer<TData extends WgslArray | Disarray>(vertexLayout: TgpuVertexLayout<TData>, buffer: (TgpuBuffer<TData> & VertexFlag) | GPUBuffer, offset?: number, size?: number): void;
59
+ /** Sets the current index buffer */
60
+ setIndexBuffer<TData extends WgslArray | Disarray>(buffer: (TgpuBuffer<TData> & IndexFlag) | GPUBuffer, indexFormat: GPUIndexFormat, offset?: number, size?: number): void;
61
+ draw(vertexCount: number, instanceCount?: number, firstVertex?: number, firstInstance?: number): void;
62
+ drawIndexed(indexCount: number, instanceCount?: number, firstIndex?: number, baseVertex?: number, firstInstance?: number): void;
63
+ /**
64
+ * Draws primitives using parameters read from a buffer.
65
+ * The buffer must contain 4 consecutive u32 values (vertexCount, instanceCount, firstVertex, firstInstance).
66
+ * To get the correct offset within complex data structures, use `d.memoryLayoutOf(...)`.
67
+ *
68
+ * @param indirectBuffer - Buffer marked with 'indirect' usage containing draw parameters or raw GPUBuffer
69
+ * @param indirectOffset - PrimitiveOffsetInfo pointing to the first draw parameter. If not provided, starts at offset 0. To obtain safe offsets, use `d.memoryLayoutOf(...)`.
70
+ */
71
+ drawIndirect(indirectBuffer: (TgpuBuffer<BaseData> & IndirectFlag) | GPUBuffer, indirectOffset?: PrimitiveOffsetInfo | number): void;
72
+ /**
73
+ * Draws indexed primitives using parameters read from a buffer.
74
+ * The buffer must contain 5 consecutive 32-bit integer values (indexCount u32, instanceCount u32, firstIndex u32, baseVertex i32, firstInstance u32).
75
+ * To get the correct offset within complex data structures, use `d.memoryLayoutOf(...)`.
76
+ *
77
+ * @param indirectBuffer - Buffer marked with 'indirect' usage containing draw parameters or raw GPUBuffer
78
+ * @param indirectOffset - PrimitiveOffsetInfo pointing to the first draw parameter. If not provided, starts at offset 0. To obtain safe offsets, use `d.memoryLayoutOf(...)`.
79
+ */
80
+ drawIndexedIndirect(indirectBuffer: (TgpuBuffer<BaseData> & IndirectFlag) | GPUBuffer, indirectOffset?: PrimitiveOffsetInfo | number): void;
81
+ }
82
+ /**
83
+ * Records draw commands into a render bundle, mirroring {@link GPURenderBundleEncoder}.
84
+ *
85
+ * Call `finish()` to obtain a {@link GPURenderBundle}, replayable in a render
86
+ * pass via {@link TgpuRenderPass.executeBundles}.
87
+ */
88
+ export interface TgpuRenderBundleEncoder extends TgpuRenderCommands {
89
+ readonly [$internal]: RenderPassInternals<GPURenderBundleEncoder>;
90
+ readonly resourceType: 'render-bundle-encoder';
91
+ /** Completes the recording and returns the resulting {@link GPURenderBundle} */
92
+ finish(descriptor?: GPURenderBundleDescriptor): GPURenderBundle;
93
+ }
94
+ /**
95
+ * A render pass recording into a {@link TgpuCommandEncoder}. On top of the
96
+ * draw commands, it exposes the state that WebGPU scopes to a render pass.
97
+ *
98
+ * Call `end()` when done recording.
99
+ */
100
+ export interface TgpuRenderPass extends TgpuRenderCommands {
101
+ readonly [$internal]: RenderPassInternals<GPURenderPassEncoder>;
102
+ readonly resourceType: 'render-pass';
103
+ setViewport(x: number, y: number, width: number, height: number, minDepth: number, maxDepth: number): void;
104
+ setScissorRect(x: number, y: number, width: number, height: number): void;
105
+ setBlendConstant(color: readonly [number, number, number, number] | GPUColor): void;
106
+ setStencilReference(reference: GPUStencilValue): void;
107
+ beginOcclusionQuery(queryIndex: GPUSize32): void;
108
+ endOcclusionQuery(): void;
109
+ /**
110
+ * Executes previously recorded {@link GPURenderBundle}s as part of this pass.
111
+ * As per the WebGPU spec, this resets the raw pass's pipeline, bind group
112
+ * and vertex/index buffer state. The state tracked by this typed pass is
113
+ * re-applied on the next draw.
114
+ */
115
+ executeBundles(bundles: Iterable<GPURenderBundle>): void;
116
+ /** Completes the recording of this render pass */
117
+ end(): void;
118
+ }
119
+ export declare function INTERNAL_beginRenderPass(encoder: TgpuCommandEncoder, descriptor: TgpuRenderPassDescriptor): TgpuRenderPass;
120
+ export declare function INTERNAL_createRenderBundleEncoder(root: ExperimentalTgpuRoot, descriptor: GPURenderBundleEncoderDescriptor): TgpuRenderBundleEncoder;
121
+ export declare function INTERNAL_adoptRenderCommands(root: ExperimentalTgpuRoot, rawPass: GPURenderPassEncoder | GPURenderBundleEncoder): TgpuRenderCommands;
@@ -0,0 +1,196 @@
1
+ import { $internal } from "../../shared/symbols.js";
2
+ import { isGPUBuffer } from "../../types.js";
3
+ import { DRAW_INDEXED_INDIRECT_SIZE, DRAW_INDIRECT_SIZE, resolveIndirectOffset, } from "../pipeline/pipelineUtils.js";
4
+ import { isTexture, isTextureView } from "../texture/texture.js";
5
+ import { emitRenderDraw, recordBindGroup, RenderDrawState, stampRenderPipeline, } from "../pipeline/drawState.js";
6
+ import { isQuerySet } from "../querySet/querySet.js";
7
+ import { unwrapAttachmentView, unwrapTimestampWrites, } from "./attachments.js";
8
+ // --------------
9
+ // Implementation
10
+ // --------------
11
+ function attachmentAspects(view) {
12
+ let format;
13
+ let aspect = 'all';
14
+ if (isTexture(view)) {
15
+ format = view.props.format;
16
+ }
17
+ else if (isTextureView(view)) {
18
+ format = view[$internal].format;
19
+ aspect = view[$internal].aspect ?? 'all';
20
+ }
21
+ if (format === undefined) {
22
+ return undefined;
23
+ }
24
+ return {
25
+ hasDepth: format.includes('depth') && aspect !== 'stencil-only',
26
+ hasStencil: format.includes('stencil') && aspect !== 'depth-only',
27
+ };
28
+ }
29
+ function withDepthStencilDefaults(attachment, view) {
30
+ const rawAttachment = { ...attachment, view };
31
+ const aspects = attachmentAspects(attachment.view);
32
+ if (aspects === undefined) {
33
+ const hasExplicitOps = attachment.depthLoadOp !== undefined ||
34
+ attachment.depthStoreOp !== undefined ||
35
+ attachment.stencilLoadOp !== undefined ||
36
+ attachment.stencilStoreOp !== undefined;
37
+ if (hasExplicitOps) {
38
+ return rawAttachment;
39
+ }
40
+ }
41
+ const { hasDepth, hasStencil } = aspects ?? { hasDepth: true, hasStencil: false };
42
+ if (hasDepth && !attachment.depthReadOnly) {
43
+ rawAttachment.depthLoadOp ??= 'clear';
44
+ rawAttachment.depthStoreOp ??= 'store';
45
+ rawAttachment.depthClearValue ??= 1;
46
+ }
47
+ if (hasStencil && !attachment.stencilReadOnly) {
48
+ rawAttachment.stencilLoadOp ??= 'clear';
49
+ rawAttachment.stencilStoreOp ??= 'store';
50
+ }
51
+ return rawAttachment;
52
+ }
53
+ export function INTERNAL_beginRenderPass(encoder, descriptor) {
54
+ const { rawEncoder, root } = encoder[$internal];
55
+ const colorAttachments = descriptor.colorAttachments === undefined
56
+ ? []
57
+ : Array.isArray(descriptor.colorAttachments)
58
+ ? descriptor.colorAttachments
59
+ : [descriptor.colorAttachments];
60
+ const rawDescriptor = {
61
+ colorAttachments: colorAttachments.map((attachment) => {
62
+ if (attachment === null) {
63
+ return null;
64
+ }
65
+ const rawAttachment = {
66
+ ...attachment,
67
+ loadOp: attachment.loadOp ?? 'clear',
68
+ storeOp: attachment.storeOp ?? 'store',
69
+ view: unwrapAttachmentView(root, attachment.view),
70
+ };
71
+ if (attachment.resolveTarget !== undefined) {
72
+ rawAttachment.resolveTarget = unwrapAttachmentView(root, attachment.resolveTarget);
73
+ }
74
+ return rawAttachment;
75
+ }),
76
+ };
77
+ if (descriptor.label !== undefined) {
78
+ rawDescriptor.label = descriptor.label;
79
+ }
80
+ if (descriptor.depthStencilAttachment !== undefined) {
81
+ rawDescriptor.depthStencilAttachment = withDepthStencilDefaults(descriptor.depthStencilAttachment, unwrapAttachmentView(root, descriptor.depthStencilAttachment.view));
82
+ }
83
+ if (descriptor.occlusionQuerySet !== undefined) {
84
+ rawDescriptor.occlusionQuerySet = isQuerySet(descriptor.occlusionQuerySet)
85
+ ? root.unwrap(descriptor.occlusionQuerySet)
86
+ : descriptor.occlusionQuerySet;
87
+ }
88
+ if (descriptor.timestampWrites !== undefined) {
89
+ rawDescriptor.timestampWrites = unwrapTimestampWrites(root, descriptor.timestampWrites);
90
+ }
91
+ if (descriptor.maxDrawCount !== undefined) {
92
+ rawDescriptor.maxDrawCount = descriptor.maxDrawCount;
93
+ }
94
+ return new TgpuRenderPassImpl(root, rawEncoder.beginRenderPass(rawDescriptor), encoder);
95
+ }
96
+ export function INTERNAL_createRenderBundleEncoder(root, descriptor) {
97
+ return new TgpuRenderBundleEncoderImpl(root, root.device.createRenderBundleEncoder(descriptor), undefined);
98
+ }
99
+ export function INTERNAL_adoptRenderCommands(root, rawPass) {
100
+ const adopted = typeof rawPass.executeBundles === 'function'
101
+ ? new TgpuRenderPassImpl(root, rawPass, undefined)
102
+ : new TgpuRenderCommandsImpl(root, rawPass, undefined);
103
+ adopted[$internal].state.rawAccessed = true;
104
+ return adopted;
105
+ }
106
+ class TgpuRenderCommandsImpl {
107
+ [$internal];
108
+ resourceType = 'render-bundle-encoder';
109
+ #root;
110
+ constructor(root, rawPass, owner) {
111
+ this.#root = root;
112
+ this[$internal] = {
113
+ rawPass,
114
+ state: new RenderDrawState(),
115
+ owner,
116
+ appliedVersion: undefined,
117
+ };
118
+ }
119
+ #emit(usesIndexBuffer, emit) {
120
+ const internals = this[$internal];
121
+ const pipeline = internals.state.currentPipeline;
122
+ if (!pipeline) {
123
+ throw new Error('Cannot draw without a call to pass.setPipeline');
124
+ }
125
+ emitRenderDraw(this.#root, internals, pipeline, usesIndexBuffer, emit);
126
+ }
127
+ setPipeline(pipeline) {
128
+ stampRenderPipeline(this[$internal].state, pipeline);
129
+ }
130
+ setBindGroup(first, bindGroup) {
131
+ recordBindGroup(this[$internal].state, first, bindGroup);
132
+ }
133
+ setVertexBuffer(vertexLayout, buffer, offset, size) {
134
+ const { state } = this[$internal];
135
+ state.vertexBuffers.set(vertexLayout, { buffer, offset, size });
136
+ state.version++;
137
+ }
138
+ setIndexBuffer(buffer, indexFormat, offset, size) {
139
+ const { state } = this[$internal];
140
+ state.indexBuffer = { buffer, indexFormat, offsetBytes: offset, sizeBytes: size };
141
+ state.version++;
142
+ }
143
+ draw(vertexCount, instanceCount, firstVertex, firstInstance) {
144
+ this.#emit(false, (rawPass) => rawPass.draw(vertexCount, instanceCount, firstVertex, firstInstance));
145
+ }
146
+ drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance) {
147
+ this.#emit(true, (rawPass) => rawPass.drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance));
148
+ }
149
+ drawIndirect(indirectBuffer, indirectOffset) {
150
+ const rawBuffer = isGPUBuffer(indirectBuffer) ? indirectBuffer : indirectBuffer.buffer;
151
+ const offset = resolveIndirectOffset(indirectBuffer, indirectOffset, DRAW_INDIRECT_SIZE, 'drawIndirect');
152
+ this.#emit(false, (rawPass) => rawPass.drawIndirect(rawBuffer, offset));
153
+ }
154
+ drawIndexedIndirect(indirectBuffer, indirectOffset) {
155
+ const rawBuffer = isGPUBuffer(indirectBuffer) ? indirectBuffer : indirectBuffer.buffer;
156
+ const offset = resolveIndirectOffset(indirectBuffer, indirectOffset, DRAW_INDEXED_INDIRECT_SIZE, 'drawIndexedIndirect');
157
+ this.#emit(true, (rawPass) => rawPass.drawIndexedIndirect(rawBuffer, offset));
158
+ }
159
+ }
160
+ class TgpuRenderBundleEncoderImpl extends TgpuRenderCommandsImpl {
161
+ resourceType = 'render-bundle-encoder';
162
+ finish(descriptor) {
163
+ return this[$internal].rawPass.finish(descriptor);
164
+ }
165
+ }
166
+ class TgpuRenderPassImpl extends TgpuRenderCommandsImpl {
167
+ resourceType = 'render-pass';
168
+ setViewport(x, y, width, height, minDepth, maxDepth) {
169
+ this[$internal].rawPass.setViewport(x, y, width, height, minDepth, maxDepth);
170
+ }
171
+ setScissorRect(x, y, width, height) {
172
+ this[$internal].rawPass.setScissorRect(x, y, width, height);
173
+ }
174
+ setBlendConstant(color) {
175
+ this[$internal].rawPass.setBlendConstant(color);
176
+ }
177
+ setStencilReference(reference) {
178
+ const { state } = this[$internal];
179
+ state.stencilReference = reference;
180
+ state.version++;
181
+ }
182
+ beginOcclusionQuery(queryIndex) {
183
+ this[$internal].rawPass.beginOcclusionQuery(queryIndex);
184
+ }
185
+ endOcclusionQuery() {
186
+ this[$internal].rawPass.endOcclusionQuery();
187
+ }
188
+ executeBundles(bundles) {
189
+ const internals = this[$internal];
190
+ internals.rawPass.executeBundles(bundles);
191
+ internals.appliedVersion = undefined;
192
+ }
193
+ end() {
194
+ this[$internal].rawPass.end();
195
+ }
196
+ }
@@ -1,30 +1,30 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $gpuValueOf, $internal } from "../../shared/symbols.js";
3
- import { AnyWgslData, BaseData, WgslArray } from "../../data/wgslTypes.js";
4
- import { InferGPU } from "../../shared/repr.js";
5
- import { AnyData } from "../../data/dataTypes.js";
6
-
7
- //#region src/core/constant/tgpuConstant.d.ts
8
- type DeepReadonly<T> = T extends {
9
- [$internal]: unknown;
10
- } ? T : T extends unknown[] ? ReadonlyArray<DeepReadonly<T[number]>> : T extends Record<string, unknown> ? { readonly [K in keyof T]: DeepReadonly<T[K]> } : T;
11
- interface TgpuConst<TDataType extends BaseData = BaseData> extends TgpuNamable {
12
- readonly resourceType: 'const';
13
- readonly [$gpuValueOf]: DeepReadonly<InferGPU<TDataType>>;
14
- /**
15
- * @deprecated Use `.$` instead, works the same way.
16
- */
17
- readonly value: DeepReadonly<InferGPU<TDataType>>;
18
- readonly $: DeepReadonly<InferGPU<TDataType>>;
19
- readonly [$internal]: {
20
- /** Makes it differentiable on the type level. Does not exist at runtime. */
21
- dataType?: TDataType;
22
- };
1
+ import { type AnyData } from '../../data/dataTypes.ts';
2
+ import { type AnyWgslData, type BaseData, type WgslArray } from '../../data/wgslTypes.ts';
3
+ import type { TgpuNamable } from '../../shared/meta.ts';
4
+ import type { InferGPU } from '../../shared/repr.ts';
5
+ import type { TgpuSoul } from '../../shared/soul.ts';
6
+ import { $gpuValueOf, $internal, $soul } from '../../shared/symbols.ts';
7
+ export type DeepReadonly<T> = T extends {
8
+ [$internal]: unknown;
9
+ } ? T : T extends unknown[] ? ReadonlyArray<DeepReadonly<T[number]>> : T extends Record<string, unknown> ? {
10
+ readonly [K in keyof T]: DeepReadonly<T[K]>;
11
+ } : T;
12
+ export interface TgpuConstSoul<TDataType extends BaseData = BaseData> extends TgpuSoul<'const'> {
13
+ readonly dataType: TDataType;
14
+ readonly value: DeepReadonly<InferGPU<TDataType>>;
15
+ }
16
+ export interface TgpuConst<TDataType extends BaseData = BaseData> extends TgpuNamable {
17
+ readonly resourceType: 'const';
18
+ readonly [$gpuValueOf]: DeepReadonly<InferGPU<TDataType>>;
19
+ readonly $: DeepReadonly<InferGPU<TDataType>>;
20
+ readonly [$soul]: TgpuConstSoul<TDataType>;
21
+ readonly [$internal]: {
22
+ /** Makes it differentiable on the type level. Does not exist at runtime. */
23
+ dataType?: TDataType;
24
+ };
23
25
  }
24
26
  /**
25
27
  * Creates a module constant with specified value.
26
28
  */
27
- declare function constant<TDataType extends AnyData>(dataType: TDataType, value: InferGPU<TDataType>): TgpuConst<TDataType>;
28
- declare function constant<TElement extends AnyWgslData>(dataType: (elementCount: number) => WgslArray<TElement>, value: InferGPU<WgslArray<TElement>>): TgpuConst<WgslArray<TElement>>;
29
- //#endregion
30
- export { TgpuConst, constant };
29
+ export declare function constant<TDataType extends AnyData>(dataType: TDataType, value: InferGPU<TDataType>): TgpuConst<TDataType>;
30
+ export declare function constant<TElement extends AnyWgslData>(dataType: (elementCount: number) => WgslArray<TElement>, value: InferGPU<WgslArray<TElement>>): TgpuConst<WgslArray<TElement>>;