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,15 @@
|
|
|
1
|
+
import { type TgpuResourceSoul, type TransferableResourceType } from './restore.ts';
|
|
2
|
+
import type { RestoreContext } from './types.ts';
|
|
3
|
+
export type { TgpuResourceSoul, TransferableResourceType };
|
|
4
|
+
/** What travels between runtimes: a plain copy of a TypeGPU resource's soul */
|
|
5
|
+
export type TgpuResourceSnapshot = TgpuResourceSoul;
|
|
6
|
+
/** Whether the value is something {@link snapshotResource} can carry across a device boundary */
|
|
7
|
+
export declare function isTransferableResource(value: unknown): boolean;
|
|
8
|
+
/** Whether the value is a class-like TypeGPU object that {@link snapshotResource} cannot carry */
|
|
9
|
+
export declare function isNonTransferableResource(value: unknown): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Extracts what survives a device boundary: the resource's soul, completed by
|
|
12
|
+
* materialization for resources whose definition is a compiled object
|
|
13
|
+
*/
|
|
14
|
+
export declare function snapshotResource(value: unknown): TgpuResourceSnapshot | undefined;
|
|
15
|
+
export declare function restoreResource(snapshot: TgpuResourceSnapshot, ctx: RestoreContext): unknown;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { isData } from "../data/dataTypes.js";
|
|
2
|
+
import { setName } from "../shared/meta.js";
|
|
3
|
+
import { $internal, $soul, isMarkedInternal } from "../shared/symbols.js";
|
|
4
|
+
import { soulRestorers } from "./restore.js";
|
|
5
|
+
import { deserializeDataSchema, serializeDataSchema } from "./schema.js";
|
|
6
|
+
/**
|
|
7
|
+
* Every data schema is callable, and host serializers claim functions before
|
|
8
|
+
* they ever ask whether a value is transferable, so schemas held by a soul are
|
|
9
|
+
* replaced with a description of themselves on the way out
|
|
10
|
+
*/
|
|
11
|
+
const DATA_SCHEMA_KEY = '~tgpuDataSchema';
|
|
12
|
+
function isPlainRecord(value) {
|
|
13
|
+
if (typeof value !== 'object' || value === null) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const proto = Object.getPrototypeOf(value);
|
|
17
|
+
return proto === Object.prototype || proto === null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Rebuilds containers only when something inside them changed, so raw handles
|
|
21
|
+
* are passed through untouched. `path` keeps self-referencing objects finite
|
|
22
|
+
*/
|
|
23
|
+
function mapContainer(value, path, mapField) {
|
|
24
|
+
const isArray = Array.isArray(value);
|
|
25
|
+
if (!isArray && !isPlainRecord(value)) {
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
if (path.has(value)) {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
path.add(value);
|
|
32
|
+
try {
|
|
33
|
+
if (isArray) {
|
|
34
|
+
const mapped = value.map((field) => mapField(field, path));
|
|
35
|
+
return mapped.some((field, idx) => field !== value[idx]) ? mapped : value;
|
|
36
|
+
}
|
|
37
|
+
const entries = Object.entries(value);
|
|
38
|
+
const mapped = entries.map(([key, field]) => [key, mapField(field, path)]);
|
|
39
|
+
return mapped.some(([, field], idx) => field !== entries[idx]?.[1])
|
|
40
|
+
? Object.fromEntries(mapped)
|
|
41
|
+
: value;
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
path.delete(value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function describeSchemas(value, path = new Set()) {
|
|
48
|
+
if (isData(value)) {
|
|
49
|
+
return { [DATA_SCHEMA_KEY]: serializeDataSchema(value) };
|
|
50
|
+
}
|
|
51
|
+
return mapContainer(value, path, describeSchemas);
|
|
52
|
+
}
|
|
53
|
+
function reviveSchemas(value, path = new Set()) {
|
|
54
|
+
if (isPlainRecord(value)) {
|
|
55
|
+
const described = value[DATA_SCHEMA_KEY];
|
|
56
|
+
if (described) {
|
|
57
|
+
return deserializeDataSchema(described);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return mapContainer(value, path, reviveSchemas);
|
|
61
|
+
}
|
|
62
|
+
function soulOf(value) {
|
|
63
|
+
const soul = value?.[$soul];
|
|
64
|
+
return soul && soul.type in soulRestorers ? soul : undefined;
|
|
65
|
+
}
|
|
66
|
+
/** Whether the value is something {@link snapshotResource} can carry across a device boundary */
|
|
67
|
+
export function isTransferableResource(value) {
|
|
68
|
+
return soulOf(value) !== undefined;
|
|
69
|
+
}
|
|
70
|
+
/** Whether the value is a class-like TypeGPU object that {@link snapshotResource} cannot carry */
|
|
71
|
+
export function isNonTransferableResource(value) {
|
|
72
|
+
return (typeof value === 'object' &&
|
|
73
|
+
value !== null &&
|
|
74
|
+
!Array.isArray(value) &&
|
|
75
|
+
!isData(value) &&
|
|
76
|
+
isMarkedInternal(value) &&
|
|
77
|
+
!isTransferableResource(value));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extracts what survives a device boundary: the resource's soul, completed by
|
|
81
|
+
* materialization for resources whose definition is a compiled object
|
|
82
|
+
*/
|
|
83
|
+
export function snapshotResource(value) {
|
|
84
|
+
const soul = soulOf(value);
|
|
85
|
+
if (!soul) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
value[$internal]?.materialize?.();
|
|
89
|
+
const nonTransferable = soul.nonTransferablePriors;
|
|
90
|
+
if (nonTransferable?.length) {
|
|
91
|
+
throw new Error(`TypeGPU '${soul.type}' cannot be transferred: ${nonTransferable.join(', ')} ${nonTransferable.length > 1 ? 'are' : 'is'} bound to this runtime. Apply them after the resource crosses the boundary.`);
|
|
92
|
+
}
|
|
93
|
+
return describeSchemas({ ...soul });
|
|
94
|
+
}
|
|
95
|
+
export function restoreResource(snapshot, ctx) {
|
|
96
|
+
const restore = soulRestorers[snapshot.type];
|
|
97
|
+
if (!restore) {
|
|
98
|
+
throw new Error(`TypeGPU resource '${snapshot.type}' has no restorer registered.`);
|
|
99
|
+
}
|
|
100
|
+
const resource = restore(reviveSchemas(snapshot), ctx);
|
|
101
|
+
// A root is restored by identity, it keeps the name the receiving runtime gave it
|
|
102
|
+
if (snapshot.label !== undefined && snapshot.type !== 'root') {
|
|
103
|
+
setName(resource, snapshot.label);
|
|
104
|
+
}
|
|
105
|
+
return resource;
|
|
106
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type TgpuBuffer, type TgpuBufferSoul } from '../core/buffer/buffer.ts';
|
|
2
|
+
import type { BaseData } from '../data/wgslTypes.ts';
|
|
3
|
+
import { TgpuBufferBindingImpl, type TgpuBufferBindingSoul } from '../core/buffer/bufferBinding.ts';
|
|
4
|
+
import { type TgpuConstSoul } from '../core/constant/tgpuConstant.ts';
|
|
5
|
+
import { type TgpuComputePipelineSoul } from '../core/pipeline/computePipeline.ts';
|
|
6
|
+
import { type TgpuRenderPipelineSoul } from '../core/pipeline/renderPipeline.ts';
|
|
7
|
+
import type { TgpuQuerySetSoul } from '../core/querySet/querySet.ts';
|
|
8
|
+
import type { TgpuGuardedComputePipelineSoul, TgpuRootSoul } from '../core/root/rootTypes.ts';
|
|
9
|
+
import type { TgpuSamplerSoul } from '../core/sampler/sampler.ts';
|
|
10
|
+
import type { TgpuAccessorSoul, TgpuMutableAccessor, TgpuSlotSoul } from '../core/slot/slotTypes.ts';
|
|
11
|
+
import { type TgpuTextureSoul } from '../core/texture/texture.ts';
|
|
12
|
+
import { type TgpuVertexLayoutSoul } from '../core/vertexLayout/vertexLayout.ts';
|
|
13
|
+
import type { AnyData } from '../data/dataTypes.ts';
|
|
14
|
+
import { type AnyWgslData } from '../data/wgslTypes.ts';
|
|
15
|
+
import type { TextureProps } from '../core/texture/textureProps.ts';
|
|
16
|
+
import { type TgpuBindGroupLayoutSoul, type TgpuBindGroupSoul } from '../tgpuBindGroupLayout.ts';
|
|
17
|
+
import type { TgpuSoul } from '../shared/soul.ts';
|
|
18
|
+
import type { RestoreContext } from './types.ts';
|
|
19
|
+
/** Every soul that can cross a device boundary, discriminated by `type` */
|
|
20
|
+
export type TgpuResourceSoul = TgpuBufferSoul | TgpuBufferBindingSoul | TgpuTextureSoul | TgpuSamplerSoul | TgpuQuerySetSoul | TgpuBindGroupLayoutSoul | TgpuBindGroupSoul | TgpuVertexLayoutSoul | TgpuConstSoul | TgpuSlotSoul | TgpuAccessorSoul | TgpuComputePipelineSoul | TgpuRenderPipelineSoul | TgpuGuardedComputePipelineSoul | TgpuRootSoul;
|
|
21
|
+
type Restorer<TSoul extends TgpuSoul> = (soul: TSoul, ctx: RestoreContext) => unknown;
|
|
22
|
+
declare function restoreBufferBinding(soul: TgpuBufferBindingSoul): TgpuBufferBindingImpl<"uniform" | "mutable" | "readonly", BaseData>;
|
|
23
|
+
/**
|
|
24
|
+
* The one place a soul turns back into a resource. Importing this module opts
|
|
25
|
+
* into every restorer, so it is kept out of the resources themselves
|
|
26
|
+
*/
|
|
27
|
+
export declare const soulRestorers: {
|
|
28
|
+
buffer: (soul: TgpuBufferSoul, ctx: RestoreContext) => TgpuBuffer<AnyData>;
|
|
29
|
+
uniform: typeof restoreBufferBinding;
|
|
30
|
+
mutable: typeof restoreBufferBinding;
|
|
31
|
+
readonly: typeof restoreBufferBinding;
|
|
32
|
+
texture: (soul: TgpuTextureSoul, ctx: RestoreContext) => import("../indexNamedExports.ts").TgpuTexture<TextureProps>;
|
|
33
|
+
sampler: (soul: TgpuSamplerSoul, ctx: RestoreContext) => import("../indexNamedExports.ts").TgpuFixedSampler;
|
|
34
|
+
'sampler-comparison': (soul: TgpuSamplerSoul, ctx: RestoreContext) => import("../indexNamedExports.ts").TgpuFixedComparisonSampler;
|
|
35
|
+
'query-set': (soul: TgpuQuerySetSoul, ctx: RestoreContext) => import("../indexNamedExports.ts").TgpuQuerySet<GPUQueryType>;
|
|
36
|
+
'bind-group-layout': (soul: TgpuBindGroupLayoutSoul) => import("../tgpuBindGroupLayout.ts").TgpuBindGroupLayout<Record<string, import("../tgpuBindGroupLayout.ts").TgpuLayoutEntry | null>>;
|
|
37
|
+
'bind-group': Restorer<TgpuBindGroupSoul>;
|
|
38
|
+
'vertex-layout': (soul: TgpuVertexLayoutSoul) => import("../indexNamedExports.ts").TgpuVertexLayout<import("../data/wgslTypes.ts").WgslArray<AnyWgslData>> | import("../indexNamedExports.ts").TgpuVertexLayout<import("../data/dataTypes.ts").Disarray<AnyData>>;
|
|
39
|
+
const: (soul: TgpuConstSoul) => import("../indexNamedExports.ts").TgpuConst<AnyData>;
|
|
40
|
+
slot: (soul: TgpuSlotSoul) => import("../indexNamedExports.ts").TgpuSlot<unknown>;
|
|
41
|
+
accessor: (soul: TgpuAccessorSoul) => import("../indexNamedExports.ts").TgpuAccessor<AnyData>;
|
|
42
|
+
'mutable-accessor': (soul: TgpuAccessorSoul) => TgpuMutableAccessor<AnyData>;
|
|
43
|
+
'compute-pipeline': Restorer<TgpuComputePipelineSoul>;
|
|
44
|
+
'render-pipeline': Restorer<TgpuRenderPipelineSoul>;
|
|
45
|
+
'guarded-compute-pipeline': Restorer<TgpuGuardedComputePipelineSoul>;
|
|
46
|
+
root: Restorer<TgpuRootSoul>;
|
|
47
|
+
};
|
|
48
|
+
export type TransferableResourceType = TgpuResourceSoul['type'];
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { INTERNAL_applyBufferUsages, } from "../core/buffer/buffer.js";
|
|
2
|
+
import { TgpuBufferBindingImpl } from "../core/buffer/bufferBinding.js";
|
|
3
|
+
import { constant } from "../core/constant/tgpuConstant.js";
|
|
4
|
+
import { INTERNAL_restoreComputePipeline, } from "../core/pipeline/computePipeline.js";
|
|
5
|
+
import { INTERNAL_restoreRenderPipeline, } from "../core/pipeline/renderPipeline.js";
|
|
6
|
+
import { INTERNAL_restoreGuardedComputePipeline, INTERNAL_restoreRoot } from "../core/root/init.js";
|
|
7
|
+
import { accessor, mutableAccessor } from "../core/slot/accessor.js";
|
|
8
|
+
import { slot } from "../core/slot/slot.js";
|
|
9
|
+
import { INTERNAL_createTexture } from "../core/texture/texture.js";
|
|
10
|
+
import { vertexLayout } from "../core/vertexLayout/vertexLayout.js";
|
|
11
|
+
import { arrayOf } from "../data/array.js";
|
|
12
|
+
import { disarrayOf } from "../data/disarray.js";
|
|
13
|
+
import { isDisarray } from "../data/dataTypes.js";
|
|
14
|
+
import { isWgslArray } from "../data/wgslTypes.js";
|
|
15
|
+
import { INTERNAL_restoreBindGroup, INTERNAL_restoreBindGroupLayout, } from "../tgpuBindGroupLayout.js";
|
|
16
|
+
function restoreBufferBinding(soul) {
|
|
17
|
+
return new TgpuBufferBindingImpl(soul.type, soul.buffer);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The one place a soul turns back into a resource. Importing this module opts
|
|
21
|
+
* into every restorer, so it is kept out of the resources themselves
|
|
22
|
+
*/
|
|
23
|
+
export const soulRestorers = {
|
|
24
|
+
buffer: (soul, ctx) => {
|
|
25
|
+
const buffer = ctx.getRoot(soul.device).createBuffer(soul.dataType, soul.raw);
|
|
26
|
+
INTERNAL_applyBufferUsages(buffer, soul.usages);
|
|
27
|
+
return buffer;
|
|
28
|
+
},
|
|
29
|
+
uniform: restoreBufferBinding,
|
|
30
|
+
mutable: restoreBufferBinding,
|
|
31
|
+
readonly: restoreBufferBinding,
|
|
32
|
+
texture: (soul, ctx) => {
|
|
33
|
+
const texture = INTERNAL_createTexture(soul.props, ctx.getRoot(soul.device), soul.raw);
|
|
34
|
+
if (soul.flagsOverridden) {
|
|
35
|
+
texture.$overrideFlags(soul.flags);
|
|
36
|
+
}
|
|
37
|
+
else if (soul.usages.length > 0) {
|
|
38
|
+
texture.$usage(...soul.usages);
|
|
39
|
+
}
|
|
40
|
+
return texture;
|
|
41
|
+
},
|
|
42
|
+
sampler: (soul, ctx) => ctx.getRoot(soul.device).createSampler(soul.props),
|
|
43
|
+
'sampler-comparison': (soul, ctx) => ctx.getRoot(soul.device).createComparisonSampler(soul.props),
|
|
44
|
+
'query-set': (soul, ctx) => ctx.getRoot(soul.device).createQuerySet(soul.queryType, soul.count, soul.raw),
|
|
45
|
+
'bind-group-layout': (soul) => INTERNAL_restoreBindGroupLayout(soul),
|
|
46
|
+
'bind-group': INTERNAL_restoreBindGroup,
|
|
47
|
+
'vertex-layout': (soul) => {
|
|
48
|
+
const schema = soul.schema;
|
|
49
|
+
if (isWgslArray(schema)) {
|
|
50
|
+
const elementType = schema.elementType;
|
|
51
|
+
return vertexLayout((count) => arrayOf(elementType, count), soul.stepMode);
|
|
52
|
+
}
|
|
53
|
+
if (isDisarray(schema)) {
|
|
54
|
+
const elementType = schema.elementType;
|
|
55
|
+
return vertexLayout((count) => disarrayOf(elementType, count), soul.stepMode);
|
|
56
|
+
}
|
|
57
|
+
throw new Error('TypeGPU vertex layout payload could not be reconstructed.');
|
|
58
|
+
},
|
|
59
|
+
const: (soul) => constant(soul.dataType, soul.value),
|
|
60
|
+
slot: (soul) => slot(soul.defaultValue),
|
|
61
|
+
accessor: (soul) => accessor(soul.schema, soul.defaultValue),
|
|
62
|
+
'mutable-accessor': (soul) => mutableAccessor(soul.schema, soul.defaultValue),
|
|
63
|
+
'compute-pipeline': INTERNAL_restoreComputePipeline,
|
|
64
|
+
'render-pipeline': INTERNAL_restoreRenderPipeline,
|
|
65
|
+
'guarded-compute-pipeline': INTERNAL_restoreGuardedComputePipeline,
|
|
66
|
+
root: INTERNAL_restoreRoot,
|
|
67
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- each restorer narrows its own soul
|
|
68
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as d from '../data/index.ts';
|
|
2
|
+
type SerializedDataAttrib = {
|
|
3
|
+
type: 'align';
|
|
4
|
+
value: number;
|
|
5
|
+
} | {
|
|
6
|
+
type: 'size';
|
|
7
|
+
value: number;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'location';
|
|
10
|
+
value: number;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'interpolate';
|
|
13
|
+
value: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'builtin';
|
|
16
|
+
value: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'invariant';
|
|
19
|
+
};
|
|
20
|
+
export type SerializedDataSchema = {
|
|
21
|
+
type: 'd';
|
|
22
|
+
key: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'array';
|
|
25
|
+
element: SerializedDataSchema;
|
|
26
|
+
count: number;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'disarray';
|
|
29
|
+
element: SerializedDataSchema;
|
|
30
|
+
count: number;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'struct';
|
|
33
|
+
props: [string, SerializedDataSchema][];
|
|
34
|
+
} | {
|
|
35
|
+
type: 'unstruct';
|
|
36
|
+
props: [string, SerializedDataSchema][];
|
|
37
|
+
} | {
|
|
38
|
+
type: 'atomic';
|
|
39
|
+
inner: SerializedDataSchema;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'decorated';
|
|
42
|
+
inner: SerializedDataSchema;
|
|
43
|
+
attribs: SerializedDataAttrib[];
|
|
44
|
+
} | {
|
|
45
|
+
type: 'sampled-texture';
|
|
46
|
+
kind: d.WgslTexture['type'];
|
|
47
|
+
sampleType: SerializedDataSchema;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'storage-texture';
|
|
50
|
+
kind: d.WgslStorageTexture['type'];
|
|
51
|
+
format: d.WgslStorageTexture['format'];
|
|
52
|
+
access: d.WgslStorageTexture['access'];
|
|
53
|
+
} | {
|
|
54
|
+
type: 'external-texture';
|
|
55
|
+
};
|
|
56
|
+
export declare function serializeDataSchema(schema: d.BaseData): SerializedDataSchema;
|
|
57
|
+
export declare function deserializeDataSchema(schema: SerializedDataSchema): d.AnyData;
|
|
58
|
+
export {};
|
package/serial/schema.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import * as d from "../data/index.js";
|
|
2
|
+
import { isWgslStorageTexture, isWgslTexture } from "../data/texture.js";
|
|
3
|
+
import { assertExhaustive } from "../shared/utilityTypes.js";
|
|
4
|
+
// Maps schema singletons (e.g. `d.f32`) back to their `d` export names
|
|
5
|
+
let leafKeys;
|
|
6
|
+
function getDataSchemaKey(schema) {
|
|
7
|
+
if (!leafKeys) {
|
|
8
|
+
leafKeys = new Map();
|
|
9
|
+
for (const [key, value] of Object.entries(d)) {
|
|
10
|
+
if ((typeof value === 'object' || typeof value === 'function') && value !== null) {
|
|
11
|
+
leafKeys.set(value, key);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return leafKeys.get(schema);
|
|
16
|
+
}
|
|
17
|
+
let builtinsByName;
|
|
18
|
+
function getBuiltinByName(value) {
|
|
19
|
+
if (!builtinsByName) {
|
|
20
|
+
builtinsByName = new Map();
|
|
21
|
+
for (const candidate of Object.values(d.builtin)) {
|
|
22
|
+
if (!d.isDecorated(candidate) && !d.isLooseDecorated(candidate)) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const builtin = candidate.attribs.find(d.isBuiltinAttrib);
|
|
26
|
+
if (builtin) {
|
|
27
|
+
builtinsByName.set(builtin.params[0], candidate);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const builtin = builtinsByName.get(value);
|
|
32
|
+
if (!builtin) {
|
|
33
|
+
throw new Error(`TypeGPU builtin '${value}' could not be reconstructed.`);
|
|
34
|
+
}
|
|
35
|
+
return builtin;
|
|
36
|
+
}
|
|
37
|
+
function serializeAttrib(attrib) {
|
|
38
|
+
if (d.isAlignAttrib(attrib)) {
|
|
39
|
+
return { type: 'align', value: attrib.params[0] };
|
|
40
|
+
}
|
|
41
|
+
if (d.isSizeAttrib(attrib)) {
|
|
42
|
+
return { type: 'size', value: attrib.params[0] };
|
|
43
|
+
}
|
|
44
|
+
if (d.isLocationAttrib(attrib)) {
|
|
45
|
+
return { type: 'location', value: attrib.params[0] };
|
|
46
|
+
}
|
|
47
|
+
if (d.isInterpolateAttrib(attrib)) {
|
|
48
|
+
return { type: 'interpolate', value: attrib.params[0] };
|
|
49
|
+
}
|
|
50
|
+
if (d.isBuiltinAttrib(attrib)) {
|
|
51
|
+
return { type: 'builtin', value: attrib.params[0] };
|
|
52
|
+
}
|
|
53
|
+
if (d.isInvariantAttrib(attrib)) {
|
|
54
|
+
return { type: 'invariant' };
|
|
55
|
+
}
|
|
56
|
+
throw new Error('This TypeGPU schema decorator cannot be serialized yet.');
|
|
57
|
+
}
|
|
58
|
+
function applyAttrib(schema, attrib) {
|
|
59
|
+
if (attrib.type === 'align') {
|
|
60
|
+
return d.align(attrib.value, schema);
|
|
61
|
+
}
|
|
62
|
+
if (attrib.type === 'size') {
|
|
63
|
+
return d.size(attrib.value, schema);
|
|
64
|
+
}
|
|
65
|
+
if (attrib.type === 'location') {
|
|
66
|
+
return d.location(attrib.value, schema);
|
|
67
|
+
}
|
|
68
|
+
if (attrib.type === 'interpolate') {
|
|
69
|
+
return d.interpolate(attrib.value, schema);
|
|
70
|
+
}
|
|
71
|
+
if (attrib.type === 'builtin') {
|
|
72
|
+
return getBuiltinByName(attrib.value);
|
|
73
|
+
}
|
|
74
|
+
if (attrib.type === 'invariant') {
|
|
75
|
+
return d.invariant(schema);
|
|
76
|
+
}
|
|
77
|
+
assertExhaustive(attrib, 'schema.ts#applyAttrib');
|
|
78
|
+
}
|
|
79
|
+
function serializeProps(propTypes) {
|
|
80
|
+
return Object.entries(propTypes).map(([prop, propType]) => [prop, serializeDataSchema(propType)]);
|
|
81
|
+
}
|
|
82
|
+
function deserializeProps(props) {
|
|
83
|
+
return Object.fromEntries(props.map(([prop, schema]) => [prop, deserializeDataSchema(schema)]));
|
|
84
|
+
}
|
|
85
|
+
const sampledTextureConstructors = {
|
|
86
|
+
texture_1d: (sampleType) => d.texture1d(sampleType),
|
|
87
|
+
texture_2d: (sampleType) => d.texture2d(sampleType),
|
|
88
|
+
texture_2d_array: (sampleType) => d.texture2dArray(sampleType),
|
|
89
|
+
texture_3d: (sampleType) => d.texture3d(sampleType),
|
|
90
|
+
texture_cube: (sampleType) => d.textureCube(sampleType),
|
|
91
|
+
texture_cube_array: (sampleType) => d.textureCubeArray(sampleType),
|
|
92
|
+
texture_multisampled_2d: (sampleType) => d.textureMultisampled2d(sampleType),
|
|
93
|
+
texture_depth_2d: () => d.textureDepth2d(),
|
|
94
|
+
texture_depth_2d_array: () => d.textureDepth2dArray(),
|
|
95
|
+
texture_depth_cube: () => d.textureDepthCube(),
|
|
96
|
+
texture_depth_cube_array: () => d.textureDepthCubeArray(),
|
|
97
|
+
texture_depth_multisampled_2d: () => d.textureDepthMultisampled2d(),
|
|
98
|
+
};
|
|
99
|
+
const storageTextureConstructors = {
|
|
100
|
+
texture_storage_1d: (format, access) => d.textureStorage1d(format, access),
|
|
101
|
+
texture_storage_2d: (format, access) => d.textureStorage2d(format, access),
|
|
102
|
+
texture_storage_2d_array: (format, access) => d.textureStorage2dArray(format, access),
|
|
103
|
+
texture_storage_3d: (format, access) => d.textureStorage3d(format, access),
|
|
104
|
+
};
|
|
105
|
+
export function serializeDataSchema(schema) {
|
|
106
|
+
const key = getDataSchemaKey(schema);
|
|
107
|
+
if (key) {
|
|
108
|
+
return { type: 'd', key };
|
|
109
|
+
}
|
|
110
|
+
if (isWgslTexture(schema)) {
|
|
111
|
+
return {
|
|
112
|
+
type: 'sampled-texture',
|
|
113
|
+
kind: schema.type,
|
|
114
|
+
sampleType: serializeDataSchema(schema.sampleType),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (isWgslStorageTexture(schema)) {
|
|
118
|
+
return {
|
|
119
|
+
type: 'storage-texture',
|
|
120
|
+
kind: schema.type,
|
|
121
|
+
format: schema.format,
|
|
122
|
+
access: schema.access,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (schema.type === 'texture_external') {
|
|
126
|
+
return { type: 'external-texture' };
|
|
127
|
+
}
|
|
128
|
+
if (d.isDecorated(schema) || d.isLooseDecorated(schema)) {
|
|
129
|
+
return {
|
|
130
|
+
type: 'decorated',
|
|
131
|
+
inner: serializeDataSchema(schema.inner),
|
|
132
|
+
attribs: schema.attribs.map(serializeAttrib),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (d.isAtomic(schema)) {
|
|
136
|
+
return { type: 'atomic', inner: serializeDataSchema(schema.inner) };
|
|
137
|
+
}
|
|
138
|
+
if (d.isWgslArray(schema)) {
|
|
139
|
+
return {
|
|
140
|
+
type: 'array',
|
|
141
|
+
element: serializeDataSchema(schema.elementType),
|
|
142
|
+
count: schema.elementCount,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (d.isDisarray(schema)) {
|
|
146
|
+
return {
|
|
147
|
+
type: 'disarray',
|
|
148
|
+
element: serializeDataSchema(schema.elementType),
|
|
149
|
+
count: schema.elementCount,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (d.isWgslStruct(schema)) {
|
|
153
|
+
return { type: 'struct', props: serializeProps(schema.propTypes) };
|
|
154
|
+
}
|
|
155
|
+
if (d.isUnstruct(schema)) {
|
|
156
|
+
return { type: 'unstruct', props: serializeProps(schema.propTypes) };
|
|
157
|
+
}
|
|
158
|
+
throw new Error(`TypeGPU schema '${schema.type}' cannot be serialized yet.`);
|
|
159
|
+
}
|
|
160
|
+
export function deserializeDataSchema(schema) {
|
|
161
|
+
if (schema.type === 'd') {
|
|
162
|
+
const leaf = d[schema.key];
|
|
163
|
+
if (!leaf) {
|
|
164
|
+
throw new Error(`TypeGPU schema 'd.${schema.key}' could not be reconstructed.`);
|
|
165
|
+
}
|
|
166
|
+
return leaf;
|
|
167
|
+
}
|
|
168
|
+
if (schema.type === 'array') {
|
|
169
|
+
return d.arrayOf(deserializeDataSchema(schema.element), schema.count);
|
|
170
|
+
}
|
|
171
|
+
if (schema.type === 'disarray') {
|
|
172
|
+
return d.disarrayOf(deserializeDataSchema(schema.element), schema.count);
|
|
173
|
+
}
|
|
174
|
+
if (schema.type === 'struct') {
|
|
175
|
+
return d.struct(deserializeProps(schema.props));
|
|
176
|
+
}
|
|
177
|
+
if (schema.type === 'unstruct') {
|
|
178
|
+
return d.unstruct(deserializeProps(schema.props));
|
|
179
|
+
}
|
|
180
|
+
if (schema.type === 'atomic') {
|
|
181
|
+
return d.atomic(deserializeDataSchema(schema.inner));
|
|
182
|
+
}
|
|
183
|
+
if (schema.type === 'decorated') {
|
|
184
|
+
let result = deserializeDataSchema(schema.inner);
|
|
185
|
+
for (let i = schema.attribs.length - 1; i >= 0; i--) {
|
|
186
|
+
const attrib = schema.attribs[i];
|
|
187
|
+
result = applyAttrib(result, attrib);
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
if (schema.type === 'sampled-texture') {
|
|
192
|
+
const constructor = sampledTextureConstructors[schema.kind];
|
|
193
|
+
if (!constructor) {
|
|
194
|
+
throw new Error(`TypeGPU texture schema '${schema.kind}' could not be reconstructed.`);
|
|
195
|
+
}
|
|
196
|
+
return constructor(deserializeDataSchema(schema.sampleType));
|
|
197
|
+
}
|
|
198
|
+
if (schema.type === 'external-texture') {
|
|
199
|
+
return d.textureExternal();
|
|
200
|
+
}
|
|
201
|
+
if (schema.type === 'storage-texture') {
|
|
202
|
+
const constructor = storageTextureConstructors[schema.kind];
|
|
203
|
+
if (!constructor) {
|
|
204
|
+
throw new Error(`TypeGPU storage texture schema '${schema.kind}' could not be reconstructed.`);
|
|
205
|
+
}
|
|
206
|
+
return constructor(schema.format, schema.access);
|
|
207
|
+
}
|
|
208
|
+
throw new Error('TypeGPU schema payload could not be reconstructed.');
|
|
209
|
+
}
|
package/serial/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/shared/env.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This can be used to branch functionality between "dev" and "prod" modes, so that our
|
|
3
|
+
* library can omit doing unnecessary work once it's out in the wild
|
|
4
|
+
*
|
|
5
|
+
* Even though the value of this constant uses Node.js specific APIs, pretty much every
|
|
6
|
+
* bundler replaces the expression below with either `development` or `production`
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEV: boolean;
|
|
9
|
+
export declare const TEST: boolean;
|
package/shared/env.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
2
|
/**
|
|
3
|
-
* This can be used to branch functionality between "dev" and "prod" modes, so that our
|
|
4
|
-
* library can omit doing unnecessary work once it's out in the wild
|
|
5
|
-
*
|
|
6
|
-
* Even though the value of this constant uses Node.js specific APIs, pretty much every
|
|
7
|
-
* bundler replaces the expression below with either `development` or `production`
|
|
8
|
-
*/
|
|
9
|
-
const DEV = process.env.NODE_ENV ===
|
|
10
|
-
const TEST = process.env.NODE_ENV ===
|
|
11
|
-
|
|
12
|
-
//#endregion
|
|
13
|
-
export { DEV, TEST };
|
|
3
|
+
* This can be used to branch functionality between "dev" and "prod" modes, so that our
|
|
4
|
+
* library can omit doing unnecessary work once it's out in the wild
|
|
5
|
+
*
|
|
6
|
+
* Even though the value of this constant uses Node.js specific APIs, pretty much every
|
|
7
|
+
* bundler replaces the expression below with either `development` or `production`
|
|
8
|
+
*/
|
|
9
|
+
export const DEV = process.env.NODE_ENV === 'development';
|
|
10
|
+
export const TEST = process.env.NODE_ENV === 'test';
|
package/shared/generators.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
//#region src/shared/generators.ts
|
|
2
1
|
/**
|
|
3
|
-
* Yields values in the sequence 0,1,2..∞ except for the ones in the `excluded` set.
|
|
4
|
-
*/
|
|
5
|
-
function* naturalsExcept(excluded) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
* Yields values in the sequence 0,1,2..∞ except for the ones in the `excluded` set.
|
|
3
|
+
*/
|
|
4
|
+
export function* naturalsExcept(excluded) {
|
|
5
|
+
let next = 0;
|
|
6
|
+
while (true) {
|
|
7
|
+
if (!excluded.has(next)) {
|
|
8
|
+
yield next;
|
|
9
|
+
}
|
|
10
|
+
next++;
|
|
11
|
+
}
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
//#endregion
|
|
14
|
-
export { naturalsExcept };
|
package/shared/meta.d.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import { RawMetadata } from
|
|
2
|
-
|
|
3
|
-
//#region src/shared/meta.d.ts
|
|
4
|
-
|
|
1
|
+
import { type Metadata, type RawMetadata } from './normalizeMetadata.ts';
|
|
5
2
|
/**
|
|
6
3
|
* Don't use or you WILL get fired from your job.
|
|
7
4
|
*
|
|
@@ -11,20 +8,38 @@ import { RawMetadata } from "./normalizeMetadata.js";
|
|
|
11
8
|
*
|
|
12
9
|
* @internal
|
|
13
10
|
*/
|
|
14
|
-
type INTERNAL_GlobalExt = typeof globalThis & {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
export type INTERNAL_GlobalExt = typeof globalThis & {
|
|
12
|
+
__TYPEGPU_VERSION__?: string;
|
|
13
|
+
__TYPEGPU_META__?: WeakMap<object, RawMetadata>;
|
|
14
|
+
__TYPEGPU_AUTONAME__?: <T>(exp: T, label: string) => T;
|
|
15
|
+
__TYPEGPU_MEASURE_PERF__?: boolean | undefined;
|
|
16
|
+
__TYPEGPU_PERF_RECORDS__?: Map<string, unknown[]>;
|
|
20
17
|
};
|
|
21
18
|
/**
|
|
22
19
|
* Can be assigned a name. Not to be confused with just having a name.
|
|
23
20
|
* The `$name` function should use `setName` to rename the object itself,
|
|
24
21
|
* even if `$getNameForward` symbol is present.
|
|
25
22
|
*/
|
|
26
|
-
interface TgpuNamable {
|
|
27
|
-
|
|
23
|
+
export interface TgpuNamable {
|
|
24
|
+
$name(label: string): this;
|
|
28
25
|
}
|
|
29
|
-
|
|
30
|
-
export
|
|
26
|
+
export declare function isNamable(value: unknown): value is TgpuNamable;
|
|
27
|
+
export declare function getName(definition: unknown): string | undefined;
|
|
28
|
+
export declare function setName(definition: object, name: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Retrieves normalized (non-raw) function metadata.
|
|
31
|
+
* If `globalExt.__TYPEGPU_META__` contains raw metadata for the function,
|
|
32
|
+
* it is normalized, and then deleted to avoid unnecessary re-normalization.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getFunctionMetadata(definition: object): Metadata | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* AST's are given to functions with a 'use gpu' directive, which this function checks for.
|
|
37
|
+
*/
|
|
38
|
+
export declare function hasTinyestMetadata(value: unknown): value is (...args: never[]) => unknown;
|
|
39
|
+
/**
|
|
40
|
+
* Performance measurements are only enabled in dev & test environments for now
|
|
41
|
+
*/
|
|
42
|
+
export declare const PERF: {
|
|
43
|
+
readonly enabled: boolean;
|
|
44
|
+
record(name: string, data: unknown): void;
|
|
45
|
+
} | undefined;
|