typegpu 0.11.9 → 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 +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/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 +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 +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 -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/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 -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 +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 -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 -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 -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 +1344 -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/package.js +0 -5
- package/tgsl/shaderGenerator_members.d.ts +0 -33
- package/tgsl/shaderGenerator_members.js +0 -12
|
@@ -1,96 +1,87 @@
|
|
|
1
1
|
import { $gpuCallable, $internal, $resolve } from "../../shared/symbols.js";
|
|
2
2
|
import { setName } from "../../shared/meta.js";
|
|
3
|
-
import {
|
|
4
|
-
import { stitch } from "../resolve/stitch.js";
|
|
5
|
-
|
|
6
|
-
//#region src/core/unroll/tgpuUnroll.ts
|
|
3
|
+
import { withValue } from "../../data/snippet.js";
|
|
7
4
|
/**
|
|
8
|
-
* The result of calling `tgpu.unroll(...)`. The code responsible for
|
|
9
|
-
* generating shader code can check if the value of a snippet is
|
|
10
|
-
* an instance of `UnrollableIterable`, and act accordingly.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
5
|
+
* The result of calling `tgpu.unroll(...)`. The code responsible for
|
|
6
|
+
* generating shader code can check if the value of a snippet is
|
|
7
|
+
* an instance of `UnrollableIterable`, and act accordingly.
|
|
8
|
+
*/
|
|
9
|
+
export class UnrollableIterable {
|
|
10
|
+
[$internal] = true;
|
|
11
|
+
snippet;
|
|
12
|
+
constructor(snippet) {
|
|
13
|
+
this.snippet = snippet;
|
|
14
|
+
}
|
|
15
|
+
[$resolve](ctx) {
|
|
16
|
+
return ctx.resolveSnippet(this.snippet);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
22
19
|
/**
|
|
23
|
-
* Marks an iterable to be unrolled by the shader generator when used in a for loop.
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```ts
|
|
27
|
-
* const neighborOffsets = [d.vec2i(0, 1), d.vec2i(0, -1), d.vec2i(1, 0), d.vec2i(-1, 0)];
|
|
28
|
-
*
|
|
29
|
-
* // Unrolls into 4 blocks of code, one for each offset.
|
|
30
|
-
* for (const offset of tgpu.unroll(neighborOffsets)) {
|
|
31
|
-
* // ...
|
|
32
|
-
* }
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* If you'd like to unroll over a range of numbers, use `tgpu.unroll(std.range(n))`.
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```ts
|
|
39
|
-
* // (...)
|
|
40
|
-
* const FBM_OCTAVES = 3;
|
|
41
|
-
*
|
|
42
|
-
* function fbm(pos: d.v3f): number {
|
|
43
|
-
* 'use gpu';
|
|
44
|
-
* let sum = d.f32();
|
|
45
|
-
*
|
|
46
|
-
* // i = 0, 1, 2
|
|
47
|
-
* for (const i of tgpu.unroll(std.range(FBM_OCTAVES))) {
|
|
48
|
-
* sum +=
|
|
49
|
-
* noise3d(pos * (CLOUD_FREQUENCY * FBM_LACUNARITY ** i)) *
|
|
50
|
-
* (CLOUD_AMPLITUDE * FBM_PERSISTENCE ** i);
|
|
51
|
-
* }
|
|
52
|
-
*
|
|
53
|
-
* return sum;
|
|
54
|
-
* }
|
|
55
|
-
*
|
|
56
|
-
* ```
|
|
57
|
-
*
|
|
58
|
-
* Generates:
|
|
59
|
-
*
|
|
60
|
-
* ```wgsl
|
|
61
|
-
* // (...)
|
|
62
|
-
*
|
|
63
|
-
* fn fbm(pos: vec3f) -> f32 {
|
|
64
|
-
* var sum = 0f;
|
|
65
|
-
* // unrolled iteration #0
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* // unrolled iteration #
|
|
70
|
-
*
|
|
71
|
-
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return snip(new UnrollableIterable(value), value.dataType, value.origin);
|
|
91
|
-
} };
|
|
92
|
-
return impl;
|
|
20
|
+
* Marks an iterable to be unrolled by the shader generator when used in a for loop.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const neighborOffsets = [d.vec2i(0, 1), d.vec2i(0, -1), d.vec2i(1, 0), d.vec2i(-1, 0)];
|
|
25
|
+
*
|
|
26
|
+
* // Unrolls into 4 blocks of code, one for each offset.
|
|
27
|
+
* for (const offset of tgpu.unroll(neighborOffsets)) {
|
|
28
|
+
* // ...
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* If you'd like to unroll over a range of numbers, use `tgpu.unroll(std.range(n))`.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* // (...)
|
|
37
|
+
* const FBM_OCTAVES = 3;
|
|
38
|
+
*
|
|
39
|
+
* function fbm(pos: d.v3f): number {
|
|
40
|
+
* 'use gpu';
|
|
41
|
+
* let sum = d.f32();
|
|
42
|
+
*
|
|
43
|
+
* // i = 0, 1, 2
|
|
44
|
+
* for (const i of tgpu.unroll(std.range(FBM_OCTAVES))) {
|
|
45
|
+
* sum +=
|
|
46
|
+
* noise3d(pos * (CLOUD_FREQUENCY * FBM_LACUNARITY ** i)) *
|
|
47
|
+
* (CLOUD_AMPLITUDE * FBM_PERSISTENCE ** i);
|
|
48
|
+
* }
|
|
49
|
+
*
|
|
50
|
+
* return sum;
|
|
51
|
+
* }
|
|
52
|
+
*
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* Generates:
|
|
56
|
+
*
|
|
57
|
+
* ```wgsl
|
|
58
|
+
* // (...)
|
|
59
|
+
*
|
|
60
|
+
* fn fbm(pos: vec3f) -> f32 {
|
|
61
|
+
* var sum = 0f;
|
|
62
|
+
* // unrolled iteration #0
|
|
63
|
+
* sum += noise3d(pos * 1.4f) * 1f;
|
|
64
|
+
* // unrolled iteration #1
|
|
65
|
+
* sum += noise3d(pos * 2.8f) * 0.5f;
|
|
66
|
+
* // unrolled iteration #2
|
|
67
|
+
* sum += noise3d(pos * 5.6f) * 0.25f;
|
|
68
|
+
* // ---
|
|
69
|
+
* return sum;
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export const unroll = (() => {
|
|
74
|
+
function jsImpl(iterable) {
|
|
75
|
+
return iterable;
|
|
76
|
+
}
|
|
77
|
+
const impl = jsImpl;
|
|
78
|
+
setName(impl, 'unroll');
|
|
79
|
+
impl.toString = () => 'unroll';
|
|
80
|
+
impl[$internal] = true;
|
|
81
|
+
impl[$gpuCallable] = {
|
|
82
|
+
call(_ctx, [value]) {
|
|
83
|
+
return withValue(new UnrollableIterable(value), value);
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
return impl;
|
|
93
87
|
})();
|
|
94
|
-
|
|
95
|
-
//#endregion
|
|
96
|
-
export { UnrollableIterable, unroll };
|
package/core/valueProxyUtils.js
CHANGED
|
@@ -1,44 +1,55 @@
|
|
|
1
|
-
import { $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
|
|
2
|
-
import { getOwnSnippet } from "../types.js";
|
|
3
1
|
import { getGPUValue } from "../getGPUValue.js";
|
|
4
|
-
import {
|
|
2
|
+
import { $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
|
|
5
3
|
import { accessIndex } from "../tgsl/accessIndex.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const valueProxyHandler = {
|
|
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
|
-
|
|
4
|
+
import { accessProp } from "../tgsl/accessProp.js";
|
|
5
|
+
import { getOwnSnippet } from "../types.js";
|
|
6
|
+
export const valueProxyHandler = {
|
|
7
|
+
get(target, prop) {
|
|
8
|
+
if (prop in target) {
|
|
9
|
+
return Reflect.get(target, prop);
|
|
10
|
+
}
|
|
11
|
+
if (prop === 'toString' || prop === Symbol.toStringTag || prop === Symbol.toPrimitive) {
|
|
12
|
+
return () => target.toString();
|
|
13
|
+
}
|
|
14
|
+
if (typeof prop === 'symbol') {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const targetSnippet = getOwnSnippet(target);
|
|
18
|
+
const index = Number(prop);
|
|
19
|
+
if (!Number.isNaN(index)) {
|
|
20
|
+
const accessed = accessIndex(targetSnippet, index);
|
|
21
|
+
if (!accessed) {
|
|
22
|
+
// Prop was not found, must be missing from this object
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return new Proxy({
|
|
26
|
+
[$internal]: true,
|
|
27
|
+
[$resolve]: (ctx) => ctx.resolveSnippet(accessed),
|
|
28
|
+
[$ownSnippet]: accessed,
|
|
29
|
+
toString: () => `${String(target)}[${prop}]`,
|
|
30
|
+
}, valueProxyHandler);
|
|
31
|
+
}
|
|
32
|
+
const accessed = accessProp(targetSnippet, String(prop));
|
|
33
|
+
if (!accessed) {
|
|
34
|
+
// Prop was not found, must be missing from this object
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return new Proxy({
|
|
38
|
+
[$internal]: true,
|
|
39
|
+
[$resolve]: (ctx) => ctx.resolveSnippet(accessed),
|
|
40
|
+
[$ownSnippet]: accessed,
|
|
41
|
+
toString: () => `${String(target)}.${prop}`,
|
|
42
|
+
}, valueProxyHandler);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
export function getGpuValueRecursively(value) {
|
|
46
|
+
let unwrapped = value;
|
|
47
|
+
while (true) {
|
|
48
|
+
const gpuValue = getGPUValue(unwrapped);
|
|
49
|
+
if (!gpuValue) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
unwrapped = gpuValue;
|
|
53
|
+
}
|
|
54
|
+
return unwrapped;
|
|
41
55
|
}
|
|
42
|
-
|
|
43
|
-
//#endregion
|
|
44
|
-
export { getGpuValueRecursively, valueProxyHandler };
|
|
@@ -1,25 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { InferGPU } from
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
import type { AnyData } from '../../data/dataTypes.ts';
|
|
2
|
+
import type { BaseData } from '../../data/wgslTypes.ts';
|
|
3
|
+
import type { TgpuNamable } from '../../shared/meta.ts';
|
|
4
|
+
import type { InferGPU } from '../../shared/repr.ts';
|
|
5
|
+
import type { TgpuSoul } from '../../shared/soul.ts';
|
|
6
|
+
import { $gpuValueOf, $internal, $soul } from '../../shared/symbols.ts';
|
|
7
|
+
export type VariableScope = 'private' | 'workgroup';
|
|
8
|
+
export interface TgpuVarSoul<TScope extends VariableScope = VariableScope, TDataType extends BaseData = BaseData> extends TgpuSoul<'var'> {
|
|
9
|
+
readonly scope: TScope;
|
|
10
|
+
readonly dataType: TDataType;
|
|
11
|
+
readonly initialValue: InferGPU<TDataType> | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface TgpuVar<TScope extends VariableScope = VariableScope, TDataType extends BaseData = BaseData> extends TgpuNamable {
|
|
14
|
+
readonly resourceType: 'var';
|
|
15
|
+
readonly [$gpuValueOf]: InferGPU<TDataType>;
|
|
16
|
+
$: InferGPU<TDataType>;
|
|
17
|
+
readonly [$soul]: TgpuVarSoul<TScope, TDataType>;
|
|
18
|
+
readonly [$internal]: {
|
|
19
|
+
/** Makes it differentiable on the type level. Does not exist at runtime. */
|
|
20
|
+
dataType?: TDataType;
|
|
21
|
+
/** Makes it differentiable on the type level. Does not exist at runtime. */
|
|
22
|
+
scope?: TScope;
|
|
23
|
+
};
|
|
23
24
|
}
|
|
24
25
|
/**
|
|
25
26
|
* Defines a variable scoped to each entry function (private).
|
|
@@ -27,14 +28,12 @@ interface TgpuVar<TScope extends VariableScope = VariableScope, TDataType extend
|
|
|
27
28
|
* @param dataType The schema of the held data's type
|
|
28
29
|
* @param initialValue If not provided, the variable will be initialized to the dataType's "zero-value".
|
|
29
30
|
*/
|
|
30
|
-
declare function privateVar<TDataType extends AnyData>(dataType: TDataType, initialValue?: InferGPU<TDataType>): TgpuVar<'private', TDataType>;
|
|
31
|
+
export declare function privateVar<TDataType extends AnyData>(dataType: TDataType, initialValue?: InferGPU<TDataType>): TgpuVar<'private', TDataType>;
|
|
31
32
|
/**
|
|
32
33
|
* Defines a variable scoped to the whole workgroup, shared between entry functions
|
|
33
34
|
* of the same invocation.
|
|
34
35
|
*
|
|
35
36
|
* @param dataType The schema of the held data's type
|
|
36
37
|
*/
|
|
37
|
-
declare function workgroupVar<TDataType extends AnyData>(dataType: TDataType): TgpuVar<'workgroup', TDataType>;
|
|
38
|
-
declare function isVariable(value: unknown): value is TgpuVar;
|
|
39
|
-
//#endregion
|
|
40
|
-
export { TgpuVar, VariableScope, isVariable, privateVar, workgroupVar };
|
|
38
|
+
export declare function workgroupVar<TDataType extends AnyData>(dataType: TDataType): TgpuVar<'workgroup', TDataType>;
|
|
39
|
+
export declare function isVariable(value: unknown): value is TgpuVar;
|
|
@@ -1,103 +1,100 @@
|
|
|
1
|
-
import { $gpuValueOf, $internal, $ownSnippet, $resolve } from "../../shared/symbols.js";
|
|
2
|
-
import { getName, setName } from "../../shared/meta.js";
|
|
3
1
|
import { snip } from "../../data/snippet.js";
|
|
4
2
|
import { IllegalVarAccessError } from "../../errors.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { isInsideTgpuFn } from "../../execMode.js";
|
|
4
|
+
import { makeDereferenceable } from "../../tgsl/makeDereferenceable.js";
|
|
5
|
+
import { makeResolvable } from "../../tgsl/makeResolvable.js";
|
|
6
|
+
import { getName, setName } from "../../shared/meta.js";
|
|
7
|
+
import { $gpuValueOf, $internal, $soul } from "../../shared/symbols.js";
|
|
10
8
|
/**
|
|
11
|
-
* Defines a variable scoped to each entry function (private).
|
|
12
|
-
*
|
|
13
|
-
* @param dataType The schema of the held data's type
|
|
14
|
-
* @param initialValue If not provided, the variable will be initialized to the dataType's "zero-value".
|
|
15
|
-
*/
|
|
16
|
-
function privateVar(dataType, initialValue) {
|
|
17
|
-
|
|
9
|
+
* Defines a variable scoped to each entry function (private).
|
|
10
|
+
*
|
|
11
|
+
* @param dataType The schema of the held data's type
|
|
12
|
+
* @param initialValue If not provided, the variable will be initialized to the dataType's "zero-value".
|
|
13
|
+
*/
|
|
14
|
+
export function privateVar(dataType, initialValue) {
|
|
15
|
+
return new TgpuVarImpl('private', dataType, initialValue);
|
|
18
16
|
}
|
|
19
17
|
/**
|
|
20
|
-
* Defines a variable scoped to the whole workgroup, shared between entry functions
|
|
21
|
-
* of the same invocation.
|
|
22
|
-
*
|
|
23
|
-
* @param dataType The schema of the held data's type
|
|
24
|
-
*/
|
|
25
|
-
function workgroupVar(dataType) {
|
|
26
|
-
|
|
18
|
+
* Defines a variable scoped to the whole workgroup, shared between entry functions
|
|
19
|
+
* of the same invocation.
|
|
20
|
+
*
|
|
21
|
+
* @param dataType The schema of the held data's type
|
|
22
|
+
*/
|
|
23
|
+
export function workgroupVar(dataType) {
|
|
24
|
+
return new TgpuVarImpl('workgroup', dataType);
|
|
25
|
+
}
|
|
26
|
+
export function isVariable(value) {
|
|
27
|
+
return value instanceof TgpuVarImpl;
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
// --------------
|
|
30
|
+
// Implementation
|
|
31
|
+
// --------------
|
|
32
|
+
class TgpuVarImpl {
|
|
33
|
+
[$soul];
|
|
34
|
+
static {
|
|
35
|
+
const prototype = TgpuVarImpl.prototype;
|
|
36
|
+
prototype.resourceType = 'var';
|
|
37
|
+
prototype[$internal] = {};
|
|
38
|
+
makeDereferenceable(makeResolvable(prototype, {
|
|
39
|
+
asString() {
|
|
40
|
+
return `var:${getName(this) ?? '<unnamed>'}`;
|
|
41
|
+
},
|
|
42
|
+
resolve(ctx) {
|
|
43
|
+
const id = ctx.makeUniqueIdentifier(getName(this), 'global');
|
|
44
|
+
const init = this[$soul].initialValue
|
|
45
|
+
? snip(this[$soul].initialValue, this[$soul].dataType, 'constant')
|
|
46
|
+
: undefined;
|
|
47
|
+
return ctx.gen.declareGlobalVar({
|
|
48
|
+
scope: this[$soul].scope,
|
|
49
|
+
id,
|
|
50
|
+
dataType: this[$soul].dataType,
|
|
51
|
+
init,
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
}), {
|
|
55
|
+
codegenMode: {
|
|
56
|
+
getBaseSnippet(trackingProxy) {
|
|
57
|
+
return snip(trackingProxy, this[$soul].dataType, this[$soul].scope,
|
|
58
|
+
/* possibleSideEffects */ false);
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
simulateMode: {
|
|
62
|
+
get(state) {
|
|
63
|
+
if (!state.vars[this[$soul].scope].has(this)) {
|
|
64
|
+
// Not initialized yet
|
|
65
|
+
state.vars[this[$soul].scope].set(this, this[$soul].initialValue);
|
|
66
|
+
}
|
|
67
|
+
return state.vars[this[$soul].scope].get(this);
|
|
68
|
+
},
|
|
69
|
+
set(state, value) {
|
|
70
|
+
state.vars[this[$soul].scope].set(this, value);
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
normalMode: {
|
|
74
|
+
get() {
|
|
75
|
+
throw new IllegalVarAccessError(isInsideTgpuFn()
|
|
76
|
+
? `Cannot access variable '${getName(this) ?? '<unnamed>'}'. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation`
|
|
77
|
+
: 'TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`');
|
|
78
|
+
},
|
|
79
|
+
set(_value) {
|
|
80
|
+
throw new IllegalVarAccessError(isInsideTgpuFn()
|
|
81
|
+
? `Cannot access variable ${getName(this) ?? '<unnamed>'}. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation`
|
|
82
|
+
: 'TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`');
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
constructor(scope, dataType, initialValue) {
|
|
88
|
+
this[$soul] = {
|
|
89
|
+
type: 'var',
|
|
90
|
+
scope,
|
|
91
|
+
dataType,
|
|
92
|
+
initialValue,
|
|
93
|
+
label: undefined,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
$name(label) {
|
|
97
|
+
setName(this, label);
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
30
100
|
}
|
|
31
|
-
var TgpuVarImpl = class {
|
|
32
|
-
[$internal] = {};
|
|
33
|
-
resourceType;
|
|
34
|
-
#scope;
|
|
35
|
-
#dataType;
|
|
36
|
-
#initialValue;
|
|
37
|
-
constructor(scope, dataType, initialValue) {
|
|
38
|
-
this.resourceType = "var";
|
|
39
|
-
this.#scope = scope;
|
|
40
|
-
this.#dataType = dataType;
|
|
41
|
-
this.#initialValue = initialValue;
|
|
42
|
-
}
|
|
43
|
-
[$resolve](ctx) {
|
|
44
|
-
const id = ctx.makeUniqueIdentifier(getName(this), "global");
|
|
45
|
-
const init = this.#initialValue ? snip(this.#initialValue, this.#dataType, "constant") : void 0;
|
|
46
|
-
return ctx.gen.declareGlobalVar({
|
|
47
|
-
scope: this.#scope,
|
|
48
|
-
id,
|
|
49
|
-
dataType: this.#dataType,
|
|
50
|
-
init
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
$name(label) {
|
|
54
|
-
setName(this, label);
|
|
55
|
-
return this;
|
|
56
|
-
}
|
|
57
|
-
toString() {
|
|
58
|
-
return `var:${getName(this) ?? "<unnamed>"}`;
|
|
59
|
-
}
|
|
60
|
-
get [$gpuValueOf]() {
|
|
61
|
-
const dataType = this.#dataType;
|
|
62
|
-
const origin = this.#scope;
|
|
63
|
-
return new Proxy({
|
|
64
|
-
[$internal]: true,
|
|
65
|
-
get [$ownSnippet]() {
|
|
66
|
-
return snip(this, dataType, origin);
|
|
67
|
-
},
|
|
68
|
-
[$resolve]: (ctx) => ctx.resolve(this),
|
|
69
|
-
toString: () => `var:${getName(this) ?? "<unnamed>"}.$`
|
|
70
|
-
}, valueProxyHandler);
|
|
71
|
-
}
|
|
72
|
-
get $() {
|
|
73
|
-
const mode = getExecMode();
|
|
74
|
-
const insideTgpuFn = isInsideTgpuFn();
|
|
75
|
-
if (mode.type === "normal") throw new IllegalVarAccessError(insideTgpuFn ? `Cannot access variable '${getName(this) ?? "<unnamed>"}'. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation` : "TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`");
|
|
76
|
-
if (mode.type === "codegen") return this[$gpuValueOf];
|
|
77
|
-
if (mode.type === "simulate") {
|
|
78
|
-
if (!mode.vars[this.#scope].has(this)) mode.vars[this.#scope].set(this, this.#initialValue);
|
|
79
|
-
return mode.vars[this.#scope].get(this);
|
|
80
|
-
}
|
|
81
|
-
return assertExhaustive(mode, "tgpuVariable.ts#TgpuVarImpl/$");
|
|
82
|
-
}
|
|
83
|
-
set $(value) {
|
|
84
|
-
const mode = getExecMode();
|
|
85
|
-
const insideTgpuFn = isInsideTgpuFn();
|
|
86
|
-
if (mode.type === "normal") throw new IllegalVarAccessError(insideTgpuFn ? `Cannot access ${String(this)}. TypeGPU functions that depends on GPU resources need to be part of a compute dispatch, draw call or simulation` : "TypeGPU variables are inaccessible during normal JS execution. If you wanted to simulate GPU behavior, try `tgpu.simulate()`");
|
|
87
|
-
if (mode.type === "codegen") throw new Error("Unreachable tgpuVariable.ts#TgpuVarImpl/$");
|
|
88
|
-
if (mode.type === "simulate") {
|
|
89
|
-
mode.vars[this.#scope].set(this, value);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
assertExhaustive(mode, "tgpuVariable.ts#TgpuVarImpl/$");
|
|
93
|
-
}
|
|
94
|
-
get value() {
|
|
95
|
-
return this.$;
|
|
96
|
-
}
|
|
97
|
-
set value(v) {
|
|
98
|
-
this.$ = v;
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
//#endregion
|
|
103
|
-
export { isVariable, privateVar, workgroupVar };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AnyVertexAttribs, TgpuVertexAttrib } from '../../shared/vertexFormat.ts';
|
|
2
|
+
import type { TgpuVertexFn } from '../function/tgpuVertexFn.ts';
|
|
3
|
+
import type { INTERNAL_TgpuVertexAttrib, TgpuVertexLayout } from './vertexLayout.ts';
|
|
4
|
+
export interface ConnectAttributesToShaderResult {
|
|
5
|
+
usedVertexLayouts: TgpuVertexLayout[];
|
|
6
|
+
bufferDefinitions: GPUVertexBufferLayout[];
|
|
7
|
+
}
|
|
8
|
+
export declare function isAttribute(value: unknown): value is TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib;
|
|
9
|
+
export declare function connectAttributesToShader(shaderInputLayout: TgpuVertexFn.In, attributes: AnyVertexAttribs): ConnectAttributesToShaderResult;
|