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
package/data/offsetUtils.d.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import { BaseData } from
|
|
2
|
-
import { Infer } from
|
|
3
|
-
|
|
4
|
-
//#region src/data/offsetUtils.d.ts
|
|
5
|
-
|
|
1
|
+
import type { BaseData } from './wgslTypes.ts';
|
|
2
|
+
import type { Infer } from '../shared/repr.ts';
|
|
3
|
+
export declare function createOffsetProxy<T extends BaseData>(schema: T, baseOffset?: number): unknown;
|
|
6
4
|
/**
|
|
7
5
|
* Interface containing information about the offset and the available contiguous after a selected primitive.
|
|
8
6
|
*/
|
|
9
|
-
interface PrimitiveOffsetInfo {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
export interface PrimitiveOffsetInfo {
|
|
8
|
+
/** The byte offset of the primitive within the buffer. */
|
|
9
|
+
offset: number;
|
|
10
|
+
/** The number of contiguous bytes available from the offset. */
|
|
11
|
+
contiguous: number;
|
|
14
12
|
}
|
|
15
13
|
/**
|
|
16
14
|
* A function that retrieves offset and information for a specific primitive within a data schema.
|
|
@@ -29,6 +27,4 @@ interface PrimitiveOffsetInfo {
|
|
|
29
27
|
* @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
|
|
30
28
|
* @returns An object containing the offset and contiguous byte information.
|
|
31
29
|
*/
|
|
32
|
-
declare function memoryLayoutOf<T extends BaseData>(schema: T, accessor?: (proxy: Infer<T>) => unknown): PrimitiveOffsetInfo;
|
|
33
|
-
//#endregion
|
|
34
|
-
export { PrimitiveOffsetInfo, memoryLayoutOf };
|
|
30
|
+
export declare function memoryLayoutOf<T extends BaseData>(schema: T, accessor?: (proxy: Infer<T>) => unknown): PrimitiveOffsetInfo;
|
package/data/offsetUtils.js
CHANGED
|
@@ -1,167 +1,227 @@
|
|
|
1
|
-
import { isVec, isWgslArray, isWgslStruct } from "./wgslTypes.js";
|
|
2
|
-
import { undecorate } from "./dataTypes.js";
|
|
3
|
-
import { alignmentOf } from "./alignmentOf.js";
|
|
4
1
|
import { roundUp } from "../mathUtils.js";
|
|
5
|
-
import {
|
|
2
|
+
import { alignmentOf } from "./alignmentOf.js";
|
|
6
3
|
import { offsetsForProps } from "./offsets.js";
|
|
4
|
+
import { sizeOf } from "./sizeOf.js";
|
|
7
5
|
import { isContiguous } from "./isContiguous.js";
|
|
8
6
|
import { getLongestContiguousPrefix } from "./getLongestContiguousPrefix.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const OFFSET_MARKER = Symbol(
|
|
12
|
-
const CONTIGUOUS_MARKER = Symbol(
|
|
7
|
+
import { isVec, isWgslArray, isWgslStruct } from "./wgslTypes.js";
|
|
8
|
+
import { undecorate } from "./dataTypes.js";
|
|
9
|
+
const OFFSET_MARKER = Symbol('indirectOffset');
|
|
10
|
+
const CONTIGUOUS_MARKER = Symbol('indirectContiguous');
|
|
13
11
|
function isOffsetProxy(value) {
|
|
14
|
-
|
|
12
|
+
return (typeof value === 'object' &&
|
|
13
|
+
value !== null &&
|
|
14
|
+
OFFSET_MARKER in value &&
|
|
15
|
+
CONTIGUOUS_MARKER in value);
|
|
15
16
|
}
|
|
16
17
|
function scalarNode(offset, contiguous) {
|
|
17
|
-
|
|
18
|
-
[OFFSET_MARKER]: offset,
|
|
19
|
-
[CONTIGUOUS_MARKER]: contiguous
|
|
20
|
-
};
|
|
18
|
+
return { [OFFSET_MARKER]: offset, [CONTIGUOUS_MARKER]: contiguous };
|
|
21
19
|
}
|
|
22
20
|
function getMarker(target, prop) {
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
if (prop === OFFSET_MARKER) {
|
|
22
|
+
return target[OFFSET_MARKER];
|
|
23
|
+
}
|
|
24
|
+
if (prop === CONTIGUOUS_MARKER) {
|
|
25
|
+
return target[CONTIGUOUS_MARKER];
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
25
28
|
}
|
|
26
29
|
function makeProxy(schema, baseOffset, contiguous = sizeOf(schema)) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
const unwrapped = undecorate(schema);
|
|
31
|
+
const vecComponentCount = isVec(unwrapped) ? unwrapped.componentCount : undefined;
|
|
32
|
+
if (vecComponentCount !== undefined) {
|
|
33
|
+
const componentSize = sizeOf(unwrapped.primitive);
|
|
34
|
+
return makeVecProxy(scalarNode(baseOffset, contiguous), componentSize, vecComponentCount);
|
|
35
|
+
}
|
|
36
|
+
if (isWgslStruct(unwrapped)) {
|
|
37
|
+
return makeStructProxy(unwrapped, scalarNode(baseOffset, contiguous));
|
|
38
|
+
}
|
|
39
|
+
if (isWgslArray(unwrapped)) {
|
|
40
|
+
return makeArrayProxy(unwrapped, scalarNode(baseOffset, contiguous));
|
|
41
|
+
}
|
|
42
|
+
return scalarNode(baseOffset, contiguous);
|
|
36
43
|
}
|
|
37
|
-
function createOffsetProxy(schema, baseOffset = 0) {
|
|
38
|
-
|
|
44
|
+
export function createOffsetProxy(schema, baseOffset = 0) {
|
|
45
|
+
return makeProxy(schema, baseOffset, sizeOf(schema));
|
|
39
46
|
}
|
|
40
47
|
function makeVecProxy(target, componentSize, componentCount) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
const baseOffset = target[OFFSET_MARKER];
|
|
49
|
+
return new Proxy(target, {
|
|
50
|
+
get(t, prop) {
|
|
51
|
+
const marker = getMarker(t, prop);
|
|
52
|
+
if (marker !== undefined) {
|
|
53
|
+
return marker;
|
|
54
|
+
}
|
|
55
|
+
const idx = prop === 'x' || prop === '0'
|
|
56
|
+
? 0
|
|
57
|
+
: prop === 'y' || prop === '1'
|
|
58
|
+
? 1
|
|
59
|
+
: prop === 'z' || prop === '2'
|
|
60
|
+
? 2
|
|
61
|
+
: prop === 'w' || prop === '3'
|
|
62
|
+
? 3
|
|
63
|
+
: -1;
|
|
64
|
+
if (idx < 0 || idx >= componentCount) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
const byteOffset = idx * componentSize;
|
|
68
|
+
const contiguous = Math.max(0, t[CONTIGUOUS_MARKER] - byteOffset);
|
|
69
|
+
return scalarNode(baseOffset + byteOffset, contiguous);
|
|
70
|
+
},
|
|
71
|
+
});
|
|
51
72
|
}
|
|
52
73
|
function makeArrayProxy(array, target) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
const elementType = array.elementType;
|
|
75
|
+
const elementSize = sizeOf(elementType);
|
|
76
|
+
const stride = roundUp(elementSize, alignmentOf(elementType));
|
|
77
|
+
const hasPadding = stride > elementSize;
|
|
78
|
+
return new Proxy(target, {
|
|
79
|
+
get(t, prop) {
|
|
80
|
+
const marker = getMarker(t, prop);
|
|
81
|
+
if (marker !== undefined) {
|
|
82
|
+
return marker;
|
|
83
|
+
}
|
|
84
|
+
if (prop === 'length') {
|
|
85
|
+
return array.elementCount;
|
|
86
|
+
}
|
|
87
|
+
if (typeof prop !== 'string') {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const index = Number(prop);
|
|
91
|
+
if (!Number.isInteger(index) || index < 0 || index >= array.elementCount) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
const elementOffset = index * stride;
|
|
95
|
+
const remainingFromHere = !isContiguous(elementType)
|
|
96
|
+
? elementSize + getLongestContiguousPrefix(elementType) // it is too much, but we correct it later
|
|
97
|
+
: Math.max(0, t[CONTIGUOUS_MARKER] - elementOffset);
|
|
98
|
+
const childContiguous = hasPadding
|
|
99
|
+
? Math.min(remainingFromHere, elementSize)
|
|
100
|
+
: remainingFromHere;
|
|
101
|
+
return makeProxy(elementType, t[OFFSET_MARKER] + elementOffset, childContiguous);
|
|
102
|
+
},
|
|
103
|
+
});
|
|
69
104
|
}
|
|
70
105
|
function makeStructProxy(struct, target) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
const offsets = offsetsForProps(struct);
|
|
107
|
+
const propTypes = struct.propTypes;
|
|
108
|
+
const propNames = Object.keys(propTypes);
|
|
109
|
+
const meta = new Map();
|
|
110
|
+
let runStart = 0;
|
|
111
|
+
for (let i = 0; i < propNames.length; i++) {
|
|
112
|
+
const name = propNames[i];
|
|
113
|
+
if (!name) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const type = propTypes[name];
|
|
117
|
+
if (!type) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const info = offsets[name];
|
|
121
|
+
const padding = info.padding ?? 0;
|
|
122
|
+
const typeContiguous = isContiguous(type);
|
|
123
|
+
const isRunEnd = i === propNames.length - 1 || padding > 0 || !typeContiguous;
|
|
124
|
+
if (!isRunEnd) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const runEnd = info.offset + (typeContiguous ? info.size : getLongestContiguousPrefix(type));
|
|
128
|
+
for (let j = runStart; j <= i; j++) {
|
|
129
|
+
const runName = propNames[j];
|
|
130
|
+
if (!runName) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const runInfo = offsets[runName];
|
|
134
|
+
meta.set(runName, { offset: runInfo.offset, runEnd });
|
|
135
|
+
}
|
|
136
|
+
runStart = i + 1;
|
|
137
|
+
}
|
|
138
|
+
return new Proxy(target, {
|
|
139
|
+
get(t, prop) {
|
|
140
|
+
const marker = getMarker(t, prop);
|
|
141
|
+
if (marker !== undefined) {
|
|
142
|
+
return marker;
|
|
143
|
+
}
|
|
144
|
+
if (typeof prop !== 'string') {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
const m = meta.get(prop);
|
|
148
|
+
if (!m) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
const remainingFromHere = Math.max(0, t[CONTIGUOUS_MARKER] - m.offset);
|
|
152
|
+
const localLimit = Math.max(0, m.runEnd - m.offset);
|
|
153
|
+
const propSchema = propTypes[prop];
|
|
154
|
+
if (!propSchema) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
return makeProxy(propSchema, t[OFFSET_MARKER] + m.offset, sizeOf(struct) === m.runEnd ? remainingFromHere : localLimit);
|
|
158
|
+
},
|
|
159
|
+
});
|
|
109
160
|
}
|
|
110
161
|
function getRootContiguous(schema) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
162
|
+
const unwrapped = undecorate(schema);
|
|
163
|
+
if (isWgslStruct(unwrapped)) {
|
|
164
|
+
const offsets = offsetsForProps(unwrapped);
|
|
165
|
+
const propTypes = unwrapped.propTypes;
|
|
166
|
+
const propNames = Object.keys(propTypes);
|
|
167
|
+
for (let i = 0; i < propNames.length; i++) {
|
|
168
|
+
const name = propNames[i];
|
|
169
|
+
if (!name) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const info = offsets[name];
|
|
173
|
+
const padding = info.padding ?? 0;
|
|
174
|
+
const runEnd = info.offset + info.size;
|
|
175
|
+
const isRunEnd = i === propNames.length - 1 || padding > 0;
|
|
176
|
+
if (isRunEnd) {
|
|
177
|
+
return runEnd;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
if (isWgslArray(unwrapped)) {
|
|
183
|
+
const elementType = unwrapped.elementType;
|
|
184
|
+
const elementSize = sizeOf(elementType);
|
|
185
|
+
const stride = roundUp(elementSize, alignmentOf(elementType));
|
|
186
|
+
const totalSize = sizeOf(schema);
|
|
187
|
+
if (!Number.isFinite(totalSize)) {
|
|
188
|
+
return elementSize;
|
|
189
|
+
}
|
|
190
|
+
return stride > elementSize ? elementSize : totalSize;
|
|
191
|
+
}
|
|
192
|
+
return sizeOf(schema);
|
|
135
193
|
}
|
|
136
194
|
/**
|
|
137
|
-
* A function that retrieves offset and information for a specific primitive within a data schema.
|
|
138
|
-
* Example usage:
|
|
139
|
-
* ```ts
|
|
140
|
-
* const Boid = d.struct({
|
|
141
|
-
* position: d.vec3f,
|
|
142
|
-
* velocity: d.vec3f,
|
|
143
|
-
* });
|
|
144
|
-
* const memLayout = d.memoryLayoutOf(Boid, (b) => b.velocity.y);
|
|
145
|
-
* console.log(memLayout.offset); // Byte offset of velocity.y within Boid (here 20 bytes)
|
|
146
|
-
* console.log(memLayout.contiguous); // Contiguous bytes available from that offset (here 8 bytes)
|
|
147
|
-
* ```
|
|
148
|
-
*
|
|
149
|
-
* @param schema - The data schema to analyze.
|
|
150
|
-
* @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
|
|
151
|
-
* @returns An object containing the offset and contiguous byte information.
|
|
152
|
-
*/
|
|
153
|
-
function memoryLayoutOf(schema, accessor) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
195
|
+
* A function that retrieves offset and information for a specific primitive within a data schema.
|
|
196
|
+
* Example usage:
|
|
197
|
+
* ```ts
|
|
198
|
+
* const Boid = d.struct({
|
|
199
|
+
* position: d.vec3f,
|
|
200
|
+
* velocity: d.vec3f,
|
|
201
|
+
* });
|
|
202
|
+
* const memLayout = d.memoryLayoutOf(Boid, (b) => b.velocity.y);
|
|
203
|
+
* console.log(memLayout.offset); // Byte offset of velocity.y within Boid (here 20 bytes)
|
|
204
|
+
* console.log(memLayout.contiguous); // Contiguous bytes available from that offset (here 8 bytes)
|
|
205
|
+
* ```
|
|
206
|
+
*
|
|
207
|
+
* @param schema - The data schema to analyze.
|
|
208
|
+
* @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
|
|
209
|
+
* @returns An object containing the offset and contiguous byte information.
|
|
210
|
+
*/
|
|
211
|
+
export function memoryLayoutOf(schema, accessor) {
|
|
212
|
+
if (!accessor) {
|
|
213
|
+
return {
|
|
214
|
+
offset: 0,
|
|
215
|
+
contiguous: getRootContiguous(schema),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
const proxy = createOffsetProxy(schema);
|
|
219
|
+
const result = accessor(proxy);
|
|
220
|
+
if (isOffsetProxy(result)) {
|
|
221
|
+
return {
|
|
222
|
+
offset: result[OFFSET_MARKER],
|
|
223
|
+
contiguous: result[CONTIGUOUS_MARKER],
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
throw new Error('memoryLayoutOf: accessor did not return a schema element. Make sure the accessor navigates to a field or element of the schema (e.g. `(s) => s.position.x`).');
|
|
164
227
|
}
|
|
165
|
-
|
|
166
|
-
//#endregion
|
|
167
|
-
export { memoryLayoutOf };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Unstruct } from './dataTypes.ts';
|
|
2
|
+
import type { WgslStruct } from './wgslTypes.ts';
|
|
3
|
+
export interface OffsetInfo {
|
|
4
|
+
offset: number;
|
|
5
|
+
size: number;
|
|
6
|
+
padding?: number | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare function offsetsForProps<T extends WgslStruct | Unstruct>(struct: T): Record<keyof T['propTypes'], OffsetInfo>;
|
package/data/offsets.js
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { alignmentOf, customAlignmentOf } from "./alignmentOf.js";
|
|
1
|
+
import { Measurer } from 'typed-binary';
|
|
3
2
|
import { roundUp } from "../mathUtils.js";
|
|
3
|
+
import alignIO from "./alignIO.js";
|
|
4
|
+
import { alignmentOf, customAlignmentOf } from "./alignmentOf.js";
|
|
5
|
+
import { isUnstruct } from "./dataTypes.js";
|
|
4
6
|
import { sizeOf } from "./sizeOf.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
7
|
+
const cachedOffsets = new WeakMap();
|
|
8
|
+
export function offsetsForProps(struct) {
|
|
9
|
+
const cached = cachedOffsets.get(struct);
|
|
10
|
+
if (cached) {
|
|
11
|
+
return cached;
|
|
12
|
+
}
|
|
13
|
+
const measurer = new Measurer();
|
|
14
|
+
const offsets = {};
|
|
15
|
+
let lastEntry;
|
|
16
|
+
for (const key in struct.propTypes) {
|
|
17
|
+
const prop = struct.propTypes[key];
|
|
18
|
+
if (prop === undefined) {
|
|
19
|
+
throw new Error(`Property ${key} is undefined in struct`);
|
|
20
|
+
}
|
|
21
|
+
const beforeAlignment = measurer.size;
|
|
22
|
+
alignIO(measurer, isUnstruct(struct) ? customAlignmentOf(prop) : alignmentOf(prop));
|
|
23
|
+
if (lastEntry) {
|
|
24
|
+
lastEntry.padding = measurer.size - beforeAlignment;
|
|
25
|
+
}
|
|
26
|
+
const propSize = sizeOf(prop);
|
|
27
|
+
offsets[key] = { offset: measurer.size, size: propSize };
|
|
28
|
+
lastEntry = offsets[key];
|
|
29
|
+
measurer.add(propSize);
|
|
30
|
+
}
|
|
31
|
+
if (lastEntry) {
|
|
32
|
+
lastEntry.padding = roundUp(sizeOf(struct), alignmentOf(struct)) - measurer.size;
|
|
33
|
+
}
|
|
34
|
+
cachedOffsets.set(struct, offsets);
|
|
35
|
+
return offsets;
|
|
33
36
|
}
|
|
34
|
-
|
|
35
|
-
//#endregion
|
|
36
|
-
export { offsetsForProps };
|
package/data/partialIO.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import type * as wgsl from './wgslTypes.ts';
|
|
2
|
+
import { type BaseData } from './wgslTypes.ts';
|
|
3
|
+
import type { InferPatch } from '../shared/repr.ts';
|
|
4
|
+
export interface WriteInstruction {
|
|
5
|
+
data: Uint8Array<ArrayBuffer>;
|
|
6
|
+
gpuOffset: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Converts `{idx, value}[]` sparse arrays into `Record<number, T>` format.
|
|
10
|
+
*/
|
|
11
|
+
export declare function convertPartialToPatch(schema: wgsl.BaseData, data: unknown): unknown;
|
|
12
|
+
export declare function getPatchInstructions<TData extends wgsl.BaseData>(schema: TData, data: unknown, targetBuffer?: ArrayBuffer): WriteInstruction[];
|
|
13
|
+
export declare function patchArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T, data: InferPatch<T>): void;
|