UNPKG

gpu.js

Version:

GPU Accelerated JavaScript

686 lines (586 loc) 18.6 kB
export class GPU { static isGPUSupported: boolean; static isCanvasSupported: boolean; static isHeadlessGLSupported: boolean; static isWebGLSupported: boolean; static isWebGL2Supported: boolean; static isKernelMapSupported: boolean; static isOffscreenCanvasSupported: boolean; static isGPUHTMLImageArraySupported: boolean; static isSinglePrecisionSupported: boolean; constructor(settings?: IGPUSettings); functions: GPUFunction<ThreadKernelVariable[]>[]; nativeFunctions: IGPUNativeFunction[]; setFunctions(flag: any): this; setNativeFunctions(flag: IGPUNativeFunction[]): this; addFunction<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsType = {}>(kernel: GPUFunction<ArgTypes, ConstantsType>, settings?: IGPUFunctionSettings): this; addNativeFunction(name: string, source: string, settings?: IGPUFunctionSettings): this; combineKernels(...kernels: KernelFunction[]): IKernelRunShortcut; combineKernels<KF extends KernelFunction>(...kernels: KF[]): ((...args: Parameters<KF>) => ReturnType<KF>[] | ReturnType<KF>[][] | ReturnType<KF>[][][] | Texture | void ) & IKernelRunShortcutBase; createKernel<ArgTypes extends ThreadKernelVariable[], ConstantsT extends IConstantsThis>(kernel: KernelFunction<ArgTypes, ConstantsT>, settings?: IGPUKernelSettings): IKernelRunShortcut; createKernel<KernelType extends KernelFunction>(kernel: KernelType, settings?: IGPUKernelSettings): ((...args: Parameters<KernelType>) => ReturnType<KernelType>[] | ReturnType<KernelType>[][] | ReturnType<KernelType>[][][] | Texture | void ) & IKernelRunShortcutBase; createKernelMap< ArgTypes extends ThreadKernelVariable[], ConstantsType = null, >( subKernels: ISubKernelObject, rootKernel: ThreadFunction<ArgTypes, ConstantsType>, settings?: IGPUKernelSettings): (((this: IKernelFunctionThis<ConstantsType>, ...args: ArgTypes) => IMappedKernelResult) & IKernelMapRunShortcut<typeof subKernels>); destroy(): Promise<void>; Kernel: typeof Kernel; mode: string; canvas: any; context: any; } export interface ISubKernelObject { [targetLocation: string]: ((...args: ThreadKernelVariable[]) => ThreadFunctionResult) | ((...args: any[]) => ThreadFunctionResult); } export interface ISubKernelArray { [index: number]: ((...args: ThreadKernelVariable[]) => ThreadFunctionResult) | ((...args: any[]) => ThreadFunctionResult); } export interface ISubKernelsResults { [resultsLocation: string]: KernelOutput; } export interface IGPUFunction extends IFunctionSettings { source: string; } export interface IGPUNativeFunction extends IGPUFunctionSettings { name: string; source: string; } export interface IMappedKernelResult { result?: KernelVariable; [targetLocation: string]: KernelVariable } export interface INativeFunction extends IGPUFunctionSettings { name: string; source: string; } export interface IInternalNativeFunction extends IArgumentTypes { name: string; source: string; } export interface INativeFunctionList { [name: string]: INativeFunction } export type GPUMode = 'gpu' | 'cpu' | 'dev'; export type GPUInternalMode = 'webgl' | 'webgl2' | 'headlessgl'; export interface IGPUSettings { mode?: GPUMode | GPUInternalMode; canvas?: object; context?: object; functions?: KernelFunction[]; nativeFunctions?: IInternalNativeFunction[]; // format: 'Float32Array' | 'Float16Array' | 'Float' // WE WANT THIS! } export type GPUVariableType = 'Array' | 'Array(2)' | 'Array(3)' | 'Array(4)' | 'Array1D(2)' | 'Array2D(2)' | 'Array3D(2)' | 'Array1D(3)' | 'Array2D(3)' | 'Array3D(3)' | 'Array1D(4)' | 'Array2D(4)' | 'Array3D(4)' | 'Boolean' | 'HTMLCanvas' | 'HTMLImage' | 'HTMLImageArray' | 'Number' | 'Float' | 'Integer' | GPUTextureType; export type GPUTextureType = 'NumberTexture' | 'ArrayTexture(4)'; export interface IGPUArgumentTypes { [argumentName: string]: GPUVariableType; } export interface IGPUFunctionSettings { argumentTypes?: IGPUArgumentTypes | string[], returnType?: GPUVariableType; } export class Kernel { static isSupported: boolean; static isContextMatch(context: any): boolean; static disableValidation(): void; static enableValidation(): void; static nativeFunctionArguments(source: string): IArgumentTypes; static nativeFunctionReturnType(source: string): string; static destroyContext(context: any): void; static features: IKernelFeatures; static getFeatures(): IKernelFeatures; static mode: GPUMode | GPUInternalMode; source: string | IKernelJSON; Kernel: Kernel; output: number[]; debug: boolean; graphical: boolean; loopMaxIterations: number; constants: IConstants; canvas: any; context: WebGLRenderingContext | any; functions: IFunction[]; nativeFunctions: IInternalNativeFunction[]; subKernels: ISubKernel[]; validate: boolean; immutable: boolean; pipeline: boolean; plugins: IPlugin[]; useLegacyEncoder: boolean; tactic: Tactic; built: boolean; texSize: [number, number]; texture: Texture; mappedTextures?: Texture[]; TextureConstructor: typeof Texture; getPixels(flip?: boolean): Uint8ClampedArray[]; getVariablePrecisionString(textureSize?: number[], tactic?: Tactic, isInt?: boolean): string; prependString(value: string): void; hasPrependString(value: string): boolean; constructor(kernel: KernelFunction|IKernelJSON|string, settings?: IDirectKernelSettings); onRequestSwitchKernel?: Kernel; onActivate(previousKernel: Kernel): void; build(...args: KernelVariable[]): void; run(...args: KernelVariable[]): KernelVariable; toString(...args: KernelVariable[]): string; toJSON(): IKernelJSON; setOutput(flag: number[]): this; setWarnVarUsage(flag: boolean): this; setOptimizeFloatMemory(flag: boolean): this; setArgumentTypes(flag: IKernelValueTypes): this; setDebug(flag: boolean): this; setGraphical(flag: boolean): this; setLoopMaxIterations(flag: number): this; setConstants(flag: IConstants): this; setConstants<T>(flag: T & IConstants): this; setConstantTypes(flag: IKernelValueTypes): this; setDynamicOutput(flag: boolean): this; setDynamicArguments(flag: boolean): this; setPipeline(flag: boolean): this; setPrecision(flag: Precision): this; setImmutable(flag: boolean): this; setCanvas(flag: any): this; setContext(flag: any): this; addFunction<ArgTypes extends ThreadKernelVariable[]>(flag: GPUFunction<ArgTypes>, settings?: IFunctionSettings): this; setFunctions(flag: any): this; setNativeFunctions(flag: IGPUNativeFunction[]): this; setStrictIntegers(flag: boolean): this; setTactic(flag: Tactic): this; setUseLegacyEncoder(flag: boolean): this; addSubKernel(subKernel: ISubKernel): this; destroy(removeCanvasReferences?: boolean): void; validateSettings(args: IArguments): void; setUniform1f(name: string, value: number): void; setUniform2f(name: string, value1: number, value2: number): void; setUniform3f(name: string, value1: number, value2: number, value3: number): void; setUniform4f(name: string, value1: number, value2: number, value3: number, value4: number): void; setUniform2fv(name: string, value: [number, number]): void; setUniform3fv(name: string, value: [number, number, number]): void; setUniform4fv(name: string, value: [number, number, number, number]): void; setUniform1i(name: string, value: number): void; setUniform2i(name: string, value1: number, value2: number): void; setUniform3i(name: string, value1: number, value2: number, value3: number): void; setUniform4i(name: string, value1: number, value2: number, value3: number, value4: number): void; setUniform2iv(name: string, value: [number, number]): void; setUniform3iv(name: string, value: [number, number, number]): void; setUniform4iv(name: string, value: [number, number, number, number]): void; } export type GPUFunction<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsType = {}> = ThreadFunction<ArgTypes, ConstantsType> | IFunction | IGPUFunction | string[]; export type ThreadFunction<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsType = {}> = ((this: IKernelFunctionThis<ConstantsType>, ...args: ArgTypes) => ThreadFunctionResult); export type Precision = 'single' | 'unsigned'; export class CPUKernel extends Kernel { } export class GLKernel extends Kernel { } export class WebGLKernel extends GLKernel { } export class WebGL2Kernel extends WebGLKernel { } export class HeadlessGLKernel extends WebGLKernel { } export interface IArgumentTypes { argumentTypes: GPUVariableType[], argumentNames: string[], } export interface IConstants { [constantName: string]: KernelVariable; } export interface IKernelValueTypes { [constantType: string]: GPUVariableType; } export interface IWebGLKernelValueSettings extends IKernelValueSettings { onRequestTexture: () => object; onRequestIndex: () => number; onRequestContextHandle: () => number; texture: any; } export interface IKernelValueSettings { name: string; kernel: Kernel; context: WebGLRenderingContext; contextHandle?: number; checkContext?: boolean; onRequestContextHandle: () => number; onUpdateValueMismatch: (constructor: object) => void; origin: 'user' | 'constants'; strictIntegers?: boolean; type: GPUVariableType; tactic?: Tactic; size: number[]; index?: number; } export type Tactic = 'speed' | 'balanced' | 'precision'; export interface IConstantsThis { [constantName: string]: ThreadKernelVariable; } export interface IKernelXYZ { x: number; y: number; z: number; } export interface FunctionList { [functionName: string]: Function } export interface IGPUKernelSettings extends IKernelSettings { argumentTypes?: ITypesList; functions?: Function[]|FunctionList; tactic?: Tactic; onRequestSwitchKernel?: Kernel; } export interface IKernelSettings { pluginNames?: string[]; output?: number[] | IKernelXYZ; precision?: Precision; constants?: object; context?: any; canvas?: any; pipeline?: boolean; immutable?: boolean; graphical?: boolean; onRequestFallback?: () => Kernel; optimizeFloatMemory?: boolean; dynamicOutput?: boolean; dynamicArguments?: boolean; constantTypes?: ITypesList; useLegacyEncoder?: boolean; nativeFunctions?: IGPUNativeFunction[], strictIntegers?: boolean; } export interface IDirectKernelSettings extends IKernelSettings { argumentTypes?: string[]; functions?: string[]|IFunction; } export interface ITypesList { [typeName: string]: GPUVariableType } export interface IKernelRunShortcutBase<T = KernelOutput> extends Kernel { kernel: Kernel; (...args: KernelVariable[]): T; exec(): Promise<T>; } export interface IKernelRunShortcut extends IKernelRunShortcutBase { } export interface IKernelMapRunShortcut<SubKernelType> extends IKernelRunShortcutBase< { result: KernelOutput } & { [key in keyof SubKernelType]: KernelOutput }> {} export interface IKernelFeatures { isFloatRead: boolean; kernelMap: boolean; isIntegerDivisionAccurate: boolean; isSpeedTacticSupported: boolean; isTextureFloat: boolean; isDrawBuffers: boolean; channelCount: number; maxTextureSize: number; lowIntPrecision: { rangeMax: number }; mediumIntPrecision: { rangeMax: number }; highIntPrecision: { rangeMax: number }; lowFloatPrecision: { rangeMax: number }; mediumFloatPrecision: { rangeMax: number }; highFloatPrecision: { rangeMax: number }; } export interface IKernelFunctionThis<ConstantsT = {}> { output: IKernelXYZ; thread: IKernelXYZ; constants: ConstantsT; color(r: number): void, color(r: number, g: number): void, color(r: number, g: number, b: number): void, color(r: number, g: number, b: number, a: number): void, } export type KernelVariable = boolean | number | Texture | Input | HTMLCanvasElement | OffscreenCanvas | HTMLVideoElement | HTMLImageElement | HTMLImageElement[] | ImageBitmap | ImageData | Float32Array | Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | KernelOutput; export type ThreadFunctionResult = number | number[] | number[][] | [number, number] | [number, number, number] | [number, number, number, number] | Pixel | Boolean; export type ThreadKernelVariable = boolean | number | number[] | number[][] | number[][][] | Float32Array | Float32Array[] | Float32Array[][] | Pixel | Pixel[][] | [number, number] | [number, number][] | [number, number][][] | [number, number][][][] | [number, number, number] | [number, number, number][] | [number, number, number][][] | [number, number, number][][][] | [number, number, number, number] | [number, number, number, number][] | [number, number, number, number][][] | [number, number, number, number][][][] ; export type Pixel = { r: number; g: number; b: number; a: number; }; // export type KernelFunction<ArgT extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsT extends IConstantsThis = {}> = (( // this: IKernelFunctionThis<ConstantsT>, // ...args: ArgT // ) => KernelOutput); export interface KernelFunction<ArgT extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsT = {}> { ( this: IKernelFunctionThis<ConstantsT>, ...args: ArgT ): KernelOutput; } export type KernelOutput = void | number | number[] | number[][] | number[][][] | Float32Array | Float32Array[] | Float32Array[][] | [number, number][] | [number, number, number][] | [number, number, number, number][] | [number, number][][] | [number, number, number][][] | [number, number, number, number][][] | [number, number][][][] | [number, number, number][][][] | [number, number, number, number][][][] | Texture; export interface IFunction { source: string; settings: IFunctionSettings; } export interface IFunctionSettings { name?: string; debug?: boolean; argumentNames?: string[]; argumentTypes?: string[] | { [argumentName: string]: string }; argumentSizes?: number[]; constants?: IConstants; constantTypes?: IKernelValueTypes; output?: number[]; loopMaxIterations?: number; returnType?: string; isRootKernel?: boolean; isSubKernel?: boolean; onNestedFunction?(ast: any, source: string): void; lookupReturnType?(functionName: string, ast: any, node: FunctionNode): void; plugins?: any[]; useLegacyEncoder?: boolean; ast?: any; } export interface ISubKernel { name: string; source: string; property: string | number; returnType: string; } export class FunctionBuilder { static fromKernel(kernel: Kernel, FunctionNode: FunctionNode, extraNodeOptions?: any): FunctionBuilder; constructor(settings: IFunctionBuilderSettings); addFunctionNode(functionNode: FunctionNode): void; traceFunctionCalls(functionName: string, retList?: string[]): string[]; getStringFromFunctionNames(functionName: string[]): string; getPrototypesFromFunctionNames(functionName: string[]): string[]; getString(functionName: string): string; getPrototypeString(functionName: string): string; } export interface IFunctionBuilderSettings { kernel: Kernel; rootNode: FunctionNode; functionNodes?: FunctionNode[]; nativeFunctions?: INativeFunctionList; subKernelNodes?: FunctionNode[]; } // These are mostly internal export class FunctionNode implements IFunctionSettings { constructor(source: string, settings?: IFunctionNodeSettings); } export interface IFunctionNodeSettings extends IFunctionSettings { argumentTypes: string[] } export class WebGLFunctionNode extends FunctionNode {} export class WebGL2FunctionNode extends WebGLFunctionNode {} export class CPUFunctionNode extends FunctionNode {} export interface IGPUTextureSettings { texture: WebGLTexture; size: number[]; dimensions: number[]; output: number[]; context: WebGLRenderingContext; kernel: Kernel; gpu?: GPU; type?: GPUTextureType; } export class Texture { constructor(settings: IGPUTextureSettings) toArray(): TextureArrayOutput; clone(): Texture; delete(): void; clear(): void; kernel: Kernel; } export type TextureArrayOutput = number[] | number[][] | number[][][] | Float32Array | Float32Array[] | Float32Array[][] | [number, number][] | [number, number][][] | [number, number][][][] | [number, number, number][] | [number, number, number][][] | [number, number, number][][][] | [number, number, number, number][] | [number, number, number, number][][] | [number, number, number, number][][][] ; export interface IPlugin { source: string; name: string; functionMatch: string; functionReplace: string; functionReturnType: GPUVariableType; onBeforeRun: (kernel: Kernel) => void; } export type OutputDimensions = [number] | [number, number] | [number, number, number] | Int32Array; export type TextureDimensions = [number, number]; export class Input { value: number[]; size: number[]; constructor(value: number[], size: OutputDimensions); } export type input = (value: number[], size: OutputDimensions) => Input; export function alias<T>(name: string, source: T): T; export class KernelValue { constructor(value: KernelVariable, settings: IKernelValueSettings); getSource(): string; setup(): void; updateValue(value: KernelVariable): void; } export class WebGLKernelValue { constructor(value: any, settings: IWebGLKernelValueSettings); } export interface IFunctionNodeMemberExpressionDetails { xProperty: object; yProperty: object; zProperty: object; property: string; type: string; origin: 'user' | 'constants'; signature: string; } export interface IKernelJSON { settings: IJSONSettings; functionNodes?: object; } export interface IJSONSettings { output: number[]; argumentsTypes: GPUVariableType; returnType: string; argumentNames?: string[]; constants?: IConstants; pipeline?: boolean; pluginNames?: string[]; tactic?: Tactic; threadDim?: number[]; } export declare const utils: { getMinifySafeName: <T>(arrowReference: () => T) => string } export interface IReason { type: 'argumentMismatch' | 'outputPrecisionMismatch'; needed: any; } export interface IDeclaration { ast: object; context: object; name: string; origin: 'declaration'; inForLoopInit: boolean; inForLoopTest: boolean; assignable: boolean; suggestedType: string; valueType: string; dependencies: any; isSafe: boolean; }