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
|
@@ -1,96 +1,93 @@
|
|
|
1
|
-
import { $gpuValueOf, $internal, $ownSnippet, $resolve } from "../../shared/symbols.js";
|
|
2
1
|
import { snip } from "../../data/snippet.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
//#region src/core/rawCodeSnippet/tgpuRawCodeSnippet.ts
|
|
2
|
+
import { makeDereferenceable } from "../../tgsl/makeDereferenceable.js";
|
|
3
|
+
import { makeResolvable } from "../../tgsl/makeResolvable.js";
|
|
4
|
+
import { $gpuValueOf, $internal } from "../../shared/symbols.js";
|
|
5
|
+
import { replaceExternalsInWgsl } from "../resolve/externals.js";
|
|
8
6
|
/**
|
|
9
|
-
* An advanced API that creates a typed shader expression which
|
|
10
|
-
* can be injected into the final shader bundle upon use.
|
|
11
|
-
*
|
|
12
|
-
* @param expression The code snippet that will be injected in place of `foo.$`
|
|
13
|
-
* @param type The type of the expression
|
|
14
|
-
* @param [origin='runtime'] Where the value originates from.
|
|
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
|
-
|
|
7
|
+
* An advanced API that creates a typed shader expression which
|
|
8
|
+
* can be injected into the final shader bundle upon use.
|
|
9
|
+
*
|
|
10
|
+
* @param expression The code snippet that will be injected in place of `foo.$`
|
|
11
|
+
* @param type The type of the expression
|
|
12
|
+
* @param [origin='runtime'] Where the value originates from.
|
|
13
|
+
* @param [possibleSideEffects=true] Whether generating this snippet may produce a WGSL expression with observable side-effects (e.g. calling a barrier, discarding a fragment, or writing to memory).
|
|
14
|
+
*
|
|
15
|
+
* **-- Which origin to choose?**
|
|
16
|
+
*
|
|
17
|
+
* Usually 'runtime' (the default) is a safe bet, but if you're sure that the expression or
|
|
18
|
+
* computation is constant (either a reference to a constant, a numeric literal,
|
|
19
|
+
* or an operation on constants), then pass 'constant' as it might lead to better
|
|
20
|
+
* optimizations.
|
|
21
|
+
*
|
|
22
|
+
* If what the expression is a direct reference to an existing value (e.g. a uniform, a
|
|
23
|
+
* storage binding, ...), then choose from 'uniform', 'mutable', 'readonly', 'workgroup',
|
|
24
|
+
* 'private' or 'handle' depending on the address space of the referred value.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* // An identifier that we know will be in the
|
|
29
|
+
* // final shader bundle, but we cannot
|
|
30
|
+
* // refer to it in any other way.
|
|
31
|
+
* const existingGlobal = tgpu['~unstable']
|
|
32
|
+
* .rawCodeSnippet('EXISTING_GLOBAL', d.f32, 'constant', false);
|
|
33
|
+
*
|
|
34
|
+
* const foo = () => {
|
|
35
|
+
* 'use gpu';
|
|
36
|
+
* return existingGlobal.$ * 2;
|
|
37
|
+
* };
|
|
38
|
+
*
|
|
39
|
+
* const wgsl = tgpu.resolve([foo]);
|
|
40
|
+
* // fn foo() -> f32 {
|
|
41
|
+
* // return EXISTING_GLOBAL * 2;
|
|
42
|
+
* // }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function rawCodeSnippet(expression, type, origin = 'runtime', possibleSideEffects = true) {
|
|
46
|
+
return new TgpuRawCodeSnippetImpl(expression, type, origin, possibleSideEffects);
|
|
47
|
+
}
|
|
48
|
+
// --------------
|
|
49
|
+
// Implementation
|
|
50
|
+
// --------------
|
|
51
|
+
class TgpuRawCodeSnippetImpl {
|
|
52
|
+
dataType;
|
|
53
|
+
origin;
|
|
54
|
+
possibleSideEffects;
|
|
55
|
+
#expression;
|
|
56
|
+
#externals;
|
|
57
|
+
static {
|
|
58
|
+
TgpuRawCodeSnippetImpl.prototype[$internal] = true;
|
|
59
|
+
makeDereferenceable(makeResolvable(TgpuRawCodeSnippetImpl.prototype, {
|
|
60
|
+
asString() {
|
|
61
|
+
return `raw(${String(this.dataType)}): "${this.#expression}"`;
|
|
62
|
+
},
|
|
63
|
+
resolve(ctx) {
|
|
64
|
+
const replacedExpression = replaceExternalsInWgsl(ctx, this.#externals ?? {}, this.#expression);
|
|
65
|
+
return snip(replacedExpression, this.dataType, this.origin, this.possibleSideEffects);
|
|
66
|
+
},
|
|
67
|
+
}), {
|
|
68
|
+
codegenMode: {
|
|
69
|
+
getBaseSnippet(trackingProxy) {
|
|
70
|
+
return snip(trackingProxy, this.dataType, this.origin, this.possibleSideEffects);
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
normalMode: {
|
|
74
|
+
get() {
|
|
75
|
+
throw new Error('Raw code snippets can only be used on the GPU.');
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
constructor(expression, type, origin, possibleSideEffects) {
|
|
81
|
+
this.dataType = type;
|
|
82
|
+
this.origin = origin;
|
|
83
|
+
this.possibleSideEffects = possibleSideEffects;
|
|
84
|
+
this.#expression = expression;
|
|
85
|
+
}
|
|
86
|
+
$uses(dependencyMap) {
|
|
87
|
+
if (this.#externals !== undefined) {
|
|
88
|
+
throw new Error("Cannot call '$uses' multiple times. If you wish to override dependencies, use slots or accessors instead.");
|
|
89
|
+
}
|
|
90
|
+
this.#externals = dependencyMap;
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
48
93
|
}
|
|
49
|
-
var TgpuRawCodeSnippetImpl = class {
|
|
50
|
-
[$internal];
|
|
51
|
-
dataType;
|
|
52
|
-
origin;
|
|
53
|
-
#expression;
|
|
54
|
-
#externalsToApply;
|
|
55
|
-
constructor(expression, type, origin) {
|
|
56
|
-
this[$internal] = true;
|
|
57
|
-
this.dataType = type;
|
|
58
|
-
this.origin = origin;
|
|
59
|
-
this.#expression = expression;
|
|
60
|
-
this.#externalsToApply = [];
|
|
61
|
-
}
|
|
62
|
-
$uses(dependencyMap) {
|
|
63
|
-
this.#externalsToApply.push(dependencyMap);
|
|
64
|
-
return this;
|
|
65
|
-
}
|
|
66
|
-
[$resolve](ctx) {
|
|
67
|
-
const externalMap = {};
|
|
68
|
-
for (const externals of this.#externalsToApply) mergeExternals(externalMap, externals);
|
|
69
|
-
return snip(replaceExternalsInWgsl(ctx, externalMap, this.#expression), this.dataType, this.origin);
|
|
70
|
-
}
|
|
71
|
-
toString() {
|
|
72
|
-
return `raw(${String(this.dataType)}): "${this.#expression}"`;
|
|
73
|
-
}
|
|
74
|
-
get [$gpuValueOf]() {
|
|
75
|
-
const dataType = this.dataType;
|
|
76
|
-
const origin = this.origin;
|
|
77
|
-
return new Proxy({
|
|
78
|
-
[$internal]: true,
|
|
79
|
-
get [$ownSnippet]() {
|
|
80
|
-
return snip(this, dataType, origin);
|
|
81
|
-
},
|
|
82
|
-
[$resolve]: (ctx) => ctx.resolve(this),
|
|
83
|
-
toString: () => `raw(${String(this.dataType)}): "${this.#expression}".$`
|
|
84
|
-
}, valueProxyHandler);
|
|
85
|
-
}
|
|
86
|
-
get $() {
|
|
87
|
-
if (!inCodegenMode()) throw new Error("Raw code snippets can only be used on the GPU.");
|
|
88
|
-
return this[$gpuValueOf];
|
|
89
|
-
}
|
|
90
|
-
get value() {
|
|
91
|
-
return this.$;
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
//#endregion
|
|
96
|
-
export { rawCodeSnippet };
|
|
@@ -1,11 +1,29 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
//#region src/core/resolve/externals.d.ts
|
|
4
|
-
|
|
1
|
+
import { type ResolutionCtx } from '../../types.ts';
|
|
2
|
+
import type { FnExternals } from '../function/fnCore.ts';
|
|
5
3
|
/**
|
|
6
4
|
* A key-value mapping where keys represent identifiers within shader code,
|
|
7
5
|
* and values can either be another ExternalMap, or be any type that can be resolved to a code string.
|
|
8
6
|
*/
|
|
9
|
-
type ExternalMap = Record<string, unknown>;
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
export type ExternalMap = Record<string, unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* Merges function externals into one map.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mergeFunctionExternals(fnExternals: FnExternals): ExternalMap;
|
|
12
|
+
export declare function addArgTypesToExternals(implementation: string, argTypes: unknown[], core: {
|
|
13
|
+
setExternals: (key: 'args', externals: ExternalMap) => void;
|
|
14
|
+
}): void;
|
|
15
|
+
export declare function addReturnTypeToExternals(implementation: string, returnType: unknown, core: {
|
|
16
|
+
setExternals: (key: 'out', externals: ExternalMap) => void;
|
|
17
|
+
}): void;
|
|
18
|
+
export declare const anyIdent: RegExp;
|
|
19
|
+
export declare const boundedPropChain: RegExp;
|
|
20
|
+
/**
|
|
21
|
+
* Replaces all occurrences of external names in WGSL code with their resolved values.
|
|
22
|
+
* It adds all necessary definitions to the resolution context.
|
|
23
|
+
* @param ctx - The resolution context.
|
|
24
|
+
* @param externalMap - The external map. Assumes that keys don't contain dots.
|
|
25
|
+
* @param wgsl - The WGSL code.
|
|
26
|
+
*
|
|
27
|
+
* @returns The WGSL code with all external names replaced with their resolved values.
|
|
28
|
+
*/
|
|
29
|
+
export declare function replaceExternalsInWgsl(ctx: ResolutionCtx, externalMap: ExternalMap, wgsl: string): string;
|
|
@@ -1,72 +1,89 @@
|
|
|
1
|
-
import { isWgslStruct } from "../../data/wgslTypes.js";
|
|
2
|
-
import { getName, hasTinyestMetadata, setName } from "../../shared/meta.js";
|
|
3
1
|
import { isLooseData } from "../../data/dataTypes.js";
|
|
2
|
+
import { isWgslStruct } from "../../data/wgslTypes.js";
|
|
3
|
+
import { getName, hasTinyestMetadata, isNamable, setName } from "../../shared/meta.js";
|
|
4
|
+
import { logger } from "../../tgpuLogger.js";
|
|
4
5
|
import { isWgsl } from "../../types.js";
|
|
5
|
-
|
|
6
|
-
//#region src/core/resolve/externals.ts
|
|
7
6
|
function isResolvable(value) {
|
|
8
|
-
|
|
7
|
+
return isWgsl(value) || isLooseData(value) || hasTinyestMetadata(value);
|
|
9
8
|
}
|
|
10
9
|
/**
|
|
11
|
-
* Merges
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const copiedValue = { ...existingValue };
|
|
27
|
-
mergeExternals(copiedValue, value);
|
|
28
|
-
existing[key] = copiedValue;
|
|
29
|
-
} else existing[key] = value;
|
|
30
|
-
if (value && (typeof value === "object" || typeof value === "function") && getName(value) === void 0) setName(value, key);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function addArgTypesToExternals(implementation, argTypes, applyExternals) {
|
|
34
|
-
const argTypeNames = [...implementation.matchAll(/:\s*(?<arg>.*?)\s*[,)]/g)].map((found) => found ? found[1] : void 0);
|
|
35
|
-
applyExternals(Object.fromEntries(argTypes.flatMap((argType, i) => {
|
|
36
|
-
const argTypeName = argTypeNames ? argTypeNames[i] : void 0;
|
|
37
|
-
return isWgslStruct(argType) && argTypeName !== void 0 ? [[argTypeName, argType]] : [];
|
|
38
|
-
})));
|
|
10
|
+
* Merges function externals into one map.
|
|
11
|
+
*/
|
|
12
|
+
export function mergeFunctionExternals(fnExternals) {
|
|
13
|
+
const base = fnExternals.pluginProvided ?? fnExternals.userProvided ?? {};
|
|
14
|
+
// avoid calling any of the getters
|
|
15
|
+
const result = Object.defineProperties({}, Object.getOwnPropertyDescriptors(base));
|
|
16
|
+
for (const flatExternal of [fnExternals.args, fnExternals.out].filter((e) => e !== undefined)) {
|
|
17
|
+
for (const [key, value] of Object.entries(flatExternal)) {
|
|
18
|
+
if (key in result && result[key] !== value) {
|
|
19
|
+
throw new Error(`Key '${key}' appears in externals despite already being used for argument/return type. Please rename this external.`);
|
|
20
|
+
}
|
|
21
|
+
result[key] = value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
39
25
|
}
|
|
40
|
-
function
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
26
|
+
export function addArgTypesToExternals(implementation, argTypes, core) {
|
|
27
|
+
const argTypeNames = [...implementation.matchAll(/:\s*(?<arg>.*?)\s*[,)]/g)].map((found) => found?.[1]);
|
|
28
|
+
const args = Object.fromEntries(argTypes.flatMap((argType, i) => {
|
|
29
|
+
const argTypeName = argTypeNames?.[i];
|
|
30
|
+
return isWgslStruct(argType) && argTypeName !== undefined ? [[argTypeName, argType]] : [];
|
|
31
|
+
}));
|
|
32
|
+
core.setExternals('args', args);
|
|
44
33
|
}
|
|
45
|
-
function
|
|
46
|
-
|
|
34
|
+
export function addReturnTypeToExternals(implementation, returnType, core) {
|
|
35
|
+
const matched = implementation.match(/->\s(?<output>[\w\d_]+)\s{/);
|
|
36
|
+
const outputName = matched ? matched[1]?.trim() : undefined;
|
|
37
|
+
if (isWgslStruct(returnType) && outputName && !/\s/g.test(outputName)) {
|
|
38
|
+
core.setExternals('out', { [outputName]: returnType });
|
|
39
|
+
}
|
|
47
40
|
}
|
|
41
|
+
export const anyIdent = /([$_\p{XID_Start}][$\p{XID_Continue}]*)/u; // WGSL ident, modified to include $
|
|
42
|
+
const anyPropChain = new RegExp(`(${anyIdent.source})(\\.${anyIdent.source})*`, 'ug');
|
|
43
|
+
export const boundedPropChain = new RegExp(`(?<![\\p{XID_Continue}\\$.])${anyPropChain.source}(?![\\p{XID_Continue}\\$])`, 'ug');
|
|
48
44
|
/**
|
|
49
|
-
* Replaces all occurrences of external names in WGSL code with their resolved values.
|
|
50
|
-
* It adds all necessary definitions to the resolution context.
|
|
51
|
-
* @param ctx - The resolution context.
|
|
52
|
-
* @param externalMap - The external map.
|
|
53
|
-
* @param wgsl - The WGSL code.
|
|
54
|
-
*
|
|
55
|
-
* @returns The WGSL code with all external names replaced with their resolved values.
|
|
56
|
-
*/
|
|
57
|
-
function replaceExternalsInWgsl(ctx, externalMap, wgsl) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
45
|
+
* Replaces all occurrences of external names in WGSL code with their resolved values.
|
|
46
|
+
* It adds all necessary definitions to the resolution context.
|
|
47
|
+
* @param ctx - The resolution context.
|
|
48
|
+
* @param externalMap - The external map. Assumes that keys don't contain dots.
|
|
49
|
+
* @param wgsl - The WGSL code.
|
|
50
|
+
*
|
|
51
|
+
* @returns The WGSL code with all external names replaced with their resolved values.
|
|
52
|
+
*/
|
|
53
|
+
export function replaceExternalsInWgsl(ctx, externalMap, wgsl) {
|
|
54
|
+
const keys = Object.keys(externalMap);
|
|
55
|
+
if (keys.length === 0) {
|
|
56
|
+
return wgsl;
|
|
57
|
+
}
|
|
58
|
+
const maybeInvalidKey = keys.find((key) => key.includes('.'));
|
|
59
|
+
if (maybeInvalidKey) {
|
|
60
|
+
throw new Error(`External key '${maybeInvalidKey}' contains invalid character '.'`);
|
|
61
|
+
}
|
|
62
|
+
return wgsl.replaceAll(boundedPropChain, (match) => {
|
|
63
|
+
const chain = match.split('.');
|
|
64
|
+
if (!Object.hasOwn(externalMap, chain.at(0))) {
|
|
65
|
+
// this prop access does not start with an external
|
|
66
|
+
return match;
|
|
67
|
+
}
|
|
68
|
+
let currentItem = externalMap;
|
|
69
|
+
let suffix = '';
|
|
70
|
+
for (const [i, elem] of chain.entries()) {
|
|
71
|
+
currentItem = currentItem[elem];
|
|
72
|
+
if (isResolvable(currentItem) || typeof currentItem === 'string') {
|
|
73
|
+
suffix = chain
|
|
74
|
+
.slice(i + 1)
|
|
75
|
+
.map((s) => `.${s}`)
|
|
76
|
+
.join('');
|
|
77
|
+
if (isNamable(currentItem) && getName(currentItem) === undefined) {
|
|
78
|
+
setName(currentItem, chain.slice(0, i + 1).join('_'));
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
if (typeof currentItem !== 'object' || currentItem === null || i === chain.length - 1) {
|
|
83
|
+
logger.warn('external-omitted', `During resolution, the external '${chain.slice(0, i + 1).join('.')}' has been omitted. Only TGPU resources, 'use gpu' functions, primitives, and plain JS objects can be used as externals.`);
|
|
84
|
+
return match;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return ctx.resolve(currentItem).value + suffix;
|
|
88
|
+
});
|
|
69
89
|
}
|
|
70
|
-
|
|
71
|
-
//#endregion
|
|
72
|
-
export { addArgTypesToExternals, addReturnTypeToExternals, mergeExternals, replaceExternalsInWgsl };
|
|
@@ -1,29 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { ShelllessRepository } from
|
|
4
|
-
import { TgpuLazy, TgpuSlot } from
|
|
5
|
-
|
|
6
|
-
//#region src/core/resolve/namespace.d.ts
|
|
1
|
+
import type { ResolvedSnippet } from '../../data/snippet.ts';
|
|
2
|
+
import { $internal } from '../../shared/symbols.ts';
|
|
3
|
+
import { ShelllessRepository } from '../../tgsl/shellless.ts';
|
|
4
|
+
import type { TgpuLazy, TgpuSlot } from '../slot/slotTypes.ts';
|
|
7
5
|
type SlotToValueMap = Map<TgpuSlot<unknown>, unknown>;
|
|
8
|
-
interface NamespaceInternal {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
6
|
+
export interface NamespaceInternal {
|
|
7
|
+
readonly takenGlobalIdentifiers: Set<string>;
|
|
8
|
+
readonly shelllessRepo: ShelllessRepository;
|
|
9
|
+
readonly strategy: 'random' | 'strict';
|
|
10
|
+
memoizedResolves: WeakMap<object, {
|
|
11
|
+
slotToValueMap: SlotToValueMap;
|
|
12
|
+
result: ResolvedSnippet;
|
|
13
|
+
}[]>;
|
|
14
|
+
memoizedLazy: WeakMap<TgpuLazy<unknown>, {
|
|
15
|
+
slotToValueMap: SlotToValueMap;
|
|
16
|
+
result: unknown;
|
|
17
|
+
}[]>;
|
|
20
18
|
}
|
|
21
|
-
interface Namespace {
|
|
22
|
-
|
|
19
|
+
export interface Namespace {
|
|
20
|
+
readonly [$internal]: NamespaceInternal;
|
|
23
21
|
}
|
|
24
|
-
interface NamespaceOptions {
|
|
25
|
-
|
|
22
|
+
export interface NamespaceOptions {
|
|
23
|
+
names?: 'random' | 'strict' | undefined;
|
|
26
24
|
}
|
|
27
|
-
declare function namespace(options?: NamespaceOptions): Namespace;
|
|
28
|
-
|
|
29
|
-
export { Namespace, namespace };
|
|
25
|
+
export declare function namespace(options?: NamespaceOptions): Namespace;
|
|
26
|
+
export {};
|
|
@@ -1,24 +1,19 @@
|
|
|
1
|
-
import { $internal } from "../../shared/symbols.js";
|
|
2
1
|
import { bannedTokens, builtins } from "../../nameUtils.js";
|
|
2
|
+
import { $internal } from "../../shared/symbols.js";
|
|
3
3
|
import { ShelllessRepository } from "../../tgsl/shellless.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const { names = "strict" } = options ?? {};
|
|
20
|
-
return new NamespaceImpl(names);
|
|
4
|
+
class NamespaceImpl {
|
|
5
|
+
[$internal];
|
|
6
|
+
constructor(strategy) {
|
|
7
|
+
this[$internal] = {
|
|
8
|
+
strategy,
|
|
9
|
+
takenGlobalIdentifiers: new Set([...bannedTokens, ...builtins]),
|
|
10
|
+
shelllessRepo: new ShelllessRepository(),
|
|
11
|
+
memoizedResolves: new WeakMap(),
|
|
12
|
+
memoizedLazy: new WeakMap(),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function namespace(options) {
|
|
17
|
+
const { names = 'strict' } = options ?? {};
|
|
18
|
+
return new NamespaceImpl(names);
|
|
21
19
|
}
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
|
-
export { namespace };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { UnknownData } from "../../data/dataTypes.js";
|
|
2
|
+
import { snip } from "../../data/snippet.js";
|
|
3
|
+
import { $internal, $resolve } from "../../shared/symbols.js";
|
|
4
|
+
export class ResolvableString {
|
|
5
|
+
[$internal] = true;
|
|
6
|
+
#value;
|
|
7
|
+
constructor(value) {
|
|
8
|
+
this.#value = value;
|
|
9
|
+
}
|
|
10
|
+
[$resolve]() {
|
|
11
|
+
return snip(this.#value, UnknownData, 'runtime', true);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AnyData } from '../../data/dataTypes.ts';
|
|
2
|
+
import type { ResolutionCtx } from '../../types.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a WGSL data-type schema to a string.
|
|
5
|
+
* @param ctx - The resolution context.
|
|
6
|
+
* @param data - The data-type to resolve.
|
|
7
|
+
*
|
|
8
|
+
* @returns The resolved data-type string.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveData(ctx: ResolutionCtx, data: AnyData): string;
|