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/bin.mjs
CHANGED
|
@@ -21,8 +21,11 @@ if (major === undefined || minor === undefined) {
|
|
|
21
21
|
*/
|
|
22
22
|
const semver = `^${major}.${minor}.0`;
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* @returns {Promise<number | undefined>}
|
|
26
|
+
*/
|
|
24
27
|
function asyncSpawn(...args) {
|
|
25
|
-
return new Promise((resolve,
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
26
29
|
const child = spawn(...args);
|
|
27
30
|
|
|
28
31
|
child.on('exit', (code, signal) => {
|
|
@@ -34,22 +37,41 @@ function asyncSpawn(...args) {
|
|
|
34
37
|
|
|
35
38
|
resolve(code);
|
|
36
39
|
});
|
|
40
|
+
|
|
41
|
+
child.on('error', (err) => {
|
|
42
|
+
reject(err);
|
|
43
|
+
});
|
|
37
44
|
});
|
|
38
45
|
}
|
|
39
46
|
|
|
47
|
+
/**
|
|
48
|
+
* @param {string} label
|
|
49
|
+
*/
|
|
50
|
+
function failedToRunErrHandler(label) {
|
|
51
|
+
return (err) => {
|
|
52
|
+
console.error(`Failed to run '${label}':`, err);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
40
57
|
(async () => {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
const windows = process.platform === 'win32';
|
|
59
|
+
const npxCommand = windows ? 'npx.cmd' : 'npx';
|
|
60
|
+
|
|
61
|
+
const code = await asyncSpawn(npxCommand, [`@typegpu/cli@${semver}`, ...process.argv.slice(2)], {
|
|
62
|
+
stdio: 'inherit',
|
|
63
|
+
shell: windows, // needs to be ran through the shell on Windows
|
|
64
|
+
}).catch(failedToRunErrHandler(`npx @typegpu/cli@${semver}`));
|
|
44
65
|
|
|
45
66
|
if (code !== 0) {
|
|
46
67
|
console.warn(
|
|
47
68
|
`Couldn't find @typegpu/cli version matching ${semver}, falling back to latest...`,
|
|
48
69
|
);
|
|
49
70
|
// Fallback to latest
|
|
50
|
-
const code = await asyncSpawn(
|
|
71
|
+
const code = await asyncSpawn(npxCommand, [`@typegpu/cli@latest`, ...process.argv.slice(2)], {
|
|
51
72
|
stdio: 'inherit',
|
|
52
|
-
|
|
73
|
+
shell: windows, // needs to be ran through the shell on Windows
|
|
74
|
+
}).catch(failedToRunErrHandler('npx @typegpu/cli@latest'));
|
|
53
75
|
process.exit(code ?? 0);
|
|
54
76
|
}
|
|
55
77
|
|
package/builtin.d.ts
CHANGED
|
@@ -1,54 +1,52 @@
|
|
|
1
|
-
import { BaseData, Bool, Builtin, Decorated, F32, U32, Vec3u, Vec4f, WgslArray } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
type
|
|
5
|
-
type
|
|
6
|
-
type
|
|
7
|
-
type
|
|
8
|
-
type
|
|
9
|
-
type
|
|
10
|
-
type
|
|
11
|
-
type
|
|
12
|
-
type
|
|
13
|
-
type
|
|
14
|
-
type
|
|
15
|
-
type
|
|
16
|
-
type
|
|
17
|
-
type
|
|
18
|
-
type
|
|
19
|
-
type
|
|
20
|
-
type
|
|
21
|
-
type
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
import type { BaseData, Bool, Builtin, Decorated, F32, U32, Vec3u, Vec4f, WgslArray } from './data/wgslTypes.ts';
|
|
2
|
+
export type BuiltinVertexIndex = Decorated<U32, [Builtin<'vertex_index'>]>;
|
|
3
|
+
export type BuiltinInstanceIndex = Decorated<U32, [Builtin<'instance_index'>]>;
|
|
4
|
+
export type BuiltinClipDistances = Decorated<WgslArray<U32>, [Builtin<'clip_distances'>]>;
|
|
5
|
+
export type BuiltinPosition = Decorated<Vec4f, [Builtin<'position'>]>;
|
|
6
|
+
export type BuiltinFrontFacing = Decorated<Bool, [Builtin<'front_facing'>]>;
|
|
7
|
+
export type BuiltinFragDepth = Decorated<F32, [Builtin<'frag_depth'>]>;
|
|
8
|
+
export type BuiltinPrimitiveIndex = Decorated<U32, [Builtin<'primitive_index'>]>;
|
|
9
|
+
export type BuiltinSampleIndex = Decorated<U32, [Builtin<'sample_index'>]>;
|
|
10
|
+
export type BuiltinSampleMask = Decorated<U32, [Builtin<'sample_mask'>]>;
|
|
11
|
+
export type BuiltinLocalInvocationId = Decorated<Vec3u, [Builtin<'local_invocation_id'>]>;
|
|
12
|
+
export type BuiltinLocalInvocationIndex = Decorated<U32, [Builtin<'local_invocation_index'>]>;
|
|
13
|
+
export type BuiltinGlobalInvocationId = Decorated<Vec3u, [Builtin<'global_invocation_id'>]>;
|
|
14
|
+
export type BuiltinGlobalInvocationIndex = Decorated<U32, [Builtin<'global_invocation_index'>]>;
|
|
15
|
+
export type BuiltinWorkgroupId = Decorated<Vec3u, [Builtin<'workgroup_id'>]>;
|
|
16
|
+
export type BuiltinWorkgroupIndex = Decorated<U32, [Builtin<'workgroup_index'>]>;
|
|
17
|
+
export type BuiltinNumWorkgroups = Decorated<Vec3u, [Builtin<'num_workgroups'>]>;
|
|
18
|
+
export type BuiltinSubgroupInvocationId = Decorated<U32, [Builtin<'subgroup_invocation_id'>]>;
|
|
19
|
+
export type BuiltinSubgroupSize = Decorated<U32, [Builtin<'subgroup_size'>]>;
|
|
20
|
+
export type BuiltinSubgroupId = Decorated<U32, [Builtin<'subgroup_id'>]>;
|
|
21
|
+
export type BuiltinNumSubgroups = Decorated<U32, [Builtin<'num_subgroups'>]>;
|
|
22
|
+
export declare const builtin: {
|
|
23
|
+
readonly vertexIndex: BuiltinVertexIndex;
|
|
24
|
+
readonly instanceIndex: BuiltinInstanceIndex;
|
|
25
|
+
readonly clipDistances: BuiltinClipDistances;
|
|
26
|
+
readonly position: BuiltinPosition;
|
|
27
|
+
readonly frontFacing: BuiltinFrontFacing;
|
|
28
|
+
readonly fragDepth: BuiltinFragDepth;
|
|
29
|
+
readonly primitiveIndex: BuiltinPrimitiveIndex;
|
|
30
|
+
readonly sampleIndex: BuiltinSampleIndex;
|
|
31
|
+
readonly sampleMask: BuiltinSampleMask;
|
|
32
|
+
readonly localInvocationId: BuiltinLocalInvocationId;
|
|
33
|
+
readonly localInvocationIndex: BuiltinLocalInvocationIndex;
|
|
34
|
+
readonly globalInvocationId: BuiltinGlobalInvocationId;
|
|
35
|
+
readonly globalInvocationIndex: BuiltinGlobalInvocationIndex;
|
|
36
|
+
readonly workgroupId: BuiltinWorkgroupId;
|
|
37
|
+
readonly workgroupIndex: BuiltinWorkgroupIndex;
|
|
38
|
+
readonly numWorkgroups: BuiltinNumWorkgroups;
|
|
39
|
+
readonly subgroupInvocationId: BuiltinSubgroupInvocationId;
|
|
40
|
+
readonly subgroupSize: BuiltinSubgroupSize;
|
|
41
|
+
readonly subgroupId: BuiltinSubgroupId;
|
|
42
|
+
readonly numSubgroups: BuiltinNumSubgroups;
|
|
43
|
+
};
|
|
44
|
+
export type AnyBuiltin = (typeof builtin)[keyof typeof builtin];
|
|
45
|
+
export type AnyComputeBuiltin = BuiltinLocalInvocationId | BuiltinLocalInvocationIndex | BuiltinGlobalInvocationId | BuiltinGlobalInvocationIndex | BuiltinWorkgroupId | BuiltinWorkgroupIndex | BuiltinNumWorkgroups | BuiltinSubgroupInvocationId | BuiltinSubgroupSize | BuiltinSubgroupId | BuiltinNumSubgroups;
|
|
46
|
+
export type AnyVertexInputBuiltin = BuiltinVertexIndex | BuiltinInstanceIndex;
|
|
47
|
+
export type AnyVertexOutputBuiltin = BuiltinClipDistances | BuiltinPosition;
|
|
48
|
+
export type AnyFragmentInputBuiltin = BuiltinPosition | BuiltinFrontFacing | BuiltinPrimitiveIndex | BuiltinSampleIndex | BuiltinSampleMask | BuiltinSubgroupInvocationId | BuiltinSubgroupSize;
|
|
49
|
+
export type AnyFragmentOutputBuiltin = BuiltinFragDepth | BuiltinSampleMask;
|
|
50
|
+
export type OmitBuiltins<S> = S extends AnyBuiltin ? never : S extends BaseData ? S : {
|
|
51
|
+
[Key in keyof S as S[Key] extends AnyBuiltin ? never : Key extends `$${string}` ? never : Key]: S[Key];
|
|
45
52
|
};
|
|
46
|
-
type AnyBuiltin = (typeof builtin)[keyof typeof builtin];
|
|
47
|
-
type AnyComputeBuiltin = BuiltinLocalInvocationId | BuiltinLocalInvocationIndex | BuiltinGlobalInvocationId | BuiltinGlobalInvocationIndex | BuiltinWorkgroupId | BuiltinWorkgroupIndex | BuiltinNumWorkgroups | BuiltinSubgroupInvocationId | BuiltinSubgroupSize | BuiltinSubgroupId | BuiltinNumSubgroups;
|
|
48
|
-
type AnyVertexInputBuiltin = BuiltinVertexIndex | BuiltinInstanceIndex;
|
|
49
|
-
type AnyVertexOutputBuiltin = BuiltinClipDistances | BuiltinPosition;
|
|
50
|
-
type AnyFragmentInputBuiltin = BuiltinPosition | BuiltinFrontFacing | BuiltinPrimitiveIndex | BuiltinSampleIndex | BuiltinSampleMask | BuiltinSubgroupInvocationId | BuiltinSubgroupSize;
|
|
51
|
-
type AnyFragmentOutputBuiltin = BuiltinFragDepth | BuiltinSampleMask;
|
|
52
|
-
type OmitBuiltins<S> = S extends AnyBuiltin ? never : S extends BaseData ? S : { [Key in keyof S as S[Key] extends AnyBuiltin ? never : Key extends `$${string}` ? never : Key]: S[Key] };
|
|
53
|
-
//#endregion
|
|
54
|
-
export { AnyBuiltin, AnyComputeBuiltin, AnyFragmentInputBuiltin, AnyFragmentOutputBuiltin, AnyVertexInputBuiltin, AnyVertexOutputBuiltin, BuiltinClipDistances, BuiltinFragDepth, BuiltinFrontFacing, BuiltinGlobalInvocationId, BuiltinInstanceIndex, BuiltinLocalInvocationId, BuiltinLocalInvocationIndex, BuiltinNumWorkgroups, BuiltinPosition, BuiltinPrimitiveIndex, BuiltinSampleIndex, BuiltinSampleMask, BuiltinSubgroupInvocationId, BuiltinSubgroupSize, BuiltinVertexIndex, BuiltinWorkgroupId, OmitBuiltins, builtin };
|
package/builtin.js
CHANGED
|
@@ -1,39 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { arrayOf } from "./data/array.js";
|
|
2
|
+
import { attribute } from "./data/attributes.js";
|
|
2
3
|
import { bool, f32, u32 } from "./data/numeric.js";
|
|
3
4
|
import { vec3u, vec4f } from "./data/vector.js";
|
|
4
|
-
import {
|
|
5
|
-
import { arrayOf } from "./data/array.js";
|
|
6
|
-
|
|
7
|
-
//#region src/builtin.ts
|
|
5
|
+
import { $internal } from "./shared/symbols.js";
|
|
8
6
|
function defineBuiltin(dataType, value) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
return attribute(dataType, {
|
|
8
|
+
[$internal]: true,
|
|
9
|
+
type: '@builtin',
|
|
10
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- it's fine
|
|
11
|
+
params: [value],
|
|
12
|
+
});
|
|
14
13
|
}
|
|
15
|
-
const builtin = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
14
|
+
export const builtin = {
|
|
15
|
+
vertexIndex: defineBuiltin(u32, 'vertex_index'),
|
|
16
|
+
instanceIndex: defineBuiltin(u32, 'instance_index'),
|
|
17
|
+
clipDistances: defineBuiltin(arrayOf(u32, 8), 'clip_distances'),
|
|
18
|
+
position: defineBuiltin(vec4f, 'position'),
|
|
19
|
+
frontFacing: defineBuiltin(bool, 'front_facing'),
|
|
20
|
+
fragDepth: defineBuiltin(f32, 'frag_depth'),
|
|
21
|
+
primitiveIndex: defineBuiltin(u32, 'primitive_index'),
|
|
22
|
+
sampleIndex: defineBuiltin(u32, 'sample_index'),
|
|
23
|
+
sampleMask: defineBuiltin(u32, 'sample_mask'),
|
|
24
|
+
localInvocationId: defineBuiltin(vec3u, 'local_invocation_id'),
|
|
25
|
+
localInvocationIndex: defineBuiltin(u32, 'local_invocation_index'),
|
|
26
|
+
globalInvocationId: defineBuiltin(vec3u, 'global_invocation_id'),
|
|
27
|
+
globalInvocationIndex: defineBuiltin(u32, 'global_invocation_index'),
|
|
28
|
+
workgroupId: defineBuiltin(vec3u, 'workgroup_id'),
|
|
29
|
+
workgroupIndex: defineBuiltin(u32, 'workgroup_index'),
|
|
30
|
+
numWorkgroups: defineBuiltin(vec3u, 'num_workgroups'),
|
|
31
|
+
subgroupInvocationId: defineBuiltin(u32, 'subgroup_invocation_id'),
|
|
32
|
+
subgroupSize: defineBuiltin(u32, 'subgroup_size'),
|
|
33
|
+
subgroupId: defineBuiltin(u32, 'subgroup_id'),
|
|
34
|
+
numSubgroups: defineBuiltin(u32, 'num_subgroups'),
|
|
36
35
|
};
|
|
37
|
-
|
|
38
|
-
//#endregion
|
|
39
|
-
export { builtin };
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { TgpuVertexFn } from "../core/function/tgpuVertexFn.js";
|
|
2
|
-
import { Vec2f } from "../data/wgslTypes.js";
|
|
3
|
-
import "../indexNamedExports.js";
|
|
4
|
-
|
|
5
|
-
//#region src/common/fullScreenTriangle.d.ts
|
|
6
|
-
|
|
7
1
|
/**
|
|
8
2
|
* A vertex function that defines a single full-screen triangle out
|
|
9
3
|
* of three points.
|
|
@@ -20,8 +14,6 @@ import "../indexNamedExports.js";
|
|
|
20
14
|
* pipeline.draw(3);
|
|
21
15
|
* ```
|
|
22
16
|
*/
|
|
23
|
-
declare const fullScreenTriangle: TgpuVertexFn<{}, {
|
|
24
|
-
|
|
17
|
+
export declare const fullScreenTriangle: import("../indexNamedExports.ts").TgpuVertexFn<{}, {
|
|
18
|
+
uv: import("../data/wgslTypes.ts").Vec2f;
|
|
25
19
|
}>;
|
|
26
|
-
//#endregion
|
|
27
|
-
export { fullScreenTriangle };
|
|
@@ -1,36 +1,28 @@
|
|
|
1
|
-
import { vec2f } from "../data/vector.js";
|
|
2
1
|
import { builtin } from "../builtin.js";
|
|
3
2
|
import { vertexFn } from "../core/function/tgpuVertexFn.js";
|
|
4
|
-
|
|
5
|
-
//#region src/common/fullScreenTriangle.ts
|
|
3
|
+
import { vec2f } from "../data/vector.js";
|
|
6
4
|
/**
|
|
7
|
-
* A vertex function that defines a single full-screen triangle out
|
|
8
|
-
* of three points.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* import { common } from 'typegpu';
|
|
13
|
-
*
|
|
14
|
-
* const pipeline = root.createRenderPipeline({
|
|
15
|
-
* vertex: common.fullScreenTriangle,
|
|
16
|
-
* fragment: yourFragmentShader,
|
|
17
|
-
* });
|
|
18
|
-
*
|
|
19
|
-
* pipeline.draw(3);
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
const fullScreenTriangle = vertexFn({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
uv: vec2f
|
|
27
|
-
}
|
|
28
|
-
})`{
|
|
5
|
+
* A vertex function that defines a single full-screen triangle out
|
|
6
|
+
* of three points.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { common } from 'typegpu';
|
|
11
|
+
*
|
|
12
|
+
* const pipeline = root.createRenderPipeline({
|
|
13
|
+
* vertex: common.fullScreenTriangle,
|
|
14
|
+
* fragment: yourFragmentShader,
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* pipeline.draw(3);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export const fullScreenTriangle = vertexFn({
|
|
21
|
+
in: { vertexIndex: builtin.vertexIndex },
|
|
22
|
+
out: { pos: builtin.position, uv: vec2f },
|
|
23
|
+
}) `{
|
|
29
24
|
const pos = array<vec2f, 3>(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3));
|
|
30
25
|
const uv = array<vec2f, 3>(vec2f(0, 1), vec2f(2, 1), vec2f(0, -1));
|
|
31
26
|
|
|
32
27
|
return Out(vec4f(pos[in.vertexIndex], 0, 1), uv[in.vertexIndex]);
|
|
33
28
|
}`;
|
|
34
|
-
|
|
35
|
-
//#endregion
|
|
36
|
-
export { fullScreenTriangle };
|
package/common/index.d.ts
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
//#region src/common/index.d.ts
|
|
5
|
-
declare namespace index_d_exports {
|
|
6
|
-
export { fullScreenTriangle, writeSoA };
|
|
7
|
-
}
|
|
8
|
-
//#endregion
|
|
9
|
-
export { fullScreenTriangle, index_d_exports, writeSoA };
|
|
1
|
+
export { fullScreenTriangle } from './fullScreenTriangle.ts';
|
|
2
|
+
export { writeSoA } from './writeSoA.ts';
|
package/common/index.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
//#region src/common/index.ts
|
|
6
|
-
var common_exports = /* @__PURE__ */ __export({
|
|
7
|
-
fullScreenTriangle: () => fullScreenTriangle,
|
|
8
|
-
writeSoA: () => writeSoA
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
//#endregion
|
|
12
|
-
export { common_exports, fullScreenTriangle, writeSoA };
|
|
1
|
+
// NOTE: This is a barrel file, internal files should not import things from this file
|
|
2
|
+
export { fullScreenTriangle } from "./fullScreenTriangle.js";
|
|
3
|
+
export { writeSoA } from "./writeSoA.js";
|
package/common/writeSoA.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
//#region src/common/writeSoA.d.ts
|
|
1
|
+
import type { Undecorate } from '../data/dataTypes.ts';
|
|
2
|
+
import type { BaseData, TypedArrayFor, WgslArray, WgslStruct } from '../data/wgslTypes.ts';
|
|
3
|
+
import type { BufferWriteOptions, TgpuBuffer } from '../core/buffer/buffer.ts';
|
|
4
|
+
import type { Prettify } from '../shared/utilityTypes.ts';
|
|
7
5
|
type PackedScalarFor<T> = Undecorate<T> extends WgslArray<infer TElement> ? PackedScalarFor<TElement> : Undecorate<T>;
|
|
8
6
|
type PackedSoAInputFor<T> = TypedArrayFor<PackedScalarFor<T>>;
|
|
9
|
-
type SoAFieldsFor<T extends Record<string, BaseData>> = {
|
|
7
|
+
type SoAFieldsFor<T extends Record<string, BaseData>> = {
|
|
8
|
+
[K in keyof T as [PackedSoAInputFor<T[K]>] extends [never] ? never : K]: PackedSoAInputFor<T[K]>;
|
|
9
|
+
};
|
|
10
10
|
type SoAInputFor<T extends Record<string, BaseData>> = [keyof T] extends [keyof SoAFieldsFor<T>] ? Prettify<SoAFieldsFor<T>> : never;
|
|
11
|
-
declare function writeSoA<TProps extends Record<string, BaseData>>(buffer: TgpuBuffer<WgslArray<WgslStruct<TProps>>>, data: SoAInputFor<TProps>, options?: BufferWriteOptions): void;
|
|
12
|
-
declare namespace writeSoA {
|
|
13
|
-
|
|
11
|
+
export declare function writeSoA<TProps extends Record<string, BaseData>>(buffer: TgpuBuffer<WgslArray<WgslStruct<TProps>>>, data: SoAInputFor<TProps>, options?: BufferWriteOptions): void;
|
|
12
|
+
export declare namespace writeSoA {
|
|
13
|
+
type InputFor<TProps extends Record<string, BaseData>> = SoAInputFor<TProps>;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
export { writeSoA };
|
|
15
|
+
export {};
|
package/common/writeSoA.js
CHANGED
|
@@ -1,92 +1,104 @@
|
|
|
1
|
-
import { isAtomic, isMat, isMat2x2f, isMat3x3f, isWgslArray } from "../data/wgslTypes.js";
|
|
2
|
-
import { undecorate } from "../data/dataTypes.js";
|
|
3
1
|
import { invariant } from "../errors.js";
|
|
4
|
-
import { alignmentOf } from "../data/alignmentOf.js";
|
|
5
2
|
import { roundUp } from "../mathUtils.js";
|
|
6
|
-
import {
|
|
3
|
+
import { alignmentOf } from "../data/alignmentOf.js";
|
|
4
|
+
import { undecorate } from "../data/dataTypes.js";
|
|
7
5
|
import { offsetsForProps } from "../data/offsets.js";
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import { sizeOf } from "../data/sizeOf.js";
|
|
7
|
+
import { isAtomic, isMat, isMat2x2f, isMat3x3f, isWgslArray } from "../data/wgslTypes.js";
|
|
10
8
|
function packedSchemaOf(schema) {
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
const unpackedSchema = undecorate(schema);
|
|
10
|
+
return isAtomic(unpackedSchema) ? unpackedSchema.inner : unpackedSchema;
|
|
13
11
|
}
|
|
14
12
|
function packedMatrixDimOf(schema) {
|
|
15
|
-
|
|
13
|
+
return isMat3x3f(schema) ? 3 : isMat2x2f(schema) ? 2 : isMat(schema) ? 4 : undefined;
|
|
16
14
|
}
|
|
17
15
|
function packedSizeOf(schema) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
const packedSchema = packedSchemaOf(schema);
|
|
17
|
+
const matrixDim = packedMatrixDimOf(packedSchema);
|
|
18
|
+
if (matrixDim) {
|
|
19
|
+
return matrixDim * matrixDim * 4;
|
|
20
|
+
}
|
|
21
|
+
if (isWgslArray(packedSchema)) {
|
|
22
|
+
return packedSchema.elementCount * packedSizeOf(packedSchema.elementType);
|
|
23
|
+
}
|
|
24
|
+
return sizeOf(packedSchema);
|
|
23
25
|
}
|
|
24
26
|
function computeSoAByteLength(arraySchema, soaData) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
const structSchema = arraySchema.elementType;
|
|
28
|
+
let inferredCount;
|
|
29
|
+
for (const key in structSchema.propTypes) {
|
|
30
|
+
const srcArray = soaData[key];
|
|
31
|
+
const fieldSchema = structSchema.propTypes[key];
|
|
32
|
+
if (srcArray === undefined || fieldSchema === undefined) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const packedFieldSize = packedSizeOf(fieldSchema);
|
|
36
|
+
if (packedFieldSize === 0) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const fieldElementCount = Math.floor(srcArray.byteLength / packedFieldSize);
|
|
40
|
+
inferredCount =
|
|
41
|
+
inferredCount === undefined ? fieldElementCount : Math.min(inferredCount, fieldElementCount);
|
|
42
|
+
}
|
|
43
|
+
if (inferredCount === undefined) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const elementStride = roundUp(sizeOf(structSchema), alignmentOf(structSchema));
|
|
47
|
+
return inferredCount * elementStride;
|
|
39
48
|
}
|
|
40
49
|
function writePackedValue(target, schema, srcBytes, dstOffset, srcOffset) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
const unpackedSchema = undecorate(schema);
|
|
51
|
+
const packedSchema = isAtomic(unpackedSchema) ? unpackedSchema.inner : unpackedSchema;
|
|
52
|
+
const matrixDim = packedMatrixDimOf(packedSchema);
|
|
53
|
+
if (matrixDim) {
|
|
54
|
+
const packedColumnSize = matrixDim * 4;
|
|
55
|
+
const gpuColumnStride = roundUp(packedColumnSize, alignmentOf(schema));
|
|
56
|
+
for (let col = 0; col < matrixDim; col++) {
|
|
57
|
+
target.set(srcBytes.subarray(srcOffset + col * packedColumnSize, srcOffset + col * packedColumnSize + packedColumnSize), dstOffset + col * gpuColumnStride);
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (isWgslArray(unpackedSchema)) {
|
|
62
|
+
const packedElementSize = packedSizeOf(unpackedSchema.elementType);
|
|
63
|
+
const gpuElementStride = roundUp(sizeOf(unpackedSchema.elementType), alignmentOf(unpackedSchema.elementType));
|
|
64
|
+
for (let i = 0; i < unpackedSchema.elementCount; i++) {
|
|
65
|
+
writePackedValue(target, unpackedSchema.elementType, srcBytes, dstOffset + i * gpuElementStride, srcOffset + i * packedElementSize);
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
target.set(srcBytes.subarray(srcOffset, srcOffset + sizeOf(packedSchema)), dstOffset);
|
|
57
70
|
}
|
|
58
71
|
function scatterSoA(target, arraySchema, soaData, startOffset, endOffset) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
const structSchema = arraySchema.elementType;
|
|
73
|
+
const elementStride = roundUp(sizeOf(structSchema), alignmentOf(structSchema));
|
|
74
|
+
invariant(startOffset % elementStride === 0, `startOffset (${startOffset}) must be aligned to the element stride (${elementStride})`);
|
|
75
|
+
const startElement = Math.floor(startOffset / elementStride);
|
|
76
|
+
const endElement = Math.min(arraySchema.elementCount, Math.ceil(endOffset / elementStride));
|
|
77
|
+
const elementCount = Math.max(0, endElement - startElement);
|
|
78
|
+
const offsets = offsetsForProps(structSchema);
|
|
79
|
+
for (const key in structSchema.propTypes) {
|
|
80
|
+
const fieldSchema = structSchema.propTypes[key];
|
|
81
|
+
if (fieldSchema === undefined) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const srcArray = soaData[key];
|
|
85
|
+
invariant(srcArray !== undefined, `Missing SoA data for field '${key}'`);
|
|
86
|
+
const fieldOffset = offsets[key]?.offset;
|
|
87
|
+
invariant(fieldOffset !== undefined, `Field ${key} not found in struct schema`);
|
|
88
|
+
const packedFieldSize = packedSizeOf(fieldSchema);
|
|
89
|
+
const srcBytes = new Uint8Array(srcArray.buffer, srcArray.byteOffset, srcArray.byteLength);
|
|
90
|
+
for (let i = 0; i < elementCount; i++) {
|
|
91
|
+
writePackedValue(target, fieldSchema, srcBytes, (startElement + i) * elementStride + fieldOffset, i * packedFieldSize);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
77
94
|
}
|
|
78
|
-
function writeSoA(buffer, data, options) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
endOffset
|
|
88
|
-
});
|
|
95
|
+
export function writeSoA(buffer, data, options) {
|
|
96
|
+
const arrayBuffer = buffer.arrayBuffer;
|
|
97
|
+
const startOffset = options?.startOffset ?? 0;
|
|
98
|
+
const bufferSize = sizeOf(buffer.dataType);
|
|
99
|
+
const naturalSize = computeSoAByteLength(buffer.dataType, data);
|
|
100
|
+
const endOffset = options?.endOffset ??
|
|
101
|
+
(naturalSize === undefined ? bufferSize : Math.min(startOffset + naturalSize, bufferSize));
|
|
102
|
+
scatterSoA(new Uint8Array(arrayBuffer), buffer.dataType, data, startOffset, endOffset);
|
|
103
|
+
buffer.write(arrayBuffer, { startOffset, endOffset });
|
|
89
104
|
}
|
|
90
|
-
|
|
91
|
-
//#endregion
|
|
92
|
-
export { writeSoA };
|