@motion-core/motion-gpu
Version:
Framework-agnostic WebGPU runtime for fullscreen WGSL shaders with explicit Svelte, React, and Vue adapter entrypoints.
274 lines • 7.3 kB
TypeScript
import { type Subscribable } from './current-value.js';
import type { FrameInvalidationToken, FrameState, RenderMode } from './types.js';
/**
* Per-frame callback executed by the frame scheduler.
*/
export type FrameCallback = (state: FrameState) => void;
/**
* Stable key type used to identify frame tasks and stages.
*/
export type FrameKey = string | symbol;
/**
* Public metadata describing a registered frame task.
*/
export interface FrameTask {
key: FrameKey;
stage: FrameKey;
}
/**
* Public metadata describing a frame stage.
*/
export interface FrameStage {
key: FrameKey;
}
/**
* Stage callback allowing custom orchestration around task execution.
*/
export type FrameStageCallback = (state: FrameState, runTasks: () => void) => void;
/**
* Options controlling task registration and scheduling behavior.
*/
export interface UseFrameOptions {
/**
* Whether task starts in active state.
*
* @default true
*/
autoStart?: boolean;
/**
* Whether task execution invalidates frame automatically.
*
* @default true
*/
autoInvalidate?: boolean;
/**
* Explicit task invalidation policy.
*/
invalidation?: FrameTaskInvalidation;
/**
* Stage to register task in.
*
* If omitted, main stage is used unless inferred from task dependencies.
*/
stage?: FrameKey | FrameStage;
/**
* Task dependencies that should run after this task.
*/
before?: (FrameKey | FrameTask) | (FrameKey | FrameTask)[];
/**
* Task dependencies that should run before this task.
*/
after?: (FrameKey | FrameTask) | (FrameKey | FrameTask)[];
/**
* Dynamic predicate controlling whether the task is currently active.
*/
running?: () => boolean;
}
/**
* Invalidation token value or resolver.
*/
export type FrameTaskInvalidationToken = FrameInvalidationToken | (() => FrameInvalidationToken | null | undefined);
/**
* Explicit task invalidation policy.
*/
export type FrameTaskInvalidation = 'never' | 'always' | {
mode?: 'never' | 'always';
token?: FrameTaskInvalidationToken;
} | {
mode: 'on-change';
token: FrameTaskInvalidationToken;
};
/**
* Handle returned by `useFrame` registration.
*/
export interface UseFrameResult {
/**
* Registered task metadata.
*/
task: FrameTask;
/**
* Starts task execution.
*/
start: () => void;
/**
* Stops task execution.
*/
stop: () => void;
/**
* Readable flag representing effective running state.
*/
started: Subscribable<boolean>;
}
/**
* Snapshot of the resolved stage/task execution order.
*/
export interface FrameScheduleSnapshot {
stages: Array<{
key: string;
tasks: string[];
}>;
}
/**
* Optional scheduler diagnostics payload captured for the last run.
*/
export interface FrameRunTimings {
total: number;
stages: Record<string, {
duration: number;
tasks: Record<string, number>;
}>;
}
/**
* Aggregated timing statistics for stage/task profiling.
*/
export interface FrameTimingStats {
last: number;
avg: number;
min: number;
max: number;
count: number;
}
/**
* Profiling snapshot aggregated from the configured history window.
*/
export interface FrameProfilingSnapshot {
window: number;
frameCount: number;
lastFrame: FrameRunTimings | null;
total: FrameTimingStats;
stages: Record<string, {
timings: FrameTimingStats;
tasks: Record<string, FrameTimingStats>;
}>;
}
/**
* Internal registration payload including unsubscribe callback.
*/
interface RegisteredFrameTask extends UseFrameResult {
unsubscribe: () => void;
}
/**
* Runtime registry that stores frame tasks/stages and drives render scheduling.
*/
export interface FrameRegistry {
/**
* Registers a frame callback in the scheduler.
*/
register: (keyOrCallback: FrameKey | FrameCallback, callbackOrOptions?: FrameCallback | UseFrameOptions, maybeOptions?: UseFrameOptions) => RegisteredFrameTask;
/**
* Executes one scheduler run.
*/
run: (state: FrameState) => void;
/**
* Marks frame as invalidated for `on-demand` mode.
*/
invalidate: (token?: FrameInvalidationToken) => void;
/**
* Requests a single render in `manual` mode.
*/
advance: () => void;
/**
* Returns whether renderer should submit a frame now.
*/
shouldRender: () => boolean;
/**
* Resets one-frame invalidation/advance flags.
*/
endFrame: () => void;
/**
* Sets render scheduling mode.
*/
setRenderMode: (mode: RenderMode) => void;
/**
* Enables or disables automatic rendering entirely.
*/
setAutoRender: (enabled: boolean) => void;
/**
* Sets maximum allowed delta passed to frame tasks.
*/
setMaxDelta: (value: number) => void;
/**
* Enables/disables frame profiling.
*/
setProfilingEnabled: (enabled: boolean) => void;
/**
* Sets profiling history window (in frames).
*/
setProfilingWindow: (window: number) => void;
/**
* Clears collected profiling samples.
*/
resetProfiling: () => void;
/**
* Enables/disables diagnostics capture.
*/
setDiagnosticsEnabled: (enabled: boolean) => void;
/**
* Returns current render mode.
*/
getRenderMode: () => RenderMode;
/**
* Returns whether automatic rendering is enabled.
*/
getAutoRender: () => boolean;
/**
* Returns current max delta clamp.
*/
getMaxDelta: () => number;
/**
* Returns profiling toggle state.
*/
getProfilingEnabled: () => boolean;
/**
* Returns active profiling history window (in frames).
*/
getProfilingWindow: () => number;
/**
* Returns aggregated profiling snapshot.
*/
getProfilingSnapshot: () => FrameProfilingSnapshot | null;
/**
* Returns diagnostics toggle state.
*/
getDiagnosticsEnabled: () => boolean;
/**
* Returns last run timings snapshot when diagnostics are enabled.
*/
getLastRunTimings: () => FrameRunTimings | null;
/**
* Returns dependency-sorted schedule snapshot.
*/
getSchedule: () => FrameScheduleSnapshot;
/**
* Creates or updates a stage.
*/
createStage: (key: FrameKey, options?: {
before?: (FrameKey | FrameStage) | (FrameKey | FrameStage)[];
after?: (FrameKey | FrameStage) | (FrameKey | FrameStage)[];
callback?: FrameStageCallback | null;
}) => FrameStage;
/**
* Reads stage metadata by key.
*/
getStage: (key: FrameKey) => FrameStage | undefined;
/**
* Removes all tasks from all stages.
*/
clear: () => void;
}
/**
* Creates a frame registry used by `FragCanvas` and `useFrame`.
*
* @param options - Initial scheduler options.
* @returns Mutable frame registry instance.
*/
export declare function createFrameRegistry(options?: {
renderMode?: RenderMode;
autoRender?: boolean;
maxDelta?: number;
profilingEnabled?: boolean;
profilingWindow?: number;
diagnosticsEnabled?: boolean;
}): FrameRegistry;
export {};
//# sourceMappingURL=frame-registry.d.ts.map