typegpu 0.11.8 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builtin.d.ts +51 -53
- package/builtin.js +30 -34
- package/common/fullScreenTriangle.d.ts +2 -10
- package/common/fullScreenTriangle.js +20 -28
- package/common/index.d.ts +2 -9
- package/common/index.js +3 -12
- package/common/writeSoA.d.ts +11 -12
- package/common/writeSoA.js +88 -76
- package/core/buffer/buffer.d.ts +79 -62
- package/core/buffer/buffer.js +279 -205
- package/core/buffer/bufferBinding.d.ts +71 -0
- package/core/buffer/bufferBinding.js +154 -0
- package/core/buffer/bufferUsage.d.ts +14 -45
- package/core/buffer/bufferUsage.js +1 -171
- package/core/buffer/laidOutBuffer.d.ts +25 -0
- package/core/buffer/laidOutBuffer.js +55 -0
- package/core/commandEncoder/attachments.d.ts +125 -0
- package/core/commandEncoder/attachments.js +29 -0
- package/core/commandEncoder/commandEncoder.d.ts +53 -0
- package/core/commandEncoder/commandEncoder.js +56 -0
- package/core/commandEncoder/computePass.d.ts +58 -0
- package/core/commandEncoder/computePass.js +63 -0
- package/core/commandEncoder/renderPass.d.ts +121 -0
- package/core/commandEncoder/renderPass.js +196 -0
- package/core/constant/tgpuConstant.d.ts +26 -26
- package/core/constant/tgpuConstant.js +76 -65
- package/core/declare/tgpuDeclare.d.ts +3 -6
- package/core/declare/tgpuDeclare.js +37 -38
- package/core/function/autoIO.d.ts +61 -33
- package/core/function/autoIO.js +68 -73
- package/core/function/comptime.d.ts +11 -13
- package/core/function/comptime.js +60 -52
- package/core/function/createCallableSchema.d.ts +16 -0
- package/core/function/createCallableSchema.js +50 -40
- package/core/function/dualImpl.d.ts +44 -0
- package/core/function/dualImpl.js +71 -50
- package/core/function/entryInputRouter.d.ts +26 -0
- package/core/function/entryInputRouter.js +31 -33
- package/core/function/extractArgs.d.ts +38 -0
- package/core/function/extractArgs.js +202 -200
- package/core/function/fnCore.d.ts +44 -0
- package/core/function/fnCore.js +148 -92
- package/core/function/fnTypes.d.ts +31 -29
- package/core/function/fnTypes.js +1 -0
- package/core/function/ioSchema.d.ts +12 -10
- package/core/function/ioSchema.js +65 -47
- package/core/function/shelllessImpl.d.ts +9 -12
- package/core/function/shelllessImpl.js +18 -20
- package/core/function/templateUtils.d.ts +2 -0
- package/core/function/templateUtils.js +9 -8
- package/core/function/tgpuComputeFn.d.ts +26 -28
- package/core/function/tgpuComputeFn.js +47 -48
- package/core/function/tgpuFn.d.ts +34 -37
- package/core/function/tgpuFn.js +179 -153
- package/core/function/tgpuFragmentFn.d.ts +52 -53
- package/core/function/tgpuFragmentFn.js +63 -56
- package/core/function/tgpuVertexFn.d.ts +36 -39
- package/core/function/tgpuVertexFn.js +56 -53
- package/core/pipeline/computePipeline.d.ts +141 -53
- package/core/pipeline/computePipeline.js +291 -225
- package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
- package/core/pipeline/connectAttachmentToShader.js +25 -22
- package/core/pipeline/connectTargetsToShader.d.ts +3 -0
- package/core/pipeline/connectTargetsToShader.js +29 -27
- package/core/pipeline/drawState.d.ts +52 -0
- package/core/pipeline/drawState.js +225 -0
- package/core/pipeline/limitsOverflow.d.ts +2 -0
- package/core/pipeline/limitsOverflow.js +13 -10
- package/core/pipeline/performanceTracker.d.ts +14 -0
- package/core/pipeline/performanceTracker.js +34 -0
- package/core/pipeline/pipelineUtils.d.ts +18 -0
- package/core/pipeline/pipelineUtils.js +54 -25
- package/core/pipeline/priors.d.ts +1 -0
- package/core/pipeline/priors.js +12 -0
- package/core/pipeline/renderPipeline.d.ts +246 -261
- package/core/pipeline/renderPipeline.js +487 -480
- package/core/pipeline/timeable.d.ts +28 -18
- package/core/pipeline/timeable.js +90 -52
- package/core/pipeline/typeGuards.d.ts +17 -0
- package/core/pipeline/typeGuards.js +52 -22
- package/core/querySet/querySet.d.ts +26 -21
- package/core/querySet/querySet.js +127 -103
- package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
- package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +90 -93
- package/core/resolve/externals.d.ts +25 -7
- package/core/resolve/externals.js +79 -62
- package/core/resolve/namespace.d.ts +22 -25
- package/core/resolve/namespace.js +16 -21
- package/core/resolve/resolvableString.d.ts +7 -0
- package/core/resolve/resolvableString.js +13 -0
- package/core/resolve/resolveData.d.ts +10 -0
- package/core/resolve/resolveData.js +162 -121
- package/core/resolve/stitch.d.ts +8 -0
- package/core/resolve/stitch.js +23 -21
- package/core/resolve/tgpuResolve.d.ts +55 -53
- package/core/resolve/tgpuResolve.js +106 -55
- package/core/root/configurableImpl.d.ts +10 -0
- package/core/root/configurableImpl.js +17 -19
- package/core/root/init.d.ts +76 -38
- package/core/root/init.js +346 -454
- package/core/root/rootTypes.d.ts +461 -627
- package/core/root/rootTypes.js +1 -0
- package/core/sampler/sampler.d.ts +50 -31
- package/core/sampler/sampler.js +120 -113
- package/core/simulate/tgpuSimulate.d.ts +9 -12
- package/core/simulate/tgpuSimulate.js +68 -71
- package/core/slot/accessor.d.ts +36 -13
- package/core/slot/accessor.js +138 -91
- package/core/slot/internalSlots.d.ts +2 -0
- package/core/slot/internalSlots.js +1 -6
- package/core/slot/lazy.d.ts +2 -6
- package/core/slot/lazy.js +71 -39
- package/core/slot/slot.d.ts +2 -6
- package/core/slot/slot.js +45 -38
- package/core/slot/slotTypes.d.ts +78 -80
- package/core/slot/slotTypes.js +11 -16
- package/core/texture/externalTexture.d.ts +20 -11
- package/core/texture/externalTexture.js +46 -46
- package/core/texture/texture.d.ts +152 -97
- package/core/texture/texture.js +407 -314
- package/core/texture/textureFormats.d.ts +42 -23
- package/core/texture/textureFormats.js +104 -75
- package/core/texture/textureProps.d.ts +7 -10
- package/core/texture/textureProps.js +1 -0
- package/core/texture/textureUtils.d.ts +8 -0
- package/core/texture/textureUtils.js +185 -179
- package/core/texture/usageExtension.d.ts +21 -18
- package/core/texture/usageExtension.js +13 -17
- package/core/unroll/tgpuUnroll.d.ts +20 -19
- package/core/unroll/tgpuUnroll.js +82 -91
- package/core/valueProxyUtils.d.ts +3 -0
- package/core/valueProxyUtils.js +52 -41
- package/core/variable/tgpuVariable.d.ts +26 -27
- package/core/variable/tgpuVariable.js +93 -96
- package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
- package/core/vertexLayout/connectAttributesToShader.js +61 -56
- package/core/vertexLayout/vertexAttribute.d.ts +21 -17
- package/core/vertexLayout/vertexAttribute.js +1 -0
- package/core/vertexLayout/vertexLayout.d.ts +24 -18
- package/core/vertexLayout/vertexLayout.js +130 -99
- package/core/whitespaces.d.ts +2 -0
- package/core/whitespaces.js +16 -0
- package/data/alignIO.d.ts +7 -0
- package/data/alignIO.js +13 -13
- package/data/alignmentOf.d.ts +5 -8
- package/data/alignmentOf.js +90 -75
- package/data/array.d.ts +6 -9
- package/data/array.js +48 -40
- package/data/atomic.d.ts +2 -7
- package/data/atomic.js +26 -23
- package/data/attributes.d.ts +19 -21
- package/data/attributes.js +192 -132
- package/data/autoStruct.d.ts +36 -3
- package/data/autoStruct.js +84 -81
- package/data/compiledIO.d.ts +5 -0
- package/data/compiledIO.js +231 -214
- package/data/dataIO.d.ts +13 -11
- package/data/dataIO.js +643 -589
- package/data/dataTypes.d.ts +83 -65
- package/data/dataTypes.js +66 -68
- package/data/deepEqual.d.ts +2 -7
- package/data/deepEqual.js +80 -55
- package/data/disarray.d.ts +6 -10
- package/data/disarray.js +52 -46
- package/data/float16Conversion.d.ts +4 -0
- package/data/float16Conversion.js +7 -0
- package/data/getLongestContiguousPrefix.d.ts +4 -8
- package/data/getLongestContiguousPrefix.js +6 -11
- package/data/index.d.ts +30 -31
- package/data/index.js +39 -172
- package/data/instanceToSchema.d.ts +24 -27
- package/data/instanceToSchema.js +1 -0
- package/data/isContiguous.d.ts +4 -8
- package/data/isContiguous.js +6 -11
- package/data/matrix.d.ts +21 -21
- package/data/matrix.js +513 -505
- package/data/numberOps.d.ts +6 -0
- package/data/numberOps.js +26 -20
- package/data/numeric.d.ts +21 -12
- package/data/numeric.js +287 -192
- package/data/offsetUtils.d.ts +9 -13
- package/data/offsetUtils.js +204 -144
- package/data/offsets.d.ts +8 -0
- package/data/offsets.js +33 -33
- package/data/partialIO.d.ts +13 -8
- package/data/partialIO.js +124 -113
- package/data/ptr.d.ts +12 -12
- package/data/ptr.js +42 -44
- package/data/ref.d.ts +40 -27
- package/data/ref.js +125 -95
- package/data/sampler.d.ts +99 -101
- package/data/sampler.js +17 -21
- package/data/schemaCallWrapper.d.ts +19 -0
- package/data/schemaCallWrapper.js +31 -26
- package/data/schemaMemoryLayout.d.ts +8 -0
- package/data/schemaMemoryLayout.js +213 -185
- package/data/sizeOf.d.ts +4 -8
- package/data/sizeOf.js +6 -11
- package/data/snippet.d.ts +96 -20
- package/data/snippet.js +75 -86
- package/data/struct.d.ts +4 -7
- package/data/struct.js +51 -39
- package/data/texture.d.ts +253 -250
- package/data/texture.js +238 -200
- package/data/unstruct.d.ts +2 -7
- package/data/unstruct.js +43 -37
- package/data/vector.d.ts +33 -21
- package/data/vector.js +234 -221
- package/data/vectorImpl.d.ts +231 -0
- package/data/vectorImpl.js +563 -515
- package/data/vectorOps.d.ts +63 -0
- package/data/vectorOps.js +642 -630
- package/data/vertexFormatData.d.ts +181 -184
- package/data/vertexFormatData.js +104 -106
- package/data/wgslTypes.d.ts +665 -600
- package/data/wgslTypes.js +220 -198
- package/errors.d.ts +50 -24
- package/errors.js +146 -120
- package/execMode.d.ts +16 -0
- package/execMode.js +47 -40
- package/extension.d.ts +13 -8
- package/extension.js +10 -16
- package/getGPUValue.d.ts +1 -0
- package/getGPUValue.js +2 -7
- package/index.d.ts +28 -68
- package/index.js +8 -28
- package/indexNamedExports.d.ts +69 -42
- package/indexNamedExports.js +25 -0
- package/internal.d.ts +16 -0
- package/internal.js +12 -0
- package/mathUtils.d.ts +5 -0
- package/mathUtils.js +7 -11
- package/memo.d.ts +11 -0
- package/memo.js +20 -22
- package/minify.d.ts +5 -0
- package/minify.js +93 -0
- package/nameUtils.d.ts +29 -0
- package/nameUtils.js +428 -398
- package/package.json +9 -3
- package/resolutionCtx.d.ts +162 -22
- package/resolutionCtx.js +911 -624
- package/serial/registry.d.ts +15 -0
- package/serial/registry.js +106 -0
- package/serial/restore.d.ts +49 -0
- package/serial/restore.js +68 -0
- package/serial/schema.d.ts +58 -0
- package/serial/schema.js +209 -0
- package/serial/types.d.ts +5 -0
- package/serial/types.js +1 -0
- package/shared/env.d.ts +9 -0
- package/shared/env.js +9 -12
- package/shared/generators.d.ts +4 -0
- package/shared/generators.js +10 -12
- package/shared/meta.d.ts +29 -14
- package/shared/meta.js +71 -55
- package/shared/normalizeMetadata.d.ts +32 -27
- package/shared/normalizeMetadata.js +23 -36
- package/shared/repr.d.ts +73 -55
- package/shared/repr.js +1 -0
- package/shared/soul.d.ts +17 -0
- package/shared/soul.js +1 -0
- package/shared/stringify.d.ts +2 -0
- package/shared/stringify.js +29 -20
- package/shared/symbols.d.ts +26 -20
- package/shared/symbols.js +79 -79
- package/shared/tseynit.d.ts +2 -0
- package/shared/tseynit.js +160 -75
- package/shared/utilityTypes.d.ts +30 -14
- package/shared/utilityTypes.js +2 -6
- package/shared/vertexFormat.d.ts +41 -43
- package/shared/vertexFormat.js +59 -62
- package/std/array.d.ts +2 -7
- package/std/array.js +18 -23
- package/std/atomic.d.ts +14 -18
- package/std/atomic.js +96 -95
- package/std/bitcast.d.ts +193 -10
- package/std/bitcast.js +309 -39
- package/std/boolean.d.ts +19 -33
- package/std/boolean.js +296 -288
- package/std/copy.d.ts +2 -7
- package/std/copy.js +27 -24
- package/std/derivative.d.ts +11 -15
- package/std/derivative.js +56 -79
- package/std/discard.d.ts +1 -6
- package/std/discard.js +7 -14
- package/std/environment.d.ts +19 -14
- package/std/environment.js +71 -51
- package/std/extensions.d.ts +2 -8
- package/std/extensions.js +10 -11
- package/std/index.d.ts +20 -24
- package/std/index.js +32 -187
- package/std/matrix.d.ts +6 -12
- package/std/matrix.js +60 -69
- package/std/numeric.d.ts +143 -146
- package/std/numeric.js +858 -749
- package/std/operators.d.ts +19 -27
- package/std/operators.js +227 -193
- package/std/packing.d.ts +5 -11
- package/std/packing.js +67 -75
- package/std/range.d.ts +6 -11
- package/std/range.js +48 -36
- package/std/subgroup.d.ts +33 -37
- package/std/subgroup.js +180 -217
- package/std/texture.d.ts +70 -38
- package/std/texture.js +176 -172
- package/taskQueue.d.ts +6 -0
- package/taskQueue.js +30 -0
- package/tgpu.d.ts +16 -0
- package/tgpu.js +17 -44
- package/tgpuBindGroupLayout.d.ts +132 -152
- package/tgpuBindGroupLayout.js +346 -268
- package/tgpuLogger.d.ts +34 -0
- package/tgpuLogger.js +63 -0
- package/tgpuUnstable.d.ts +16 -22
- package/tgpuUnstable.js +13 -35
- package/tgsl/accessIndex.d.ts +2 -0
- package/tgsl/accessIndex.js +76 -33
- package/tgsl/accessProp.d.ts +2 -0
- package/tgsl/accessProp.js +142 -100
- package/tgsl/accessStructProp.d.ts +5 -0
- package/tgsl/accessStructProp.js +18 -0
- package/tgsl/consoleLog/deserializers.d.ts +13 -0
- package/tgsl/consoleLog/deserializers.js +119 -103
- package/tgsl/consoleLog/logGenerator.d.ts +21 -0
- package/tgsl/consoleLog/logGenerator.js +85 -80
- package/tgsl/consoleLog/serializers.d.ts +21 -0
- package/tgsl/consoleLog/serializers.js +119 -100
- package/tgsl/consoleLog/types.d.ts +40 -39
- package/tgsl/consoleLog/types.js +1 -0
- package/tgsl/conversion.d.ts +33 -0
- package/tgsl/conversion.js +272 -193
- package/tgsl/forOfUtils.d.ts +15 -0
- package/tgsl/forOfUtils.js +85 -70
- package/tgsl/generationHelpers.d.ts +22 -39
- package/tgsl/generationHelpers.js +85 -58
- package/tgsl/infixDispatch.d.ts +70 -0
- package/tgsl/infixDispatch.js +48 -46
- package/tgsl/jsPolyfills.d.ts +16 -19
- package/tgsl/jsPolyfills.js +44 -42
- package/tgsl/makeDereferenceable.d.ts +48 -0
- package/tgsl/makeDereferenceable.js +86 -0
- package/tgsl/makeResolvable.d.ts +22 -0
- package/tgsl/makeResolvable.js +33 -0
- package/tgsl/shaderGenerator.d.ts +77 -17
- package/tgsl/shaderGenerator.js +1 -0
- package/tgsl/shellless.d.ts +6 -9
- package/tgsl/shellless.js +73 -43
- package/tgsl/wgslGenerator.d.ts +66 -59
- package/tgsl/wgslGenerator.js +1344 -747
- package/types.d.ts +287 -221
- package/types.js +61 -44
- package/unwrapper.d.ts +31 -26
- package/unwrapper.js +1 -0
- package/wgslExtensions.d.ts +3 -5
- package/wgslExtensions.js +12 -16
- package/_virtual/rolldown_runtime.js +0 -13
- package/core/buffer/bufferShorthand.d.ts +0 -50
- package/core/buffer/bufferShorthand.js +0 -55
- package/core/pipeline/applyPipelineState.js +0 -37
- package/package.js +0 -5
- package/tgsl/shaderGenerator_members.d.ts +0 -33
- 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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { InferGPU } from
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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>>;
|