typegpu 0.11.9 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +36 -36
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -5
  42. package/core/function/fnCore.js +148 -93
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +17 -22
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -53
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -215
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -197
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -126
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +271 -216
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -760
  350. package/types.d.ts +287 -222
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -0,0 +1,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>>;