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/attributes.js
CHANGED
|
@@ -1,147 +1,207 @@
|
|
|
1
1
|
import { $internal } from "../shared/symbols.js";
|
|
2
|
-
import {
|
|
3
|
-
import { isLooseData, isLooseDecorated } from "./dataTypes.js";
|
|
2
|
+
import { $gpuRepr, $inRepr, $invalidSchemaReason, $memIdent, $repr, $reprPartial, $reprPatch, $validStorageSchema, $validUniformSchema, $validVertexSchema, } from "../shared/symbols.js";
|
|
4
3
|
import { alignmentOf } from "./alignmentOf.js";
|
|
4
|
+
import { isLooseData, isLooseDecorated, } from "./dataTypes.js";
|
|
5
5
|
import { sizeOf } from "./sizeOf.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
import { isAlignAttrib, isBuiltinAttrib, isDecorated, isSizeAttrib, isWgslData, } from "./wgslTypes.js";
|
|
7
|
+
// ----------
|
|
8
|
+
// Public API
|
|
9
|
+
// ----------
|
|
10
|
+
export const builtinNames = [
|
|
11
|
+
'vertex_index',
|
|
12
|
+
'instance_index',
|
|
13
|
+
'clip_distances',
|
|
14
|
+
'position',
|
|
15
|
+
'front_facing',
|
|
16
|
+
'frag_depth',
|
|
17
|
+
'primitive_index',
|
|
18
|
+
'sample_index',
|
|
19
|
+
'sample_mask',
|
|
20
|
+
'fragment',
|
|
21
|
+
'local_invocation_id',
|
|
22
|
+
'local_invocation_index',
|
|
23
|
+
'global_invocation_id',
|
|
24
|
+
'global_invocation_index',
|
|
25
|
+
'workgroup_id',
|
|
26
|
+
'workgroup_index',
|
|
27
|
+
'num_workgroups',
|
|
28
|
+
'subgroup_invocation_id',
|
|
29
|
+
'subgroup_size',
|
|
30
|
+
'subgroup_id',
|
|
31
|
+
'num_subgroups',
|
|
32
|
+
];
|
|
33
|
+
export function attribute(data, attrib) {
|
|
34
|
+
if (isDecorated(data)) {
|
|
35
|
+
return new DecoratedImpl(data.inner, [attrib, ...data.attribs]);
|
|
36
|
+
}
|
|
37
|
+
if (isLooseDecorated(data)) {
|
|
38
|
+
return new LooseDecoratedImpl(data.inner, [attrib, ...data.attribs]);
|
|
39
|
+
}
|
|
40
|
+
if (isLooseData(data)) {
|
|
41
|
+
return new LooseDecoratedImpl(data, [attrib]);
|
|
42
|
+
}
|
|
43
|
+
return new DecoratedImpl(data, [attrib]);
|
|
13
44
|
}
|
|
14
45
|
/**
|
|
15
|
-
* Gives the wrapped data-type a custom byte alignment. Useful in order to
|
|
16
|
-
* fulfill uniform alignment requirements.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* const Data = d.struct({
|
|
20
|
-
* a: u32, // takes up 4 bytes
|
|
21
|
-
* // 12 bytes of padding, because `b` is custom aligned to multiples of 16 bytes
|
|
22
|
-
* b: d.align(16, u32),
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* @param alignment The multiple of bytes this data should align itself to.
|
|
26
|
-
* @param data The data-type to align.
|
|
27
|
-
*/
|
|
28
|
-
function align(alignment, data) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
46
|
+
* Gives the wrapped data-type a custom byte alignment. Useful in order to
|
|
47
|
+
* fulfill uniform alignment requirements.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* const Data = d.struct({
|
|
51
|
+
* a: u32, // takes up 4 bytes
|
|
52
|
+
* // 12 bytes of padding, because `b` is custom aligned to multiples of 16 bytes
|
|
53
|
+
* b: d.align(16, u32),
|
|
54
|
+
* });
|
|
55
|
+
*
|
|
56
|
+
* @param alignment The multiple of bytes this data should align itself to.
|
|
57
|
+
* @param data The data-type to align.
|
|
58
|
+
*/
|
|
59
|
+
export function align(alignment, data) {
|
|
60
|
+
return attribute(data, {
|
|
61
|
+
[$internal]: true,
|
|
62
|
+
type: '@align',
|
|
63
|
+
params: [alignment],
|
|
64
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
|
|
65
|
+
});
|
|
34
66
|
}
|
|
35
67
|
/**
|
|
36
|
-
* Adds padding bytes after the wrapped data-type, until the whole value takes up `size` bytes.
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* const Data = d.struct({
|
|
40
|
-
* a: d.size(16, u32), // takes up 16 bytes, instead of 4
|
|
41
|
-
* b: u32, // starts at byte 16, because `a` has a custom size
|
|
42
|
-
* });
|
|
43
|
-
*
|
|
44
|
-
* @param size The amount of bytes that should be reserved for this data-type.
|
|
45
|
-
* @param data The data-type to wrap.
|
|
46
|
-
*/
|
|
47
|
-
function size(size
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
68
|
+
* Adds padding bytes after the wrapped data-type, until the whole value takes up `size` bytes.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* const Data = d.struct({
|
|
72
|
+
* a: d.size(16, u32), // takes up 16 bytes, instead of 4
|
|
73
|
+
* b: u32, // starts at byte 16, because `a` has a custom size
|
|
74
|
+
* });
|
|
75
|
+
*
|
|
76
|
+
* @param size The amount of bytes that should be reserved for this data-type.
|
|
77
|
+
* @param data The data-type to wrap.
|
|
78
|
+
*/
|
|
79
|
+
export function size(size, data) {
|
|
80
|
+
return attribute(data, {
|
|
81
|
+
[$internal]: true,
|
|
82
|
+
type: '@size',
|
|
83
|
+
params: [size],
|
|
84
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
|
|
85
|
+
});
|
|
53
86
|
}
|
|
54
87
|
/**
|
|
55
|
-
* Assigns an explicit numeric location to a struct member or a parameter that has this type.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* const VertexOutput = {
|
|
59
|
-
* a: d.u32, // has implicit location 0
|
|
60
|
-
* b: d.location(5, d.u32),
|
|
61
|
-
* c: d.u32, // has implicit location 6
|
|
62
|
-
* };
|
|
63
|
-
*
|
|
64
|
-
* @param location The explicit numeric location.
|
|
65
|
-
* @param data The data-type to wrap.
|
|
66
|
-
*/
|
|
67
|
-
function location(location
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
88
|
+
* Assigns an explicit numeric location to a struct member or a parameter that has this type.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* const VertexOutput = {
|
|
92
|
+
* a: d.u32, // has implicit location 0
|
|
93
|
+
* b: d.location(5, d.u32),
|
|
94
|
+
* c: d.u32, // has implicit location 6
|
|
95
|
+
* };
|
|
96
|
+
*
|
|
97
|
+
* @param location The explicit numeric location.
|
|
98
|
+
* @param data The data-type to wrap.
|
|
99
|
+
*/
|
|
100
|
+
export function location(location, data) {
|
|
101
|
+
return attribute(data, {
|
|
102
|
+
[$internal]: true,
|
|
103
|
+
type: '@location',
|
|
104
|
+
params: [location],
|
|
105
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
|
|
106
|
+
});
|
|
73
107
|
}
|
|
74
|
-
function interpolate(interpolationType, data) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
108
|
+
export function interpolate(interpolationType, data) {
|
|
109
|
+
return attribute(data, {
|
|
110
|
+
[$internal]: true,
|
|
111
|
+
type: '@interpolate',
|
|
112
|
+
params: [interpolationType],
|
|
113
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
|
|
114
|
+
});
|
|
80
115
|
}
|
|
81
116
|
/**
|
|
82
|
-
* Marks a position built-in output value as invariant in vertex shaders.
|
|
83
|
-
* If the data and control flow match for two position outputs in different
|
|
84
|
-
* entry points, then the result values are guaranteed to be the same.
|
|
85
|
-
*
|
|
86
|
-
* Must only be applied to the position built-in value.
|
|
87
|
-
*
|
|
88
|
-
* @example
|
|
89
|
-
* const VertexOutput = {
|
|
90
|
-
* pos: d.invariant(d.builtin.position),
|
|
91
|
-
* };
|
|
92
|
-
*
|
|
93
|
-
* @param data The position built-in data-type to mark as invariant.
|
|
94
|
-
*/
|
|
95
|
-
function invariant(data) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
117
|
+
* Marks a position built-in output value as invariant in vertex shaders.
|
|
118
|
+
* If the data and control flow match for two position outputs in different
|
|
119
|
+
* entry points, then the result values are guaranteed to be the same.
|
|
120
|
+
*
|
|
121
|
+
* Must only be applied to the position built-in value.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* const VertexOutput = {
|
|
125
|
+
* pos: d.invariant(d.builtin.position),
|
|
126
|
+
* };
|
|
127
|
+
*
|
|
128
|
+
* @param data The position built-in data-type to mark as invariant.
|
|
129
|
+
*/
|
|
130
|
+
export function invariant(data) {
|
|
131
|
+
// Validate that invariant is only applied to position built-in
|
|
132
|
+
if (!isBuiltin(data)) {
|
|
133
|
+
throw new Error('The @invariant attribute must only be applied to the position built-in value.');
|
|
134
|
+
}
|
|
135
|
+
// Find the builtin attribute to check if it's position
|
|
136
|
+
const builtinAttrib = isDecorated(data) || isLooseDecorated(data) ? data.attribs.find(isBuiltinAttrib) : undefined;
|
|
137
|
+
if (!builtinAttrib || builtinAttrib.params[0] !== 'position') {
|
|
138
|
+
throw new Error('The @invariant attribute must only be applied to the position built-in value.');
|
|
139
|
+
}
|
|
140
|
+
return attribute(data, {
|
|
141
|
+
[$internal]: true,
|
|
142
|
+
type: '@invariant',
|
|
143
|
+
params: [],
|
|
144
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
|
|
145
|
+
});
|
|
104
146
|
}
|
|
105
|
-
function isBuiltin(value) {
|
|
106
|
-
|
|
147
|
+
export function isBuiltin(value) {
|
|
148
|
+
return ((isDecorated(value) || isLooseDecorated(value)) &&
|
|
149
|
+
value.attribs.find(isBuiltinAttrib) !== undefined);
|
|
107
150
|
}
|
|
108
|
-
function getAttributesString(field) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
151
|
+
export function getAttributesString(field) {
|
|
152
|
+
if (!isDecorated(field) && !isLooseDecorated(field)) {
|
|
153
|
+
return '';
|
|
154
|
+
}
|
|
155
|
+
return field.attribs
|
|
156
|
+
.map((attrib) => {
|
|
157
|
+
if (attrib.params.length === 0) {
|
|
158
|
+
return `${attrib.type} `;
|
|
159
|
+
}
|
|
160
|
+
return `${attrib.type}(${attrib.params.join(', ')}) `;
|
|
161
|
+
})
|
|
162
|
+
.join('');
|
|
163
|
+
}
|
|
164
|
+
// --------------
|
|
165
|
+
// Implementation
|
|
166
|
+
// --------------
|
|
167
|
+
class BaseDecoratedImpl {
|
|
168
|
+
[$internal] = {};
|
|
169
|
+
inner;
|
|
170
|
+
attribs;
|
|
171
|
+
// ---
|
|
172
|
+
constructor(inner, attribs) {
|
|
173
|
+
this.inner = inner;
|
|
174
|
+
this.attribs = attribs;
|
|
175
|
+
const alignAttrib = attribs.find(isAlignAttrib)?.params[0];
|
|
176
|
+
const sizeAttrib = attribs.find(isSizeAttrib)?.params[0];
|
|
177
|
+
if (alignAttrib !== undefined) {
|
|
178
|
+
if (alignAttrib <= 0) {
|
|
179
|
+
throw new Error(`Custom data alignment must be a positive number, got: ${alignAttrib}.`);
|
|
180
|
+
}
|
|
181
|
+
if (Math.log2(alignAttrib) % 1 !== 0) {
|
|
182
|
+
throw new Error(`Alignment has to be a power of 2, got: ${alignAttrib}.`);
|
|
183
|
+
}
|
|
184
|
+
if (isWgslData(this.inner)) {
|
|
185
|
+
if (alignAttrib % alignmentOf(this.inner) !== 0) {
|
|
186
|
+
throw new Error(`Custom alignment has to be a multiple of the standard data alignment. Got: ${alignAttrib}, expected multiple of: ${alignmentOf(this.inner)}.`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (sizeAttrib !== undefined) {
|
|
191
|
+
if (sizeAttrib < sizeOf(this.inner)) {
|
|
192
|
+
throw new Error(`Custom data size cannot be smaller then the standard data size. Got: ${sizeAttrib}, expected at least: ${sizeOf(this.inner)}.`);
|
|
193
|
+
}
|
|
194
|
+
if (sizeAttrib <= 0) {
|
|
195
|
+
throw new Error(`Custom data size must be a positive number. Got: ${sizeAttrib}.`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
class DecoratedImpl extends BaseDecoratedImpl {
|
|
201
|
+
[$internal] = {};
|
|
202
|
+
type = 'decorated';
|
|
203
|
+
}
|
|
204
|
+
class LooseDecoratedImpl extends BaseDecoratedImpl {
|
|
205
|
+
[$internal] = {};
|
|
206
|
+
type = 'loose-decorated';
|
|
114
207
|
}
|
|
115
|
-
var BaseDecoratedImpl = class {
|
|
116
|
-
[$internal] = {};
|
|
117
|
-
inner;
|
|
118
|
-
attribs;
|
|
119
|
-
constructor(inner, attribs) {
|
|
120
|
-
this.inner = inner;
|
|
121
|
-
this.attribs = attribs;
|
|
122
|
-
const alignAttrib = attribs.find(isAlignAttrib)?.params[0];
|
|
123
|
-
const sizeAttrib = attribs.find(isSizeAttrib)?.params[0];
|
|
124
|
-
if (alignAttrib !== void 0) {
|
|
125
|
-
if (alignAttrib <= 0) throw new Error(`Custom data alignment must be a positive number, got: ${alignAttrib}.`);
|
|
126
|
-
if (Math.log2(alignAttrib) % 1 !== 0) throw new Error(`Alignment has to be a power of 2, got: ${alignAttrib}.`);
|
|
127
|
-
if (isWgslData(this.inner)) {
|
|
128
|
-
if (alignAttrib % alignmentOf(this.inner) !== 0) throw new Error(`Custom alignment has to be a multiple of the standard data alignment. Got: ${alignAttrib}, expected multiple of: ${alignmentOf(this.inner)}.`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (sizeAttrib !== void 0) {
|
|
132
|
-
if (sizeAttrib < sizeOf(this.inner)) throw new Error(`Custom data size cannot be smaller then the standard data size. Got: ${sizeAttrib}, expected at least: ${sizeOf(this.inner)}.`);
|
|
133
|
-
if (sizeAttrib <= 0) throw new Error(`Custom data size must be a positive number. Got: ${sizeAttrib}.`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
var DecoratedImpl = class extends BaseDecoratedImpl {
|
|
138
|
-
[$internal] = {};
|
|
139
|
-
type = "decorated";
|
|
140
|
-
};
|
|
141
|
-
var LooseDecoratedImpl = class extends BaseDecoratedImpl {
|
|
142
|
-
[$internal] = {};
|
|
143
|
-
type = "loose-decorated";
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
//#endregion
|
|
147
|
-
export { align, attribute, getAttributesString, interpolate, invariant, isBuiltin, location, size };
|
package/data/autoStruct.d.ts
CHANGED
|
@@ -1,3 +1,36 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { $internal, $repr, $resolve } from '../shared/symbols.ts';
|
|
2
|
+
import type { ResolutionCtx, SelfResolvable } from '../types.ts';
|
|
3
|
+
import type { ResolvedSnippet } from './snippet.ts';
|
|
4
|
+
import type { BaseData, WgslStruct } from './wgslTypes.ts';
|
|
5
|
+
/**
|
|
6
|
+
* A requirement for the generated struct is that non-builtin properties need to
|
|
7
|
+
* have the same name in WGSL as they do in JS. This allows locations to be properly
|
|
8
|
+
* matched between the Vertex output and Fragment input.
|
|
9
|
+
*/
|
|
10
|
+
export declare class AutoStruct implements BaseData, SelfResolvable {
|
|
11
|
+
#private;
|
|
12
|
+
[$internal]: Record<string, never>;
|
|
13
|
+
type: 'auto-struct';
|
|
14
|
+
readonly [$repr]: Record<string, unknown>;
|
|
15
|
+
constructor(validProps: Record<string, BaseData>, typeForExtraProps: BaseData | undefined, locations?: Record<string, number>);
|
|
16
|
+
/**
|
|
17
|
+
* Used for accessing builtins, varying and attributes in code.
|
|
18
|
+
*/
|
|
19
|
+
accessProp(key: string): {
|
|
20
|
+
prop: string;
|
|
21
|
+
type: BaseData;
|
|
22
|
+
} | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Used for providing new varyings.
|
|
25
|
+
*
|
|
26
|
+
* @privateRemarks
|
|
27
|
+
* Internally used by `accessProp`.
|
|
28
|
+
*/
|
|
29
|
+
provideProp(key: string, dataType: BaseData): {
|
|
30
|
+
prop: string;
|
|
31
|
+
type: BaseData;
|
|
32
|
+
};
|
|
33
|
+
get completeStruct(): WgslStruct<Record<string, BaseData>>;
|
|
34
|
+
[$resolve](ctx: ResolutionCtx): ResolvedSnippet;
|
|
35
|
+
toString(): string;
|
|
36
|
+
}
|
package/data/autoStruct.js
CHANGED
|
@@ -1,84 +1,87 @@
|
|
|
1
|
-
import { $internal, $resolve } from "../shared/symbols.js";
|
|
2
|
-
import { getName, setName } from "../shared/meta.js";
|
|
3
|
-
import { validateProp } from "../nameUtils.js";
|
|
4
1
|
import { createIoSchema } from "../core/function/ioSchema.js";
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { validateProp } from "../nameUtils.js";
|
|
3
|
+
import { getName, setName } from "../shared/meta.js";
|
|
4
|
+
import { $internal, $repr, $resolve } from "../shared/symbols.js";
|
|
7
5
|
/**
|
|
8
|
-
* A requirement for the generated struct is that non-builtin properties need to
|
|
9
|
-
* have the same name in WGSL as they do in JS. This allows locations to be properly
|
|
10
|
-
* matched between the Vertex output and Fragment input.
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
6
|
+
* A requirement for the generated struct is that non-builtin properties need to
|
|
7
|
+
* have the same name in WGSL as they do in JS. This allows locations to be properly
|
|
8
|
+
* matched between the Vertex output and Fragment input.
|
|
9
|
+
*/
|
|
10
|
+
export class AutoStruct {
|
|
11
|
+
// ---
|
|
12
|
+
/**
|
|
13
|
+
* js key -> data type
|
|
14
|
+
*/
|
|
15
|
+
#validProps;
|
|
16
|
+
/**
|
|
17
|
+
* js key -> { prop: 'wgsl key', type: ... }
|
|
18
|
+
* @example '$position' -> { prop: 'position', type: ... }
|
|
19
|
+
*/
|
|
20
|
+
#allocated;
|
|
21
|
+
#usedWgslKeys;
|
|
22
|
+
#locations;
|
|
23
|
+
#cachedStruct;
|
|
24
|
+
#typeForExtraProps;
|
|
25
|
+
constructor(validProps, typeForExtraProps, locations) {
|
|
26
|
+
this.#validProps = validProps;
|
|
27
|
+
this.#typeForExtraProps = typeForExtraProps;
|
|
28
|
+
this.#allocated = {};
|
|
29
|
+
this.#locations = locations;
|
|
30
|
+
this.#usedWgslKeys = new Set();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Used for accessing builtins, varying and attributes in code.
|
|
34
|
+
*/
|
|
35
|
+
accessProp(key) {
|
|
36
|
+
// If the prop is not found in validProps, we consider it an extra property
|
|
37
|
+
const dataType = this.#validProps[key] ?? this.#typeForExtraProps;
|
|
38
|
+
if (!dataType) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return this.provideProp(key, dataType);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Used for providing new varyings.
|
|
45
|
+
*
|
|
46
|
+
* @privateRemarks
|
|
47
|
+
* Internally used by `accessProp`.
|
|
48
|
+
*/
|
|
49
|
+
provideProp(key, dataType) {
|
|
50
|
+
let alloc = this.#allocated[key];
|
|
51
|
+
if (!alloc) {
|
|
52
|
+
const wgslKey = key.replaceAll('$', '');
|
|
53
|
+
if (this.#usedWgslKeys.has(wgslKey)) {
|
|
54
|
+
throw new Error(`Property name '${wgslKey}' causes naming clashes. Choose a different name.`);
|
|
55
|
+
}
|
|
56
|
+
const result = validateProp(wgslKey);
|
|
57
|
+
if (!result.success) {
|
|
58
|
+
throw new Error(`Invalid property key '${key}'${result.error ? `: ${result.error}` : ''}`);
|
|
59
|
+
}
|
|
60
|
+
this.#usedWgslKeys.add(wgslKey);
|
|
61
|
+
alloc = { prop: wgslKey, type: dataType };
|
|
62
|
+
this.#allocated[key] = alloc;
|
|
63
|
+
}
|
|
64
|
+
return alloc;
|
|
65
|
+
}
|
|
66
|
+
get completeStruct() {
|
|
67
|
+
if (!this.#cachedStruct) {
|
|
68
|
+
this.#cachedStruct = createIoSchema(Object.fromEntries(Object.values(this.#allocated).map((alloc) => {
|
|
69
|
+
return [alloc.prop, alloc.type];
|
|
70
|
+
})), this.#locations);
|
|
71
|
+
const ownName = getName(this);
|
|
72
|
+
// Passing the given name forward
|
|
73
|
+
if (ownName) {
|
|
74
|
+
setName(this.#cachedStruct, ownName);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return this.#cachedStruct;
|
|
78
|
+
}
|
|
79
|
+
[$resolve](ctx) {
|
|
80
|
+
return ctx.resolve(this.completeStruct);
|
|
81
|
+
}
|
|
82
|
+
toString() {
|
|
83
|
+
return `auto-struct:${getName(this) ?? '<unnamed>'}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
80
86
|
AutoStruct.prototype[$internal] = {};
|
|
81
|
-
AutoStruct.prototype.type =
|
|
82
|
-
|
|
83
|
-
//#endregion
|
|
84
|
-
export { AutoStruct };
|
|
87
|
+
AutoStruct.prototype.type = 'auto-struct';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as wgsl from './wgslTypes.ts';
|
|
2
|
+
export declare const EVAL_ALLOWED_IN_ENV: boolean;
|
|
3
|
+
export type CompiledWriter = (output: DataView, offset: number, value: unknown, littleEndian?: boolean, endOffset?: number) => void;
|
|
4
|
+
export declare function buildWriter(node: wgsl.BaseData, offsetExpr: string, valueExpr: string, depth?: number, partial?: boolean): string;
|
|
5
|
+
export declare function getCompiledWriter(schema: wgsl.BaseData): CompiledWriter | undefined;
|