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,56 +1,64 @@
|
|
|
1
|
-
import { $getNameForward, $gpuCallable, $internal } from "../../shared/symbols.js";
|
|
2
|
-
import { setName } from "../../shared/meta.js";
|
|
3
1
|
import { WgslTypeError } from "../../errors.js";
|
|
4
|
-
import {
|
|
2
|
+
import { setName } from "../../shared/meta.js";
|
|
3
|
+
import { $getNameForward, $gpuCallable, $internal } from "../../shared/symbols.js";
|
|
5
4
|
import { coerceToSnippet } from "../../tgsl/generationHelpers.js";
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import { isKnownAtComptime, NormalState } from "../../types.js";
|
|
6
|
+
export function isComptimeFn(value) {
|
|
7
|
+
return !!value?.[$internal]?.isComptime;
|
|
8
|
+
}
|
|
8
9
|
/**
|
|
9
|
-
* Creates a version of `func` that can called safely in a TypeGPU function to
|
|
10
|
-
* precompute and inject a value into the final shader code.
|
|
11
|
-
*
|
|
12
|
-
* Note how the function passed into `comptime` doesn't have to be marked with
|
|
13
|
-
* 'use gpu'. That's because the function doesn't execute on the GPU, it gets
|
|
14
|
-
* executed before the shader code gets sent to the GPU.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```ts
|
|
18
|
-
* const color = tgpu.comptime((int: number) => {
|
|
19
|
-
* const r = (int >> 16) & 0xff;
|
|
20
|
-
* const g = (int >> 8) & 0xff;
|
|
21
|
-
* const b = int & 0xff;
|
|
22
|
-
* return d.vec3f(r / 255, g / 255, b / 255);
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* const material = (diffuse: d.v3f): d.v3f => {
|
|
26
|
-
* 'use gpu';
|
|
27
|
-
* const albedo = color(0xff00ff);
|
|
28
|
-
* return albedo.mul(diffuse);
|
|
29
|
-
* };
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
function comptime(func) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
10
|
+
* Creates a version of `func` that can called safely in a TypeGPU function to
|
|
11
|
+
* precompute and inject a value into the final shader code.
|
|
12
|
+
*
|
|
13
|
+
* Note how the function passed into `comptime` doesn't have to be marked with
|
|
14
|
+
* 'use gpu'. That's because the function doesn't execute on the GPU, it gets
|
|
15
|
+
* executed before the shader code gets sent to the GPU.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const color = tgpu.comptime((int: number) => {
|
|
20
|
+
* const r = (int >> 16) & 0xff;
|
|
21
|
+
* const g = (int >> 8) & 0xff;
|
|
22
|
+
* const b = int & 0xff;
|
|
23
|
+
* return d.vec3f(r / 255, g / 255, b / 255);
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* const material = (diffuse: d.v3f): d.v3f => {
|
|
27
|
+
* 'use gpu';
|
|
28
|
+
* const albedo = color(0xff00ff);
|
|
29
|
+
* return albedo.mul(diffuse);
|
|
30
|
+
* };
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function comptime(func) {
|
|
34
|
+
const impl = ((...args) => {
|
|
35
|
+
return func(...args);
|
|
36
|
+
});
|
|
37
|
+
impl.toString = () => 'comptime';
|
|
38
|
+
impl[$getNameForward] = func;
|
|
39
|
+
impl[$gpuCallable] = {
|
|
40
|
+
call(ctx, args) {
|
|
41
|
+
if (!args.every((s) => isKnownAtComptime(s))) {
|
|
42
|
+
throw new WgslTypeError(`Called comptime function with runtime-known values: ${args
|
|
43
|
+
.filter((s) => !isKnownAtComptime(s))
|
|
44
|
+
.map((s) => `'${s.value}'`)
|
|
45
|
+
.join(', ')}`);
|
|
46
|
+
}
|
|
47
|
+
ctx.pushMode(new NormalState());
|
|
48
|
+
try {
|
|
49
|
+
return coerceToSnippet(func(...args.map((s) => s.value)));
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
ctx.popMode();
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
impl.$name = (label) => {
|
|
57
|
+
setName(func, label);
|
|
58
|
+
return impl;
|
|
59
|
+
};
|
|
60
|
+
Object.defineProperty(impl, $internal, {
|
|
61
|
+
value: { isComptime: true },
|
|
62
|
+
});
|
|
63
|
+
return impl;
|
|
53
64
|
}
|
|
54
|
-
|
|
55
|
-
//#endregion
|
|
56
|
-
export { comptime };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type MapValueToSnippet, type ResolvedSnippet } from '../../data/snippet.ts';
|
|
2
|
+
import { type BaseData } from '../../data/wgslTypes.ts';
|
|
3
|
+
import { type DualFn, type ResolutionCtx } from '../../types.ts';
|
|
4
|
+
import type { AnyFn } from './fnTypes.ts';
|
|
5
|
+
type MapValueToDataType<T> = {
|
|
6
|
+
[K in keyof T]: BaseData;
|
|
7
|
+
};
|
|
8
|
+
interface CallableSchemaOptions<T extends AnyFn> {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly schema: () => BaseData;
|
|
11
|
+
readonly normalImpl: T;
|
|
12
|
+
readonly codegenImpl: (ctx: ResolutionCtx, args: MapValueToSnippet<Parameters<T>>) => ResolvedSnippet;
|
|
13
|
+
readonly argTypes: (...inArgTypes: MapValueToDataType<Parameters<T>>) => (BaseData | BaseData[])[];
|
|
14
|
+
}
|
|
15
|
+
export declare function callableSchema<T extends AnyFn>(options: CallableSchemaOptions<T>): DualFn<T>;
|
|
16
|
+
export {};
|
|
@@ -1,44 +1,54 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { noSideEffects, snip, } from "../../data/snippet.js";
|
|
2
2
|
import { isPtr } from "../../data/wgslTypes.js";
|
|
3
3
|
import { setName } from "../../shared/meta.js";
|
|
4
|
-
import {
|
|
5
|
-
import { NormalState, isKnownAtComptime } from "../../types.js";
|
|
4
|
+
import { $gpuCallable } from "../../shared/symbols.js";
|
|
6
5
|
import { tryConvertSnippet } from "../../tgsl/conversion.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
6
|
+
import { isKnownAtComptime, NormalState } from "../../types.js";
|
|
7
|
+
export function callableSchema(options) {
|
|
8
|
+
const impl = ((...args) => {
|
|
9
|
+
return options.normalImpl(...args);
|
|
10
|
+
});
|
|
11
|
+
setName(impl, options.name);
|
|
12
|
+
impl.toString = () => options.name;
|
|
13
|
+
impl[$gpuCallable] = {
|
|
14
|
+
get strictSignature() {
|
|
15
|
+
return undefined;
|
|
16
|
+
},
|
|
17
|
+
call(ctx, args) {
|
|
18
|
+
const argTypes = options.argTypes(...args.map((s) => {
|
|
19
|
+
// Dereference implicit pointers
|
|
20
|
+
if (isPtr(s.dataType) && s.dataType.implicit) {
|
|
21
|
+
return s.dataType.inner;
|
|
22
|
+
}
|
|
23
|
+
return s.dataType;
|
|
24
|
+
}));
|
|
25
|
+
const converted = args.map((s, idx) => {
|
|
26
|
+
const argType = argTypes[idx];
|
|
27
|
+
if (!argType) {
|
|
28
|
+
throw new Error('Function called with invalid arguments');
|
|
29
|
+
}
|
|
30
|
+
return tryConvertSnippet(ctx, s, argType, false);
|
|
31
|
+
});
|
|
32
|
+
let result;
|
|
33
|
+
if (converted.every((s) => isKnownAtComptime(s))) {
|
|
34
|
+
ctx.pushMode(new NormalState());
|
|
35
|
+
try {
|
|
36
|
+
result = snip(options.normalImpl(...converted.map((s) => s.value)), options.schema(),
|
|
37
|
+
// Functions give up ownership of their return value
|
|
38
|
+
/* origin */ 'constant');
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
ctx.popMode('normal');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
result = options.codegenImpl(ctx, converted);
|
|
46
|
+
}
|
|
47
|
+
if (!args.some((a) => a.possibleSideEffects)) {
|
|
48
|
+
return noSideEffects(result);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
return impl;
|
|
41
54
|
}
|
|
42
|
-
|
|
43
|
-
//#endregion
|
|
44
|
-
export { callableSchema };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type MapValueToSnippet } from '../../data/snippet.ts';
|
|
2
|
+
import { type DualFn, type ResolutionCtx } from '../../types.ts';
|
|
3
|
+
import { type BaseData } from '../../data/wgslTypes.ts';
|
|
4
|
+
type MapValueToDataType<T> = {
|
|
5
|
+
[K in keyof T]: BaseData;
|
|
6
|
+
};
|
|
7
|
+
type AnyFn = (...args: never[]) => unknown;
|
|
8
|
+
interface DualImplOptions<T extends AnyFn> {
|
|
9
|
+
readonly name: string | undefined;
|
|
10
|
+
readonly normalImpl: T | string;
|
|
11
|
+
readonly codegenImpl: (ctx: ResolutionCtx, args: MapValueToSnippet<Parameters<T>>, returnType: BaseData) => string;
|
|
12
|
+
readonly signature: {
|
|
13
|
+
argTypes: (BaseData | BaseData[])[];
|
|
14
|
+
returnType: BaseData;
|
|
15
|
+
} | ((...inArgTypes: MapValueToDataType<Parameters<T>>) => {
|
|
16
|
+
argTypes: (BaseData | BaseData[])[];
|
|
17
|
+
returnType: BaseData;
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* Whether the function should skip trying to execute the "normal" implementation if
|
|
21
|
+
* all arguments are known at compile time.
|
|
22
|
+
* @default false
|
|
23
|
+
*/
|
|
24
|
+
readonly noComptime?: boolean | undefined;
|
|
25
|
+
readonly ignoreImplicitCastWarning?: boolean | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Whether calling this function is a side-effect in itself, irrespective of
|
|
28
|
+
* its arguments. Examples:
|
|
29
|
+
*
|
|
30
|
+
* - `discard` -> `true` - it discards the fragment.
|
|
31
|
+
* - `workgroupBarrier()` -> `true` - the barrier synchronizes threads.
|
|
32
|
+
* - `sin(x)`, `abs(x)` -> `false` - these are purely value-producing; the
|
|
33
|
+
* call itself has no observable effect beyond the returned value.
|
|
34
|
+
*
|
|
35
|
+
* When `false`, the result inherits side-effects from its arguments: it
|
|
36
|
+
* only has `possibleSideEffects: true` if at least one argument does.
|
|
37
|
+
*/
|
|
38
|
+
readonly sideEffects: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare class MissingCpuImplError extends Error {
|
|
41
|
+
constructor(message: string | undefined);
|
|
42
|
+
}
|
|
43
|
+
export declare function dualImpl<T extends AnyFn>(options: DualImplOptions<T>): DualFn<T>;
|
|
44
|
+
export {};
|
|
@@ -1,54 +1,75 @@
|
|
|
1
|
-
import { $gpuCallable } from "../../shared/symbols.js";
|
|
2
|
-
import { isPtr } from "../../data/wgslTypes.js";
|
|
3
|
-
import { setName } from "../../shared/meta.js";
|
|
4
1
|
import { snip } from "../../data/snippet.js";
|
|
5
|
-
import {
|
|
2
|
+
import { setName } from "../../shared/meta.js";
|
|
3
|
+
import { $gpuCallable } from "../../shared/symbols.js";
|
|
6
4
|
import { tryConvertSnippet } from "../../tgsl/conversion.js";
|
|
7
5
|
import { concretize } from "../../tgsl/generationHelpers.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
function dualImpl(options) {
|
|
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
|
-
|
|
6
|
+
import { isKnownAtComptime, NormalState } from "../../types.js";
|
|
7
|
+
import { isPtr } from "../../data/wgslTypes.js";
|
|
8
|
+
export class MissingCpuImplError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = this.constructor.name;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function dualImpl(options) {
|
|
15
|
+
const impl = ((...args) => {
|
|
16
|
+
if (typeof options.normalImpl === 'string') {
|
|
17
|
+
throw new MissingCpuImplError(options.normalImpl);
|
|
18
|
+
}
|
|
19
|
+
return options.normalImpl(...args);
|
|
20
|
+
});
|
|
21
|
+
if (options.name) {
|
|
22
|
+
setName(impl, options.name);
|
|
23
|
+
}
|
|
24
|
+
impl.toString = () => options.name ?? '<unknown>';
|
|
25
|
+
impl[$gpuCallable] = {
|
|
26
|
+
get strictSignature() {
|
|
27
|
+
return typeof options.signature !== 'function' ? options.signature : undefined;
|
|
28
|
+
},
|
|
29
|
+
call(ctx, args) {
|
|
30
|
+
const { argTypes, returnType } = typeof options.signature === 'function'
|
|
31
|
+
? options.signature(...args.map((s) => {
|
|
32
|
+
// Dereference implicit pointers
|
|
33
|
+
if (isPtr(s.dataType) && s.dataType.implicit) {
|
|
34
|
+
return s.dataType.inner;
|
|
35
|
+
}
|
|
36
|
+
return s.dataType;
|
|
37
|
+
}))
|
|
38
|
+
: options.signature;
|
|
39
|
+
const converted = args.map((s, idx) => {
|
|
40
|
+
const argType = argTypes[idx];
|
|
41
|
+
if (!argType) {
|
|
42
|
+
throw new Error('Function called with invalid arguments');
|
|
43
|
+
}
|
|
44
|
+
return tryConvertSnippet(ctx, s, argType, !options.ignoreImplicitCastWarning);
|
|
45
|
+
});
|
|
46
|
+
if (!options.noComptime &&
|
|
47
|
+
converted.every((s) => isKnownAtComptime(s)) &&
|
|
48
|
+
typeof options.normalImpl === 'function') {
|
|
49
|
+
ctx.pushMode(new NormalState());
|
|
50
|
+
try {
|
|
51
|
+
return snip(options.normalImpl(...converted.map((s) => s.value)), returnType,
|
|
52
|
+
// Functions give up ownership of their return value
|
|
53
|
+
/* origin */ 'constant', options.sideEffects);
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
// cpuImpl may in some cases be present but implemented only partially.
|
|
57
|
+
// In that case, if the MissingCpuImplError is thrown, we fallback to codegenImpl.
|
|
58
|
+
// If it is any other error, we just rethrow.
|
|
59
|
+
if (!(e instanceof MissingCpuImplError)) {
|
|
60
|
+
throw e;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
ctx.popMode('normal');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const possibleSideEffects = options.sideEffects || args.some((a) => a.possibleSideEffects);
|
|
68
|
+
const concreteReturnType = concretize(returnType);
|
|
69
|
+
return snip(options.codegenImpl(ctx, converted, concreteReturnType), concreteReturnType,
|
|
70
|
+
// Functions give up ownership of their return value
|
|
71
|
+
/* origin */ 'runtime', possibleSideEffects);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
return impl;
|
|
51
75
|
}
|
|
52
|
-
|
|
53
|
-
//#endregion
|
|
54
|
-
export { MissingCpuImplError, dualImpl };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Snippet } from '../../data/snippet.ts';
|
|
2
|
+
import { $internal, $repr } from '../../shared/symbols.ts';
|
|
3
|
+
import { type BaseData } from '../../data/wgslTypes.ts';
|
|
4
|
+
import type { FunctionArgumentAccess } from '../../types.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Routes `(input) => { input.x }` style property access to the correct WGSL
|
|
7
|
+
* expression: positional args get a direct snippet, struct fields get
|
|
8
|
+
* `structArgName.fieldName`.
|
|
9
|
+
*/
|
|
10
|
+
export declare class EntryInputRouter implements BaseData {
|
|
11
|
+
readonly [$internal]: Record<string, unknown>;
|
|
12
|
+
readonly type: "entry-input-router";
|
|
13
|
+
readonly [$repr]: never;
|
|
14
|
+
readonly structArg: FunctionArgumentAccess | undefined;
|
|
15
|
+
/** Maps schemaKey → { WGSL arg name, type } */
|
|
16
|
+
readonly positionalArgsMap: Map<string, FunctionArgumentAccess>;
|
|
17
|
+
constructor(structArg: FunctionArgumentAccess | undefined, positionalArgs: {
|
|
18
|
+
schemaKey: string;
|
|
19
|
+
arg: FunctionArgumentAccess;
|
|
20
|
+
}[]);
|
|
21
|
+
toString(): string;
|
|
22
|
+
accessProp(propName: string): Snippet | {
|
|
23
|
+
target: Snippet;
|
|
24
|
+
prop: string;
|
|
25
|
+
} | undefined;
|
|
26
|
+
}
|
|
@@ -1,35 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {} from "../../data/snippet.js";
|
|
2
|
+
import { $internal, $repr } from "../../shared/symbols.js";
|
|
2
3
|
import { isWgslStruct } from "../../data/wgslTypes.js";
|
|
3
|
-
|
|
4
|
-
//#region src/core/function/entryInputRouter.ts
|
|
5
4
|
/**
|
|
6
|
-
* Routes `(input) => { input.x }` style property access to the correct WGSL
|
|
7
|
-
* expression: positional args get a direct snippet, struct fields get
|
|
8
|
-
* `structArgName.fieldName`.
|
|
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
|
-
export { EntryInputRouter };
|
|
5
|
+
* Routes `(input) => { input.x }` style property access to the correct WGSL
|
|
6
|
+
* expression: positional args get a direct snippet, struct fields get
|
|
7
|
+
* `structArgName.fieldName`.
|
|
8
|
+
*/
|
|
9
|
+
export class EntryInputRouter {
|
|
10
|
+
[$internal] = {};
|
|
11
|
+
type = 'entry-input-router';
|
|
12
|
+
structArg;
|
|
13
|
+
/** Maps schemaKey → { WGSL arg name, type } */
|
|
14
|
+
positionalArgsMap;
|
|
15
|
+
constructor(structArg, positionalArgs) {
|
|
16
|
+
this.structArg = structArg;
|
|
17
|
+
this.positionalArgsMap = new Map(positionalArgs.map((a) => [a.schemaKey, a.arg]));
|
|
18
|
+
}
|
|
19
|
+
toString() {
|
|
20
|
+
return 'entry-input-router';
|
|
21
|
+
}
|
|
22
|
+
accessProp(propName) {
|
|
23
|
+
const positionalEntry = this.positionalArgsMap.get(propName);
|
|
24
|
+
if (positionalEntry) {
|
|
25
|
+
return positionalEntry();
|
|
26
|
+
}
|
|
27
|
+
const structSnippet = this.structArg?.();
|
|
28
|
+
if (structSnippet && isWgslStruct(structSnippet.dataType)) {
|
|
29
|
+
return { target: structSnippet, prop: propName };
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface FunctionArgsInfo {
|
|
2
|
+
args: ArgInfo[];
|
|
3
|
+
ret: ReturnInfo | undefined;
|
|
4
|
+
range: {
|
|
5
|
+
begin: number;
|
|
6
|
+
end: number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
interface ArgInfo {
|
|
10
|
+
identifier: string;
|
|
11
|
+
attributes: string[];
|
|
12
|
+
type: string | undefined;
|
|
13
|
+
}
|
|
14
|
+
interface ReturnInfo {
|
|
15
|
+
attributes: string[];
|
|
16
|
+
type: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Extracts info about arguments of a given WGSL function string.
|
|
20
|
+
* @example
|
|
21
|
+
* const code = `
|
|
22
|
+
* fn add(a: i32, @location(0) b: i32, c) -> i32 {
|
|
23
|
+
* return a + b + c;
|
|
24
|
+
* }`;
|
|
25
|
+
*
|
|
26
|
+
* extractArgs(code);
|
|
27
|
+
* // {
|
|
28
|
+
* // args: [
|
|
29
|
+
* // { identifier: 'a', attributes: [], type: 'i32' },
|
|
30
|
+
* // { identifier: 'b', attributes: ['@location(0)'], type: 'i32' },
|
|
31
|
+
* // { identifier: 'c', attributes: [], type: undefined }
|
|
32
|
+
* // ],
|
|
33
|
+
* // ret: { type: 'i32', attributes: [] },
|
|
34
|
+
* // range: { begin: 11, end: 51 }
|
|
35
|
+
* // }
|
|
36
|
+
*/
|
|
37
|
+
export declare function extractArgs(rawCode: string): FunctionArgsInfo;
|
|
38
|
+
export {};
|