typegpu 0.11.9 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin.mjs +28 -6
- package/builtin.d.ts +51 -53
- package/builtin.js +30 -34
- package/common/fullScreenTriangle.d.ts +2 -10
- package/common/fullScreenTriangle.js +20 -28
- package/common/index.d.ts +2 -9
- package/common/index.js +3 -12
- package/common/writeSoA.d.ts +11 -12
- package/common/writeSoA.js +88 -76
- package/core/buffer/buffer.d.ts +79 -62
- package/core/buffer/buffer.js +283 -205
- package/core/buffer/bufferBinding.d.ts +71 -0
- package/core/buffer/bufferBinding.js +154 -0
- package/core/buffer/bufferUsage.d.ts +14 -45
- package/core/buffer/bufferUsage.js +1 -171
- package/core/buffer/laidOutBuffer.d.ts +25 -0
- package/core/buffer/laidOutBuffer.js +55 -0
- package/core/commandEncoder/attachments.d.ts +125 -0
- package/core/commandEncoder/attachments.js +29 -0
- package/core/commandEncoder/commandEncoder.d.ts +53 -0
- package/core/commandEncoder/commandEncoder.js +56 -0
- package/core/commandEncoder/computePass.d.ts +58 -0
- package/core/commandEncoder/computePass.js +63 -0
- package/core/commandEncoder/renderPass.d.ts +121 -0
- package/core/commandEncoder/renderPass.js +196 -0
- package/core/constant/tgpuConstant.d.ts +26 -26
- package/core/constant/tgpuConstant.js +76 -65
- package/core/declare/tgpuDeclare.d.ts +3 -6
- package/core/declare/tgpuDeclare.js +36 -36
- package/core/function/autoIO.d.ts +61 -33
- package/core/function/autoIO.js +68 -73
- package/core/function/comptime.d.ts +11 -13
- package/core/function/comptime.js +60 -52
- package/core/function/createCallableSchema.d.ts +16 -0
- package/core/function/createCallableSchema.js +50 -40
- package/core/function/dualImpl.d.ts +44 -0
- package/core/function/dualImpl.js +71 -50
- package/core/function/entryInputRouter.d.ts +26 -0
- package/core/function/entryInputRouter.js +31 -33
- package/core/function/extractArgs.d.ts +38 -0
- package/core/function/extractArgs.js +202 -200
- package/core/function/fnCore.d.ts +44 -5
- package/core/function/fnCore.js +148 -93
- package/core/function/fnTypes.d.ts +31 -29
- package/core/function/fnTypes.js +1 -0
- package/core/function/ioSchema.d.ts +12 -10
- package/core/function/ioSchema.js +65 -47
- package/core/function/shelllessImpl.d.ts +9 -12
- package/core/function/shelllessImpl.js +17 -22
- package/core/function/templateUtils.d.ts +2 -0
- package/core/function/templateUtils.js +9 -8
- package/core/function/tgpuComputeFn.d.ts +26 -28
- package/core/function/tgpuComputeFn.js +47 -48
- package/core/function/tgpuFn.d.ts +34 -37
- package/core/function/tgpuFn.js +179 -153
- package/core/function/tgpuFragmentFn.d.ts +52 -53
- package/core/function/tgpuFragmentFn.js +63 -56
- package/core/function/tgpuVertexFn.d.ts +36 -39
- package/core/function/tgpuVertexFn.js +56 -53
- package/core/pipeline/computePipeline.d.ts +141 -53
- package/core/pipeline/computePipeline.js +291 -225
- package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
- package/core/pipeline/connectAttachmentToShader.js +25 -22
- package/core/pipeline/connectTargetsToShader.d.ts +3 -0
- package/core/pipeline/connectTargetsToShader.js +29 -27
- package/core/pipeline/drawState.d.ts +52 -0
- package/core/pipeline/drawState.js +225 -0
- package/core/pipeline/performanceTracker.d.ts +14 -0
- package/core/pipeline/performanceTracker.js +34 -0
- package/core/pipeline/pipelineUtils.d.ts +18 -0
- package/core/pipeline/pipelineUtils.js +54 -25
- package/core/pipeline/priors.d.ts +1 -0
- package/core/pipeline/priors.js +12 -0
- package/core/pipeline/renderPipeline.d.ts +246 -261
- package/core/pipeline/renderPipeline.js +487 -480
- package/core/pipeline/timeable.d.ts +28 -18
- package/core/pipeline/timeable.js +90 -52
- package/core/pipeline/typeGuards.d.ts +17 -0
- package/core/pipeline/typeGuards.js +52 -22
- package/core/pipeline/webgpuLimitations.d.ts +10 -0
- package/core/pipeline/webgpuLimitations.js +81 -0
- package/core/querySet/querySet.d.ts +26 -21
- package/core/querySet/querySet.js +127 -103
- package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
- package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
- package/core/resolve/externals.d.ts +25 -8
- package/core/resolve/externals.js +78 -54
- package/core/resolve/namespace.d.ts +22 -25
- package/core/resolve/namespace.js +16 -21
- package/core/resolve/resolvableString.d.ts +7 -0
- package/core/resolve/resolvableString.js +13 -0
- package/core/resolve/resolveData.d.ts +10 -0
- package/core/resolve/resolveData.js +162 -121
- package/core/resolve/stitch.d.ts +8 -0
- package/core/resolve/stitch.js +23 -21
- package/core/resolve/tgpuResolve.d.ts +55 -53
- package/core/resolve/tgpuResolve.js +106 -53
- package/core/root/configurableImpl.d.ts +10 -0
- package/core/root/configurableImpl.js +17 -19
- package/core/root/init.d.ts +76 -38
- package/core/root/init.js +346 -455
- package/core/root/rootTypes.d.ts +461 -636
- package/core/root/rootTypes.js +1 -0
- package/core/sampler/sampler.d.ts +50 -31
- package/core/sampler/sampler.js +120 -113
- package/core/simulate/tgpuSimulate.d.ts +9 -12
- package/core/simulate/tgpuSimulate.js +68 -71
- package/core/slot/accessor.d.ts +36 -13
- package/core/slot/accessor.js +138 -91
- package/core/slot/internalSlots.d.ts +2 -0
- package/core/slot/internalSlots.js +1 -6
- package/core/slot/lazy.d.ts +2 -6
- package/core/slot/lazy.js +71 -39
- package/core/slot/slot.d.ts +2 -6
- package/core/slot/slot.js +45 -38
- package/core/slot/slotTypes.d.ts +78 -80
- package/core/slot/slotTypes.js +11 -16
- package/core/texture/externalTexture.d.ts +20 -11
- package/core/texture/externalTexture.js +46 -46
- package/core/texture/texture.d.ts +152 -97
- package/core/texture/texture.js +407 -314
- package/core/texture/textureFormats.d.ts +42 -23
- package/core/texture/textureFormats.js +104 -75
- package/core/texture/textureProps.d.ts +7 -10
- package/core/texture/textureProps.js +1 -0
- package/core/texture/textureUtils.d.ts +8 -0
- package/core/texture/textureUtils.js +185 -179
- package/core/texture/usageExtension.d.ts +21 -18
- package/core/texture/usageExtension.js +13 -17
- package/core/unroll/tgpuUnroll.d.ts +20 -19
- package/core/unroll/tgpuUnroll.js +82 -91
- package/core/valueProxyUtils.d.ts +3 -0
- package/core/valueProxyUtils.js +52 -41
- package/core/variable/tgpuVariable.d.ts +26 -27
- package/core/variable/tgpuVariable.js +93 -96
- package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
- package/core/vertexLayout/connectAttributesToShader.js +61 -56
- package/core/vertexLayout/vertexAttribute.d.ts +21 -17
- package/core/vertexLayout/vertexAttribute.js +1 -0
- package/core/vertexLayout/vertexLayout.d.ts +24 -18
- package/core/vertexLayout/vertexLayout.js +130 -99
- package/core/whitespaces.d.ts +2 -0
- package/core/whitespaces.js +16 -0
- package/data/alignIO.d.ts +7 -0
- package/data/alignIO.js +13 -13
- package/data/alignmentOf.d.ts +5 -8
- package/data/alignmentOf.js +90 -75
- package/data/array.d.ts +17 -9
- package/data/array.js +57 -40
- package/data/atomic.d.ts +2 -7
- package/data/atomic.js +26 -23
- package/data/attributes.d.ts +19 -21
- package/data/attributes.js +192 -132
- package/data/autoStruct.d.ts +36 -3
- package/data/autoStruct.js +84 -81
- package/data/compiledIO.d.ts +5 -0
- package/data/compiledIO.js +231 -215
- package/data/dataIO.d.ts +13 -11
- package/data/dataIO.js +643 -589
- package/data/dataTypes.d.ts +83 -65
- package/data/dataTypes.js +66 -68
- package/data/deepEqual.d.ts +2 -7
- package/data/deepEqual.js +80 -55
- package/data/disarray.d.ts +6 -10
- package/data/disarray.js +52 -46
- package/data/float16Conversion.d.ts +4 -0
- package/data/float16Conversion.js +7 -0
- package/data/generalizeFn.d.ts +25 -0
- package/data/generalizeFn.js +89 -0
- package/data/getLongestContiguousPrefix.d.ts +4 -8
- package/data/getLongestContiguousPrefix.js +6 -11
- package/data/index.d.ts +30 -31
- package/data/index.js +39 -172
- package/data/instanceToSchema.d.ts +24 -27
- package/data/instanceToSchema.js +1 -0
- package/data/isContiguous.d.ts +4 -8
- package/data/isContiguous.js +6 -11
- package/data/matrix.d.ts +21 -21
- package/data/matrix.js +513 -505
- package/data/numberOps.d.ts +5 -0
- package/data/numberOps.js +21 -21
- package/data/numeric.d.ts +21 -12
- package/data/numeric.js +287 -197
- package/data/offsetUtils.d.ts +9 -13
- package/data/offsetUtils.js +204 -144
- package/data/offsets.d.ts +8 -0
- package/data/offsets.js +33 -33
- package/data/partialIO.d.ts +13 -8
- package/data/partialIO.js +124 -113
- package/data/ptr.d.ts +12 -12
- package/data/ptr.js +42 -44
- package/data/ref.d.ts +40 -27
- package/data/ref.js +125 -95
- package/data/sampler.d.ts +99 -101
- package/data/sampler.js +17 -21
- package/data/schemaCallWrapper.d.ts +19 -0
- package/data/schemaCallWrapper.js +31 -26
- package/data/schemaMemoryLayout.d.ts +8 -0
- package/data/schemaMemoryLayout.js +213 -185
- package/data/sizeOf.d.ts +4 -8
- package/data/sizeOf.js +6 -11
- package/data/snippet.d.ts +96 -20
- package/data/snippet.js +75 -86
- package/data/struct.d.ts +4 -7
- package/data/struct.js +51 -39
- package/data/texture.d.ts +253 -250
- package/data/texture.js +238 -200
- package/data/unstruct.d.ts +2 -7
- package/data/unstruct.js +43 -37
- package/data/vector.d.ts +33 -21
- package/data/vector.js +234 -221
- package/data/vectorImpl.d.ts +231 -0
- package/data/vectorImpl.js +563 -515
- package/data/vectorOps.d.ts +25 -0
- package/data/vectorOps.js +118 -669
- package/data/vertexFormatData.d.ts +181 -184
- package/data/vertexFormatData.js +104 -106
- package/data/wgslTypes.d.ts +665 -600
- package/data/wgslTypes.js +220 -198
- package/errors.d.ts +50 -24
- package/errors.js +146 -126
- package/execMode.d.ts +16 -0
- package/execMode.js +47 -40
- package/extension.d.ts +13 -8
- package/extension.js +10 -16
- package/getGPUValue.d.ts +1 -0
- package/getGPUValue.js +2 -7
- package/index.d.ts +28 -68
- package/index.js +8 -28
- package/indexNamedExports.d.ts +69 -42
- package/indexNamedExports.js +25 -0
- package/internal.d.ts +16 -0
- package/internal.js +12 -0
- package/mathUtils.d.ts +5 -0
- package/mathUtils.js +7 -11
- package/memo.d.ts +11 -0
- package/memo.js +20 -22
- package/minify.d.ts +5 -0
- package/minify.js +93 -0
- package/nameUtils.d.ts +29 -0
- package/nameUtils.js +427 -394
- package/package.json +5 -1
- package/resolutionCtx.d.ts +162 -22
- package/resolutionCtx.js +911 -629
- package/serial/registry.d.ts +15 -0
- package/serial/registry.js +106 -0
- package/serial/restore.d.ts +49 -0
- package/serial/restore.js +68 -0
- package/serial/schema.d.ts +58 -0
- package/serial/schema.js +209 -0
- package/serial/types.d.ts +5 -0
- package/serial/types.js +1 -0
- package/shared/env.d.ts +9 -0
- package/shared/env.js +9 -12
- package/shared/generators.d.ts +4 -0
- package/shared/generators.js +10 -12
- package/shared/meta.d.ts +29 -14
- package/shared/meta.js +71 -55
- package/shared/normalizeMetadata.d.ts +32 -27
- package/shared/normalizeMetadata.js +23 -36
- package/shared/repr.d.ts +73 -55
- package/shared/repr.js +1 -0
- package/shared/soul.d.ts +17 -0
- package/shared/soul.js +1 -0
- package/shared/stringify.d.ts +2 -0
- package/shared/stringify.js +29 -20
- package/shared/symbols.d.ts +26 -20
- package/shared/symbols.js +79 -79
- package/shared/tseynit.d.ts +2 -0
- package/shared/tseynit.js +160 -75
- package/shared/utilityTypes.d.ts +30 -14
- package/shared/utilityTypes.js +2 -6
- package/shared/vertexFormat.d.ts +41 -43
- package/shared/vertexFormat.js +59 -62
- package/std/array.d.ts +2 -7
- package/std/array.js +18 -23
- package/std/atomic.d.ts +14 -18
- package/std/atomic.js +96 -95
- package/std/bitcast.d.ts +193 -10
- package/std/bitcast.js +309 -39
- package/std/boolean.d.ts +19 -33
- package/std/boolean.js +296 -292
- package/std/copy.d.ts +2 -7
- package/std/copy.js +27 -24
- package/std/derivative.d.ts +11 -15
- package/std/derivative.js +56 -79
- package/std/discard.d.ts +1 -6
- package/std/discard.js +7 -14
- package/std/environment.d.ts +19 -14
- package/std/environment.js +71 -51
- package/std/extensions.d.ts +2 -8
- package/std/extensions.js +10 -11
- package/std/index.d.ts +20 -24
- package/std/index.js +32 -187
- package/std/matrix.d.ts +6 -12
- package/std/matrix.js +60 -69
- package/std/numeric.d.ts +150 -146
- package/std/numeric.js +771 -727
- package/std/operators.d.ts +19 -27
- package/std/operators.js +195 -194
- package/std/packing.d.ts +5 -11
- package/std/packing.js +67 -75
- package/std/range.d.ts +6 -11
- package/std/range.js +48 -36
- package/std/subgroup.d.ts +33 -37
- package/std/subgroup.js +180 -217
- package/std/texture.d.ts +70 -38
- package/std/texture.js +176 -172
- package/taskQueue.d.ts +6 -0
- package/taskQueue.js +30 -0
- package/tgpu.d.ts +16 -0
- package/tgpu.js +17 -44
- package/tgpuBindGroupLayout.d.ts +132 -152
- package/tgpuBindGroupLayout.js +346 -268
- package/tgpuLogger.d.ts +34 -0
- package/tgpuLogger.js +64 -0
- package/tgpuUnstable.d.ts +16 -22
- package/tgpuUnstable.js +13 -35
- package/tgsl/accessIndex.d.ts +2 -0
- package/tgsl/accessIndex.js +76 -33
- package/tgsl/accessProp.d.ts +2 -0
- package/tgsl/accessProp.js +142 -101
- package/tgsl/accessStructProp.d.ts +5 -0
- package/tgsl/accessStructProp.js +13 -15
- package/tgsl/consoleLog/deserializers.d.ts +13 -0
- package/tgsl/consoleLog/deserializers.js +119 -103
- package/tgsl/consoleLog/logGenerator.d.ts +21 -0
- package/tgsl/consoleLog/logGenerator.js +85 -80
- package/tgsl/consoleLog/serializers.d.ts +21 -0
- package/tgsl/consoleLog/serializers.js +119 -100
- package/tgsl/consoleLog/types.d.ts +40 -39
- package/tgsl/consoleLog/types.js +1 -0
- package/tgsl/conversion.d.ts +33 -0
- package/tgsl/conversion.js +271 -216
- package/tgsl/forOfUtils.d.ts +15 -0
- package/tgsl/forOfUtils.js +85 -70
- package/tgsl/generationHelpers.d.ts +22 -39
- package/tgsl/generationHelpers.js +85 -58
- package/tgsl/infixDispatch.d.ts +70 -0
- package/tgsl/infixDispatch.js +48 -46
- package/tgsl/jsPolyfills.d.ts +16 -19
- package/tgsl/jsPolyfills.js +44 -42
- package/tgsl/makeDereferenceable.d.ts +48 -0
- package/tgsl/makeDereferenceable.js +86 -0
- package/tgsl/makeResolvable.d.ts +22 -0
- package/tgsl/makeResolvable.js +33 -0
- package/tgsl/shaderGenerator.d.ts +77 -17
- package/tgsl/shaderGenerator.js +1 -0
- package/tgsl/shellless.d.ts +6 -9
- package/tgsl/shellless.js +73 -43
- package/tgsl/wgslGenerator.d.ts +66 -59
- package/tgsl/wgslGenerator.js +1345 -760
- package/types.d.ts +287 -222
- package/types.js +61 -44
- package/unwrapper.d.ts +31 -26
- package/unwrapper.js +1 -0
- package/wgslExtensions.d.ts +3 -5
- package/wgslExtensions.js +12 -16
- package/_virtual/rolldown_runtime.js +0 -13
- package/core/buffer/bufferShorthand.d.ts +0 -50
- package/core/buffer/bufferShorthand.js +0 -55
- package/core/pipeline/applyPipelineState.js +0 -37
- package/core/pipeline/limitsOverflow.js +0 -13
- package/package.js +0 -5
- package/tgsl/shaderGenerator_members.d.ts +0 -33
- package/tgsl/shaderGenerator_members.js +0 -12
package/tgsl/jsPolyfills.js
CHANGED
|
@@ -1,44 +1,46 @@
|
|
|
1
1
|
import { f32 } from "../data/numeric.js";
|
|
2
|
-
import { abs, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, cos, cosh, countLeadingZeros, exp, floor, log, log2, max, min, pow, sign, sin, sinh, sqrt, tan, tanh, trunc } from "../std/numeric.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
2
|
+
import { abs, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, cos, cosh, countLeadingZeros, exp, floor, log, log2, max, min, pow, sign, sin, sinh, sqrt, tan, tanh, trunc, } from "../std/numeric.js";
|
|
3
|
+
export const mathToStd = new Map([
|
|
4
|
+
// -- one to one Math to WGSL correlation --
|
|
5
|
+
[Math.abs, abs],
|
|
6
|
+
[Math.acos, acos],
|
|
7
|
+
[Math.acosh, acosh],
|
|
8
|
+
[Math.asin, asin],
|
|
9
|
+
[Math.asinh, asinh],
|
|
10
|
+
[Math.atan, atan],
|
|
11
|
+
[Math.atan2, atan2],
|
|
12
|
+
[Math.atanh, atanh],
|
|
13
|
+
[Math.ceil, ceil],
|
|
14
|
+
[Math.cos, cos],
|
|
15
|
+
[Math.cosh, cosh],
|
|
16
|
+
[Math.exp, exp],
|
|
17
|
+
[Math.floor, floor],
|
|
18
|
+
[Math.fround, f32],
|
|
19
|
+
[Math.clz32, countLeadingZeros],
|
|
20
|
+
[Math.trunc, trunc],
|
|
21
|
+
[Math.log, log],
|
|
22
|
+
[Math.log2, log2],
|
|
23
|
+
[Math.pow, pow],
|
|
24
|
+
[Math.sign, sign],
|
|
25
|
+
[Math.sin, sin],
|
|
26
|
+
[Math.sinh, sinh],
|
|
27
|
+
[Math.sqrt, sqrt],
|
|
28
|
+
[Math.tan, tan],
|
|
29
|
+
[Math.tanh, tanh],
|
|
30
|
+
// -- varying in Math and two arg in WGSL, but we support varying in std --
|
|
31
|
+
[Math.max, max],
|
|
32
|
+
[Math.min, min],
|
|
33
|
+
// -- possible if we extend std --
|
|
34
|
+
// [Math.cbrt, ???],
|
|
35
|
+
// [Math.log10, ???],
|
|
36
|
+
// [Math.log1p, ???],
|
|
37
|
+
// [Math.f16round, ???],
|
|
38
|
+
// [Math.hypot, ???],
|
|
39
|
+
// [Math.expm1, ???],
|
|
40
|
+
// -- skipped --
|
|
41
|
+
// [Math.random, ???],
|
|
42
|
+
// [Math.imul, ???],
|
|
43
|
+
// [Math.round, ???], // round(2.5) is 3 in JS and 2 in WGSL
|
|
33
44
|
]);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
console.debug,
|
|
37
|
-
console.info,
|
|
38
|
-
console.warn,
|
|
39
|
-
console.error,
|
|
40
|
-
console.clear
|
|
41
|
-
];
|
|
42
|
-
|
|
43
|
-
//#endregion
|
|
44
|
-
export { mathToStd, supportedLogOps };
|
|
45
|
+
// deferring the array creation lets us handle console mocks
|
|
46
|
+
export const supportedLogOps = () => [console.log, console.debug, console.info, console.warn, console.error, console.clear];
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Snippet } from '../data/snippet.ts';
|
|
2
|
+
import type { SimulationState } from '../types.ts';
|
|
3
|
+
import type { makeResolvable } from './makeResolvable.ts';
|
|
4
|
+
/**
|
|
5
|
+
* WARNING: This is an API that touches a lot of internals, and is not stable
|
|
6
|
+
* (can change between patches). You should probably talk to the TypeGPU team
|
|
7
|
+
* before using this, maybe we can provide a better public API for your use case.
|
|
8
|
+
*
|
|
9
|
+
* Defines additional properties on `value` (mutates it) that makes TypeGPU
|
|
10
|
+
* understand how it should handle using .$ on that object. All dereferenceable
|
|
11
|
+
* value must also be made resolvable (through the makeResolvable API).
|
|
12
|
+
*
|
|
13
|
+
* `value` can in particular be the prototype of a class, meaning all instances
|
|
14
|
+
* of that class will be dereferenceable.
|
|
15
|
+
*/
|
|
16
|
+
export declare function makeDereferenceable<T extends makeResolvable.Resolvable, TValue>(value: T, options: makeDereferenceable.Options<T, TValue>): T & {
|
|
17
|
+
$: TValue;
|
|
18
|
+
};
|
|
19
|
+
export declare namespace makeDereferenceable {
|
|
20
|
+
interface Options<T extends makeResolvable.Resolvable, TValue> {
|
|
21
|
+
normalMode: {
|
|
22
|
+
get(this: T): TValue;
|
|
23
|
+
set?(this: T, value: TValue): void;
|
|
24
|
+
};
|
|
25
|
+
codegenMode: {
|
|
26
|
+
/**
|
|
27
|
+
* Should return a representative value that is accessible on the GPU.
|
|
28
|
+
* If not provided, `codegenMode.getBaseSnippet` is used instead.
|
|
29
|
+
*/
|
|
30
|
+
get(this: T): TValue;
|
|
31
|
+
} | {
|
|
32
|
+
/**
|
|
33
|
+
* Used if `codegenMode.get` is not defined. The snippet returned from
|
|
34
|
+
* this function should represent the value that exists on .$
|
|
35
|
+
*
|
|
36
|
+
* The value of the snippet should in most cases be `trackingProxy` that
|
|
37
|
+
* is provided as the argument.
|
|
38
|
+
* @param trackingProxy
|
|
39
|
+
*/
|
|
40
|
+
getBaseSnippet(this: T, trackingProxy: TValue): Snippet;
|
|
41
|
+
};
|
|
42
|
+
/** @deprecated 'simulate' mode is planned to be removed in the future */
|
|
43
|
+
simulateMode?: {
|
|
44
|
+
get?(this: T, state: SimulationState): TValue;
|
|
45
|
+
set?(this: T, state: SimulationState, value: TValue): void;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { $gpuValueOf, $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
|
|
2
|
+
import { valueProxyHandler } from "../core/valueProxyUtils.js";
|
|
3
|
+
import { getExecMode } from "../execMode.js";
|
|
4
|
+
import { assertExhaustive } from "../shared/utilityTypes.js";
|
|
5
|
+
/**
|
|
6
|
+
* WARNING: This is an API that touches a lot of internals, and is not stable
|
|
7
|
+
* (can change between patches). You should probably talk to the TypeGPU team
|
|
8
|
+
* before using this, maybe we can provide a better public API for your use case.
|
|
9
|
+
*
|
|
10
|
+
* Defines additional properties on `value` (mutates it) that makes TypeGPU
|
|
11
|
+
* understand how it should handle using .$ on that object. All dereferenceable
|
|
12
|
+
* value must also be made resolvable (through the makeResolvable API).
|
|
13
|
+
*
|
|
14
|
+
* `value` can in particular be the prototype of a class, meaning all instances
|
|
15
|
+
* of that class will be dereferenceable.
|
|
16
|
+
*/
|
|
17
|
+
export function makeDereferenceable(value, options) {
|
|
18
|
+
Object.defineProperty(value, $gpuValueOf, {
|
|
19
|
+
get() {
|
|
20
|
+
if ('get' in options.codegenMode) {
|
|
21
|
+
return options.codegenMode.get.apply(this);
|
|
22
|
+
}
|
|
23
|
+
// oxlint-disable-next-line typescript/no-this-alias
|
|
24
|
+
const resource = this;
|
|
25
|
+
return new Proxy({
|
|
26
|
+
[$internal]: true,
|
|
27
|
+
get [$ownSnippet]() {
|
|
28
|
+
if (!('getBaseSnippet' in options.codegenMode)) {
|
|
29
|
+
throw new Error(`Expected 'getBaseSnippet' to be defined.`);
|
|
30
|
+
}
|
|
31
|
+
return options.codegenMode.getBaseSnippet.apply(resource, [this]);
|
|
32
|
+
},
|
|
33
|
+
[$resolve]: (ctx) => ctx.resolve(resource),
|
|
34
|
+
toString: () => `${resource.toString()}.$`,
|
|
35
|
+
}, valueProxyHandler);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(value, '$', {
|
|
39
|
+
get() {
|
|
40
|
+
const mode = getExecMode();
|
|
41
|
+
if (mode.type === 'codegen') {
|
|
42
|
+
return this[$gpuValueOf];
|
|
43
|
+
}
|
|
44
|
+
if (mode.type === 'simulate') {
|
|
45
|
+
if (options.simulateMode?.get) {
|
|
46
|
+
return options.simulateMode.get.apply(this, [mode]);
|
|
47
|
+
}
|
|
48
|
+
return options.normalMode.get.apply(this);
|
|
49
|
+
}
|
|
50
|
+
if (mode.type === 'normal') {
|
|
51
|
+
return options.normalMode.get.apply(this);
|
|
52
|
+
}
|
|
53
|
+
return assertExhaustive(mode, 'makeDereferenceable.ts#$ (get)');
|
|
54
|
+
},
|
|
55
|
+
set(value) {
|
|
56
|
+
const mode = getExecMode();
|
|
57
|
+
if (mode.type === 'normal') {
|
|
58
|
+
if (!options.normalMode.set) {
|
|
59
|
+
throw new Error(`'${this.toString()}' cannot be set in normal mode`);
|
|
60
|
+
}
|
|
61
|
+
options.normalMode.set.apply(this, [value]);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (mode.type === 'simulate') {
|
|
65
|
+
if (options.simulateMode?.set) {
|
|
66
|
+
options.simulateMode.set.apply(this, [mode, value]);
|
|
67
|
+
}
|
|
68
|
+
else if (options.normalMode.set) {
|
|
69
|
+
// Falling back to the 'normal' set
|
|
70
|
+
options.normalMode.set.apply(this, [value]);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
throw new Error(`'${this.toString()}' cannot be set in simulate mode`);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (mode.type === 'codegen') {
|
|
78
|
+
// The shader generator handles assignment, and does not defer to
|
|
79
|
+
// whatever's being assigned to generate the shader code.
|
|
80
|
+
throw new Error('Unreachable makeDerefenceable.ts#$ (set)');
|
|
81
|
+
}
|
|
82
|
+
return assertExhaustive(mode, 'makeDereferenceable.ts#$ (set)');
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ResolvedSnippet } from '../data/snippet.ts';
|
|
2
|
+
import type { ResolutionCtx, SelfResolvable } from '../types.ts';
|
|
3
|
+
/**
|
|
4
|
+
* WARNING: This is an API that touches a lot of internals, and is not stable
|
|
5
|
+
* (can change between patches). You should probably talk to the TypeGPU team
|
|
6
|
+
* before using this, maybe we can provide a better public API for your use case.
|
|
7
|
+
*
|
|
8
|
+
* Defines additional properties on `value` (mutates it) that makes TypeGPU
|
|
9
|
+
* understand how it should handle passing this object to the `tgpu.resolve`
|
|
10
|
+
* API, or just how to generate shader code from it to begin with.
|
|
11
|
+
*
|
|
12
|
+
* `value` can in particular be the prototype of a class, meaning all instances
|
|
13
|
+
* of that class will be resolvable.
|
|
14
|
+
*/
|
|
15
|
+
export declare function makeResolvable<T extends object>(value: T, options: makeResolvable.Options<T>): T & SelfResolvable;
|
|
16
|
+
export declare namespace makeResolvable {
|
|
17
|
+
interface Options<T> {
|
|
18
|
+
resolve(this: T, ctx: ResolutionCtx): ResolvedSnippet;
|
|
19
|
+
asString(this: T): string;
|
|
20
|
+
}
|
|
21
|
+
type Resolvable = SelfResolvable;
|
|
22
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {} from "../data/snippet.js";
|
|
2
|
+
import { $internal, $resolve, isMarkedInternal } from "../shared/symbols.js";
|
|
3
|
+
/**
|
|
4
|
+
* WARNING: This is an API that touches a lot of internals, and is not stable
|
|
5
|
+
* (can change between patches). You should probably talk to the TypeGPU team
|
|
6
|
+
* before using this, maybe we can provide a better public API for your use case.
|
|
7
|
+
*
|
|
8
|
+
* Defines additional properties on `value` (mutates it) that makes TypeGPU
|
|
9
|
+
* understand how it should handle passing this object to the `tgpu.resolve`
|
|
10
|
+
* API, or just how to generate shader code from it to begin with.
|
|
11
|
+
*
|
|
12
|
+
* `value` can in particular be the prototype of a class, meaning all instances
|
|
13
|
+
* of that class will be resolvable.
|
|
14
|
+
*/
|
|
15
|
+
export function makeResolvable(value, options) {
|
|
16
|
+
if (!isMarkedInternal(value)) {
|
|
17
|
+
Object.defineProperty(value, $internal, {
|
|
18
|
+
value: true,
|
|
19
|
+
writable: true,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(value, 'toString', {
|
|
23
|
+
value() {
|
|
24
|
+
return options.asString.apply(this);
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(value, $resolve, {
|
|
28
|
+
value(ctx) {
|
|
29
|
+
return options.resolve.apply(this, [ctx]);
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
@@ -1,24 +1,84 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import type { Block } from 'tinyest';
|
|
2
|
+
import type { BaseData } from '../data/wgslTypes.ts';
|
|
3
|
+
import type { ResolvedSnippet, Snippet } from '../data/snippet.ts';
|
|
4
|
+
import type { VariableScope } from '../core/variable/tgpuVariable.ts';
|
|
5
|
+
import type { BindableBufferUsage, FunctionArgument, ResolutionCtx, ShaderStage } from '../types.ts';
|
|
6
|
+
export interface FunctionDefinitionOptions {
|
|
7
|
+
readonly functionType: 'normal' | ShaderStage;
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly workgroupSize?: readonly number[] | undefined;
|
|
10
|
+
readonly args: readonly FunctionArgument[];
|
|
11
|
+
readonly body: Block;
|
|
12
|
+
determineReturnType(): BaseData;
|
|
13
|
+
}
|
|
14
|
+
export interface ConstantDefinitionOptions {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly dataType: BaseData;
|
|
17
|
+
readonly init: Snippet;
|
|
18
|
+
}
|
|
19
|
+
export interface VariableDefinitionOptions {
|
|
20
|
+
readonly scope: VariableScope | BindableBufferUsage | 'handle';
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly dataType: BaseData;
|
|
23
|
+
readonly init: Snippet | undefined;
|
|
24
|
+
readonly group?: string | undefined;
|
|
25
|
+
readonly binding?: number | undefined;
|
|
26
|
+
}
|
|
27
|
+
export interface ResolvedStatement {
|
|
28
|
+
code: string;
|
|
29
|
+
/**
|
|
30
|
+
* True if the statement (or statements) in `code` define variables that would
|
|
31
|
+
* be scoped to the nearest block.
|
|
32
|
+
*/
|
|
33
|
+
definesInNearestScope: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* If not undefined, the execution of the statement (or statements) in `code`
|
|
36
|
+
* *ends* in a control flow statement that will always cause the subsequent
|
|
37
|
+
* statements to not be executed.
|
|
38
|
+
*
|
|
39
|
+
* For example, statements with code set to `return;`, `break;` and `continue;`
|
|
40
|
+
* will have this field set to 'return', 'break' and 'continue' respectively.
|
|
41
|
+
* So will any sequence of statements that end with them, or `return value;`
|
|
42
|
+
*
|
|
43
|
+
* However, the statement `if (cond) { return; }` has `endsWithControlFlow` set to `undefined`,
|
|
44
|
+
* because it's not guaranteed that including this code in a sequence will cause all
|
|
45
|
+
* subsequent statements to be unreachable.
|
|
46
|
+
*/
|
|
47
|
+
endsWithControlFlow?: 'return' | 'break' | 'continue' | undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* **NOTE: This is an unstable API and may change in the future.**
|
|
51
|
+
*
|
|
52
|
+
* Used to instantiate generators, once per resolution context
|
|
53
|
+
*/
|
|
54
|
+
export interface ShaderGeneratorClass<T extends ShaderGenerator = ShaderGenerator> {
|
|
55
|
+
new (): T;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Binary operators that can appear in WGSL
|
|
59
|
+
*/
|
|
60
|
+
export type BinaryOperator = '=' | '^' | '|' | '&' | '*' | '/' | '%' | '+' | '-' | '<<' | '>>' | '<' | '>' | '<=' | '>=' | '==' | '!=' | '&&' | '||' | '+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '&=' | '|=' | '^=';
|
|
61
|
+
/**
|
|
62
|
+
* Represents generators that, once instantiated, will generate `wgsl` (as opposed to e.g. `glsl`)
|
|
63
|
+
*/
|
|
64
|
+
export type WgslGeneratorClass = ShaderGeneratorClass<ShaderGenerator & {
|
|
65
|
+
languageKey: 'wgsl';
|
|
66
|
+
}>;
|
|
8
67
|
/**
|
|
9
68
|
* **NOTE: This is an unstable API and may change in the future.**
|
|
10
69
|
*
|
|
11
70
|
* An interface meant to be used by other systems to generate snippets of
|
|
12
71
|
* shader code in the target language (WGSL, GLSL, etc.).
|
|
13
72
|
*/
|
|
14
|
-
interface ShaderGenerator {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
73
|
+
export interface ShaderGenerator {
|
|
74
|
+
readonly languageKey: string;
|
|
75
|
+
initGenerator(ctx: ResolutionCtx): void;
|
|
76
|
+
declareGlobalConst(options: ConstantDefinitionOptions): ResolvedSnippet;
|
|
77
|
+
declareGlobalVar(options: VariableDefinitionOptions): ResolvedSnippet;
|
|
78
|
+
functionDefinition(options: FunctionDefinitionOptions): string;
|
|
79
|
+
typeInstantiation(schema: BaseData, args: readonly Snippet[]): ResolvedSnippet;
|
|
80
|
+
numericLiteral(value: number, schema: BaseData): ResolvedSnippet;
|
|
81
|
+
emitTypeAnnotation(schema: BaseData): string;
|
|
82
|
+
emitCall(name: string, templateParams: readonly Snippet[], args: readonly Snippet[]): string;
|
|
83
|
+
emitBinaryOp(lhs: Snippet, op: BinaryOperator, rhs: Snippet): string;
|
|
22
84
|
}
|
|
23
|
-
//#endregion
|
|
24
|
-
export { ShaderGenerator };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/tgsl/shellless.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/tgsl/shellless.d.ts
|
|
1
|
+
import { type ShelllessImpl } from '../core/function/shelllessImpl.ts';
|
|
2
|
+
import type { Snippet } from '../data/snippet.ts';
|
|
5
3
|
type AnyFn = (...args: never[]) => unknown;
|
|
6
|
-
declare class ShelllessRepository {
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
export declare class ShelllessRepository {
|
|
5
|
+
cache: Map<AnyFn, ShelllessImpl[]>;
|
|
6
|
+
get(fn: AnyFn, argSnippets: readonly Snippet[] | undefined): ShelllessImpl | undefined;
|
|
9
7
|
}
|
|
10
|
-
|
|
11
|
-
export { ShelllessRepository };
|
|
8
|
+
export {};
|
package/tgsl/shellless.js
CHANGED
|
@@ -1,48 +1,78 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getFunctionMetadata, getName } from "../shared/meta.js";
|
|
1
|
+
import { createShelllessImpl } from "../core/function/shelllessImpl.js";
|
|
3
2
|
import { UnknownData } from "../data/dataTypes.js";
|
|
4
|
-
import { WgslTypeError } from "../errors.js";
|
|
5
3
|
import { RefOperator } from "../data/ref.js";
|
|
4
|
+
import { isPtr, isWgslArray, isWgslStruct } from "../data/wgslTypes.js";
|
|
5
|
+
import { WgslTypeError } from "../errors.js";
|
|
6
|
+
import { getFunctionMetadata, getName } from "../shared/meta.js";
|
|
6
7
|
import { concretize } from "./generationHelpers.js";
|
|
7
|
-
import { createShelllessImpl } from "../core/function/shelllessImpl.js";
|
|
8
|
-
|
|
9
|
-
//#region src/tgsl/shellless.ts
|
|
10
8
|
function shallowEqualSchemas(a, b) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
if (a.type !== b.type)
|
|
10
|
+
return false;
|
|
11
|
+
if (isPtr(a) && isPtr(b)) {
|
|
12
|
+
return (a.access === b.access &&
|
|
13
|
+
a.addressSpace === b.addressSpace &&
|
|
14
|
+
a.implicit === b.implicit &&
|
|
15
|
+
shallowEqualSchemas(a.inner, b.inner));
|
|
16
|
+
}
|
|
17
|
+
if (isWgslArray(a) && isWgslArray(b)) {
|
|
18
|
+
return a.elementCount === b.elementCount && shallowEqualSchemas(a.elementType, b.elementType);
|
|
19
|
+
}
|
|
20
|
+
if (isWgslStruct(a) && isWgslStruct(b)) {
|
|
21
|
+
// Only structs with the same identity are considered equal
|
|
22
|
+
return a === b;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
export class ShelllessRepository {
|
|
27
|
+
cache = new Map();
|
|
28
|
+
get(fn, argSnippets) {
|
|
29
|
+
const meta = getFunctionMetadata(fn);
|
|
30
|
+
if (!meta) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
if (!argSnippets && meta.ast.params.length > 0) {
|
|
34
|
+
throw new Error(`Cannot resolve '${getName(fn)}' directly, because it expects arguments. Either call it from another function, or wrap it in a shell`);
|
|
35
|
+
}
|
|
36
|
+
const argTypes = (argSnippets ?? []).map((s, index) => {
|
|
37
|
+
if (s.value instanceof RefOperator) {
|
|
38
|
+
if (s.dataType === UnknownData) {
|
|
39
|
+
throw new WgslTypeError(`d.ref() created with primitive types must be stored in a variable before use`);
|
|
40
|
+
}
|
|
41
|
+
return s.dataType;
|
|
42
|
+
}
|
|
43
|
+
if (s.dataType === UnknownData) {
|
|
44
|
+
throw new Error(`Passed illegal value ${s.value} as the #${index} argument to ${getName(fn) ?? '<unnamed>'}(...)\n` +
|
|
45
|
+
`Shellless functions can only accept arguments representing WGSL resources: constructible WGSL types, d.refs, samplers or texture views.\n` +
|
|
46
|
+
`Remember, that arguments such as samplers, texture views, accessors, slots etc. should be dereferenced via '.$' first.`);
|
|
47
|
+
}
|
|
48
|
+
let type = concretize(s.dataType);
|
|
49
|
+
if (isPtr(type) && type.implicit) {
|
|
50
|
+
// If the pointer was made implicitly (e.g. by assigning a reference to a const variable),
|
|
51
|
+
// then we dereference the pointer before passing it to the function. The main reason for this,
|
|
52
|
+
// is that in TypeScript, the type of the function accepts a value, not the value wrapped in
|
|
53
|
+
// d.ref<> (so it's not considered mutable from the perspective of the function)
|
|
54
|
+
// Example:
|
|
55
|
+
// const foo = layout.$.boids;
|
|
56
|
+
// bar(foo)
|
|
57
|
+
// ^^^
|
|
58
|
+
type = type.inner;
|
|
59
|
+
}
|
|
60
|
+
return type;
|
|
61
|
+
});
|
|
62
|
+
let cache = this.cache.get(fn);
|
|
63
|
+
if (cache) {
|
|
64
|
+
const variant = cache.find((v) => v.argTypes.length === argTypes.length &&
|
|
65
|
+
v.argTypes.every((t, i) => shallowEqualSchemas(t, argTypes[i])));
|
|
66
|
+
if (variant) {
|
|
67
|
+
return variant;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
cache = [];
|
|
72
|
+
this.cache.set(fn, cache);
|
|
73
|
+
}
|
|
74
|
+
const shellless = createShelllessImpl(argTypes, fn);
|
|
75
|
+
cache.push(shellless);
|
|
76
|
+
return shellless;
|
|
77
|
+
}
|
|
16
78
|
}
|
|
17
|
-
var ShelllessRepository = class {
|
|
18
|
-
cache = /* @__PURE__ */ new Map();
|
|
19
|
-
get(fn, argSnippets) {
|
|
20
|
-
const meta = getFunctionMetadata(fn);
|
|
21
|
-
if (!meta) return;
|
|
22
|
-
if (!argSnippets && meta.ast.params.length > 0) throw new Error(`Cannot resolve '${getName(fn)}' directly, because it expects arguments. Either call it from another function, or wrap it in a shell`);
|
|
23
|
-
const argTypes = (argSnippets ?? []).map((s, index) => {
|
|
24
|
-
if (s.value instanceof RefOperator) {
|
|
25
|
-
if (s.dataType === UnknownData) throw new WgslTypeError(`d.ref() created with primitive types must be stored in a variable before use`);
|
|
26
|
-
return s.dataType;
|
|
27
|
-
}
|
|
28
|
-
if (s.dataType === UnknownData) throw new Error(`Passed illegal value ${s.value} as the #${index} argument to ${getName(fn) ?? "<unnamed>"}(...)\nShellless functions can only accept arguments representing WGSL resources: constructible WGSL types, d.refs, samplers or texture views.\nRemember, that arguments such as samplers, texture views, accessors, slots etc. should be dereferenced via '.$' first.`);
|
|
29
|
-
let type = concretize(s.dataType);
|
|
30
|
-
if (isPtr(type) && type.implicit) type = type.inner;
|
|
31
|
-
return type;
|
|
32
|
-
});
|
|
33
|
-
let cache = this.cache.get(fn);
|
|
34
|
-
if (cache) {
|
|
35
|
-
const variant = cache.find((v) => v.argTypes.length === argTypes.length && v.argTypes.every((t, i) => shallowEqualSchemas(t, argTypes[i])));
|
|
36
|
-
if (variant) return variant;
|
|
37
|
-
} else {
|
|
38
|
-
cache = [];
|
|
39
|
-
this.cache.set(fn, cache);
|
|
40
|
-
}
|
|
41
|
-
const shellless = createShelllessImpl(argTypes, fn);
|
|
42
|
-
cache.push(shellless);
|
|
43
|
-
return shellless;
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
//#endregion
|
|
48
|
-
export { ShelllessRepository };
|