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
package/tgsl/conversion.js
CHANGED
|
@@ -1,237 +1,292 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { getName } from "../shared/meta.js";
|
|
5
|
-
import { UnknownData, undecorate } from "../data/dataTypes.js";
|
|
6
|
-
import { isAlias, snip, withDataType } from "../data/snippet.js";
|
|
7
|
-
import { WgslTypeError, invariant } from "../errors.js";
|
|
8
|
-
import { stitch } from "../core/resolve/stitch.js";
|
|
9
|
-
import { RefOperator, derefSnippet } from "../data/ref.js";
|
|
1
|
+
import { UnknownData } from "../data/dataTypes.js";
|
|
2
|
+
import { undecorate } from "../data/dataTypes.js";
|
|
3
|
+
import { derefSnippet, RefOperator } from "../data/ref.js";
|
|
10
4
|
import { schemaCallWrapperGPU } from "../data/schemaCallWrapper.js";
|
|
5
|
+
import { snip, withDataType } from "../data/snippet.js";
|
|
6
|
+
import { isMat, isPtr, isVec, isWgslStruct, } from "../data/wgslTypes.js";
|
|
7
|
+
import { invariant, WgslTypeError } from "../errors.js";
|
|
8
|
+
import { getName } from "../shared/meta.js";
|
|
9
|
+
import { safeStringify } from "../shared/stringify.js";
|
|
11
10
|
import { assertExhaustive } from "../shared/utilityTypes.js";
|
|
11
|
+
import { logger } from "../tgpuLogger.js";
|
|
12
12
|
import { accessStructProp } from "./accessStructProp.js";
|
|
13
|
-
|
|
14
|
-
//#region src/tgsl/conversion.ts
|
|
15
13
|
const INFINITE_RANK = {
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
rank: Number.POSITIVE_INFINITY,
|
|
15
|
+
action: 'none',
|
|
18
16
|
};
|
|
19
17
|
function getAutoConversionRank(src, dest) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (trueDst.type === "f16") return {
|
|
61
|
-
rank: 7,
|
|
62
|
-
action: "none"
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
if (isVec(trueSrc) && isVec(trueDst) && trueSrc.type[3] === trueDst.type[3]) return getAutoConversionRank(trueSrc.primitive, trueDst.primitive);
|
|
66
|
-
if (isMat(trueSrc) && isMat(trueDst) && trueSrc.type[3] === trueDst.type[3]) return {
|
|
67
|
-
rank: 0,
|
|
68
|
-
action: "none"
|
|
69
|
-
};
|
|
70
|
-
return INFINITE_RANK;
|
|
18
|
+
const trueSrc = undecorate(src);
|
|
19
|
+
const trueDst = undecorate(dest);
|
|
20
|
+
if (trueSrc.type === trueDst.type) {
|
|
21
|
+
if (trueSrc.type === 'struct' && trueSrc !== trueDst) {
|
|
22
|
+
return { rank: 1, action: 'cast', targetType: dest };
|
|
23
|
+
}
|
|
24
|
+
return { rank: 0, action: 'none' };
|
|
25
|
+
}
|
|
26
|
+
if (trueSrc.type === 'abstractFloat') {
|
|
27
|
+
if (trueDst.type === 'f32')
|
|
28
|
+
return { rank: 1, action: 'none' };
|
|
29
|
+
if (trueDst.type === 'f16')
|
|
30
|
+
return { rank: 2, action: 'none' };
|
|
31
|
+
}
|
|
32
|
+
if (trueSrc.type === 'abstractInt') {
|
|
33
|
+
if (trueDst.type === 'i32')
|
|
34
|
+
return { rank: 3, action: 'none' };
|
|
35
|
+
if (trueDst.type === 'u32')
|
|
36
|
+
return { rank: 4, action: 'none' };
|
|
37
|
+
if (trueDst.type === 'abstractFloat')
|
|
38
|
+
return { rank: 5, action: 'none' };
|
|
39
|
+
if (trueDst.type === 'f32')
|
|
40
|
+
return { rank: 6, action: 'none' };
|
|
41
|
+
if (trueDst.type === 'f16')
|
|
42
|
+
return { rank: 7, action: 'none' };
|
|
43
|
+
}
|
|
44
|
+
if (isVec(trueSrc) &&
|
|
45
|
+
isVec(trueDst) &&
|
|
46
|
+
// Same length vectors
|
|
47
|
+
trueSrc.type[3] === trueDst.type[3]) {
|
|
48
|
+
return getAutoConversionRank(trueSrc.primitive, trueDst.primitive);
|
|
49
|
+
}
|
|
50
|
+
if (isMat(trueSrc) &&
|
|
51
|
+
isMat(trueDst) &&
|
|
52
|
+
// Same dimensions
|
|
53
|
+
trueSrc.type[3] === trueDst.type[3]) {
|
|
54
|
+
// Matrix conversion rank depends only on component type (always f32 for now)
|
|
55
|
+
return { rank: 0, action: 'none' };
|
|
56
|
+
}
|
|
57
|
+
return INFINITE_RANK;
|
|
71
58
|
}
|
|
72
59
|
function getImplicitConversionRank(src, dest) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
targetType: trueDst
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
return INFINITE_RANK;
|
|
60
|
+
const trueSrc = undecorate(src);
|
|
61
|
+
const trueDst = undecorate(dest);
|
|
62
|
+
if (isPtr(trueSrc) &&
|
|
63
|
+
// Only dereferencing implicit pointers, otherwise we'd have a types mismatch between TS and WGSL
|
|
64
|
+
trueSrc.implicit &&
|
|
65
|
+
getAutoConversionRank(trueSrc.inner, trueDst).rank < Number.POSITIVE_INFINITY) {
|
|
66
|
+
return { rank: 0, action: 'deref' };
|
|
67
|
+
}
|
|
68
|
+
if (isPtr(trueDst) &&
|
|
69
|
+
getAutoConversionRank(trueSrc, trueDst.inner).rank < Number.POSITIVE_INFINITY) {
|
|
70
|
+
return { rank: 1, action: 'ref' };
|
|
71
|
+
}
|
|
72
|
+
const primitivePreference = {
|
|
73
|
+
f32: 0,
|
|
74
|
+
f16: 1,
|
|
75
|
+
i32: 2,
|
|
76
|
+
u32: 3,
|
|
77
|
+
bool: 4,
|
|
78
|
+
};
|
|
79
|
+
if (trueSrc.type in primitivePreference && trueDst.type in primitivePreference) {
|
|
80
|
+
const srcType = trueSrc.type;
|
|
81
|
+
const destType = trueDst.type;
|
|
82
|
+
if (srcType !== destType) {
|
|
83
|
+
const srcPref = primitivePreference[srcType];
|
|
84
|
+
const destPref = primitivePreference[destType];
|
|
85
|
+
const rank = destPref < srcPref ? 10 : 20;
|
|
86
|
+
return { rank: rank, action: 'cast', targetType: trueDst };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if ((trueSrc.type === 'u32' || trueSrc.type === 'i32') && trueDst.type === 'abstractFloat') {
|
|
90
|
+
// When one of the types is a float (abstract or not), we don't want to cast it to a non-float type,
|
|
91
|
+
// which would cause it to lose precision. We instead choose the common type to be f32.
|
|
92
|
+
return { rank: 1, action: 'cast', targetType: trueDst.concretized };
|
|
93
|
+
}
|
|
94
|
+
if (trueSrc.type === 'abstractFloat') {
|
|
95
|
+
if (trueDst.type === 'i32') {
|
|
96
|
+
return { rank: 2, action: 'cast', targetType: trueDst };
|
|
97
|
+
}
|
|
98
|
+
if (trueDst.type === 'u32') {
|
|
99
|
+
return { rank: 3, action: 'cast', targetType: trueDst };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return INFINITE_RANK;
|
|
120
103
|
}
|
|
121
104
|
function getConversionRank(src, dest, allowImplicit) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
105
|
+
const autoRank = getAutoConversionRank(src, dest);
|
|
106
|
+
if (autoRank.rank < Number.POSITIVE_INFINITY) {
|
|
107
|
+
return autoRank;
|
|
108
|
+
}
|
|
109
|
+
if (allowImplicit) {
|
|
110
|
+
return getImplicitConversionRank(src, dest);
|
|
111
|
+
}
|
|
112
|
+
return INFINITE_RANK;
|
|
126
113
|
}
|
|
127
114
|
function findBestType(types, uniqueTypes, allowImplicit) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
115
|
+
let bestResult;
|
|
116
|
+
for (const targetType of uniqueTypes) {
|
|
117
|
+
/**
|
|
118
|
+
* The type we end up converting to. Will be different than `targetType` if `targetType === abstractFloat`
|
|
119
|
+
*/
|
|
120
|
+
let destType = targetType;
|
|
121
|
+
const details = [];
|
|
122
|
+
let sum = 0;
|
|
123
|
+
for (const sourceType of types) {
|
|
124
|
+
const conversion = getConversionRank(sourceType, targetType, allowImplicit);
|
|
125
|
+
sum += conversion.rank;
|
|
126
|
+
if (conversion.rank === Number.POSITIVE_INFINITY) {
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
details.push(conversion);
|
|
130
|
+
if (conversion.action === 'cast') {
|
|
131
|
+
destType = conversion.targetType;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (sum < (bestResult?.sum ?? Number.POSITIVE_INFINITY)) {
|
|
135
|
+
bestResult = { type: destType, details, sum };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (!bestResult) {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
const actions = bestResult.details.map((detail, index) => ({
|
|
142
|
+
sourceIndex: index,
|
|
143
|
+
action: detail.action,
|
|
144
|
+
...(detail.action === 'cast' && {
|
|
145
|
+
targetType: detail.targetType,
|
|
146
|
+
}),
|
|
147
|
+
}));
|
|
148
|
+
return {
|
|
149
|
+
targetType: bestResult.type,
|
|
150
|
+
actions,
|
|
151
|
+
hasImplicitConversions: actions.some((action) => action.action === 'cast'),
|
|
152
|
+
};
|
|
160
153
|
}
|
|
161
|
-
function getBestConversion(types, targetTypes) {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
154
|
+
export function getBestConversion(types, targetTypes) {
|
|
155
|
+
if (types.length === 0)
|
|
156
|
+
return undefined;
|
|
157
|
+
const uniqueTargetTypes = [...new Set((targetTypes || types).map(undecorate))];
|
|
158
|
+
const explicitResult = findBestType(types, uniqueTargetTypes, false);
|
|
159
|
+
if (explicitResult) {
|
|
160
|
+
return explicitResult;
|
|
161
|
+
}
|
|
162
|
+
const implicitResult = findBestType(types, uniqueTargetTypes, true);
|
|
163
|
+
if (implicitResult) {
|
|
164
|
+
return implicitResult;
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
168
167
|
}
|
|
169
168
|
function applyActionToSnippet(ctx, snippet, action, targetType) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
169
|
+
if (action.action === 'none') {
|
|
170
|
+
if (targetType === snippet.dataType) {
|
|
171
|
+
return snippet;
|
|
172
|
+
}
|
|
173
|
+
return withDataType(targetType, snippet);
|
|
174
|
+
}
|
|
175
|
+
switch (action.action) {
|
|
176
|
+
case 'ref':
|
|
177
|
+
return snip(new RefOperator(snippet, targetType), targetType, snippet.origin, snippet.possibleSideEffects);
|
|
178
|
+
case 'deref':
|
|
179
|
+
return derefSnippet(snippet);
|
|
180
|
+
case 'cast': {
|
|
181
|
+
if (isWgslStruct(snippet.dataType) && isWgslStruct(targetType)) {
|
|
182
|
+
const typeName = getName(snippet.dataType) ?? '<unnamed>';
|
|
183
|
+
const targetName = getName(targetType) ?? '<unnamed>';
|
|
184
|
+
// Struct to struct casting
|
|
185
|
+
if (snippet.possibleSideEffects) {
|
|
186
|
+
throw new Error(`Cannot resolve struct cast from '${typeName}' to '${targetName}'. Store the value to a variable first, then cast it.`);
|
|
187
|
+
}
|
|
188
|
+
const propSnips = Object.entries(targetType.propTypes).map(([key, dataType]) => {
|
|
189
|
+
const accessedProp = accessStructProp(snippet, key);
|
|
190
|
+
if (!accessedProp) {
|
|
191
|
+
throw new Error(`Cannot auto-convert struct '${typeName}' to '${targetName}' because the property '${key}' is missing.`);
|
|
192
|
+
}
|
|
193
|
+
const converted = convertToCommonType(ctx, [accessedProp], [dataType]);
|
|
194
|
+
if (!converted || !converted[0]) {
|
|
195
|
+
throw new Error(`Cannot auto-convert struct '${typeName}' to '${targetName}' because type '${getName(accessedProp.dataType) ?? '<unnamed>'}' is not convertible to '${getName(undecorate(dataType)) ?? '<unnamed>'}'.`);
|
|
196
|
+
}
|
|
197
|
+
return converted[0];
|
|
198
|
+
});
|
|
199
|
+
const targetSnippet = ctx.resolve(targetType).value;
|
|
200
|
+
return snip(`${targetSnippet}(${propSnips.map((snip) => snip.value).join(', ')})`, targetType, 'runtime', false);
|
|
201
|
+
}
|
|
202
|
+
// Casting means calling the schema with the snippet as an argument.
|
|
203
|
+
return schemaCallWrapperGPU(ctx, targetType, snippet);
|
|
204
|
+
}
|
|
205
|
+
default: {
|
|
206
|
+
assertExhaustive(action.action, 'applyActionToSnippet');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Unifies input types to a common type.
|
|
212
|
+
*/
|
|
213
|
+
export function unify(inTypes, restrictTo) {
|
|
214
|
+
if (inTypes.some((type) => type === UnknownData)) {
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
const conversion = getBestConversion(inTypes, restrictTo);
|
|
218
|
+
if (!conversion) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
return inTypes.map((type) => (isVec(type) || isMat(type) ? type : conversion.targetType));
|
|
195
222
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
223
|
+
/**
|
|
224
|
+
* Unifies input types to a common type.
|
|
225
|
+
* Unlike `unify`, it does not allow implicit conversions.
|
|
226
|
+
*/
|
|
227
|
+
export function unifyStrict(inTypes, restrictTo) {
|
|
228
|
+
if (inTypes.some((type) => type === UnknownData)) {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
const uniqueTargetTypes = [...new Set((restrictTo || inTypes).map(undecorate))];
|
|
232
|
+
const conversion = findBestType(inTypes, uniqueTargetTypes, false);
|
|
233
|
+
if (!conversion) {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
return inTypes.map((type) => (isVec(type) || isMat(type) ? type : conversion.targetType));
|
|
201
237
|
}
|
|
202
|
-
function convertToCommonType(ctx, values, restrictTo, verbose = true) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
238
|
+
export function convertToCommonType(ctx, values, restrictTo, verbose = true) {
|
|
239
|
+
const types = values.map((value) => value.dataType);
|
|
240
|
+
if (types.some((type) => type === UnknownData)) {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
// Calling convertToCommonType with an empty restrictTo array
|
|
244
|
+
// prevents any conversions from being made. If you intend to allow
|
|
245
|
+
// all conversions, pass undefined instead. If this was intended call
|
|
246
|
+
// the function conditionally since the result will always be undefined.
|
|
247
|
+
invariant(!(Array.isArray(restrictTo) && restrictTo.length === 0), "Internal error, expected 'restrictTo' to not be an empty array.");
|
|
248
|
+
const conversion = getBestConversion(types, restrictTo);
|
|
249
|
+
if (!conversion) {
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
if (verbose && conversion.hasImplicitConversions) {
|
|
253
|
+
logger.warn('implicit-conversion', `Implicit conversions from [\n${values
|
|
254
|
+
.map((v) => ` ${ctx.resolveSnippet(v).value}: ${safeStringify(v.dataType)}`)
|
|
255
|
+
.join(',\n')}\n] to ${conversion.targetType.type} are supported, but not recommended.
|
|
209
256
|
Consider using explicit conversions instead.`);
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
257
|
+
}
|
|
258
|
+
return values.map((value, index) => {
|
|
259
|
+
const action = conversion.actions[index];
|
|
260
|
+
invariant(action, 'Action should not be undefined');
|
|
261
|
+
return applyActionToSnippet(ctx, value, action, conversion.targetType);
|
|
262
|
+
});
|
|
215
263
|
}
|
|
216
|
-
function tryConvertSnippet(ctx, snippet, targetDataTypes, verbose = true) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
264
|
+
export function tryConvertSnippet(ctx, snippet, targetDataTypes, verbose = true) {
|
|
265
|
+
const targets = Array.isArray(targetDataTypes) ? targetDataTypes : [targetDataTypes];
|
|
266
|
+
const { value, dataType, origin, possibleSideEffects } = snippet;
|
|
267
|
+
if (targets.length === 1) {
|
|
268
|
+
const target = targets[0];
|
|
269
|
+
if (target === dataType) {
|
|
270
|
+
return snip(value, target, origin, possibleSideEffects);
|
|
271
|
+
}
|
|
272
|
+
if (dataType === UnknownData) {
|
|
273
|
+
// Commit unknown to the expected type.
|
|
274
|
+
return ctx.resolveSnippet(snip(value, target, origin, possibleSideEffects));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const converted = convertToCommonType(ctx, [snippet], targets, verbose);
|
|
278
|
+
if (converted) {
|
|
279
|
+
return converted[0];
|
|
280
|
+
}
|
|
281
|
+
throw new WgslTypeError(`Cannot convert value of type '${String(dataType)}' to any of the target types: [${targets.map((t) => t.type).join(', ')}]`);
|
|
227
282
|
}
|
|
228
|
-
function convertStructValues(ctx, structType, values) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
283
|
+
export function convertStructValues(ctx, structType, values) {
|
|
284
|
+
return Object.entries(structType.propTypes).map(([key, targetType]) => {
|
|
285
|
+
const val = values[key];
|
|
286
|
+
if (!val) {
|
|
287
|
+
throw new Error(`Missing property ${key}`);
|
|
288
|
+
}
|
|
289
|
+
const converted = convertToCommonType(ctx, [val], [targetType]);
|
|
290
|
+
return converted?.[0] ?? val;
|
|
291
|
+
});
|
|
234
292
|
}
|
|
235
|
-
|
|
236
|
-
//#endregion
|
|
237
|
-
export { convertStructValues, convertToCommonType, getBestConversion, tryConvertSnippet, unify };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Snippet } from '../data/snippet.ts';
|
|
2
|
+
import * as wgsl from '../data/wgslTypes.ts';
|
|
3
|
+
import type { ResolutionCtx } from '../types.ts';
|
|
4
|
+
export declare function getLoopVarKind(elementSnippet: Snippet): "let" | "const";
|
|
5
|
+
export declare function getElementSnippet(iterableSnippet: Snippet, index: Snippet): Snippet;
|
|
6
|
+
/**
|
|
7
|
+
* Determines the type of the element as accessible inside of the `for .. of` loop body
|
|
8
|
+
*/
|
|
9
|
+
export declare function getElementType(elementSnippet: Snippet, iterableSnippet: Snippet): wgsl.BaseData;
|
|
10
|
+
export declare function getRangeSnippets(ctx: ResolutionCtx, iterableSnippet: Snippet, unroll?: boolean): {
|
|
11
|
+
start: Snippet;
|
|
12
|
+
end: Snippet;
|
|
13
|
+
step: Snippet;
|
|
14
|
+
comparison: '<' | '>';
|
|
15
|
+
};
|