bun-webgpu
Version:
Native WebGPU implementation for Bun runtime
116 lines (115 loc) • 6.5 kB
TypeScript
import { type Pointer } from "bun:ffi";
export declare const pointerSize: number;
export type PrimitiveType = 'u8' | 'u16' | 'u32' | 'u64' | 'f32' | 'f64' | 'pointer' | 'i32' | 'i16' | 'bool_u8' | 'bool_u32';
interface PointyObject {
ptr: Pointer | number | bigint | null;
}
interface ObjectPointerDef<T extends PointyObject> {
__type: 'objectPointer';
}
/**
* Type helper for creating object pointers for structs.
*/
export declare function objectPtr<T extends PointyObject>(): ObjectPointerDef<T>;
type Prettify<T> = {
[K in keyof T]: T[K];
} & {};
export type Simplify<T> = T extends (...args: any[]) => any ? T : T extends object ? Prettify<T> : T;
type PrimitiveToTSType<T extends PrimitiveType> = T extends 'u8' | 'u16' | 'u32' | 'i16' | 'i32' | 'f32' | 'f64' ? number : T extends 'u64' ? bigint | number : T extends 'bool_u8' | 'bool_u32' ? boolean : T extends 'pointer' ? number | bigint : never;
type FieldDefInputType<Def> = Def extends PrimitiveType ? PrimitiveToTSType<Def> : Def extends 'cstring' | 'char*' ? string | null : Def extends EnumDef<infer E> ? keyof E : Def extends StructDef<any, infer InputType> ? InputType : Def extends ObjectPointerDef<infer T> ? T | null : Def extends readonly [infer InnerDef] ? InnerDef extends PrimitiveType ? Iterable<PrimitiveToTSType<InnerDef>> : InnerDef extends EnumDef<infer E> ? Iterable<keyof E> : InnerDef extends StructDef<any, infer InputType> ? Iterable<InputType> : InnerDef extends ObjectPointerDef<infer T> ? (T | null)[] : never : never;
type FieldDefOutputType<Def> = Def extends PrimitiveType ? PrimitiveToTSType<Def> : Def extends 'cstring' | 'char*' ? string | null : Def extends EnumDef<infer E> ? keyof E : Def extends StructDef<infer OutputType, any> ? OutputType : Def extends ObjectPointerDef<infer T> ? T | null : Def extends readonly [infer InnerDef] ? InnerDef extends PrimitiveType ? Iterable<PrimitiveToTSType<InnerDef>> : InnerDef extends EnumDef<infer E> ? Iterable<keyof E> : InnerDef extends StructDef<infer OutputType, any> ? Iterable<OutputType> : InnerDef extends ObjectPointerDef<infer T> ? (T | null)[] : never : never;
type IsOptional<Options extends StructFieldOptions | undefined> = Options extends {
optional: true;
} ? true : Options extends {
default: any;
} ? true : Options extends {
lengthOf: string;
} ? true : Options extends {
condition: () => boolean;
} ? true : false;
export type StructObjectInputType<Fields extends readonly StructField[]> = {
[F in Fields[number] as IsOptional<F[2]> extends false ? F[0] : never]: FieldDefInputType<F[1]>;
} & {
[F in Fields[number] as IsOptional<F[2]> extends true ? F[0] : never]?: FieldDefInputType<F[1]> | null;
};
export type StructObjectOutputType<Fields extends readonly StructField[]> = {
[F in Fields[number] as IsOptional<F[2]> extends false ? F[0] : never]: FieldDefOutputType<F[1]>;
} & {
[F in Fields[number] as IsOptional<F[2]> extends true ? F[0] : never]?: FieldDefOutputType<F[1]> | null;
};
type DefineStructReturnType<Fields extends readonly StructField[], Options extends StructDefOptions | undefined> = StructDef<Simplify<Options extends {
reduceValue: (value: any) => infer R;
} ? R : StructObjectOutputType<Fields>>, Simplify<Options extends {
mapValue: (value: infer V) => any;
} ? V : StructObjectInputType<Fields>>>;
interface AllocStructOptions {
lengths?: Record<string, number>;
}
interface AllocStructResult {
buffer: ArrayBuffer;
view: DataView;
subBuffers?: Record<string, ArrayBuffer>;
}
export declare function allocStruct(structDef: StructDef<any, any>, options?: AllocStructOptions): AllocStructResult;
export interface EnumDef<T extends Record<string, number>> {
__type: 'enum';
type: Exclude<PrimitiveType, 'bool_u8' | 'bool_u32'>;
to(value: keyof T): number;
from(value: number | bigint): keyof T;
enum: T;
}
export declare function defineEnum<T extends Record<string, number>>(mapping: T, base?: Exclude<PrimitiveType, 'bool_u8' | 'bool_u32'>): EnumDef<T>;
type ValidationFunction = (value: any, fieldName: string, options: {
hints?: any;
input?: any;
}) => void | never;
interface StructFieldOptions {
optional?: boolean;
mapOptionalInline?: boolean;
unpackTransform?: (value: any) => any;
packTransform?: (value: any) => any;
lengthOf?: string;
asPointer?: boolean;
default?: any;
condition?: () => boolean;
validate?: ValidationFunction | ValidationFunction[];
}
type StructField = readonly [string, PrimitiveType, StructFieldOptions?] | readonly [string, EnumDef<any>, StructFieldOptions?] | readonly [string, StructDef<any>, StructFieldOptions?] | readonly [string, 'cstring' | 'char*', StructFieldOptions?] | readonly [string, ObjectPointerDef<any>, StructFieldOptions?] | readonly [string, readonly [EnumDef<any> | StructDef<any> | PrimitiveType | ObjectPointerDef<any>], StructFieldOptions?];
export interface StructFieldPackOptions {
validationHints?: any;
}
export interface StructFieldDescription {
name: string;
offset: number;
size: number;
align: number;
optional: boolean;
type: PrimitiveType | EnumDef<any> | StructDef<any> | 'cstring' | 'char*' | ObjectPointerDef<any> | readonly [any];
lengthOf?: string;
}
export interface ArrayFieldMetadata {
elementSize: number;
arrayOffset: number;
lengthOffset: number;
lengthPack: (view: DataView, offset: number, value: number) => void;
}
export interface StructDef<OutputType, InputType = OutputType> {
__type: 'struct';
size: number;
align: number;
hasMapValue: boolean;
layoutByName: Map<string, StructFieldDescription>;
arrayFields: Map<string, ArrayFieldMetadata>;
pack(obj: Simplify<InputType>, options?: StructFieldPackOptions): ArrayBuffer;
packInto(obj: Simplify<InputType>, view: DataView, offset: number, options?: StructFieldPackOptions): void;
unpack(buf: ArrayBuffer | SharedArrayBuffer): Simplify<OutputType>;
describe(): StructFieldDescription[];
}
export interface StructDefOptions {
default?: Record<string, any>;
mapValue?: (value: any) => any;
reduceValue?: (value: any) => any;
}
export declare function packObjectArray(val: (PointyObject | null)[]): DataView<ArrayBuffer>;
export declare function defineStruct<const Fields extends readonly StructField[], const Opts extends StructDefOptions = {}>(fields: Fields & StructField[], structDefOptions?: Opts): DefineStructReturnType<Fields, Opts>;
export {};