typegpu 0.11.9 → 0.12.1
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/bin.mjs +28 -6
- 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 +283 -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/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/pipeline/webgpuLimitations.d.ts +10 -0
- package/core/pipeline/webgpuLimitations.js +81 -0
- 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 +17 -9
- package/data/array.js +57 -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/generalizeFn.d.ts +25 -0
- package/data/generalizeFn.js +89 -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 +5 -0
- package/data/numberOps.js +21 -21
- 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 +25 -0
- package/data/vectorOps.js +118 -669
- 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 -292
- 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 +150 -146
- package/std/numeric.js +771 -727
- package/std/operators.d.ts +19 -27
- package/std/operators.js +195 -194
- 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 +64 -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 +1345 -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/core/pipeline/limitsOverflow.js +0 -13
- package/package.js +0 -5
- package/tgsl/shaderGenerator_members.d.ts +0 -33
- package/tgsl/shaderGenerator_members.js +0 -12
|
@@ -1,59 +1,64 @@
|
|
|
1
|
-
import { getCustomLocation, isData } from "../../data/dataTypes.js";
|
|
2
1
|
import { isBuiltin } from "../../data/attributes.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function isAttribute(value) {
|
|
6
|
-
|
|
2
|
+
import { getCustomLocation } from "../../data/dataTypes.js";
|
|
3
|
+
import { isData } from "../../data/dataTypes.js";
|
|
4
|
+
export function isAttribute(value) {
|
|
5
|
+
return typeof value?.format === 'string';
|
|
7
6
|
}
|
|
8
|
-
function connectAttributesToShader(shaderInputLayout, attributes) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
7
|
+
export function connectAttributesToShader(shaderInputLayout, attributes) {
|
|
8
|
+
const usedVertexLayouts = [];
|
|
9
|
+
if (isData(shaderInputLayout)) {
|
|
10
|
+
// Expecting a single attribute, no record.
|
|
11
|
+
if (!isAttribute(attributes)) {
|
|
12
|
+
throw new Error('Shader expected a single attribute, not a record of attributes to be passed in.');
|
|
13
|
+
}
|
|
14
|
+
usedVertexLayouts.push(attributes._layout);
|
|
15
|
+
return {
|
|
16
|
+
usedVertexLayouts,
|
|
17
|
+
bufferDefinitions: [
|
|
18
|
+
{
|
|
19
|
+
arrayStride: attributes._layout.stride,
|
|
20
|
+
stepMode: attributes._layout.stepMode,
|
|
21
|
+
attributes: [
|
|
22
|
+
{
|
|
23
|
+
format: attributes.format,
|
|
24
|
+
offset: attributes.offset,
|
|
25
|
+
shaderLocation: getCustomLocation(shaderInputLayout) ?? 0,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const bufferDefinitions = [];
|
|
33
|
+
const layoutToAttribListMap = new WeakMap();
|
|
34
|
+
let nextShaderLocation = 0;
|
|
35
|
+
for (const [key, member] of Object.entries(shaderInputLayout)) {
|
|
36
|
+
if (isBuiltin(member)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const matchingAttribute = attributes[key];
|
|
40
|
+
if (!matchingAttribute) {
|
|
41
|
+
throw new Error(`An attribute by the name of '${key}' was not provided to the shader.`);
|
|
42
|
+
}
|
|
43
|
+
const layout = matchingAttribute._layout;
|
|
44
|
+
let attribList = layoutToAttribListMap.get(layout);
|
|
45
|
+
if (!attribList) {
|
|
46
|
+
// First time seeing this layout
|
|
47
|
+
usedVertexLayouts.push(layout);
|
|
48
|
+
attribList = [];
|
|
49
|
+
bufferDefinitions.push({
|
|
50
|
+
arrayStride: layout.stride,
|
|
51
|
+
stepMode: layout.stepMode,
|
|
52
|
+
attributes: attribList,
|
|
53
|
+
});
|
|
54
|
+
layoutToAttribListMap.set(layout, attribList);
|
|
55
|
+
}
|
|
56
|
+
nextShaderLocation = getCustomLocation(member) ?? nextShaderLocation;
|
|
57
|
+
attribList.push({
|
|
58
|
+
format: matchingAttribute.format,
|
|
59
|
+
offset: matchingAttribute.offset,
|
|
60
|
+
shaderLocation: nextShaderLocation++,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return { usedVertexLayouts, bufferDefinitions };
|
|
56
64
|
}
|
|
57
|
-
|
|
58
|
-
//#endregion
|
|
59
|
-
export { connectAttributesToShader, isAttribute };
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FormatToWGSLType } from
|
|
3
|
-
import { Decorated, WgslArray, WgslStruct } from
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
//#region src/core/vertexLayout/vertexAttribute.d.ts
|
|
7
|
-
|
|
1
|
+
import type { Disarray, LooseDecorated, Unstruct } from '../../data/dataTypes.ts';
|
|
2
|
+
import type { FormatToAcceptedData, FormatToWGSLType } from '../../data/vertexFormatData.ts';
|
|
3
|
+
import type { Decorated, WgslArray, WgslStruct } from '../../data/wgslTypes.ts';
|
|
4
|
+
import type { KindToAcceptedAttribMap, KindToDefaultFormatMap, TgpuVertexAttrib, VertexFormat } from '../../shared/vertexFormat.ts';
|
|
8
5
|
/**
|
|
9
6
|
* The array can hold T, where T is a single/multi-component numeric, or a struct with members of type T.
|
|
10
7
|
* Examples of valid array members:
|
|
@@ -13,18 +10,25 @@ import { Disarray, LooseDecorated, Unstruct } from "../../data/dataTypes.js";
|
|
|
13
10
|
* - WgslStruct<{ a: Vec3f, b: unorm8x2 }>
|
|
14
11
|
* - WgslStruct<{ nested: WgslStruct<{ a: Vec3f }> }>
|
|
15
12
|
*/
|
|
16
|
-
type DataToContainedAttribs<T> = T extends WgslStruct | Unstruct ? {
|
|
17
|
-
|
|
13
|
+
export type DataToContainedAttribs<T> = T extends WgslStruct | Unstruct ? {
|
|
14
|
+
[Key in keyof T['propTypes']]: DataToContainedAttribs<T['propTypes'][Key]>;
|
|
15
|
+
} : T extends {
|
|
16
|
+
type: VertexFormat;
|
|
18
17
|
} ? TgpuVertexAttrib<T['type']> : T extends {
|
|
19
|
-
|
|
18
|
+
type: keyof KindToDefaultFormatMap;
|
|
20
19
|
} ? TgpuVertexAttrib<KindToDefaultFormatMap[T['type']]> : T extends Decorated<infer TInner> ? DataToContainedAttribs<TInner> : T extends LooseDecorated<infer TInner> ? DataToContainedAttribs<TInner> : never;
|
|
21
20
|
/**
|
|
22
21
|
* Interprets an array as a set of vertex attributes.
|
|
23
22
|
*/
|
|
24
|
-
type ArrayToContainedAttribs<T extends WgslArray | Disarray> = DataToContainedAttribs<T['elementType']>;
|
|
25
|
-
type LayoutToAllowedAttribs<T> = T extends {
|
|
26
|
-
|
|
27
|
-
} ? KindToAcceptedAttribMap[T['type']] : T extends Record<string, unknown> ? {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export
|
|
23
|
+
export type ArrayToContainedAttribs<T extends WgslArray | Disarray> = DataToContainedAttribs<T['elementType']>;
|
|
24
|
+
export type LayoutToAllowedAttribs<T> = T extends {
|
|
25
|
+
type: keyof KindToAcceptedAttribMap;
|
|
26
|
+
} ? KindToAcceptedAttribMap[T['type']] : T extends Record<string, unknown> ? {
|
|
27
|
+
[Key in keyof T]: LayoutToAllowedAttribs<T[Key]>;
|
|
28
|
+
} : never;
|
|
29
|
+
export type AttribRecordToDefaultDataTypes<T extends Record<string, TgpuVertexAttrib>> = {
|
|
30
|
+
[Key in keyof T]: FormatToWGSLType<T[Key]['format']>;
|
|
31
|
+
};
|
|
32
|
+
export type AttribRecordToAcceptedDataTypes<T extends Record<string, TgpuVertexAttrib>> = {
|
|
33
|
+
[Key in keyof T]: FormatToAcceptedData[T[Key]['format']];
|
|
34
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
readonly resourceType: 'vertex-layout';
|
|
11
|
-
readonly stride: number;
|
|
12
|
-
readonly stepMode: 'vertex' | 'instance';
|
|
13
|
-
readonly attrib: ArrayToContainedAttribs<TData>;
|
|
14
|
-
readonly vertexLayout: GPUVertexBufferLayout;
|
|
15
|
-
schemaForCount(n: number): TData;
|
|
1
|
+
import type { Disarray } from '../../data/dataTypes.ts';
|
|
2
|
+
import type { WgslArray } from '../../data/wgslTypes.ts';
|
|
3
|
+
import type { TgpuNamable } from '../../shared/meta.ts';
|
|
4
|
+
import type { TgpuSoul } from '../../shared/soul.ts';
|
|
5
|
+
import { $internal, $soul } from '../../shared/symbols.ts';
|
|
6
|
+
import type { ArrayToContainedAttribs } from './vertexAttribute.ts';
|
|
7
|
+
export interface TgpuVertexLayoutSoul extends TgpuSoul<'vertex-layout'> {
|
|
8
|
+
readonly schema: WgslArray | Disarray;
|
|
9
|
+
readonly stepMode: 'vertex' | 'instance';
|
|
16
10
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
export interface TgpuVertexLayout<TData extends WgslArray | Disarray = WgslArray | Disarray> extends TgpuNamable {
|
|
12
|
+
readonly [$internal]: true;
|
|
13
|
+
readonly [$soul]: TgpuVertexLayoutSoul;
|
|
14
|
+
readonly resourceType: 'vertex-layout';
|
|
15
|
+
readonly stride: number;
|
|
16
|
+
readonly stepMode: 'vertex' | 'instance';
|
|
17
|
+
readonly attrib: ArrayToContainedAttribs<TData>;
|
|
18
|
+
readonly vertexLayout: GPUVertexBufferLayout;
|
|
19
|
+
schemaForCount(n: number): TData;
|
|
20
|
+
}
|
|
21
|
+
export interface INTERNAL_TgpuVertexAttrib {
|
|
22
|
+
readonly _layout: TgpuVertexLayout;
|
|
23
|
+
}
|
|
24
|
+
export declare function vertexLayout<TData extends WgslArray | Disarray>(schemaForCount: (count: number) => TData, stepMode?: 'vertex' | 'instance'): TgpuVertexLayout<TData>;
|
|
25
|
+
export declare function isVertexLayout(value: unknown): value is TgpuVertexLayout;
|
|
@@ -1,105 +1,136 @@
|
|
|
1
|
-
import { $internal } from "../../shared/symbols.js";
|
|
2
|
-
import { isDecorated, isWgslStruct } from "../../data/wgslTypes.js";
|
|
3
|
-
import { setName } from "../../shared/meta.js";
|
|
4
|
-
import { kindToDefaultFormatMap, vertexFormats } from "../../shared/vertexFormat.js";
|
|
5
|
-
import { getCustomLocation, isLooseDecorated, isUnstruct } from "../../data/dataTypes.js";
|
|
6
1
|
import { alignmentOf, customAlignmentOf } from "../../data/alignmentOf.js";
|
|
7
|
-
import {
|
|
2
|
+
import { getCustomLocation, isLooseDecorated, isUnstruct } from "../../data/dataTypes.js";
|
|
8
3
|
import { sizeOf } from "../../data/sizeOf.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
import { isDecorated, isWgslStruct } from "../../data/wgslTypes.js";
|
|
5
|
+
import { roundUp } from "../../mathUtils.js";
|
|
6
|
+
import { setName } from "../../shared/meta.js";
|
|
7
|
+
import { $internal, $soul } from "../../shared/symbols.js";
|
|
8
|
+
import { kindToDefaultFormatMap, vertexFormats, } from "../../shared/vertexFormat.js";
|
|
9
|
+
export function vertexLayout(schemaForCount, stepMode = 'vertex') {
|
|
10
|
+
return new TgpuVertexLayoutImpl(schemaForCount, stepMode);
|
|
13
11
|
}
|
|
14
|
-
function isVertexLayout(value) {
|
|
15
|
-
|
|
12
|
+
export function isVertexLayout(value) {
|
|
13
|
+
return value?.resourceType === 'vertex-layout';
|
|
16
14
|
}
|
|
17
|
-
|
|
15
|
+
// --------------
|
|
16
|
+
// Implementation
|
|
17
|
+
// --------------
|
|
18
|
+
const defaultAttribEntry = Symbol('defaultAttribEntry');
|
|
18
19
|
function dataToContainedAttribs(layout, data, offset, customLocationMap, key) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
20
|
+
if (isDecorated(data) || isLooseDecorated(data)) {
|
|
21
|
+
const customLocation = getCustomLocation(data);
|
|
22
|
+
if (customLocation !== undefined) {
|
|
23
|
+
customLocationMap[key ?? defaultAttribEntry] = customLocation;
|
|
24
|
+
}
|
|
25
|
+
return dataToContainedAttribs(layout, data.inner, roundUp(offset, customAlignmentOf(data)), customLocationMap);
|
|
26
|
+
}
|
|
27
|
+
if (isWgslStruct(data)) {
|
|
28
|
+
let memberOffset = offset;
|
|
29
|
+
const propTypes = data.propTypes;
|
|
30
|
+
return Object.fromEntries(Object.entries(propTypes).map(([key, value]) => {
|
|
31
|
+
memberOffset = roundUp(memberOffset, alignmentOf(value));
|
|
32
|
+
const attrib = [
|
|
33
|
+
key,
|
|
34
|
+
dataToContainedAttribs(layout, value, memberOffset, customLocationMap, key),
|
|
35
|
+
];
|
|
36
|
+
memberOffset += sizeOf(value);
|
|
37
|
+
return attrib;
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
if (isUnstruct(data)) {
|
|
41
|
+
let memberOffset = offset;
|
|
42
|
+
const propTypes = data.propTypes;
|
|
43
|
+
return Object.fromEntries(Object.entries(propTypes).map(([key, value]) => {
|
|
44
|
+
memberOffset = roundUp(memberOffset, customAlignmentOf(value));
|
|
45
|
+
const attrib = [
|
|
46
|
+
key,
|
|
47
|
+
dataToContainedAttribs(layout, value, memberOffset, customLocationMap, key),
|
|
48
|
+
];
|
|
49
|
+
memberOffset += sizeOf(value);
|
|
50
|
+
return attrib;
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
if ('type' in data && typeof data.type === 'string') {
|
|
54
|
+
if (vertexFormats.includes(data.type)) {
|
|
55
|
+
return {
|
|
56
|
+
_layout: layout, // hidden property, used to determine which buffers to apply when executing the pipeline
|
|
57
|
+
format: data.type,
|
|
58
|
+
offset,
|
|
59
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- too many type shenanigans
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const format = kindToDefaultFormatMap[data.type];
|
|
63
|
+
if (format) {
|
|
64
|
+
return {
|
|
65
|
+
_layout: layout, // hidden property, used to determine which buffers to apply when executing the pipeline
|
|
66
|
+
format,
|
|
67
|
+
offset,
|
|
68
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- too many type shenanigans
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`Unsupported data used in vertex layout: ${String(data)}`);
|
|
73
|
+
}
|
|
74
|
+
class TgpuVertexLayoutImpl {
|
|
75
|
+
[$internal] = true;
|
|
76
|
+
[$soul];
|
|
77
|
+
resourceType = 'vertex-layout';
|
|
78
|
+
stride;
|
|
79
|
+
attrib;
|
|
80
|
+
schemaForCount;
|
|
81
|
+
#customLocationMap = {};
|
|
82
|
+
constructor(schemaForCount, stepMode) {
|
|
83
|
+
this.schemaForCount = schemaForCount;
|
|
84
|
+
// `0` signals that the data-type is runtime-sized, and should not be used to create buffers.
|
|
85
|
+
const arraySchema = schemaForCount(0);
|
|
86
|
+
this[$soul] = {
|
|
87
|
+
type: 'vertex-layout',
|
|
88
|
+
schema: arraySchema,
|
|
89
|
+
stepMode,
|
|
90
|
+
label: undefined,
|
|
91
|
+
};
|
|
92
|
+
this.stride = roundUp(sizeOf(arraySchema.elementType), alignmentOf(arraySchema));
|
|
93
|
+
this.attrib = dataToContainedAttribs(this, arraySchema.elementType, 0, this.#customLocationMap);
|
|
94
|
+
}
|
|
95
|
+
get stepMode() {
|
|
96
|
+
return this[$soul].stepMode;
|
|
97
|
+
}
|
|
98
|
+
get vertexLayout() {
|
|
99
|
+
// If defaultAttribEntry is in the custom location map,
|
|
100
|
+
// it means that the vertex layout is based on a single attribute
|
|
101
|
+
if (this.#customLocationMap[defaultAttribEntry] !== undefined) {
|
|
102
|
+
if (typeof this.attrib.format !== 'string' || typeof this.attrib.offset !== 'number') {
|
|
103
|
+
throw new Error('Single attribute vertex layouts must have a format and offset.');
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
arrayStride: this.stride,
|
|
107
|
+
stepMode: this.stepMode,
|
|
108
|
+
attributes: [
|
|
109
|
+
{
|
|
110
|
+
format: this.attrib.format,
|
|
111
|
+
offset: this.attrib.offset,
|
|
112
|
+
shaderLocation: this.#customLocationMap[defaultAttribEntry],
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// check if all attributes have custom locations
|
|
118
|
+
const allAttributesHaveCustomLocations = Object.keys(this.attrib).every((key) => this.#customLocationMap[key] !== undefined);
|
|
119
|
+
if (!allAttributesHaveCustomLocations) {
|
|
120
|
+
throw new Error('All attributes must have custom locations in order to unwrap a vertex layout.');
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
arrayStride: this.stride,
|
|
124
|
+
stepMode: this.stepMode,
|
|
125
|
+
attributes: Object.entries(this.attrib).map(([key, attrib]) => ({
|
|
126
|
+
format: attrib.format,
|
|
127
|
+
offset: attrib.offset,
|
|
128
|
+
shaderLocation: this.#customLocationMap[key],
|
|
129
|
+
})),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
$name(label) {
|
|
133
|
+
setName(this, label);
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
58
136
|
}
|
|
59
|
-
var TgpuVertexLayoutImpl = class {
|
|
60
|
-
[$internal] = true;
|
|
61
|
-
resourceType = "vertex-layout";
|
|
62
|
-
stride;
|
|
63
|
-
attrib;
|
|
64
|
-
schemaForCount;
|
|
65
|
-
stepMode;
|
|
66
|
-
#customLocationMap = {};
|
|
67
|
-
constructor(schemaForCount, stepMode) {
|
|
68
|
-
this.schemaForCount = schemaForCount;
|
|
69
|
-
this.stepMode = stepMode;
|
|
70
|
-
const arraySchema = schemaForCount(0);
|
|
71
|
-
this.stride = roundUp(sizeOf(arraySchema.elementType), alignmentOf(arraySchema));
|
|
72
|
-
this.attrib = dataToContainedAttribs(this, arraySchema.elementType, 0, this.#customLocationMap);
|
|
73
|
-
}
|
|
74
|
-
get vertexLayout() {
|
|
75
|
-
if (this.#customLocationMap[defaultAttribEntry] !== void 0) {
|
|
76
|
-
if (typeof this.attrib.format !== "string" || typeof this.attrib.offset !== "number") throw new Error("Single attribute vertex layouts must have a format and offset.");
|
|
77
|
-
return {
|
|
78
|
-
arrayStride: this.stride,
|
|
79
|
-
stepMode: this.stepMode,
|
|
80
|
-
attributes: [{
|
|
81
|
-
format: this.attrib.format,
|
|
82
|
-
offset: this.attrib.offset,
|
|
83
|
-
shaderLocation: this.#customLocationMap[defaultAttribEntry]
|
|
84
|
-
}]
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
if (!Object.keys(this.attrib).every((key) => this.#customLocationMap[key] !== void 0)) throw new Error("All attributes must have custom locations in order to unwrap a vertex layout.");
|
|
88
|
-
return {
|
|
89
|
-
arrayStride: this.stride,
|
|
90
|
-
stepMode: this.stepMode,
|
|
91
|
-
attributes: Object.entries(this.attrib).map(([key, attrib]) => ({
|
|
92
|
-
format: attrib.format,
|
|
93
|
-
offset: attrib.offset,
|
|
94
|
-
shaderLocation: this.#customLocationMap[key]
|
|
95
|
-
}))
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
$name(label) {
|
|
99
|
-
setName(this, label);
|
|
100
|
-
return this;
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
//#endregion
|
|
105
|
-
export { isVertexLayout, vertexLayout };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const lineBreaks = new Set([
|
|
2
|
+
'\u000A', // line feed
|
|
3
|
+
'\u000B', // vertical tab
|
|
4
|
+
'\u000C', // form feed
|
|
5
|
+
'\u000D', // carriage return
|
|
6
|
+
'\u0085', // next line
|
|
7
|
+
'\u2028', // line separator
|
|
8
|
+
'\u2029', // paragraph separator
|
|
9
|
+
]);
|
|
10
|
+
export const blankSpaces = new Set([
|
|
11
|
+
...lineBreaks,
|
|
12
|
+
'\u0020', // space
|
|
13
|
+
'\u0009', // horizontal tab
|
|
14
|
+
'\u200E', // left-to-right mark
|
|
15
|
+
'\u200F', // right-to-left mark
|
|
16
|
+
]);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IMeasurer, ISerialInput, ISerialOutput } from 'typed-binary';
|
|
2
|
+
/**
|
|
3
|
+
* @param io the IO to align
|
|
4
|
+
* @param baseAlignment must be power of 2
|
|
5
|
+
*/
|
|
6
|
+
declare function alignIO(io: ISerialInput | ISerialOutput | IMeasurer, baseAlignment: number): void;
|
|
7
|
+
export default alignIO;
|
package/data/alignIO.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
//#region src/data/alignIO.ts
|
|
2
1
|
/**
|
|
3
|
-
* @param io the IO to align
|
|
4
|
-
* @param baseAlignment must be power of 2
|
|
5
|
-
*/
|
|
2
|
+
* @param io the IO to align
|
|
3
|
+
* @param baseAlignment must be power of 2
|
|
4
|
+
*/
|
|
6
5
|
function alignIO(io, baseAlignment) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
const currentPos = 'size' in io ? io.size : io.currentByteOffset;
|
|
7
|
+
const bitMask = baseAlignment - 1;
|
|
8
|
+
const offset = currentPos & bitMask;
|
|
9
|
+
if ('skipBytes' in io) {
|
|
10
|
+
io.skipBytes((baseAlignment - offset) & bitMask);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
io.add((baseAlignment - offset) & bitMask);
|
|
14
|
+
}
|
|
12
15
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
//#endregion
|
|
16
|
-
export { alignIO_default as default };
|
|
16
|
+
export default alignIO;
|
package/data/alignmentOf.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { type AnyData } from './dataTypes.ts';
|
|
2
|
+
import { type BaseData } from './wgslTypes.ts';
|
|
3
|
+
export declare function alignmentOf(data: BaseData): number;
|
|
4
|
+
export declare function customAlignmentOf(data: BaseData): number;
|
|
6
5
|
/**
|
|
7
6
|
* Returns the alignment (in bytes) of data represented by the `schema`.
|
|
8
7
|
*/
|
|
9
|
-
declare function PUBLIC_alignmentOf(schema: AnyData): number;
|
|
10
|
-
//#endregion
|
|
11
|
-
export { PUBLIC_alignmentOf };
|
|
8
|
+
export declare function PUBLIC_alignmentOf(schema: AnyData): number;
|