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,49 +1,47 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
//#region src/core/function/tgpuComputeFn.d.ts
|
|
8
|
-
|
|
1
|
+
import type { AnyComputeBuiltin } from '../../builtin.ts';
|
|
2
|
+
import { Void } from '../../data/wgslTypes.ts';
|
|
3
|
+
import { type TgpuNamable } from '../../shared/meta.ts';
|
|
4
|
+
import { $internal } from '../../shared/symbols.ts';
|
|
5
|
+
import type { InferIO, IORecord } from './fnTypes.ts';
|
|
9
6
|
/**
|
|
10
7
|
* Describes a compute entry function signature (its arguments, return type and workgroup size)
|
|
11
8
|
*/
|
|
12
9
|
type TgpuComputeFnShellHeader<ComputeIn extends IORecord<AnyComputeBuiltin>> = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
readonly argTypes: ComputeIn[keyof ComputeIn][];
|
|
11
|
+
readonly returnType: Void;
|
|
12
|
+
readonly workgroupSize: number[];
|
|
13
|
+
readonly entryPoint: 'compute';
|
|
17
14
|
};
|
|
18
15
|
/**
|
|
19
16
|
* Describes a compute entry function signature (its arguments, return type and workgroup size).
|
|
20
17
|
* Allows creating tgpu compute functions by calling this shell
|
|
21
18
|
* and passing the implementation (as WGSL string or JS function) as the argument.
|
|
22
19
|
*/
|
|
23
|
-
type TgpuComputeFnShell<ComputeIn extends IORecord<AnyComputeBuiltin>> = TgpuComputeFnShellHeader<ComputeIn> &
|
|
20
|
+
export type TgpuComputeFnShell<ComputeIn extends IORecord<AnyComputeBuiltin>> = TgpuComputeFnShellHeader<ComputeIn> &
|
|
24
21
|
/**
|
|
25
22
|
* Creates a type-safe implementation of this signature
|
|
26
23
|
*/
|
|
27
|
-
((implementation: (input: InferIO<ComputeIn>) => undefined) => TgpuComputeFn<ComputeIn>) &
|
|
24
|
+
((implementation: (input: InferIO<ComputeIn>) => undefined) => TgpuComputeFn<ComputeIn>) &
|
|
28
25
|
/**
|
|
29
26
|
* @param implementation
|
|
30
27
|
* Raw WGSL function implementation with header and body
|
|
31
28
|
* without `fn` keyword and function name
|
|
32
29
|
* e.g. `"(x: f32) -> f32 { return x; }"`;
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
*/ ((implementation: string) => TgpuComputeFn<ComputeIn>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuComputeFn<ComputeIn>);
|
|
31
|
+
export interface TgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin> = any> extends TgpuNamable {
|
|
32
|
+
readonly [$internal]: true;
|
|
33
|
+
readonly shell: TgpuComputeFnShellHeader<ComputeIn>;
|
|
34
|
+
$uses(dependencyMap: Record<string, unknown>): this;
|
|
35
|
+
}
|
|
36
|
+
export interface ComputeFnOptions {
|
|
37
|
+
workgroupSize: number[];
|
|
39
38
|
}
|
|
40
|
-
declare function computeFn(options: {
|
|
41
|
-
|
|
39
|
+
export declare function computeFn(options: {
|
|
40
|
+
workgroupSize: number[];
|
|
42
41
|
}): TgpuComputeFnShell<{}>;
|
|
43
|
-
declare function computeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(options: {
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
export declare function computeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(options: {
|
|
43
|
+
in: ComputeIn;
|
|
44
|
+
workgroupSize: number[];
|
|
46
45
|
}): TgpuComputeFnShell<ComputeIn>;
|
|
47
|
-
declare function isTgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(value: unknown): value is TgpuComputeFn<ComputeIn>;
|
|
48
|
-
|
|
49
|
-
export { TgpuComputeFn, TgpuComputeFnShell, computeFn, isTgpuComputeFn };
|
|
46
|
+
export declare function isTgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(value: unknown): value is TgpuComputeFn<ComputeIn>;
|
|
47
|
+
export {};
|
|
@@ -1,57 +1,56 @@
|
|
|
1
|
-
import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
|
|
2
1
|
import { Void } from "../../data/wgslTypes.js";
|
|
3
2
|
import { getName, setName } from "../../shared/meta.js";
|
|
4
|
-
import {
|
|
3
|
+
import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
|
|
4
|
+
import { shaderStageSlot } from "../slot/internalSlots.js";
|
|
5
5
|
import { createFnCore } from "./fnCore.js";
|
|
6
|
+
import { separateBuiltins } from "./ioSchema.js";
|
|
6
7
|
import { stripTemplate } from "./templateUtils.js";
|
|
7
|
-
import { shaderStageSlot } from "../slot/internalSlots.js";
|
|
8
|
-
|
|
9
|
-
//#region src/core/function/tgpuComputeFn.ts
|
|
10
8
|
/**
|
|
11
|
-
* Creates a shell of a typed entry function for the compute shader stage. Any function
|
|
12
|
-
* that implements this shell can perform general-purpose computation.
|
|
13
|
-
*
|
|
14
|
-
* @param options.in
|
|
15
|
-
* Record with builtins used by the compute shader.
|
|
16
|
-
* @param options.workgroupSize
|
|
17
|
-
* Size of blocks that the thread grid will be divided into (up to 3 dimensions).
|
|
18
|
-
*/
|
|
19
|
-
function computeFn(options) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
9
|
+
* Creates a shell of a typed entry function for the compute shader stage. Any function
|
|
10
|
+
* that implements this shell can perform general-purpose computation.
|
|
11
|
+
*
|
|
12
|
+
* @param options.in
|
|
13
|
+
* Record with builtins used by the compute shader.
|
|
14
|
+
* @param options.workgroupSize
|
|
15
|
+
* Size of blocks that the thread grid will be divided into (up to 3 dimensions).
|
|
16
|
+
*/
|
|
17
|
+
export function computeFn(options) {
|
|
18
|
+
const shell = {
|
|
19
|
+
argTypes: Object.values(options.in ?? {}),
|
|
20
|
+
returnType: Void,
|
|
21
|
+
workgroupSize: options.workgroupSize,
|
|
22
|
+
entryPoint: 'compute',
|
|
23
|
+
};
|
|
24
|
+
const entryInput = separateBuiltins(options.in ?? {});
|
|
25
|
+
const call = (arg, ...values) => createComputeFn(shell, options.workgroupSize, stripTemplate(arg, ...values), entryInput);
|
|
26
|
+
return Object.assign(call, shell);
|
|
29
27
|
}
|
|
30
|
-
function isTgpuComputeFn(value) {
|
|
31
|
-
|
|
28
|
+
export function isTgpuComputeFn(value) {
|
|
29
|
+
return value?.shell?.entryPoint === 'compute';
|
|
32
30
|
}
|
|
31
|
+
// --------------
|
|
32
|
+
// Implementation
|
|
33
|
+
// --------------
|
|
33
34
|
function createComputeFn(shell, workgroupSize, implementation, entryInput) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
35
|
+
const core = createFnCore(implementation, 'compute', workgroupSize);
|
|
36
|
+
const result = {
|
|
37
|
+
shell,
|
|
38
|
+
$uses(newExternals) {
|
|
39
|
+
core.setExternals('userProvided', newExternals);
|
|
40
|
+
return this;
|
|
41
|
+
},
|
|
42
|
+
[$internal]: true,
|
|
43
|
+
[$getNameForward]: core,
|
|
44
|
+
$name(newLabel) {
|
|
45
|
+
setName(this, newLabel);
|
|
46
|
+
return this;
|
|
47
|
+
},
|
|
48
|
+
[$resolve](ctx) {
|
|
49
|
+
return ctx.withSlots([[shaderStageSlot, 'compute']], () => core.resolve(ctx, [], shell.returnType, entryInput));
|
|
50
|
+
},
|
|
51
|
+
toString() {
|
|
52
|
+
return `computeFn:${getName(core) ?? '<unnamed>'}`;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
return result;
|
|
54
56
|
}
|
|
55
|
-
|
|
56
|
-
//#endregion
|
|
57
|
-
export { computeFn, isTgpuComputeFn };
|
|
@@ -1,53 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
//#region src/core/function/tgpuFn.d.ts
|
|
12
|
-
|
|
1
|
+
import { type BaseData, Void } from '../../data/wgslTypes.ts';
|
|
2
|
+
import type { TgpuNamable } from '../../shared/meta.ts';
|
|
3
|
+
import type { InferGPU } from '../../shared/repr.ts';
|
|
4
|
+
import { $internal, $providing } from '../../shared/symbols.ts';
|
|
5
|
+
import type { Prettify } from '../../shared/utilityTypes.ts';
|
|
6
|
+
import type { DualFn } from '../../types.ts';
|
|
7
|
+
import { type Providing } from '../slot/slotTypes.ts';
|
|
8
|
+
import type { AnyFn, Implementation, InferArgs, InferImplSchema, InheritArgNames } from './fnTypes.ts';
|
|
9
|
+
import type { Withable } from '../root/rootTypes.ts';
|
|
13
10
|
/**
|
|
14
11
|
* Describes a function signature (its arguments and return type)
|
|
15
12
|
*/
|
|
16
13
|
type TgpuFnShellHeader<Args extends BaseData[], Return extends BaseData> = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
readonly [$internal]: true;
|
|
15
|
+
readonly argTypes: Args;
|
|
16
|
+
readonly returnType: Return;
|
|
20
17
|
};
|
|
21
18
|
/**
|
|
22
19
|
* Describes a function signature (its arguments and return type).
|
|
23
20
|
* Allows creating tgpu functions by calling this shell
|
|
24
21
|
* and passing the implementation (as WGSL string or JS function) as the argument.
|
|
25
22
|
*/
|
|
26
|
-
type TgpuFnShell<Args extends BaseData[], Return extends BaseData> = TgpuFnShellHeader<Args, Return> & (<T extends (...args: InferArgs<Args>) => InferGPU<Return>>(implementation: T) => TgpuFn<Prettify<InheritArgNames<(...args: Args) => Return, T>>['result']>) & ((implementation: string) => TgpuFn<(...args: Args) => Return>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuFn<(...args: Args) => Return>);
|
|
23
|
+
export type TgpuFnShell<Args extends BaseData[], Return extends BaseData> = TgpuFnShellHeader<Args, Return> & (<T extends (...args: InferArgs<Args>) => InferGPU<Return>>(implementation: T) => TgpuFn<Prettify<InheritArgNames<(...args: Args) => Return, T>>['result']>) & ((implementation: string) => TgpuFn<(...args: Args) => Return>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuFn<(...args: Args) => Return>);
|
|
27
24
|
interface TgpuFnBase<ImplSchema extends AnyFn> extends TgpuNamable, Withable<TgpuFn<ImplSchema>> {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
[$internal]: {
|
|
26
|
+
implementation: Implementation<ImplSchema>;
|
|
27
|
+
};
|
|
28
|
+
readonly resourceType: 'function';
|
|
29
|
+
readonly shell: TgpuFnShellHeader<Parameters<ImplSchema>, Extract<ReturnType<ImplSchema>, BaseData>>;
|
|
30
|
+
readonly [$providing]?: Providing | undefined;
|
|
31
|
+
$uses(dependencyMap: Record<string, unknown>): this;
|
|
35
32
|
}
|
|
36
|
-
type TgpuFn<ImplSchema extends AnyFn = (...args: any[]) => any> = DualFn<InferImplSchema<ImplSchema>> & TgpuFnBase<ImplSchema>;
|
|
33
|
+
export type TgpuFn<ImplSchema extends AnyFn = (...args: any[]) => any> = DualFn<InferImplSchema<ImplSchema>> & TgpuFnBase<ImplSchema>;
|
|
37
34
|
/**
|
|
38
35
|
* A function wrapper that allows providing slot and accessor overrides for shellless functions
|
|
39
36
|
*/
|
|
40
|
-
interface TgpuGenericFn<T extends AnyFn> extends TgpuNamable, Withable<TgpuGenericFn<T>> {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
export interface TgpuGenericFn<T extends AnyFn> extends TgpuNamable, Withable<TgpuGenericFn<T>> {
|
|
38
|
+
readonly [$internal]: {
|
|
39
|
+
inner: T;
|
|
40
|
+
};
|
|
41
|
+
readonly [$providing]?: Providing | undefined;
|
|
42
|
+
readonly resourceType: 'generic-function';
|
|
43
|
+
(...args: Parameters<T>): ReturnType<T>;
|
|
47
44
|
}
|
|
48
|
-
declare function fn<Args extends BaseData[] | []>(argTypes: Args, returnType?: undefined): TgpuFnShell<Args, Void>;
|
|
49
|
-
declare function fn<Args extends BaseData[] | [], Return extends BaseData>(argTypes: Args, returnType: Return): TgpuFnShell<Args, Return>;
|
|
50
|
-
declare function fn<T extends AnyFn>(inner: T): TgpuGenericFn<T>;
|
|
51
|
-
declare function isTgpuFn<Args extends BaseData[] | [], Return extends BaseData>(value: unknown): value is TgpuFn<(...args: Args) => Return>;
|
|
52
|
-
|
|
53
|
-
export {
|
|
45
|
+
export declare function fn<Args extends BaseData[] | []>(argTypes: Args, returnType?: undefined): TgpuFnShell<Args, Void>;
|
|
46
|
+
export declare function fn<Args extends BaseData[] | [], Return extends BaseData>(argTypes: Args, returnType: Return): TgpuFnShell<Args, Return>;
|
|
47
|
+
export declare function fn<T extends AnyFn>(inner: T): TgpuGenericFn<T>;
|
|
48
|
+
export declare function isTgpuFn<Args extends BaseData[] | [], Return extends BaseData>(value: unknown): value is TgpuFn<(...args: Args) => Return>;
|
|
49
|
+
export declare function isGenericFn<Callback extends AnyFn>(value: unknown): value is TgpuGenericFn<Callback>;
|
|
50
|
+
export {};
|
package/core/function/tgpuFn.js
CHANGED
|
@@ -1,171 +1,197 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { schemaCallWrapper } from "../../data/schemaCallWrapper.js";
|
|
2
2
|
import { Void } from "../../data/wgslTypes.js";
|
|
3
|
-
import { getName, setName } from "../../shared/meta.js";
|
|
4
3
|
import { ExecutionError } from "../../errors.js";
|
|
5
|
-
import { isAccessor, isMutableAccessor } from "../slot/slotTypes.js";
|
|
6
4
|
import { provideInsideTgpuFn } from "../../execMode.js";
|
|
5
|
+
import { getName, setName } from "../../shared/meta.js";
|
|
6
|
+
import { isMarkedInternal } from "../../shared/symbols.js";
|
|
7
|
+
import { $getNameForward, $internal, $providing, $resolve } from "../../shared/symbols.js";
|
|
8
|
+
import { addArgTypesToExternals, addReturnTypeToExternals } from "../resolve/externals.js";
|
|
7
9
|
import { stitch } from "../resolve/stitch.js";
|
|
8
|
-
import {
|
|
10
|
+
import { isAccessor, isMutableAccessor, } from "../slot/slotTypes.js";
|
|
9
11
|
import { dualImpl } from "./dualImpl.js";
|
|
10
|
-
import { comptime } from "./comptime.js";
|
|
11
|
-
import { addArgTypesToExternals, addReturnTypeToExternals } from "../resolve/externals.js";
|
|
12
12
|
import { createFnCore } from "./fnCore.js";
|
|
13
13
|
import { stripTemplate } from "./templateUtils.js";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
14
|
+
import { comptime } from "./comptime.js";
|
|
15
|
+
export function fn(argTypesOrCallback, returnType) {
|
|
16
|
+
if (typeof argTypesOrCallback === 'function') {
|
|
17
|
+
return createGenericFn(argTypesOrCallback, []);
|
|
18
|
+
}
|
|
19
|
+
const argTypes = argTypesOrCallback;
|
|
20
|
+
const shell = {
|
|
21
|
+
[$internal]: true,
|
|
22
|
+
argTypes,
|
|
23
|
+
returnType: returnType ?? Void,
|
|
24
|
+
};
|
|
25
|
+
const call = (arg, ...values) => createFn(shell, stripTemplate(arg, ...values));
|
|
26
|
+
return Object.assign(call, shell);
|
|
26
27
|
}
|
|
27
|
-
function isTgpuFn(value) {
|
|
28
|
-
|
|
28
|
+
export function isTgpuFn(value) {
|
|
29
|
+
return (isMarkedInternal(value) &&
|
|
30
|
+
value?.resourceType === 'function');
|
|
29
31
|
}
|
|
30
|
-
function isGenericFn(value) {
|
|
31
|
-
|
|
32
|
+
export function isGenericFn(value) {
|
|
33
|
+
return (isMarkedInternal(value) &&
|
|
34
|
+
value?.resourceType === 'generic-function');
|
|
32
35
|
}
|
|
36
|
+
// --------------
|
|
37
|
+
// Implementation
|
|
38
|
+
// --------------
|
|
33
39
|
function stringifyPair([slot, value]) {
|
|
34
|
-
|
|
40
|
+
return `${getName(slot) ?? '<unnamed>'}=${value}`;
|
|
35
41
|
}
|
|
36
42
|
function createFn(shell, _implementation) {
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
43
|
+
let pairs = [];
|
|
44
|
+
// Unwrapping generic functions
|
|
45
|
+
let implementation;
|
|
46
|
+
if (isGenericFn(_implementation)) {
|
|
47
|
+
pairs = _implementation[$providing]?.pairs ?? [];
|
|
48
|
+
implementation = _implementation[$internal].inner;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
implementation = _implementation;
|
|
52
|
+
}
|
|
53
|
+
const core = createFnCore(implementation, 'normal');
|
|
54
|
+
const fnBase = {
|
|
55
|
+
shell,
|
|
56
|
+
resourceType: 'function',
|
|
57
|
+
[$internal]: { implementation },
|
|
58
|
+
$uses(newExternals) {
|
|
59
|
+
core.setExternals('userProvided', newExternals);
|
|
60
|
+
return this;
|
|
61
|
+
},
|
|
62
|
+
[$getNameForward]: core,
|
|
63
|
+
$name(label) {
|
|
64
|
+
setName(this, label);
|
|
65
|
+
return this;
|
|
66
|
+
},
|
|
67
|
+
with: comptime((slot, value) => {
|
|
68
|
+
const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
|
|
69
|
+
return createBoundFunction(fn, [[s, value]]);
|
|
70
|
+
}),
|
|
71
|
+
[$resolve](ctx) {
|
|
72
|
+
if (typeof implementation === 'string') {
|
|
73
|
+
addArgTypesToExternals(implementation, shell.argTypes, core);
|
|
74
|
+
addReturnTypeToExternals(implementation, shell.returnType, core);
|
|
75
|
+
}
|
|
76
|
+
return core.resolve(ctx, shell.argTypes, shell.returnType);
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
const call = dualImpl({
|
|
80
|
+
name: undefined, // the name is forwarded to the core anyway
|
|
81
|
+
noComptime: true,
|
|
82
|
+
signature: { argTypes: shell.argTypes, returnType: shell.returnType },
|
|
83
|
+
normalImpl: (...args) => provideInsideTgpuFn(() => {
|
|
84
|
+
try {
|
|
85
|
+
if (typeof implementation === 'string') {
|
|
86
|
+
throw new Error('Cannot execute on the CPU functions constructed with raw WGSL');
|
|
87
|
+
}
|
|
88
|
+
const castAndCopiedArgs = args.map((arg, index) => schemaCallWrapper(shell.argTypes[index], arg));
|
|
89
|
+
const result = implementation(...castAndCopiedArgs);
|
|
90
|
+
// Casting the result to the appropriate schema
|
|
91
|
+
return schemaCallWrapper(shell.returnType, result);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
if (err instanceof ExecutionError) {
|
|
95
|
+
throw err.appendToTrace(fn);
|
|
96
|
+
}
|
|
97
|
+
throw new ExecutionError(err, [fn]);
|
|
98
|
+
}
|
|
99
|
+
}),
|
|
100
|
+
codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch `${ctx.resolve(fn).value}(${args})`),
|
|
101
|
+
sideEffects: true,
|
|
102
|
+
});
|
|
103
|
+
const fn = Object.assign(call, fnBase);
|
|
104
|
+
Object.defineProperty(fn, 'toString', {
|
|
105
|
+
value() {
|
|
106
|
+
return `fn:${getName(core) ?? '<unnamed>'}`;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
if (pairs.length > 0) {
|
|
110
|
+
return createBoundFunction(fn, pairs);
|
|
111
|
+
}
|
|
112
|
+
return fn;
|
|
94
113
|
}
|
|
95
114
|
function createBoundFunction(innerFn, pairs) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
115
|
+
const fnBase = {
|
|
116
|
+
resourceType: 'function',
|
|
117
|
+
shell: innerFn.shell,
|
|
118
|
+
[$internal]: { implementation: innerFn[$internal].implementation },
|
|
119
|
+
[$providing]: { inner: innerFn, pairs },
|
|
120
|
+
$uses(newExternals) {
|
|
121
|
+
innerFn.$uses(newExternals);
|
|
122
|
+
return this;
|
|
123
|
+
},
|
|
124
|
+
$name(label) {
|
|
125
|
+
setName(this, label);
|
|
126
|
+
return this;
|
|
127
|
+
},
|
|
128
|
+
with: comptime((slot, value) => {
|
|
129
|
+
const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
|
|
130
|
+
return createBoundFunction(innerFn, [...pairs, [s, value]]);
|
|
131
|
+
}),
|
|
132
|
+
};
|
|
133
|
+
const call = dualImpl({
|
|
134
|
+
name: undefined, // setting name here would override autonaming
|
|
135
|
+
noComptime: true,
|
|
136
|
+
signature: {
|
|
137
|
+
argTypes: innerFn.shell.argTypes,
|
|
138
|
+
returnType: innerFn.shell.returnType,
|
|
139
|
+
},
|
|
140
|
+
normalImpl: innerFn,
|
|
141
|
+
codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch `${ctx.resolve(fn).value}(${args})`),
|
|
142
|
+
sideEffects: true,
|
|
143
|
+
});
|
|
144
|
+
const fn = Object.assign(call, fnBase);
|
|
145
|
+
Object.defineProperty(fn, 'toString', {
|
|
146
|
+
value() {
|
|
147
|
+
const fnLabel = getName(this) ?? '<unnamed>';
|
|
148
|
+
return `fn:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
const innerName = getName(innerFn);
|
|
152
|
+
if (innerName) {
|
|
153
|
+
setName(fn, innerName);
|
|
154
|
+
}
|
|
155
|
+
return fn;
|
|
134
156
|
}
|
|
135
157
|
function createGenericFn(inner, pairs) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
158
|
+
const fnBase = {
|
|
159
|
+
[$internal]: { inner },
|
|
160
|
+
resourceType: 'generic-function',
|
|
161
|
+
[$providing]: pairs.length > 0 ? { inner, pairs } : undefined,
|
|
162
|
+
$name(label) {
|
|
163
|
+
setName(this, label);
|
|
164
|
+
// Giving `inner` a name if it doesn't have one
|
|
165
|
+
if (!getName(inner)) {
|
|
166
|
+
setName(inner, label);
|
|
167
|
+
}
|
|
168
|
+
return this;
|
|
169
|
+
},
|
|
170
|
+
[$resolve](ctx) {
|
|
171
|
+
return ctx.resolve(inner);
|
|
172
|
+
},
|
|
173
|
+
with(slot, value) {
|
|
174
|
+
const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
|
|
175
|
+
return createGenericFn(inner, [...pairs, [s, value]]);
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
const call = (...args) => {
|
|
179
|
+
return inner(...args);
|
|
180
|
+
};
|
|
181
|
+
const genericFn = Object.assign(call, fnBase);
|
|
182
|
+
// Inheriting name from `inner`, if it exists
|
|
183
|
+
const innerName = getName(inner);
|
|
184
|
+
if (innerName) {
|
|
185
|
+
setName(genericFn, innerName);
|
|
186
|
+
}
|
|
187
|
+
Object.defineProperty(genericFn, 'toString', {
|
|
188
|
+
value() {
|
|
189
|
+
const fnLabel = getName(genericFn) ?? '<unnamed>';
|
|
190
|
+
if (pairs.length > 0) {
|
|
191
|
+
return `fn*:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;
|
|
192
|
+
}
|
|
193
|
+
return `fn*:${fnLabel}`;
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
return genericFn;
|
|
168
197
|
}
|
|
169
|
-
|
|
170
|
-
//#endregion
|
|
171
|
-
export { fn, isGenericFn, isTgpuFn };
|