@motion-core/motion-gpu 0.4.0 → 0.4.2
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/dist/advanced.d.ts +1 -0
- package/dist/advanced.d.ts.map +1 -0
- package/dist/advanced.js +12 -6
- package/dist/core/advanced.d.ts +1 -0
- package/dist/core/advanced.d.ts.map +1 -0
- package/dist/core/advanced.js +12 -5
- package/dist/core/current-value.d.ts +1 -0
- package/dist/core/current-value.d.ts.map +1 -0
- package/dist/core/current-value.js +35 -34
- package/dist/core/current-value.js.map +1 -0
- package/dist/core/error-diagnostics.d.ts +1 -0
- package/dist/core/error-diagnostics.d.ts.map +1 -0
- package/dist/core/error-diagnostics.js +70 -137
- package/dist/core/error-diagnostics.js.map +1 -0
- package/dist/core/error-report.d.ts +1 -0
- package/dist/core/error-report.d.ts.map +1 -0
- package/dist/core/error-report.js +184 -233
- package/dist/core/error-report.js.map +1 -0
- package/dist/core/frame-registry.d.ts +1 -0
- package/dist/core/frame-registry.d.ts.map +1 -0
- package/dist/core/frame-registry.js +546 -662
- package/dist/core/frame-registry.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -12
- package/dist/core/material-preprocess.d.ts +1 -0
- package/dist/core/material-preprocess.d.ts.map +1 -0
- package/dist/core/material-preprocess.js +128 -151
- package/dist/core/material-preprocess.js.map +1 -0
- package/dist/core/material.d.ts +1 -0
- package/dist/core/material.d.ts.map +1 -0
- package/dist/core/material.js +263 -317
- package/dist/core/material.js.map +1 -0
- package/dist/core/recompile-policy.d.ts +1 -0
- package/dist/core/recompile-policy.d.ts.map +1 -0
- package/dist/core/recompile-policy.js +18 -13
- package/dist/core/recompile-policy.js.map +1 -0
- package/dist/core/render-graph.d.ts +1 -0
- package/dist/core/render-graph.d.ts.map +1 -0
- package/dist/core/render-graph.js +61 -68
- package/dist/core/render-graph.js.map +1 -0
- package/dist/core/render-targets.d.ts +2 -0
- package/dist/core/render-targets.d.ts.map +1 -0
- package/dist/core/render-targets.js +52 -53
- package/dist/core/render-targets.js.map +1 -0
- package/dist/core/renderer.d.ts +1 -0
- package/dist/core/renderer.d.ts.map +1 -0
- package/dist/core/renderer.js +942 -1081
- package/dist/core/renderer.js.map +1 -0
- package/dist/core/runtime-loop.d.ts +2 -0
- package/dist/core/runtime-loop.d.ts.map +1 -0
- package/dist/core/runtime-loop.js +305 -362
- package/dist/core/runtime-loop.js.map +1 -0
- package/dist/core/scheduler-helpers.d.ts +1 -0
- package/dist/core/scheduler-helpers.d.ts.map +1 -0
- package/dist/core/scheduler-helpers.js +52 -51
- package/dist/core/scheduler-helpers.js.map +1 -0
- package/dist/core/shader.d.ts +1 -0
- package/dist/core/shader.d.ts.map +1 -0
- package/dist/core/shader.js +92 -117
- package/dist/core/shader.js.map +1 -0
- package/dist/core/texture-loader.d.ts +1 -0
- package/dist/core/texture-loader.d.ts.map +1 -0
- package/dist/core/texture-loader.js +205 -273
- package/dist/core/texture-loader.js.map +1 -0
- package/dist/core/textures.d.ts +2 -0
- package/dist/core/textures.d.ts.map +1 -0
- package/dist/core/textures.js +106 -116
- package/dist/core/textures.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +0 -4
- package/dist/core/uniforms.d.ts +1 -0
- package/dist/core/uniforms.d.ts.map +1 -0
- package/dist/core/uniforms.js +170 -191
- package/dist/core/uniforms.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -6
- package/dist/passes/BlitPass.d.ts +1 -0
- package/dist/passes/BlitPass.d.ts.map +1 -0
- package/dist/passes/BlitPass.js +23 -18
- package/dist/passes/BlitPass.js.map +1 -0
- package/dist/passes/CopyPass.d.ts +2 -0
- package/dist/passes/CopyPass.d.ts.map +1 -0
- package/dist/passes/CopyPass.js +58 -52
- package/dist/passes/CopyPass.js.map +1 -0
- package/dist/passes/FullscreenPass.d.ts +2 -0
- package/dist/passes/FullscreenPass.d.ts.map +1 -0
- package/dist/passes/FullscreenPass.js +127 -130
- package/dist/passes/FullscreenPass.js.map +1 -0
- package/dist/passes/ShaderPass.d.ts +1 -0
- package/dist/passes/ShaderPass.d.ts.map +1 -0
- package/dist/passes/ShaderPass.js +40 -37
- package/dist/passes/ShaderPass.js.map +1 -0
- package/dist/passes/index.d.ts +1 -0
- package/dist/passes/index.d.ts.map +1 -0
- package/dist/passes/index.js +4 -3
- package/dist/react/FragCanvas.d.ts +2 -0
- package/dist/react/FragCanvas.d.ts.map +1 -0
- package/dist/react/FragCanvas.js +234 -211
- package/dist/react/FragCanvas.js.map +1 -0
- package/dist/react/MotionGPUErrorOverlay.d.ts +1 -0
- package/dist/react/MotionGPUErrorOverlay.d.ts.map +1 -0
- package/dist/react/MotionGPUErrorOverlay.js +384 -48
- package/dist/react/MotionGPUErrorOverlay.js.map +1 -0
- package/dist/react/Portal.d.ts +1 -0
- package/dist/react/Portal.d.ts.map +1 -0
- package/dist/react/Portal.js +18 -21
- package/dist/react/Portal.js.map +1 -0
- package/dist/react/advanced.d.ts +1 -0
- package/dist/react/advanced.d.ts.map +1 -0
- package/dist/react/advanced.js +12 -6
- package/dist/react/frame-context.d.ts +1 -0
- package/dist/react/frame-context.d.ts.map +1 -0
- package/dist/react/frame-context.js +88 -94
- package/dist/react/frame-context.js.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +10 -9
- package/dist/react/motiongpu-context.d.ts +1 -0
- package/dist/react/motiongpu-context.d.ts.map +1 -0
- package/dist/react/motiongpu-context.js +18 -15
- package/dist/react/motiongpu-context.js.map +1 -0
- package/dist/react/use-motiongpu-user-context.d.ts +1 -0
- package/dist/react/use-motiongpu-user-context.d.ts.map +1 -0
- package/dist/react/use-motiongpu-user-context.js +83 -82
- package/dist/react/use-motiongpu-user-context.js.map +1 -0
- package/dist/react/use-texture.d.ts +1 -0
- package/dist/react/use-texture.d.ts.map +1 -0
- package/dist/react/use-texture.js +132 -152
- package/dist/react/use-texture.js.map +1 -0
- package/dist/svelte/FragCanvas.svelte.d.ts +2 -0
- package/dist/svelte/FragCanvas.svelte.d.ts.map +1 -0
- package/dist/svelte/MotionGPUErrorOverlay.svelte +17 -20
- package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts +1 -0
- package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts.map +1 -0
- package/dist/svelte/Portal.svelte.d.ts +1 -0
- package/dist/svelte/Portal.svelte.d.ts.map +1 -0
- package/dist/svelte/advanced.d.ts +1 -0
- package/dist/svelte/advanced.d.ts.map +1 -0
- package/dist/svelte/advanced.js +11 -6
- package/dist/svelte/frame-context.d.ts +1 -0
- package/dist/svelte/frame-context.d.ts.map +1 -0
- package/dist/svelte/frame-context.js +27 -27
- package/dist/svelte/frame-context.js.map +1 -0
- package/dist/svelte/index.d.ts +1 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +10 -9
- package/dist/svelte/motiongpu-context.d.ts +1 -0
- package/dist/svelte/motiongpu-context.d.ts.map +1 -0
- package/dist/svelte/motiongpu-context.js +24 -21
- package/dist/svelte/motiongpu-context.js.map +1 -0
- package/dist/svelte/use-motiongpu-user-context.d.ts +1 -0
- package/dist/svelte/use-motiongpu-user-context.d.ts.map +1 -0
- package/dist/svelte/use-motiongpu-user-context.js +69 -70
- package/dist/svelte/use-motiongpu-user-context.js.map +1 -0
- package/dist/svelte/use-texture.d.ts +1 -0
- package/dist/svelte/use-texture.d.ts.map +1 -0
- package/dist/svelte/use-texture.js +125 -147
- package/dist/svelte/use-texture.js.map +1 -0
- package/package.json +15 -7
- package/src/lib/advanced.ts +6 -0
- package/src/lib/core/advanced.ts +12 -0
- package/src/lib/core/current-value.ts +64 -0
- package/src/lib/core/error-diagnostics.ts +236 -0
- package/src/lib/core/error-report.ts +406 -0
- package/src/lib/core/frame-registry.ts +1189 -0
- package/src/lib/core/index.ts +77 -0
- package/src/lib/core/material-preprocess.ts +284 -0
- package/src/lib/core/material.ts +667 -0
- package/src/lib/core/recompile-policy.ts +31 -0
- package/src/lib/core/render-graph.ts +143 -0
- package/src/lib/core/render-targets.ts +107 -0
- package/src/lib/core/renderer.ts +1547 -0
- package/src/lib/core/runtime-loop.ts +458 -0
- package/src/lib/core/scheduler-helpers.ts +136 -0
- package/src/lib/core/shader.ts +258 -0
- package/src/lib/core/texture-loader.ts +476 -0
- package/src/lib/core/textures.ts +235 -0
- package/src/lib/core/types.ts +582 -0
- package/src/lib/core/uniforms.ts +282 -0
- package/src/lib/index.ts +6 -0
- package/src/lib/passes/BlitPass.ts +54 -0
- package/src/lib/passes/CopyPass.ts +80 -0
- package/src/lib/passes/FullscreenPass.ts +173 -0
- package/src/lib/passes/ShaderPass.ts +88 -0
- package/src/lib/passes/index.ts +3 -0
- package/src/lib/react/MotionGPUErrorOverlay.tsx +392 -0
- package/src/lib/react/advanced.ts +36 -0
- package/src/lib/react/frame-context.ts +169 -0
- package/src/lib/react/index.ts +51 -0
- package/src/lib/react/motiongpu-context.ts +88 -0
- package/src/lib/react/use-motiongpu-user-context.ts +186 -0
- package/src/lib/react/use-texture.ts +233 -0
- package/src/lib/svelte/FragCanvas.svelte +249 -0
- package/src/lib/svelte/MotionGPUErrorOverlay.svelte +382 -0
- package/src/lib/svelte/Portal.svelte +31 -0
- package/src/lib/svelte/advanced.ts +32 -0
- package/src/lib/svelte/frame-context.ts +87 -0
- package/src/lib/svelte/index.ts +51 -0
- package/src/lib/svelte/motiongpu-context.ts +97 -0
- package/src/lib/svelte/use-motiongpu-user-context.ts +145 -0
- package/src/lib/svelte/use-texture.ts +232 -0
- package/dist/react/MotionGPUErrorOverlay.tsx +0 -129
- /package/{dist → src/lib}/react/FragCanvas.tsx +0 -0
- /package/{dist → src/lib}/react/Portal.tsx +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { RenderPass, RenderPassInputSlot, RenderPassOutputSlot } from './types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolved render-pass step with defaults applied.
|
|
5
|
+
*/
|
|
6
|
+
export interface RenderGraphStep {
|
|
7
|
+
/**
|
|
8
|
+
* User pass instance.
|
|
9
|
+
*/
|
|
10
|
+
pass: RenderPass;
|
|
11
|
+
/**
|
|
12
|
+
* Resolved input slot.
|
|
13
|
+
*/
|
|
14
|
+
input: RenderPassInputSlot;
|
|
15
|
+
/**
|
|
16
|
+
* Resolved output slot.
|
|
17
|
+
*/
|
|
18
|
+
output: RenderPassOutputSlot;
|
|
19
|
+
/**
|
|
20
|
+
* Whether ping-pong swap should be performed after render.
|
|
21
|
+
*/
|
|
22
|
+
needsSwap: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether pass should clear output before drawing.
|
|
25
|
+
*/
|
|
26
|
+
clear: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Effective clear color.
|
|
29
|
+
*/
|
|
30
|
+
clearColor: [number, number, number, number];
|
|
31
|
+
/**
|
|
32
|
+
* Whether output should be preserved after pass ends.
|
|
33
|
+
*/
|
|
34
|
+
preserve: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Immutable render-graph execution plan for one frame.
|
|
39
|
+
*/
|
|
40
|
+
export interface RenderGraphPlan {
|
|
41
|
+
/**
|
|
42
|
+
* Resolved enabled steps in execution order.
|
|
43
|
+
*/
|
|
44
|
+
steps: RenderGraphStep[];
|
|
45
|
+
/**
|
|
46
|
+
* Output slot holding final frame result before presentation.
|
|
47
|
+
*/
|
|
48
|
+
finalOutput: RenderPassOutputSlot;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates a copy of RGBA clear color.
|
|
53
|
+
*/
|
|
54
|
+
function cloneClearColor(
|
|
55
|
+
color: [number, number, number, number]
|
|
56
|
+
): [number, number, number, number] {
|
|
57
|
+
return [color[0], color[1], color[2], color[3]];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Builds validated render graph plan from runtime pass list.
|
|
62
|
+
*
|
|
63
|
+
* @param passes - Runtime passes.
|
|
64
|
+
* @param defaultClearColor - Global clear color fallback.
|
|
65
|
+
* @returns Resolved render graph plan.
|
|
66
|
+
*/
|
|
67
|
+
export function planRenderGraph(
|
|
68
|
+
passes: RenderPass[] | undefined,
|
|
69
|
+
defaultClearColor: [number, number, number, number],
|
|
70
|
+
renderTargetSlots?: Iterable<string>
|
|
71
|
+
): RenderGraphPlan {
|
|
72
|
+
const steps: RenderGraphStep[] = [];
|
|
73
|
+
const declaredTargets = new Set(renderTargetSlots ?? []);
|
|
74
|
+
const availableSlots = new Set<RenderPassInputSlot | RenderPassOutputSlot>(['source']);
|
|
75
|
+
let finalOutput: RenderPassOutputSlot = 'canvas';
|
|
76
|
+
let enabledIndex = 0;
|
|
77
|
+
|
|
78
|
+
for (const pass of passes ?? []) {
|
|
79
|
+
if (pass.enabled === false) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const needsSwap = pass.needsSwap ?? true;
|
|
84
|
+
const input: RenderPassInputSlot = pass.input ?? 'source';
|
|
85
|
+
const output: RenderPassOutputSlot = pass.output ?? (needsSwap ? 'target' : 'source');
|
|
86
|
+
|
|
87
|
+
if (input === 'canvas') {
|
|
88
|
+
throw new Error(`Render pass #${enabledIndex} cannot read from "canvas".`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const inputIsNamed = input !== 'source' && input !== 'target';
|
|
92
|
+
if (inputIsNamed && !declaredTargets.has(input)) {
|
|
93
|
+
throw new Error(`Render pass #${enabledIndex} reads unknown target "${input}".`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const outputIsNamed = output !== 'source' && output !== 'target' && output !== 'canvas';
|
|
97
|
+
if (outputIsNamed && !declaredTargets.has(output)) {
|
|
98
|
+
throw new Error(`Render pass #${enabledIndex} writes unknown target "${output}".`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (needsSwap && (input !== 'source' || output !== 'target')) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
`Render pass #${enabledIndex} uses needsSwap=true but does not follow source->target flow.`
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!availableSlots.has(input)) {
|
|
108
|
+
throw new Error(`Render pass #${enabledIndex} reads "${input}" before it is written.`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const clear = pass.clear ?? false;
|
|
112
|
+
const clearColor = cloneClearColor(pass.clearColor ?? defaultClearColor);
|
|
113
|
+
const preserve = pass.preserve ?? true;
|
|
114
|
+
|
|
115
|
+
steps.push({
|
|
116
|
+
pass,
|
|
117
|
+
input,
|
|
118
|
+
output,
|
|
119
|
+
needsSwap,
|
|
120
|
+
clear,
|
|
121
|
+
clearColor,
|
|
122
|
+
preserve
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
if (needsSwap) {
|
|
126
|
+
availableSlots.add('target');
|
|
127
|
+
availableSlots.add('source');
|
|
128
|
+
finalOutput = 'source';
|
|
129
|
+
} else {
|
|
130
|
+
if (output !== 'canvas') {
|
|
131
|
+
availableSlots.add(output);
|
|
132
|
+
}
|
|
133
|
+
finalOutput = output;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
enabledIndex += 1;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
steps,
|
|
141
|
+
finalOutput
|
|
142
|
+
};
|
|
143
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { assertUniformName } from './uniforms.js';
|
|
2
|
+
import type { RenderTargetDefinitionMap } from './types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Concrete render target configuration resolved for current canvas size.
|
|
6
|
+
*/
|
|
7
|
+
export interface ResolvedRenderTargetDefinition {
|
|
8
|
+
/**
|
|
9
|
+
* Render target key.
|
|
10
|
+
*/
|
|
11
|
+
key: string;
|
|
12
|
+
/**
|
|
13
|
+
* Resolved width in pixels.
|
|
14
|
+
*/
|
|
15
|
+
width: number;
|
|
16
|
+
/**
|
|
17
|
+
* Resolved height in pixels.
|
|
18
|
+
*/
|
|
19
|
+
height: number;
|
|
20
|
+
/**
|
|
21
|
+
* Resolved format.
|
|
22
|
+
*/
|
|
23
|
+
format: GPUTextureFormat;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Asserts positive finite numeric input for render target options.
|
|
28
|
+
*/
|
|
29
|
+
function assertPositiveFinite(name: string, value: number): void {
|
|
30
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
31
|
+
throw new Error(`${name} must be a finite number greater than 0`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Resolves a render target dimension from explicit value or scaled canvas size.
|
|
37
|
+
*/
|
|
38
|
+
function resolveDimension(
|
|
39
|
+
explicitValue: number | undefined,
|
|
40
|
+
canvasDimension: number,
|
|
41
|
+
scale: number
|
|
42
|
+
): number {
|
|
43
|
+
if (explicitValue !== undefined) {
|
|
44
|
+
assertPositiveFinite('RenderTarget dimension', explicitValue);
|
|
45
|
+
return Math.max(1, Math.floor(explicitValue));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return Math.max(1, Math.floor(canvasDimension * scale));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Resolves all render target definitions for a specific canvas size.
|
|
53
|
+
*
|
|
54
|
+
* @param definitions - Declarative definitions.
|
|
55
|
+
* @param canvasWidth - Current canvas width in pixels.
|
|
56
|
+
* @param canvasHeight - Current canvas height in pixels.
|
|
57
|
+
* @param defaultFormat - Fallback texture format.
|
|
58
|
+
* @returns Sorted concrete render target definitions.
|
|
59
|
+
*/
|
|
60
|
+
export function resolveRenderTargetDefinitions(
|
|
61
|
+
definitions: RenderTargetDefinitionMap | undefined,
|
|
62
|
+
canvasWidth: number,
|
|
63
|
+
canvasHeight: number,
|
|
64
|
+
defaultFormat: GPUTextureFormat
|
|
65
|
+
): ResolvedRenderTargetDefinition[] {
|
|
66
|
+
if (!definitions) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const keys = Object.keys(definitions).sort();
|
|
71
|
+
const resolved: ResolvedRenderTargetDefinition[] = [];
|
|
72
|
+
|
|
73
|
+
for (const key of keys) {
|
|
74
|
+
assertUniformName(key);
|
|
75
|
+
const definition = definitions[key];
|
|
76
|
+
const scale = definition?.scale ?? 1;
|
|
77
|
+
assertPositiveFinite('RenderTarget scale', scale);
|
|
78
|
+
|
|
79
|
+
const width = resolveDimension(definition?.width, canvasWidth, scale);
|
|
80
|
+
const height = resolveDimension(definition?.height, canvasHeight, scale);
|
|
81
|
+
|
|
82
|
+
resolved.push({
|
|
83
|
+
key,
|
|
84
|
+
width,
|
|
85
|
+
height,
|
|
86
|
+
format: definition?.format ?? defaultFormat
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return resolved;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Builds a deterministic signature used to detect render target topology changes.
|
|
95
|
+
*
|
|
96
|
+
* @param resolvedDefinitions - Concrete target definitions.
|
|
97
|
+
* @returns Stable signature string.
|
|
98
|
+
*/
|
|
99
|
+
export function buildRenderTargetSignature(
|
|
100
|
+
resolvedDefinitions: ResolvedRenderTargetDefinition[]
|
|
101
|
+
): string {
|
|
102
|
+
return resolvedDefinitions
|
|
103
|
+
.map((definition) => {
|
|
104
|
+
return `${definition.key}:${definition.format}:${definition.width}x${definition.height}`;
|
|
105
|
+
})
|
|
106
|
+
.join('|');
|
|
107
|
+
}
|