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.
- 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 +36 -36
- 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 -5
- package/core/function/fnCore.js +148 -93
- 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 +17 -22
- 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 +89 -90
- package/core/resolve/externals.d.ts +25 -8
- package/core/resolve/externals.js +78 -54
- 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 -53
- 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 -455
- package/core/root/rootTypes.d.ts +461 -636
- 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 -215
- 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 -197
- 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 -126
- 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 +427 -394
- package/package.json +5 -1
- package/resolutionCtx.d.ts +162 -22
- package/resolutionCtx.js +911 -629
- 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 -101
- package/tgsl/accessStructProp.d.ts +5 -0
- package/tgsl/accessStructProp.js +13 -15
- 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 +271 -216
- 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 -760
- package/types.d.ts +287 -222
- 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,52 @@
|
|
|
1
|
+
import type { BaseData } from '../../data/wgslTypes.ts';
|
|
2
|
+
import { type TgpuBindGroup, type TgpuBindGroupLayout } from '../../tgpuBindGroupLayout.ts';
|
|
3
|
+
import type { LogResources } from '../../tgsl/consoleLog/types.ts';
|
|
4
|
+
import type { IndexFlag, TgpuBuffer, VertexFlag } from '../buffer/buffer.ts';
|
|
5
|
+
import type { TgpuCommandEncoder } from '../commandEncoder/commandEncoder.ts';
|
|
6
|
+
import type { ComputePassInternals } from '../commandEncoder/computePass.ts';
|
|
7
|
+
import type { RenderPassInternals } from '../commandEncoder/renderPass.ts';
|
|
8
|
+
import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
|
|
9
|
+
import type { TgpuVertexLayout } from '../vertexLayout/vertexLayout.ts';
|
|
10
|
+
import type { TgpuComputePipeline } from './computePipeline.ts';
|
|
11
|
+
import type { TgpuRenderPipeline } from './renderPipeline.ts';
|
|
12
|
+
import { type TimestampWritesPriors } from './timeable.ts';
|
|
13
|
+
export interface VertexBufferEntry {
|
|
14
|
+
buffer: (TgpuBuffer<BaseData> & VertexFlag) | GPUBuffer;
|
|
15
|
+
offset?: number | undefined;
|
|
16
|
+
size?: number | undefined;
|
|
17
|
+
}
|
|
18
|
+
export interface IndexBufferEntry {
|
|
19
|
+
buffer: (TgpuBuffer<BaseData> & IndexFlag) | GPUBuffer;
|
|
20
|
+
indexFormat: GPUIndexFormat;
|
|
21
|
+
offsetBytes?: number | undefined;
|
|
22
|
+
sizeBytes?: number | undefined;
|
|
23
|
+
}
|
|
24
|
+
export declare class RenderDrawState {
|
|
25
|
+
readonly bindGroups: Map<TgpuBindGroupLayout<Record<string, import("../../tgpuBindGroupLayout.ts").TgpuLayoutEntry | null>>, TgpuBindGroup | GPUBindGroup>;
|
|
26
|
+
readonly vertexBuffers: Map<TgpuVertexLayout<import("../../data/wgslTypes.ts").WgslArray<BaseData> | import("../../data/dataTypes.ts").Disarray<BaseData>>, VertexBufferEntry>;
|
|
27
|
+
currentPipeline: TgpuRenderPipeline | undefined;
|
|
28
|
+
indexBuffer: IndexBufferEntry | undefined;
|
|
29
|
+
stencilReference: GPUStencilValue | undefined;
|
|
30
|
+
/** What the raw pass holds, starting at the WebGPU default; survives executeBundles */
|
|
31
|
+
appliedStencilReference: GPUStencilValue;
|
|
32
|
+
version: number;
|
|
33
|
+
/** Raw access via `root.unwrap(pass)` can mutate state invisibly, disabling deduplication */
|
|
34
|
+
rawAccessed: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare class ComputeDrawState {
|
|
37
|
+
readonly bindGroups: Map<TgpuBindGroupLayout<Record<string, import("../../tgpuBindGroupLayout.ts").TgpuLayoutEntry | null>>, TgpuBindGroup | GPUBindGroup>;
|
|
38
|
+
currentPipeline: TgpuComputePipeline | undefined;
|
|
39
|
+
version: number;
|
|
40
|
+
rawAccessed: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare function recordBindGroup(state: RenderDrawState | ComputeDrawState, first: TgpuBindGroup | TgpuBindGroupLayout, bindGroup: TgpuBindGroup | GPUBindGroup | undefined): void;
|
|
43
|
+
/** Writes the pipeline and its bound resources into pass state; later set* calls overwrite them */
|
|
44
|
+
export declare function stampRenderPipeline(state: RenderDrawState, pipeline: TgpuRenderPipeline): void;
|
|
45
|
+
/** The compute counterpart of {@link stampRenderPipeline} */
|
|
46
|
+
export declare function stampComputePipeline(state: ComputeDrawState, pipeline: TgpuComputePipeline): void;
|
|
47
|
+
export declare function requireIndexBuffer(indexBuffer: IndexBufferEntry | undefined): void;
|
|
48
|
+
export declare function finalizeOwnEncoder(encoder: TgpuCommandEncoder, core: object, logResources: LogResources | undefined, priors: TimestampWritesPriors & {
|
|
49
|
+
readonly encoder?: TgpuCommandEncoder | undefined;
|
|
50
|
+
}): void;
|
|
51
|
+
export declare function emitRenderDraw(root: ExperimentalTgpuRoot, passInternals: RenderPassInternals, pipeline: TgpuRenderPipeline, usesIndexBuffer: boolean, emit: (rawPass: GPURenderPassEncoder | GPURenderBundleEncoder) => void, ownsPass?: boolean): void;
|
|
52
|
+
export declare function emitComputeDispatch(root: ExperimentalTgpuRoot, passInternals: ComputePassInternals, pipeline: TgpuComputePipeline, emit: (rawPass: GPUComputePassEncoder) => void, ownsPass?: boolean): void;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { MissingBindGroupsError, MissingVertexBuffersError } from "../../errors.js";
|
|
2
|
+
import { $internal } from "../../shared/symbols.js";
|
|
3
|
+
import { logger } from "../../tgpuLogger.js";
|
|
4
|
+
import { isBindGroup, } from "../../tgpuBindGroupLayout.js";
|
|
5
|
+
import { logDataFromGPU } from "../../tgsl/consoleLog/deserializers.js";
|
|
6
|
+
import { isBuffer } from "../../types.js";
|
|
7
|
+
import { queueTimestampResolve } from "./timeable.js";
|
|
8
|
+
export class RenderDrawState {
|
|
9
|
+
bindGroups = new Map();
|
|
10
|
+
vertexBuffers = new Map();
|
|
11
|
+
currentPipeline;
|
|
12
|
+
indexBuffer;
|
|
13
|
+
stencilReference;
|
|
14
|
+
/** What the raw pass holds, starting at the WebGPU default; survives executeBundles */
|
|
15
|
+
appliedStencilReference = 0;
|
|
16
|
+
version = 0;
|
|
17
|
+
/** Raw access via `root.unwrap(pass)` can mutate state invisibly, disabling deduplication */
|
|
18
|
+
rawAccessed = false;
|
|
19
|
+
}
|
|
20
|
+
export class ComputeDrawState {
|
|
21
|
+
bindGroups = new Map();
|
|
22
|
+
currentPipeline;
|
|
23
|
+
version = 0;
|
|
24
|
+
rawAccessed = false;
|
|
25
|
+
}
|
|
26
|
+
export function recordBindGroup(state, first, bindGroup) {
|
|
27
|
+
if (isBindGroup(first)) {
|
|
28
|
+
state.bindGroups.set(first.layout, first);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
state.bindGroups.set(first, bindGroup);
|
|
32
|
+
}
|
|
33
|
+
state.version++;
|
|
34
|
+
}
|
|
35
|
+
/** Writes the pipeline and its bound resources into pass state; later set* calls overwrite them */
|
|
36
|
+
export function stampRenderPipeline(state, pipeline) {
|
|
37
|
+
const { priors } = pipeline[$internal];
|
|
38
|
+
state.currentPipeline = pipeline;
|
|
39
|
+
if (priors.bindGroupLayoutMap) {
|
|
40
|
+
for (const [layout, group] of priors.bindGroupLayoutMap) {
|
|
41
|
+
state.bindGroups.set(layout, group);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (priors.vertexLayoutMap) {
|
|
45
|
+
for (const [layout, buffer] of priors.vertexLayoutMap) {
|
|
46
|
+
state.vertexBuffers.set(layout, { buffer, offset: undefined, size: undefined });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (priors.indexBuffer) {
|
|
50
|
+
state.indexBuffer = priors.indexBuffer;
|
|
51
|
+
}
|
|
52
|
+
if (priors.stencilReference !== undefined) {
|
|
53
|
+
state.stencilReference = priors.stencilReference;
|
|
54
|
+
}
|
|
55
|
+
state.version++;
|
|
56
|
+
}
|
|
57
|
+
/** The compute counterpart of {@link stampRenderPipeline} */
|
|
58
|
+
export function stampComputePipeline(state, pipeline) {
|
|
59
|
+
const { priors } = pipeline[$internal];
|
|
60
|
+
state.currentPipeline = pipeline;
|
|
61
|
+
if (priors.bindGroupLayoutMap) {
|
|
62
|
+
for (const [layout, group] of priors.bindGroupLayoutMap) {
|
|
63
|
+
state.bindGroups.set(layout, group);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
state.version++;
|
|
67
|
+
}
|
|
68
|
+
function applyIndexBuffer(encoder, root, entry) {
|
|
69
|
+
const { buffer, indexFormat, offsetBytes, sizeBytes } = entry;
|
|
70
|
+
if (isBuffer(buffer)) {
|
|
71
|
+
encoder.setIndexBuffer(root.unwrap(buffer), indexFormat, offsetBytes, sizeBytes);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
encoder.setIndexBuffer(buffer, indexFormat, offsetBytes, sizeBytes);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function applyBindGroups(encoder, root, usedBindGroupLayouts, catchall, resolveBindGroup) {
|
|
78
|
+
const missingBindGroups = new Set(usedBindGroupLayouts);
|
|
79
|
+
usedBindGroupLayouts.forEach((layout, idx) => {
|
|
80
|
+
if (catchall && idx === catchall[0]) {
|
|
81
|
+
encoder.setBindGroup(idx, root.unwrap(catchall[1]));
|
|
82
|
+
missingBindGroups.delete(layout);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const bindGroup = resolveBindGroup(layout);
|
|
86
|
+
if (bindGroup !== undefined) {
|
|
87
|
+
missingBindGroups.delete(layout);
|
|
88
|
+
if (isBindGroup(bindGroup)) {
|
|
89
|
+
encoder.setBindGroup(idx, root.unwrap(bindGroup));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
encoder.setBindGroup(idx, bindGroup);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
if (missingBindGroups.size > 0) {
|
|
98
|
+
throw new MissingBindGroupsError(missingBindGroups);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function applyVertexBuffers(encoder, root, usedVertexLayouts, resolveVertexBuffer) {
|
|
102
|
+
const missingVertexLayouts = new Set();
|
|
103
|
+
usedVertexLayouts.forEach((vertexLayout, idx) => {
|
|
104
|
+
const entry = resolveVertexBuffer(vertexLayout);
|
|
105
|
+
if (!entry || !entry.buffer) {
|
|
106
|
+
missingVertexLayouts.add(vertexLayout);
|
|
107
|
+
}
|
|
108
|
+
else if (isBuffer(entry.buffer)) {
|
|
109
|
+
encoder.setVertexBuffer(idx, root.unwrap(entry.buffer), entry.offset, entry.size);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
encoder.setVertexBuffer(idx, entry.buffer, entry.offset, entry.size);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
if (missingVertexLayouts.size > 0) {
|
|
116
|
+
throw new MissingVertexBuffersError(missingVertexLayouts);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function applyRenderPipelineState(encoder, root, pipeline, passState) {
|
|
120
|
+
const memo = pipeline[$internal].core.unwrap();
|
|
121
|
+
encoder.setPipeline(memo.pipeline);
|
|
122
|
+
applyBindGroups(encoder, root, memo.usedBindGroupLayouts, memo.catchall, (layout) => passState.bindGroups.get(layout));
|
|
123
|
+
applyVertexBuffers(encoder, root, memo.usedVertexLayouts, (vertexLayout) => passState.vertexBuffers.get(vertexLayout));
|
|
124
|
+
if (passState.indexBuffer !== undefined) {
|
|
125
|
+
applyIndexBuffer(encoder, root, passState.indexBuffer);
|
|
126
|
+
}
|
|
127
|
+
if (typeof encoder.setStencilReference === 'function' &&
|
|
128
|
+
passState.stencilReference !== undefined) {
|
|
129
|
+
if (passState.rawAccessed || passState.stencilReference !== passState.appliedStencilReference) {
|
|
130
|
+
encoder.setStencilReference(passState.stencilReference);
|
|
131
|
+
passState.appliedStencilReference = passState.stencilReference;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function applyComputePipelineState(encoder, root, pipeline, passState) {
|
|
136
|
+
const memo = pipeline[$internal].core.unwrap();
|
|
137
|
+
encoder.setPipeline(memo.pipeline);
|
|
138
|
+
applyBindGroups(encoder, root, memo.usedBindGroupLayouts, memo.catchall, (layout) => passState.bindGroups.get(layout));
|
|
139
|
+
}
|
|
140
|
+
export function requireIndexBuffer(indexBuffer) {
|
|
141
|
+
if (!indexBuffer) {
|
|
142
|
+
throw new Error('No index buffer is set. Call pipeline.withIndexBuffer or pass.setIndexBuffer before drawing indexed geometry.');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function warnAboutUnreachableSubmission(core, what) {
|
|
146
|
+
logger.warnOnce('suspicious', core, what, `${what} is ignored when recording into a raw GPUCommandEncoder, since there is no submission to report after. Use root['~unstable'].createCommandEncoder() instead.`);
|
|
147
|
+
}
|
|
148
|
+
/** Returns false when there is no encoder to defer the read to, meaning the output is lost */
|
|
149
|
+
function queueLogDrain(encoder, logResources) {
|
|
150
|
+
if (!encoder || encoder[$internal].adopted) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
encoder[$internal].afterSubmit.set(logResources, () => logDataFromGPU(logResources));
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
export function finalizeOwnEncoder(encoder, core, logResources, priors) {
|
|
157
|
+
if (logResources && !queueLogDrain(encoder, logResources)) {
|
|
158
|
+
warnAboutUnreachableSubmission(core, 'Shader console.log output');
|
|
159
|
+
}
|
|
160
|
+
if (priors.performanceCallback && !queueTimestampResolve(encoder, priors)) {
|
|
161
|
+
warnAboutUnreachableSubmission(core, 'The performance callback');
|
|
162
|
+
}
|
|
163
|
+
if (priors.encoder === undefined) {
|
|
164
|
+
encoder.submit();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const PassKindWording = {
|
|
168
|
+
render: {
|
|
169
|
+
into: 'drawing into a render pass',
|
|
170
|
+
intoRaw: 'drawing into a raw render pass',
|
|
171
|
+
begin: 'beginRenderPass',
|
|
172
|
+
},
|
|
173
|
+
compute: {
|
|
174
|
+
into: 'dispatching into a compute pass',
|
|
175
|
+
intoRaw: 'dispatching into a raw compute pass',
|
|
176
|
+
begin: 'beginComputePass',
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
function reportIgnoredPriors(core, owner, hasTimestampWrites, logResources, passKind, hasAttachments = false) {
|
|
180
|
+
const wording = PassKindWording[passKind];
|
|
181
|
+
if (hasAttachments) {
|
|
182
|
+
logger.warnOnce('suspicious', core, 'attachments', `Pipeline-level attachments are ignored when ${wording.into}. Pass \`colorAttachments\` and \`depthStencilAttachment\` to encoder.${wording.begin} instead.`);
|
|
183
|
+
}
|
|
184
|
+
if (hasTimestampWrites) {
|
|
185
|
+
logger.warnOnce('suspicious', core, 'timestampWrites', `Pipeline-level timestamp writes are ignored when ${wording.into}. Pass \`timestampWrites\` to encoder.${wording.begin} instead.`);
|
|
186
|
+
}
|
|
187
|
+
if (logResources && !queueLogDrain(owner, logResources)) {
|
|
188
|
+
logger.warnOnce('suspicious', core, 'logs', `Shader console.log output is ignored when ${wording.intoRaw} encoder, since there is no submission to read it back after.`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export function emitRenderDraw(root, passInternals, pipeline, usesIndexBuffer, emit, ownsPass = false) {
|
|
192
|
+
const { state, rawPass } = passInternals;
|
|
193
|
+
const { core, priors } = pipeline[$internal];
|
|
194
|
+
if (state.currentPipeline !== pipeline) {
|
|
195
|
+
stampRenderPipeline(state, pipeline);
|
|
196
|
+
}
|
|
197
|
+
if (usesIndexBuffer) {
|
|
198
|
+
requireIndexBuffer(state.indexBuffer);
|
|
199
|
+
}
|
|
200
|
+
const memo = core.unwrap();
|
|
201
|
+
if (!ownsPass) {
|
|
202
|
+
reportIgnoredPriors(core, passInternals.owner, !!priors.timestampWrites, memo.logResources, 'render', !!priors.colorAttachment || !!priors.depthStencilAttachment);
|
|
203
|
+
}
|
|
204
|
+
if (state.rawAccessed || passInternals.appliedVersion !== state.version) {
|
|
205
|
+
applyRenderPipelineState(rawPass, root, pipeline, state);
|
|
206
|
+
passInternals.appliedVersion = state.version;
|
|
207
|
+
}
|
|
208
|
+
emit(rawPass);
|
|
209
|
+
}
|
|
210
|
+
export function emitComputeDispatch(root, passInternals, pipeline, emit, ownsPass = false) {
|
|
211
|
+
const { state, rawPass } = passInternals;
|
|
212
|
+
const { core, priors } = pipeline[$internal];
|
|
213
|
+
if (state.currentPipeline !== pipeline) {
|
|
214
|
+
stampComputePipeline(state, pipeline);
|
|
215
|
+
}
|
|
216
|
+
const memo = core.unwrap();
|
|
217
|
+
if (!ownsPass) {
|
|
218
|
+
reportIgnoredPriors(core, passInternals.owner, !!priors.timestampWrites, memo.logResources, 'compute');
|
|
219
|
+
}
|
|
220
|
+
if (state.rawAccessed || passInternals.appliedVersion !== state.version) {
|
|
221
|
+
applyComputePipelineState(rawPass, root, pipeline, state);
|
|
222
|
+
passInternals.appliedVersion = state.version;
|
|
223
|
+
}
|
|
224
|
+
emit(rawPass);
|
|
225
|
+
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
function warnIfOverflow(layouts, limits) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { logger } from "../../tgpuLogger.js";
|
|
2
|
+
export function warnIfOverflow(layouts, limits) {
|
|
3
|
+
const entries = Object.values(layouts)
|
|
4
|
+
.flatMap((layout) => Object.values(layout.entries))
|
|
5
|
+
.filter((entry) => entry !== null);
|
|
6
|
+
const uniform = entries.filter((entry) => 'uniform' in entry).length;
|
|
7
|
+
const storage = entries.filter((entry) => 'storage' in entry).length;
|
|
8
|
+
if (uniform > limits.maxUniformBuffersPerShaderStage) {
|
|
9
|
+
logger.warn('webgpu-limits-exceeded', `Total number of uniform buffers (${uniform}) exceeds maxUniformBuffersPerShaderStage (${limits.maxUniformBuffersPerShaderStage}). Consider:
|
|
7
10
|
1. Grouping some of the uniforms into one using 'd.struct',
|
|
8
11
|
2. Increasing the limit when requesting a device or creating a root.`);
|
|
9
|
-
|
|
12
|
+
}
|
|
13
|
+
if (storage > limits.maxStorageBuffersPerShaderStage) {
|
|
14
|
+
logger.warn('webgpu-limits-exceeded', `Total number of storage buffers (${storage}) exceeds maxStorageBuffersPerShaderStage (${limits.maxStorageBuffersPerShaderStage}).`);
|
|
15
|
+
}
|
|
10
16
|
}
|
|
11
|
-
|
|
12
|
-
//#endregion
|
|
13
|
-
export { warnIfOverflow };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ResolutionResult } from '../../resolutionCtx.ts';
|
|
2
|
+
export interface PerformanceTracker {
|
|
3
|
+
measureResolve(callback: () => ResolutionResult): ResolutionResult;
|
|
4
|
+
measureCompile(device: GPUDevice): void;
|
|
5
|
+
}
|
|
6
|
+
export declare class PerformanceTrackerImpl implements PerformanceTracker {
|
|
7
|
+
#private;
|
|
8
|
+
measureResolve(callback: () => ResolutionResult): ResolutionResult;
|
|
9
|
+
measureCompile(device: GPUDevice): void;
|
|
10
|
+
}
|
|
11
|
+
export declare class NullPerformanceTracker implements PerformanceTracker {
|
|
12
|
+
measureResolve(callback: () => ResolutionResult): ResolutionResult;
|
|
13
|
+
measureCompile(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { PERF } from "../../shared/meta.js";
|
|
2
|
+
export class PerformanceTrackerImpl {
|
|
3
|
+
#resolveMeasure;
|
|
4
|
+
#wgslSize;
|
|
5
|
+
measureResolve(callback) {
|
|
6
|
+
const resolveStart = performance.mark('typegpu:resolution:start');
|
|
7
|
+
const result = callback();
|
|
8
|
+
this.#resolveMeasure = performance.measure('typegpu:resolution', {
|
|
9
|
+
start: resolveStart.name,
|
|
10
|
+
});
|
|
11
|
+
this.#wgslSize = result.code.length;
|
|
12
|
+
return result;
|
|
13
|
+
}
|
|
14
|
+
measureCompile(device) {
|
|
15
|
+
void (async () => {
|
|
16
|
+
const start = performance.mark('typegpu:compile-start');
|
|
17
|
+
await device.queue.onSubmittedWorkDone();
|
|
18
|
+
const compileMeasure = performance.measure('typegpu:compiled', {
|
|
19
|
+
start: start.name,
|
|
20
|
+
});
|
|
21
|
+
PERF?.record('resolution', {
|
|
22
|
+
resolveDuration: this.#resolveMeasure?.duration,
|
|
23
|
+
compileDuration: compileMeasure.duration,
|
|
24
|
+
wgslSize: this.#wgslSize,
|
|
25
|
+
});
|
|
26
|
+
})();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class NullPerformanceTracker {
|
|
30
|
+
measureResolve(callback) {
|
|
31
|
+
return callback();
|
|
32
|
+
}
|
|
33
|
+
measureCompile() { }
|
|
34
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IndirectFlag, TgpuBuffer } from '../buffer/buffer.ts';
|
|
2
|
+
import { type PrimitiveOffsetInfo } from '../../data/offsetUtils.ts';
|
|
3
|
+
import type { BaseData } from '../../data/wgslTypes.ts';
|
|
4
|
+
import type { TgpuBindGroup, TgpuBindGroupLayout } from '../../tgpuBindGroupLayout.ts';
|
|
5
|
+
import type { TgpuVertexLayout } from '../vertexLayout/vertexLayout.ts';
|
|
6
|
+
import type { Timeable, TimestampWritesPriors } from './timeable.ts';
|
|
7
|
+
export declare const DISPATCH_INDIRECT_SIZE = 12;
|
|
8
|
+
export declare const DRAW_INDIRECT_SIZE = 16;
|
|
9
|
+
export declare const DRAW_INDEXED_INDIRECT_SIZE = 20;
|
|
10
|
+
export declare function collectBindGroupPairs(layouts: TgpuBindGroupLayout[], catchall: [number, TgpuBindGroup] | undefined, map: Map<TgpuBindGroupLayout, TgpuBindGroup | GPUBindGroup> | undefined): [TgpuBindGroupLayout, TgpuBindGroup | GPUBindGroup][];
|
|
11
|
+
export declare function collectVertexBufferPairs<Buffer>(layouts: TgpuVertexLayout[], map: Map<TgpuVertexLayout, Buffer> | undefined): [TgpuVertexLayout, Buffer][];
|
|
12
|
+
export declare function restoreTimestampPriors<T extends Timeable>(pipeline: T, priors: {
|
|
13
|
+
readonly timestampWrites?: TimestampWritesPriors['timestampWrites'] | undefined;
|
|
14
|
+
readonly performanceCallback?: TimestampWritesPriors['performanceCallback'] | undefined;
|
|
15
|
+
}): T;
|
|
16
|
+
type IndirectOperation = 'dispatchWorkgroupsIndirect' | 'drawIndirect' | 'drawIndexedIndirect';
|
|
17
|
+
export declare function resolveIndirectOffset(indirectBuffer: (TgpuBuffer<BaseData> & IndirectFlag) | GPUBuffer, start: PrimitiveOffsetInfo | number | undefined, requiredSize: number, operation: IndirectOperation): number;
|
|
18
|
+
export {};
|
|
@@ -1,31 +1,60 @@
|
|
|
1
|
-
import { isGPUBuffer } from "../../types.js";
|
|
2
|
-
import { sizeOf } from "../../data/sizeOf.js";
|
|
3
1
|
import { memoryLayoutOf } from "../../data/offsetUtils.js";
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { sizeOf } from "../../data/sizeOf.js";
|
|
3
|
+
import { isGPUBuffer } from "../../types.js";
|
|
4
|
+
import { logger } from "../../tgpuLogger.js";
|
|
5
|
+
export const DISPATCH_INDIRECT_SIZE = 12; // 3 x u32 (x, y, z)
|
|
6
|
+
export const DRAW_INDIRECT_SIZE = 16; // 4 x 4
|
|
7
|
+
export const DRAW_INDEXED_INDIRECT_SIZE = 20; // 5 x 4
|
|
8
|
+
export function collectBindGroupPairs(layouts, catchall, map) {
|
|
9
|
+
return layouts.flatMap((layout, idx) => {
|
|
10
|
+
const resource = catchall && idx === catchall[0] ? catchall[1] : map?.get(layout);
|
|
11
|
+
return resource ? [[layout, resource]] : [];
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function collectVertexBufferPairs(layouts, map) {
|
|
15
|
+
return layouts.flatMap((layout) => {
|
|
16
|
+
const resource = map?.get(layout);
|
|
17
|
+
return resource ? [[layout, resource]] : [];
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function restoreTimestampPriors(pipeline, priors) {
|
|
21
|
+
let result = pipeline;
|
|
22
|
+
if (priors.timestampWrites) {
|
|
23
|
+
result = result.withTimestampWrites(priors.timestampWrites);
|
|
24
|
+
}
|
|
25
|
+
if (priors.performanceCallback) {
|
|
26
|
+
result = result.withPerformanceCallback(priors.performanceCallback);
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
6
30
|
const IndirectOperationToRequiredData = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
31
|
+
dispatchWorkgroupsIndirect: '3 x u32',
|
|
32
|
+
drawIndirect: '4 x u32',
|
|
33
|
+
drawIndexedIndirect: '3 x u32, i32, u32',
|
|
10
34
|
};
|
|
11
35
|
function validateIndirectBufferSize(bufferSize, offset, requiredBytes, operation) {
|
|
12
|
-
|
|
13
|
-
|
|
36
|
+
if (offset + requiredBytes > bufferSize) {
|
|
37
|
+
throw new Error(`Buffer too small for ${operation}. Required: ${requiredBytes} bytes at offset ${offset}, but buffer is only ${bufferSize} bytes.`);
|
|
38
|
+
}
|
|
39
|
+
if (offset % 4 !== 0) {
|
|
40
|
+
throw new Error(`Indirect buffer offset must be a multiple of 4. Got: ${offset}`);
|
|
41
|
+
}
|
|
14
42
|
}
|
|
15
|
-
function resolveIndirectOffset(indirectBuffer, start, requiredSize, operation) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
43
|
+
export function resolveIndirectOffset(indirectBuffer, start, requiredSize, operation) {
|
|
44
|
+
if (isGPUBuffer(indirectBuffer)) {
|
|
45
|
+
const offset = typeof start === 'number' ? start : (start?.offset ?? 0);
|
|
46
|
+
validateIndirectBufferSize(indirectBuffer.size, offset, requiredSize, operation);
|
|
47
|
+
return offset;
|
|
48
|
+
}
|
|
49
|
+
const offsetInfo = start
|
|
50
|
+
? typeof start === 'number'
|
|
51
|
+
? { offset: start, contiguous: requiredSize }
|
|
52
|
+
: start
|
|
53
|
+
: memoryLayoutOf(indirectBuffer.dataType);
|
|
54
|
+
const { offset, contiguous } = offsetInfo;
|
|
55
|
+
validateIndirectBufferSize(sizeOf(indirectBuffer.dataType), offset, requiredSize, operation);
|
|
56
|
+
if (contiguous < requiredSize) {
|
|
57
|
+
logger.warn('suspicious', `${operation}: Starting at offset ${offset}, only ${contiguous} contiguous bytes are available before padding. '${operation}' requires ${requiredSize} bytes (${IndirectOperationToRequiredData[operation]}). Reading across padding may result in undefined behavior.`);
|
|
58
|
+
}
|
|
59
|
+
return offset;
|
|
28
60
|
}
|
|
29
|
-
|
|
30
|
-
//#endregion
|
|
31
|
-
export { resolveIndirectOffset };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function nonTransferablePriorsOf(priors: object): string[];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// GPU objects like query sets cross runtimes as shareable host objects, performanceCallback crosses only if it is a worklet
|
|
2
|
+
const TRANSFERABLE_PRIORS = new Set([
|
|
3
|
+
'bindGroupLayoutMap',
|
|
4
|
+
'vertexLayoutMap',
|
|
5
|
+
'indexBuffer',
|
|
6
|
+
'stencilReference',
|
|
7
|
+
'timestampWrites',
|
|
8
|
+
'performanceCallback',
|
|
9
|
+
]);
|
|
10
|
+
export function nonTransferablePriorsOf(priors) {
|
|
11
|
+
return Object.keys(priors).filter((key) => !TRANSFERABLE_PRIORS.has(key) && priors[key] !== undefined);
|
|
12
|
+
}
|