UNPKG

@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
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