typegpu 0.0.0-alpha.3 → 0.0.0-alpha.4

Sign up to get free protection for your applications and to get access to all the features.
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/callable.ts","../src/nameRegistry.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/wgslBufferUsage.ts","../src/wgslBuffer.ts","../src/wgslConstant.ts","../src/wgslDeclare.ts","../src/wgslFunction.ts","../src/wgslFunctionExperimental.ts","../src/settableTrait.ts","../src/wgslPlum.ts","../src/wgslSlot.ts","../src/wgslVariable.ts","../src/wgsl.ts","../src/createRuntime.ts","../src/mathUtils.ts","../src/plumStore.ts","../src/taskQueue.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: <generics>\nabstract class Callable<TArgs extends [...any[]], TReturn> extends Function {\n _bound: Callable<TArgs, TReturn>;\n\n constructor() {\n // We create a new Function object using `super`, with a `this` reference\n // to itself (the Function object) provided by binding it to `this`,\n // then returning the bound Function object (which is a wrapper around the\n // the original `this`/Function object). We then also have to store\n // a reference to the bound Function object, as `_bound` on the unbound `this`,\n // so the bound function has access to the new bound object.\n // Pro: Works well, doesn't rely on deprecated features.\n // Con: A little convoluted, and requires wrapping `this` in a bound object.\n\n super('...args', 'return this._bound._call(...args)');\n // Or without the spread/rest operator:\n // super('return this._bound._call.apply(this._bound, arguments)')\n this._bound = this.bind(this);\n\n // biome-ignore lint/correctness/noConstructorReturn: <quirks of creating a custom callable>\n return this._bound;\n }\n\n abstract _call(...args: TArgs): TReturn;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type ICallable<TArgs extends [...any[]], TReturn> = (\n ...args: TArgs\n) => TReturn;\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type AsCallable<T, TArgs extends [...any[]], TReturn> = T &\n ICallable<TArgs, TReturn>;\n\nexport default Callable;\n","import type { WgslResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: WgslResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable) {\n let name = this.names.get(item);\n\n if (name === undefined) {\n // creating sanitized name\n let label: string;\n if (item.label) {\n label = item.label.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n name = `${label}_${this.lastUniqueId++}`;\n this.names.set(item, name);\n }\n\n return name;\n }\n}\n\nexport class StrictNameRegistry implements NameRegistry {\n /**\n * Allows to provide a good fallback for instances of the\n * same function that are bound to different slot values.\n */\n private readonly _usedNames = new Set<string>();\n\n private readonly _assignedNames = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable): string {\n const assignedName = this._assignedNames.get(item);\n if (assignedName !== undefined) {\n return assignedName;\n }\n\n if (item.label === undefined) {\n throw new Error('Unnamed item found when using a strict NameRegistry');\n }\n\n let index = 0;\n let unusedName = item.label;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${item.label}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n this._assignedNames.set(item, unusedName);\n return unusedName;\n }\n}\n","import { MissingSlotValueError, ResolutionError } from './errors';\nimport type { NameRegistry } from './nameRegistry';\nimport {\n type BufferUsage,\n type Eventual,\n type ResolutionCtx,\n type SlotValuePair,\n type Wgsl,\n type WgslBindable,\n type WgslResolvable,\n type WgslSlot,\n isResolvable,\n isSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport type { WgslIdentifier } from './wgslIdentifier';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n};\n\ntype SlotToValueMap = Map<WgslSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<BufferUsage, string> = {\n uniform: 'uniform',\n mutable_storage: 'storage, read_write',\n readonly_storage: 'storage, read',\n};\n\nclass SharedResolutionState {\n private readonly _memoizedResolves = new WeakMap<\n // WeakMap because if the resolvable does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n WgslResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private _nextFreeBindingIdx = 0;\n private readonly _usedBindables = new Set<WgslBindable>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n ) {}\n\n get usedBindables(): Iterable<WgslBindable> {\n return this._usedBindables;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved\n * with the `compute` method.\n * @param compute Returns the resolved item and the corresponding bindingMap. This result will be discarded if a sufficient cache entry is found.\n */\n getOrInstantiate(item: WgslResolvable, itemCtx: ScopedResolutionCtx): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) => itemCtx.readSlot(slot) === expectedValue,\n )\n ) {\n return instance.result;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n let result: string;\n try {\n result = item.resolve(itemCtx);\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(item);\n }\n\n throw new ResolutionError(err, [item]);\n }\n\n // We know which bindables the item used while resolving\n const slotToValueMap = new Map<WgslSlot<unknown>, unknown>();\n for (const usedSlot of itemCtx.usedSlots) {\n slotToValueMap.set(usedSlot, itemCtx.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n }\n\n reserveBindingEntry(_bindable: WgslBindable) {\n this._usedBindables.add(_bindable);\n\n return { group: this._bindingGroup, idx: this._nextFreeBindingIdx++ };\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\n private readonly _shared: SharedResolutionState;\n\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor({ names, bindingGroup }: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(names, bindingGroup ?? 0);\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n addDeclaration(_declaration: WgslResolvable) {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBinding(_bindable: WgslBindable, _identifier: WgslIdentifier): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n nameFor(item: WgslResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n if (slot.defaultValue === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return slot.defaultValue;\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n const result = this._shared.getOrInstantiate(item, itemCtx);\n\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n}\n\nclass ScopedResolutionCtx implements ResolutionCtx {\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor(\n private readonly _parent: ResolutionCtxImpl | ScopedResolutionCtx,\n private readonly _shared: SharedResolutionState,\n private readonly _slotValuePairs: SlotValuePair<unknown>[],\n ) {}\n\n addDeclaration(declaration: WgslResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void {\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n nameFor(token: WgslResolvable): string {\n return this._shared.names.nameFor(token);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n const slotToValuePair = this._slotValuePairs.find(\n ([boundSlot]) => boundSlot === slot,\n ) as SlotValuePair<T> | undefined;\n\n if (!slotToValuePair) {\n // Not yet available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n // Maybe the parent ctx has it.\n return this._parent.readSlot(slot);\n }\n\n // Available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n return slotToValuePair[1];\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeSlot = eventual;\n\n // Unwrapping all layers of slots.\n while (isSlot(maybeSlot)) {\n maybeSlot = this.readSlot(maybeSlot);\n }\n\n return maybeSlot;\n }\n\n resolve(\n item: Wgsl,\n slotValueOverrides: SlotValuePair<unknown>[] = [],\n ): string {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n return this._shared.getOrInstantiate(item, itemCtx);\n }\n}\n","import { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport type { TypeGpuRuntime } from './typegpuRuntime';\nimport type { BufferUsage, WgslResolvable } from './types';\n\nexport type Program = {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly bindGroup: GPUBindGroup;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nconst usageToBindingTypeMap: Record<BufferUsage, GPUBufferBindingType> = {\n uniform: 'uniform',\n mutable_storage: 'storage',\n readonly_storage: 'read-only-storage',\n};\n\nexport default class ProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private root: WgslResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.root);\n const usedBindables = Array.from(ctx.usedBindables);\n\n const bindGroupLayout = this.runtime.device.createBindGroupLayout({\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n visibility: options.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[bindable.usage],\n },\n })),\n });\n\n const bindGroup = this.runtime.device.createBindGroup({\n layout: bindGroupLayout,\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n resource: {\n buffer: this.runtime.bufferFor(bindable.allocatable),\n },\n })),\n });\n\n return {\n bindGroupLayout,\n bindGroup,\n code: codeString,\n };\n }\n}\n","import type {\n AnyWgslData,\n BufferUsage,\n ResolutionCtx,\n WgslBindable,\n} from './types';\nimport type { WgslBuffer } from './wgslBuffer';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n> extends WgslBindable<TData, TUsage> {\n $name(label: string): WgslBufferUsage<TData, TUsage>;\n}\n\nexport function bufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n>(\n buffer: WgslBuffer<TData, TUsage>,\n usage: TUsage,\n): WgslBufferUsage<TData, TUsage> {\n return new WgslBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferUsageImpl<TData extends AnyWgslData, TUsage extends BufferUsage>\n implements WgslBufferUsage<TData, TUsage>\n{\n private _label: string | undefined;\n\n constructor(\n public readonly buffer: WgslBuffer<TData, TUsage>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier();\n\n ctx.addBinding(this, identifier);\n\n return ctx.resolve(identifier);\n }\n\n toString(): string {\n return `${this.usage}:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { Parsed } from 'typed-binary';\nimport type { AnyWgslData, BufferUsage, WgslAllocatable } from './types';\nimport { type WgslBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { WgslPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBuffer<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> extends WgslAllocatable<TData> {\n $name(label: string): WgslBuffer<TData, TAllows>;\n $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;\n $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;\n $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;\n $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;\n\n asUniform(): 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n\n asMutableStorage(): 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n\n asReadonlyStorage(): 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n}\n\nexport function buffer<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = never,\n>(\n typeSchema: TData,\n initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined,\n): WgslBuffer<TData, TUsage> {\n return new WgslBufferImpl<TData, TUsage>(typeSchema, initial);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferImpl<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> implements WgslBuffer<TData, TAllows>\n{\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n\n private _allowedUsages: {\n uniform: WgslBufferUsage<TData, TAllows | 'uniform'> | null;\n mutableStorage: WgslBufferUsage<TData, TAllows | 'mutable_storage'> | null;\n readonlyStorage: WgslBufferUsage<\n TData,\n TAllows | 'readonly_storage'\n > | null;\n } = {\n uniform: null,\n mutableStorage: null,\n readonlyStorage: null,\n };\n\n private _label: string | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $allowUniform() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'uniform'>;\n this.$addFlags(GPUBufferUsage.UNIFORM);\n if (!this._allowedUsages.uniform) {\n this._allowedUsages.uniform = bufferUsage(enrichedThis, 'uniform');\n }\n return enrichedThis;\n }\n\n $allowReadonlyStorage() {\n const enrichedThis = this as WgslBuffer<\n TData,\n TAllows | 'readonly_storage'\n >;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.readonlyStorage) {\n this._allowedUsages.readonlyStorage = bufferUsage(\n enrichedThis,\n 'readonly_storage',\n );\n }\n return enrichedThis;\n }\n\n $allowMutableStorage() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'mutable_storage'>;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.mutableStorage) {\n this._allowedUsages.mutableStorage = bufferUsage(\n enrichedThis,\n 'mutable_storage',\n );\n }\n return enrichedThis;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n asUniform() {\n return this._allowedUsages.uniform as 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n }\n\n asMutableStorage() {\n return this._allowedUsages\n .mutableStorage as 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n }\n\n asReadonlyStorage() {\n return this._allowedUsages\n .readonlyStorage as 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslConst extends WgslResolvable {\n $name(label: string): WgslConst;\n}\n\n/**\n * Creates a constant is computed at shader initialization according\n * to the passed in expression.\n */\nexport function constant(expr: Wgsl): WgslConst {\n return new WgslConstImpl(expr);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslConstImpl implements WgslConst {\n private _label: string | undefined;\n\n constructor(private readonly expr: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`const ${identifier} = ${this.expr};`);\n\n return ctx.resolve(identifier);\n }\n}\n","import type {\n InlineResolve,\n ResolutionCtx,\n Wgsl,\n WgslResolvable,\n} from './types';\nimport { code } from './wgslCode';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslDeclare extends WgslResolvable {}\n\nexport function declare(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): WgslDeclare {\n return new WgslDeclareImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslDeclareImpl implements WgslDeclare {\n constructor(private readonly _declaration: Wgsl) {}\n\n resolve(ctx: ResolutionCtx): string {\n ctx.addDeclaration(code`${this._declaration}`);\n return '';\n }\n}\n","import type {\n Eventual,\n InlineResolve,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn extends WgslResolvable {\n $name(label: string): WgslFn;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;\n}\n\nexport type BoundWgslFn = Omit<WgslFn, '$name'>;\n\nexport function fn(\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n): WgslFn {\n return new WgslFnImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslFnImpl implements WgslFn {\n private _label: string | undefined;\n\n constructor(private readonly body: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`fn ${identifier}${this.body}`.$name(this._label));\n\n return ctx.resolve(identifier);\n }\n\n with<T>(slot: WgslSlot<T>, value: T): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `fn:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslFnImpl<T> implements BoundWgslFn {\n constructor(\n private readonly _innerFn: BoundWgslFn,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this._innerFn, [this._slotValuePair]);\n }\n\n toString(): string {\n const [slot, value] = this._slotValuePair;\n return `fn:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import Callable, { type AsCallable } from './callable';\nimport { isPointer } from './types';\nimport type {\n AnyWgslData,\n ResolutionCtx,\n Wgsl,\n WgslFnArgument,\n WgslResolvable,\n WgslValue,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> extends WgslResolvable,\n Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n > {}\n\nexport function fn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n>(argTypes: TArgTypes, returnType?: TReturn) {\n const argPairs = argTypes.map(\n (argType) => [new WgslIdentifier(), argType] as const,\n ) as PairsFromTypes<TArgTypes>;\n\n const argValues = argPairs.map(\n ([argIdent, argType]) =>\n argIdent as WgslValue<typeof argType> & WgslIdentifier,\n );\n\n type TArgValues = ValuesFromTypes<TArgTypes>;\n return (bodyProducer: (...args: TArgValues) => Wgsl) => {\n const body = bodyProducer(...(argValues as TArgValues));\n\n const fnInstance = new WgslFnImpl<TArgTypes, TReturn>(\n argPairs,\n returnType,\n body,\n );\n\n return fnInstance as AsCallable<\n typeof fnInstance,\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes>\n >;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;\n};\n\ntype PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];\n};\n\ntype SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: Wgsl;\n};\n\nclass WgslFunctionCall<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> implements WgslResolvable\n{\n constructor(\n private usedFn: WgslFn<TArgTypes, TReturn>,\n private readonly args: SegmentsFromTypes<TArgTypes>,\n ) {}\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.args.map((argSegment, idx) => {\n const comma = idx < this.args.length - 1 ? ', ' : '';\n return code`${argSegment}${comma}`;\n });\n\n return ctx.resolve(code`${this.usedFn}(${argsCode})`.$name('internal'));\n }\n\n toString(): string {\n return `fun:${this.usedFn.label ?? '<unnamed>'}()`;\n }\n}\n\nclass WgslFnImpl<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n // TArgPairs extends (readonly [WgslIdentifier, WgslFnArgument])[],\n TReturn extends AnyWgslData | undefined = undefined,\n >\n extends Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n >\n implements WgslFn<TArgTypes, TReturn>\n{\n private _label: string | undefined;\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n const argsCode = this.argPairs.map(([ident, argType], idx) => {\n const comma = idx < this.argPairs.length - 1 ? ', ' : '';\n\n if (isPointer(argType)) {\n return code`${ident}: ptr<${argType.scope}, ${argType.pointsTo}>${comma}`;\n }\n\n return code`${ident}: ${argType}${comma}`;\n });\n\n if (this.returnType !== undefined) {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\n }\n\n toString(): string {\n return `fun:${this._label ?? '<unnamed>'}`;\n }\n}\n","export const WgslSettableTrait = Symbol(\n 'This item can be set, owns its value (does not get value from an external source)',\n);\n\nexport interface WgslSettable {\n readonly [WgslSettableTrait]: true;\n}\n\nexport function isSettable(\n value: WgslSettable | unknown,\n): value is WgslSettable {\n return (value as WgslSettable)[WgslSettableTrait] === true;\n}\n","import { type WgslSettable, WgslSettableTrait } from './settableTrait';\nimport type { Wgsl, WgslResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport type Getter = <T>(plum: WgslPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends WgslPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface WgslPlum<TValue = unknown> {\n readonly __brand: 'WgslPlum';\n\n $name(label: string): this;\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const WgslExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\nexport interface WgslExternalPlum {\n readonly [WgslExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | WgslExternalPlum,\n): value is WgslExternalPlum {\n return (value as WgslExternalPlum)[WgslExternalPlumTrait] === true;\n}\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T extends Wgsl>(\n compute: (get: Getter) => T,\n): WgslPlum<T> & WgslResolvable;\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T>(compute: (get: Getter) => T): WgslPlum<T>;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T extends Wgsl>(\n initial: T,\n): WgslPlum<T> & WgslSettable & WgslResolvable;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T>(initial: T): WgslPlum<T> & WgslSettable;\n\nexport function plum<T>(\n initialOrCompute: T | ((get: Getter) => T),\n): WgslPlum<T> | (WgslPlum<T> & WgslSettable) {\n if (typeof initialOrCompute === 'function') {\n return new WgslDerivedPlumImpl(initialOrCompute as (get: Getter) => T);\n }\n\n return new WgslSourcePlumImpl(initialOrCompute);\n}\n\nexport function plumFromEvent<T>(\n subscribe: (listener: () => unknown) => Unsubscribe,\n getLatest: () => T,\n): WgslPlum<T> & WgslExternalPlum {\n return new WgslExternalPlumImpl(subscribe, getLatest);\n}\n\nexport function isPlum<T>(value: WgslPlum<T> | unknown): value is WgslPlum<T> {\n return (value as WgslPlum).__brand === 'WgslPlum';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSourcePlumImpl<TValue> implements WgslPlum<TValue>, WgslSettable {\n readonly __brand = 'WgslPlum';\n readonly [WgslSettableTrait] = true;\n\n private _label: string | undefined;\n\n constructor(private readonly _initial: TValue) {}\n\n compute(_get: Getter) {\n return this._initial;\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslDerivedPlumImpl<TValue> implements WgslPlum<TValue> {\n readonly __brand = 'WgslPlum';\n private _label: string | undefined;\n\n constructor(private readonly _compute: (get: Getter) => TValue) {}\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n compute(get: Getter): TValue {\n return this._compute(get);\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslExternalPlumImpl<TValue>\n implements WgslPlum<TValue>, WgslExternalPlum\n{\n readonly __brand = 'WgslPlum';\n readonly [WgslExternalPlumTrait] = true;\n\n private _label: string | undefined;\n private _prev: TValue;\n private _version = 0;\n\n constructor(\n private readonly _subscribe: (listener: () => unknown) => Unsubscribe,\n private readonly _getLatest: () => TValue,\n ) {\n this._prev = _getLatest();\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get version(): number {\n return this._version;\n }\n\n subscribe(listener: () => unknown): Unsubscribe {\n return this._subscribe(listener);\n }\n\n compute(): TValue {\n const latest = this._getLatest();\n\n if (!Object.is(latest, this._prev)) {\n this._version++;\n this._prev = latest;\n }\n\n return this._prev;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n","import {\n type ResolutionCtx,\n type Wgsl,\n type WgslResolvable,\n type WgslResolvableSlot,\n type WgslSlot,\n isWgsl,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T> {\n return new WgslSlotImpl(defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSlotImpl<T> implements WgslResolvable, WgslSlot<T> {\n readonly __brand = 'WgslSlot';\n public label?: string | undefined;\n\n constructor(public defaultValue: T | undefined = undefined) {}\n\n public $name(label: string) {\n this.label = label;\n return this;\n }\n\n areEqual(a: T, b: T): boolean {\n return Object.is(a, b);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const value = ctx.unwrap(this);\n\n if (!isWgsl(value)) {\n throw new Error(\n `Cannot inject value of type ${typeof value} of slot '${this.label ?? '<unnamed>'}' in code.`,\n );\n }\n\n return ctx.resolve(value);\n }\n\n toString(): string {\n return `slot:${this.label ?? '<unnamed>'}`;\n }\n}\n","import type { AnyWgslData, ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport type VariableScope = 'private';\n\nexport interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {\n $name(label: string): WgslVar<TDataType>;\n}\n\n/**\n * Creates a variable, with an optional initial value.\n */\nexport const variable = <TDataType extends AnyWgslData>(\n dataType: TDataType,\n initialValue?: Wgsl,\n): WgslVar<TDataType> => new WgslVarImpl(dataType, initialValue, 'private');\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslVarImpl<TDataType extends AnyWgslData> implements WgslVar<TDataType> {\n public identifier = new WgslIdentifier();\n\n constructor(\n private readonly _dataType: TDataType,\n private readonly _initialValue: Wgsl | undefined,\n public readonly scope: VariableScope,\n ) {}\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n if (this._initialValue) {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`,\n );\n } else {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType};`,\n );\n }\n\n return ctx.resolve(this.identifier);\n }\n}\n","import { buffer } from './wgslBuffer';\nimport { code } from './wgslCode';\nimport { constant } from './wgslConstant';\nimport { declare } from './wgslDeclare';\nimport { fn } from './wgslFunction';\nimport { fn as fun } from './wgslFunctionExperimental';\nimport { plum, plumFromEvent } from './wgslPlum';\nimport { slot } from './wgslSlot';\nimport { variable } from './wgslVariable';\n\nexport default Object.assign(code, {\n code,\n fn,\n fun,\n buffer,\n plum,\n plumFromEvent,\n slot,\n constant,\n declare,\n var: variable,\n});\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport { roundUp } from './mathUtils';\nimport { PlumStore } from './plumStore';\nimport ProgramBuilder, { type Program } from './programBuilder';\nimport type { WgslSettable } from './settableTrait';\nimport { TaskQueue } from './taskQueue';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n TypeGpuRuntime,\n} from './typegpuRuntime';\nimport type { AnyWgslData, WgslAllocatable } from './types';\nimport { code } from './wgslCode';\nimport {\n type ExtractPlumValue,\n type Unsubscribe,\n type WgslPlum,\n isPlum,\n} from './wgslPlum';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a runtime can interact via GPU buffers.\n */\nclass TypeGpuRuntimeImpl {\n private _entryToBufferMap = new Map<WgslAllocatable, GPUBuffer>();\n private _pipelineExecutors: PipelineExecutor<\n GPURenderPipeline | GPUComputePipeline\n >[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n // Used for reading GPU buffers ad hoc.\n private _readBuffer: GPUBuffer | null = null;\n private _taskQueue = new TaskQueue();\n private readonly _plumStore = new PlumStore();\n private readonly _allocSubscriptions = new Map<\n WgslAllocatable,\n Unsubscribe\n >();\n\n constructor(public readonly device: GPUDevice) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n dispose() {\n for (const unsub of this._allocSubscriptions.values()) {\n unsub();\n }\n this._allocSubscriptions.clear();\n\n for (const buffer of this._entryToBufferMap.values()) {\n buffer.destroy();\n }\n\n this._entryToBufferMap.clear();\n\n this._readBuffer?.destroy();\n }\n\n bufferFor(allocatable: WgslAllocatable) {\n let buffer = this._entryToBufferMap.get(allocatable);\n\n if (!buffer) {\n buffer = this.device.createBuffer({\n usage: allocatable.flags,\n size: roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n ),\n mappedAtCreation: allocatable.initial !== undefined,\n });\n\n if (!buffer) {\n throw new Error(`Failed to create buffer for ${allocatable}`);\n }\n\n if (allocatable.initial !== undefined) {\n const writer = new BufferWriter(buffer.getMappedRange());\n\n if (isPlum(allocatable.initial)) {\n const plum = allocatable.initial;\n\n allocatable.dataType.write(writer, this._plumStore.get(plum));\n\n this._allocSubscriptions.set(\n allocatable,\n this._plumStore.subscribe(plum, () => {\n this.writeBuffer(allocatable, this._plumStore.get(plum));\n }),\n );\n } else {\n allocatable.dataType.write(writer, allocatable.initial);\n }\n\n buffer.unmap();\n }\n\n this._entryToBufferMap.set(allocatable, buffer);\n }\n\n return buffer;\n }\n\n async readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>> {\n return this._taskQueue.enqueue(async () => {\n // Flushing any commands to be encoded.\n this.flush();\n\n if (\n !this._readBuffer ||\n this._readBuffer.size < allocatable.dataType.size\n ) {\n // destroying the previous buffer\n this._readBuffer?.destroy();\n\n this._readBuffer = this.device.createBuffer({\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n size: allocatable.dataType.size,\n });\n }\n\n const buffer = this.bufferFor(allocatable);\n const commandEncoder = this.device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n buffer,\n 0,\n this._readBuffer,\n 0,\n allocatable.dataType.size,\n );\n\n this.device.queue.submit([commandEncoder.finish()]);\n await this.device.queue.onSubmittedWorkDone();\n await this._readBuffer.mapAsync(\n GPUMapMode.READ,\n 0,\n allocatable.dataType.size,\n );\n\n const res = allocatable.dataType.read(\n new BufferReader(this._readBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n this._readBuffer.unmap();\n\n return res;\n });\n }\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ) {\n const gpuBuffer = this.bufferFor(allocatable);\n\n const size = roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n );\n\n const hostBuffer = new ArrayBuffer(size);\n allocatable.dataType.write(new BufferWriter(hostBuffer), data);\n this.device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: ExtractPlumValue<TPlum>,\n ) {\n this._plumStore.set(plum, value);\n }\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: () => unknown,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const vertexProgram = new ProgramBuilder(\n this,\n code`\n @vertex fn main_vertex(${options.vertex.args.flatMap((arg) => [arg, ', '])}) -> ${options.vertex.output} {\n ${options.vertex.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.VERTEX,\n });\n\n const fragmentProgram = new ProgramBuilder(\n this,\n code`\n @fragment fn main_frag(${options.fragment.args.flatMap((arg) => [arg, ', '])}) -> ${options.fragment.output} {\n ${options.fragment.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupLayout,\n fragmentProgram.bindGroupLayout,\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers: options.vertex.buffersLayouts ?? [],\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n [vertexProgram, fragmentProgram],\n options.externalLayouts?.length ?? 0,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const { args = [], workgroupSize = [1, 1] } = options;\n\n const program = new ProgramBuilder(\n this,\n code`\n @compute @workgroup_size(${workgroupSize.join(', ')}) fn main_compute(${args.flatMap((arg) => [arg, ', '])}) {\n ${options.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.COMPUTE,\n });\n\n const shaderModule = this.device.createShaderModule({\n code: program.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n program.bindGroupLayout,\n ],\n });\n\n const computePipeline = this.device.createComputePipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n },\n });\n\n const executor = new ComputePipelineExecutor(\n this,\n computePipeline,\n [program],\n options.externalLayouts?.length ?? 0,\n );\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n flush() {\n if (!this._commandEncoder) {\n return;\n }\n\n this.device.queue.submit([this._commandEncoder.finish()]);\n this._commandEncoder = null;\n }\n}\n\nclass PipelineExecutor<T extends GPURenderPipeline | GPUComputePipeline> {\n constructor(\n protected _runtime: TypeGpuRuntime,\n public pipeline: T,\n public programs: Program[],\n public externalLayoutCount: number,\n protected label?: string,\n ) {}\n}\n\nclass RenderPipelineExecutor extends PipelineExecutor<GPURenderPipeline> {\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n externalVertexBuffers,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n (externalVertexBuffers ?? []).forEach((group, index) =>\n passEncoder.setVertexBuffer(index, group),\n );\n\n this.programs.forEach((program, i) => {\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n );\n });\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor extends PipelineExecutor<GPUComputePipeline> {\n execute(options?: ComputePipelineExecutorOptions) {\n const { workgroups = [1, 1], externalBindGroups } = options ?? {};\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginComputePass({\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n this.programs.forEach((program, i) =>\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link createRuntime}.\n */\nexport type CreateRuntimeOptions = {\n adapter: GPURequestAdapterOptions | undefined;\n device: GPUDeviceDescriptor | undefined;\n};\n\n/**\n * @param options\n * @returns\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * createRuntime();\n * ```\n *\n * @example\n * If there are specific options that should be used when requesting a device, you can pass those in.\n * ```ts\n * const adapterOptions: GPURequestAdapterOptions = ...;\n * const deviceDescriptor: GPUDeviceDescriptor = ...;\n * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n *\n * @example\n * If a specific device should be used instead, it can be passed in as a parameter.\n * ```ts\n * const device: GPUDevice = ...;\n * createRuntime(device);\n * ```\n */\nexport async function createRuntime(\n options?: CreateRuntimeOptions | GPUDevice,\n): Promise<TypeGpuRuntime> {\n if (options instanceof GPUDevice) {\n return new TypeGpuRuntimeImpl(options);\n }\n\n if (!navigator.gpu) {\n throw new Error('WebGPU is not supported by this browser.');\n }\n\n const adapter = await navigator.gpu.requestAdapter(options?.adapter);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new TypeGpuRuntimeImpl(await adapter.requestDevice(options?.device));\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import type { WgslSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type WgslPlum,\n isExternalPlum,\n} from './wgslPlum';\n\ntype Listener = () => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<WgslPlum, number>;\n active?: PlumActiveState | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<Listener>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<WgslPlum, PlumState>();\n\n /**\n * Used to inspect the current state of a plum.\n * To be used mostly in unit tests.\n */\n inspect(plum: WgslPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: WgslPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n };\n this._stateMap.set(plum, state);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: WgslPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener();\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: WgslPlum<T>) {\n const dependencies = new Map<WgslPlum, number>();\n\n const getter = (<T>(dep: WgslPlum<T>) => {\n // registering dependency.\n if (!dependencies.has(dep)) {\n const depState = this._getState(dep);\n dependencies.set(dep, depState.version);\n }\n\n return this.get(dep);\n }) as Getter;\n\n return { value: plum.compute(getter), dependencies };\n }\n\n private _recompute<T>(plum: WgslPlum<T>): T {\n const state = this._getState(plum);\n\n if (state.active) {\n // Unsubscribing from old dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n }\n\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state.dependencies = dependencies;\n if (state.active) {\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n state.active.unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n }\n\n if (Object.is(state.value, value)) {\n return state.value;\n }\n\n state.value = value;\n state.version = isExternalPlum(plum) ? plum.version : state.version + 1;\n\n this._notifyListeners(plum);\n\n return state.value;\n }\n\n get<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n const state = this._getState(plum);\n\n if (state.active) {\n // Return memoized value, the dependencies are keeping it up to date.\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n let dirty = false;\n\n if (isExternalPlum(plum)) {\n plum.compute(null as unknown as Getter); // external plums do not use 'get'\n dirty = state.version !== plum.version;\n } else if (state.dependencies.size > 0) {\n dirty = [...state.dependencies.entries()].some(([dep, prevVersion]) => {\n this.get(dep); // allowing dependencies to recompute if necessary.\n const depState = this._getState(dep);\n\n return depState.version !== prevVersion;\n });\n }\n\n if (!dirty) {\n // No need to recompute\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n return this._recompute(plum) as ExtractPlumValue<TPlum>;\n }\n\n set<T>(plum: WgslPlum<T> & WgslSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe(plum: WgslPlum, listener: Listener): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","export class TaskQueue<T> {\n private _queue: (() => Promise<void>)[] = [];\n private _pending = false;\n\n enqueue<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this._queue.push(async () => {\n try {\n resolve(await task());\n } catch (e) {\n reject(e);\n }\n });\n this._processQueue();\n });\n }\n\n private async _processQueue() {\n if (this._pending) {\n return;\n }\n this._pending = true;\n while (this._queue.length > 0) {\n const task = this._queue.shift();\n if (task) {\n await task();\n }\n }\n this._pending = false;\n }\n}\n"],"mappings":"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","names":["Callable","__publicField","callable_default","RandomNameRegistry","__publicField","item","name","label","StrictNameRegistry","assignedName","index","unusedName","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","__publicField","item","itemCtx","_a","instances","instance","slot","expectedValue","result","err","ResolutionError","slotToValueMap","usedSlot","_bindable","declaration","ResolutionCtxImpl","bindingGroup","_declaration","_identifier","MissingSlotValueError","eventual","slotValueOverrides","isResolvable","ScopedResolutionCtx","_ScopedResolutionCtx","_parent","_shared","_slotValuePairs","bindable","identifier","group","idx","code","token","slotToValuePair","boundSlot","maybeSlot","isSlot","usageToBindingTypeMap","ProgramBuilder","runtime","root","options","_a","ctx","ResolutionCtxImpl","RandomNameRegistry","codeString","usedBindables","bindGroupLayout","bindable","idx","bindGroup","bufferUsage","buffer","usage","WgslBufferUsageImpl","__publicField","label","ctx","identifier","WgslIdentifier","_a","buffer","typeSchema","initial","WgslBufferImpl","dataType","__publicField","label","enrichedThis","bufferUsage","flags","_a","constant","expr","WgslConstImpl","__publicField","label","ctx","identifier","WgslIdentifier","code","declare","strings","params","WgslDeclareImpl","code","_declaration","ctx","fn","strings","params","WgslFnImpl","code","body","__publicField","label","ctx","identifier","WgslIdentifier","slot","value","BoundWgslFnImpl","_a","_BoundWgslFnImpl","_innerFn","_slotValuePair","_b","fn","argTypes","returnType","argPairs","argType","WgslIdentifier","argValues","argIdent","bodyProducer","body","WgslFnImpl","WgslFunctionCall","usedFn","args","ctx","argsCode","argSegment","idx","comma","code","_a","callable_default","__publicField","label","identifier","ident","isPointer","WgslSettableTrait","WgslExternalPlumTrait","isExternalPlum","value","plum","initialOrCompute","WgslDerivedPlumImpl","WgslSourcePlumImpl","plumFromEvent","subscribe","getLatest","WgslExternalPlumImpl","isPlum","_a","_initial","__publicField","_get","label","WgslSettableTrait","_compute","get","_subscribe","_getLatest","listener","latest","slot","defaultValue","WgslSlotImpl","__publicField","label","a","b","ctx","_a","value","isWgsl","variable","dataType","initialValue","WgslVarImpl","_dataType","_initialValue","scope","__publicField","WgslIdentifier","label","ctx","code","wgsl_default","code","fn","buffer","plum","plumFromEvent","slot","constant","declare","variable","BufferReader","BufferWriter","roundUp","value","modulo","bitMask","invBitMask","PlumStore","__publicField","plum","state","value","dependencies","listeners","listener","getter","dep","depState","unsub","isExternalPlum","dirty","prevVersion","externalUnsub","unsubs","TaskQueue","__publicField","task","resolve","reject","e","TypeGpuRuntimeImpl","device","__publicField","TaskQueue","PlumStore","_a","unsub","buffer","allocatable","roundUp","writer","BufferWriter","isPlum","plum","commandEncoder","res","BufferReader","data","gpuBuffer","size","hostBuffer","value","listener","options","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","vertexProgram","ProgramBuilder","code","arg","fragmentProgram","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","args","workgroupSize","program","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","label","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers","descriptor","__objRest","passEncoder","__spreadProps","__spreadValues","group","index","i","workgroups","createRuntime","adapter"]}
1
+ {"version":3,"sources":["../src/callable.ts","../src/typegpuRuntime.ts","../src/nameRegistry.ts","../src/wgslSampler.ts","../src/wgslTexture.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/wgslBufferUsage.ts","../src/wgslBuffer.ts","../src/wgslConstant.ts","../src/wgslDeclare.ts","../src/wgslFunction.ts","../src/wgslFunctionExperimental.ts","../src/settableTrait.ts","../src/wgslPlum.ts","../src/wgslSlot.ts","../src/wgslVariable.ts","../src/wgsl.ts","../src/createRuntime.ts","../src/mathUtils.ts","../src/plumStore.ts","../src/taskQueue.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: <generics>\nabstract class Callable<TArgs extends [...any[]], TReturn> extends Function {\n _bound: Callable<TArgs, TReturn>;\n\n constructor() {\n // We create a new Function object using `super`, with a `this` reference\n // to itself (the Function object) provided by binding it to `this`,\n // then returning the bound Function object (which is a wrapper around the\n // the original `this`/Function object). We then also have to store\n // a reference to the bound Function object, as `_bound` on the unbound `this`,\n // so the bound function has access to the new bound object.\n // Pro: Works well, doesn't rely on deprecated features.\n // Con: A little convoluted, and requires wrapping `this` in a bound object.\n\n super('...args', 'return this._bound._call(...args)');\n // Or without the spread/rest operator:\n // super('return this._bound._call.apply(this._bound, arguments)')\n this._bound = this.bind(this);\n\n // biome-ignore lint/correctness/noConstructorReturn: <quirks of creating a custom callable>\n return this._bound;\n }\n\n abstract _call(...args: TArgs): TReturn;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type ICallable<TArgs extends [...any[]], TReturn> = (\n ...args: TArgs\n) => TReturn;\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type AsCallable<T, TArgs extends [...any[]], TReturn> = T &\n ICallable<TArgs, TReturn>;\n\nexport default Callable;\n","import type { AnySchema } from 'typed-binary';\nimport type { Parsed } from 'typed-binary';\nimport type { SimpleWgslData } from './data';\nimport type { PlumListener } from './plumStore';\nimport type { WgslSettable } from './settableTrait';\nimport type { AnyWgslData, WgslAllocatable } from './types';\nimport type { BoundWgslCode, WgslCode } from './wgslCode';\nimport type { ExtractPlumValue, Unsubscribe, WgslPlum } from './wgslPlum';\nimport type { WgslSampler } from './wgslSampler';\nimport type {\n WgslAnyTexture,\n WgslAnyTextureView,\n WgslTextureExternal,\n} from './wgslTexture';\n\n// ----------\n// Public API\n// ----------\n\nexport type SetPlumAction<T> = T | ((prev: T) => T);\n\nexport interface TypeGpuRuntime {\n readonly device: GPUDevice;\n /**\n * The current command encoder. This property will\n * hold the same value until `flush()` is called.\n */\n readonly commandEncoder: GPUCommandEncoder;\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ): void;\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe;\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ): void;\n\n readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>>;\n\n bufferFor(allocatable: WgslAllocatable): GPUBuffer;\n textureFor(view: WgslAnyTexture | WgslAnyTextureView): GPUTexture;\n viewFor(view: WgslAnyTextureView): GPUTextureView;\n externalTextureFor(texture: WgslTextureExternal): GPUExternalTexture;\n samplerFor(sampler: WgslSampler): GPUSampler;\n dispose(): void;\n\n /**\n * Causes all commands enqueued by pipelines to be\n * submitted to the GPU.\n */\n flush(): void;\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;\n makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;\n}\n\nexport interface RenderPipelineOptions {\n vertex: {\n code: WgslCode | BoundWgslCode;\n output: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyWgslData;\n };\n };\n fragment: {\n code: WgslCode | BoundWgslCode;\n target: Iterable<GPUColorTargetState | null>;\n };\n primitive: GPUPrimitiveState;\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport interface ComputePipelineOptions {\n code: WgslCode | BoundWgslCode;\n workgroupSize?: readonly [number, number?, number?];\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {\n vertexCount: number;\n instanceCount?: number;\n firstVertex?: number;\n firstInstance?: number;\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface RenderPipelineExecutor {\n execute(options: RenderPipelineExecutorOptions): void;\n}\n\nexport type ComputePipelineExecutorOptions = {\n workgroups?: readonly [number, number?, number?];\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface ComputePipelineExecutor {\n execute(options?: ComputePipelineExecutorOptions): void;\n}\n\nconst typeToVertexFormatMap: Record<string, GPUVertexFormat> = {\n f32: 'float32',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n u32: 'uint32',\n vec2u: 'uint32x2',\n vec3u: 'uint32x3',\n vec4u: 'uint32x4',\n i32: 'sint32',\n vec2i: 'sint32x2',\n vec3i: 'sint32x3',\n vec4i: 'sint32x4',\n};\n\nexport function deriveVertexFormat<TData extends SimpleWgslData<AnySchema>>(\n typeSchema: TData,\n): GPUVertexFormat {\n if (!('expressionCode' in typeSchema)) {\n throw new Error(`Type schema must contain a 'code' field`);\n }\n const code = typeSchema.getUnderlyingTypeString();\n\n const vertexFormat = typeToVertexFormatMap[code];\n if (!vertexFormat) {\n throw new Error(`Unknown vertex format for type code: ${code}`);\n }\n return vertexFormat;\n}\n","import type { WgslResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: WgslResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable) {\n let name = this.names.get(item);\n\n if (name === undefined) {\n // creating sanitized name\n let label: string;\n if (item.label) {\n label = item.label.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n name = `${label}_${this.lastUniqueId++}`;\n this.names.set(item, name);\n }\n\n return name;\n }\n}\n\nexport class StrictNameRegistry implements NameRegistry {\n /**\n * Allows to provide a good fallback for instances of the\n * same function that are bound to different slot values.\n */\n private readonly _usedNames = new Set<string>();\n\n private readonly _assignedNames = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable): string {\n const assignedName = this._assignedNames.get(item);\n if (assignedName !== undefined) {\n return assignedName;\n }\n\n if (item.label === undefined) {\n throw new Error('Unnamed item found when using a strict NameRegistry');\n }\n\n let index = 0;\n let unusedName = item.label;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${item.label}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n this._assignedNames.set(item, unusedName);\n return unusedName;\n }\n}\n","import type {\n ResolutionCtx,\n WgslRenderResource,\n WgslSamplerType,\n} from './types';\nimport { WgslIdentifier } from './wgslIdentifier';\n\nexport interface WgslSampler extends WgslRenderResource {\n readonly descriptor: GPUSamplerDescriptor;\n $name(label: string): WgslSampler;\n}\n\nexport function sampler(descriptor: GPUSamplerDescriptor): WgslSampler {\n return new WgslSamplerImpl(descriptor);\n}\n\nclass WgslSamplerImpl implements WgslSampler {\n private _label: string | undefined;\n private _type: WgslSamplerType;\n\n constructor(public readonly descriptor: GPUSamplerDescriptor) {\n if (descriptor.compare === undefined) this._type = 'sampler';\n else this._type = 'sampler_comparison';\n }\n\n get label() {\n return this._label;\n }\n\n get type() {\n return this._type;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addRenderResource(this, identifier);\n\n return ctx.resolve(identifier);\n }\n}\n\nexport function isSampler(\n resource: WgslRenderResource,\n): resource is WgslSampler {\n return resource.type === 'sampler' || resource.type === 'sampler_comparison';\n}\n","import { vec4f, vec4i, vec4u } from './data';\nimport type {\n AnyWgslPrimitive,\n AnyWgslTexelFormat,\n ResolutionCtx,\n SampledTextureParams,\n StorageTextureAccess,\n StorageTextureParams,\n TextureUsage,\n WgslRenderResource,\n WgslRenderResourceType,\n} from './types';\nimport { WgslIdentifier } from './wgslIdentifier';\nimport { isSampler } from './wgslSampler';\n\nexport interface WgslAnyTextureView extends WgslRenderResource {\n readonly descriptor: GPUTextureViewDescriptor;\n readonly texture: WgslAnyTexture;\n readonly dataType: AnyWgslPrimitive | AnyWgslTexelFormat;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface WgslAnyTexture {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get flags(): GPUTextureUsageFlags;\n}\n\nexport interface WgslTexture<TAllows extends TextureUsage = never> {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get label(): string | undefined;\n get flags(): GPUTextureUsageFlags;\n\n $name(label: string): WgslTexture<TAllows>;\n $allowSampled(): WgslTexture<TAllows | 'sampled'>;\n $allowStorage(): WgslTexture<TAllows | 'storage'>;\n\n asStorage(\n params: StorageTextureParams,\n ): 'storage' extends TAllows\n ? WgslTextureView<AnyWgslTexelFormat, 'storage'>\n : null;\n asSampled(\n params: SampledTextureParams,\n ): 'sampled' extends TAllows\n ? WgslTextureView<typeof params.dataType, 'sampled'>\n : null;\n}\n\nexport interface WgslTextureView<\n TData extends AnyWgslPrimitive | AnyWgslTexelFormat,\n TUsage extends TextureUsage,\n> extends WgslRenderResource {\n readonly texture: WgslTexture<TUsage>;\n readonly descriptor: Omit<GPUTextureViewDescriptor, 'usage'>;\n readonly type: WgslRenderResourceType;\n readonly dataType: TData;\n readonly access: StorageTextureAccess | undefined;\n\n $name(label: string): WgslTextureView<TData, TUsage>;\n}\n\nexport interface WgslTextureExternal extends WgslRenderResource {\n readonly descriptor: GPUExternalTextureDescriptor;\n}\n\nexport function texture<TUsage extends TextureUsage = never>(\n descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n): WgslTexture<TUsage> {\n return new WgslTextureImpl(descriptor);\n}\n\nexport function textureExternal(descriptor: GPUExternalTextureDescriptor) {\n return new WgslTextureExternalImpl(descriptor);\n}\n\nclass WgslTextureImpl<TAllows extends TextureUsage = never>\n implements WgslTexture<TAllows>, WgslAnyTexture\n{\n private _flags: GPUTextureUsageFlags =\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.COPY_SRC |\n GPUTextureUsage.RENDER_ATTACHMENT;\n private _allowedUsages: {\n sampled: Map<string, WgslTextureView<AnyWgslPrimitive, 'sampled'>> | null;\n storage: Map<string, WgslTextureView<AnyWgslTexelFormat, 'storage'>> | null;\n } = {\n sampled: null,\n storage: null,\n };\n private _label: string | undefined;\n\n constructor(\n public readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get flags() {\n return this._flags;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $addFlags(flags: GPUTextureUsageFlags) {\n this._flags |= flags;\n return this;\n }\n\n $allowSampled() {\n const enrichedThis = this as WgslTexture<TAllows | 'sampled'>;\n if (!this._allowedUsages.sampled) {\n this._allowedUsages.sampled = new Map();\n }\n this.$addFlags(GPUTextureUsage.TEXTURE_BINDING);\n return enrichedThis;\n }\n\n $allowStorage() {\n const enrichedThis = this as WgslTexture<TAllows | 'storage'>;\n if (!this._allowedUsages.storage) {\n this._allowedUsages.storage = new Map();\n }\n this.$addFlags(GPUTextureUsage.STORAGE_BINDING);\n return enrichedThis;\n }\n\n private getStorageIfAllowed(\n params: StorageTextureParams,\n ): WgslTextureView<AnyWgslTexelFormat, 'storage'> | null {\n if (!this._allowedUsages.storage) {\n return null;\n }\n const stringified = hashFromShallowObj(params);\n const existing = this._allowedUsages.storage.get(stringified);\n if (existing) {\n return existing;\n }\n const type = texelFormatToWgslType[this.descriptor.format];\n if (!type) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n const view = new WgslTextureViewImpl(\n params.type,\n this,\n type,\n params.descriptor,\n params.access,\n ) as unknown as WgslTextureView<typeof type, 'storage'>;\n this._allowedUsages.storage.set(stringified, view);\n return view;\n }\n\n private getSampledIfAllowed(\n params: SampledTextureParams,\n ): WgslTextureView<AnyWgslPrimitive, 'sampled'> | null {\n if (!this._allowedUsages.sampled) {\n return null;\n }\n const stringified = hashFromShallowObj(params);\n const existing = this._allowedUsages.sampled.get(stringified);\n if (existing) {\n return existing;\n }\n const view = new WgslTextureViewImpl(\n params.type,\n this,\n params.dataType,\n params.descriptor,\n ) as unknown as WgslTextureView<typeof params.dataType, 'sampled'>;\n this._allowedUsages.sampled.set(stringified, view);\n return view;\n }\n\n asStorage(params: StorageTextureParams) {\n const maybeView = this.getStorageIfAllowed(params);\n const maybeType = texelFormatToWgslType[this.descriptor.format];\n if (!maybeType) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n return maybeView as 'storage' extends TAllows\n ? WgslTextureView<typeof maybeType, 'storage'>\n : null;\n }\n\n asSampled(params: SampledTextureParams) {\n return this.getSampledIfAllowed(params) as 'sampled' extends TAllows\n ? WgslTextureView<typeof params.dataType, 'sampled'>\n : null;\n }\n}\n\nclass WgslTextureViewImpl<\n TData extends AnyWgslPrimitive | AnyWgslTexelFormat,\n TUsage extends TextureUsage,\n> implements WgslTextureView<TData, TUsage>, WgslAnyTextureView\n{\n private _label: string | undefined;\n\n constructor(\n public readonly type: WgslRenderResourceType,\n public readonly texture: WgslTexture<TUsage>,\n public readonly dataType: TData,\n public readonly descriptor: GPUTextureViewDescriptor = {},\n public readonly access: StorageTextureAccess | undefined = undefined,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addRenderResource(this, identifier);\n\n return ctx.resolve(identifier);\n }\n}\n\nclass WgslTextureExternalImpl implements WgslTextureExternal {\n private _label: string | undefined;\n public readonly type = 'texture_external';\n\n constructor(public readonly descriptor: GPUExternalTextureDescriptor) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addRenderResource(this, identifier);\n\n return ctx.resolve(identifier);\n }\n}\n\nexport function isExternalTexture(\n texture: WgslRenderResource,\n): texture is WgslTextureExternal {\n return !('texture' in texture) && !isSampler(texture);\n}\n\nexport function isTextureView(\n texture: WgslRenderResource,\n): texture is WgslAnyTextureView {\n return 'texture' in texture;\n}\n\nconst texelFormatToWgslType: Record<string, AnyWgslTexelFormat> = {\n rgba8unorm: vec4f,\n rgba8snorm: vec4f,\n rgba8uint: vec4u,\n rgba8sint: vec4i,\n rgba16uint: vec4u,\n rgba16sint: vec4i,\n rgba16float: vec4f,\n r32uint: vec4u,\n r32sint: vec4i,\n r32float: vec4f,\n rg32uint: vec4u,\n rg32sint: vec4i,\n rg32float: vec4f,\n rgba32uint: vec4u,\n rgba32sint: vec4i,\n rgba32float: vec4f,\n bgra8unorm: vec4f,\n};\n\nfunction hashFromShallowObj(obj: object): string {\n const withKeysSorted = Object.fromEntries(\n Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n return JSON.stringify(withKeysSorted);\n}\n","import { MissingSlotValueError, ResolutionError } from './errors';\nimport type { NameRegistry } from './nameRegistry';\nimport type {\n BufferUsage,\n Eventual,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslBindable,\n WgslRenderResource,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport {\n isDepthTextureType,\n isExternalTextureType,\n isResolvable,\n isSamplerType,\n isSlot,\n} from './types';\nimport type { Builtin } from './wgslBuiltin';\nimport { code } from './wgslCode';\nimport type { WgslIdentifier } from './wgslIdentifier';\nimport { isTextureView } from './wgslTexture';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n};\n\ntype SlotToValueMap = Map<WgslSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<Exclude<BufferUsage, 'vertex'>, string> = {\n uniform: 'uniform',\n mutable: 'storage, read_write',\n readonly: 'storage, read',\n};\n\nclass SharedResolutionState {\n private readonly _memoizedResolves = new WeakMap<\n // WeakMap because if the resolvable does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n WgslResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private _nextFreeBindingIdx = 0;\n private readonly _usedBindables = new Set<WgslBindable>();\n private readonly _usedRenderResources = new Set<WgslRenderResource>();\n private readonly _resourceToIndexMap = new WeakMap<\n WgslRenderResource | WgslBindable,\n number\n >();\n private readonly _usedBuiltins = new Set<Builtin>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n ) {}\n\n get usedBindables(): Iterable<WgslBindable> {\n return this._usedBindables;\n }\n\n get usedRenderResources(): Iterable<WgslRenderResource> {\n return this._usedRenderResources;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n get usedBuiltins(): Iterable<Builtin> {\n return this._usedBuiltins;\n }\n\n /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved\n * with the `compute` method.\n * @param compute Returns the resolved item and the corresponding bindingMap. This result will be discarded if a sufficient cache entry is found.\n */\n getOrInstantiate(item: WgslResolvable, itemCtx: ScopedResolutionCtx): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) => itemCtx.readSlot(slot) === expectedValue,\n )\n ) {\n return instance.result;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n let result: string;\n try {\n result = item.resolve(itemCtx);\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(item);\n }\n\n throw new ResolutionError(err, [item]);\n }\n\n // We know which bindables the item used while resolving\n const slotToValueMap = new Map<WgslSlot<unknown>, unknown>();\n for (const usedSlot of itemCtx.usedSlots) {\n slotToValueMap.set(usedSlot, itemCtx.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n }\n\n reserveBindingEntry(bindable: WgslBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(bindable, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n registerBindingNoEntry(bindable: WgslBindable) {\n this._usedBindables.add(bindable);\n }\n\n reserveRenderResourceEntry(resource: WgslRenderResource) {\n this._usedRenderResources.add(resource);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(resource, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n getBindingIndex(resource: WgslRenderResource | WgslBindable) {\n return this._resourceToIndexMap.get(resource);\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n\n addBuiltin(builtin: Builtin) {\n this._usedBuiltins.add(builtin);\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\n private readonly _shared: SharedResolutionState;\n\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor({ names, bindingGroup }: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(names, bindingGroup ?? 0);\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n get usedRenderResources() {\n return this._shared.usedRenderResources;\n }\n\n get usedBuiltins() {\n return this._shared.usedBuiltins;\n }\n\n addDeclaration(_declaration: WgslResolvable) {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBinding(_bindable: WgslBindable, _identifier: WgslIdentifier): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addRenderResource(\n resource: WgslRenderResource,\n identifier: WgslIdentifier,\n ): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBuiltin(builtin: Builtin): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n nameFor(item: WgslResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n if (slot.defaultValue === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return slot.defaultValue;\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n const result = this._shared.getOrInstantiate(item, itemCtx);\n\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n\n getIndexFor(item: WgslBindable | WgslRenderResource) {\n const index = this._shared.getBindingIndex(item);\n if (index === undefined) {\n throw new Error('No index found for item');\n }\n return index;\n }\n}\n\nclass ScopedResolutionCtx implements ResolutionCtx {\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor(\n private readonly _parent: ResolutionCtxImpl | ScopedResolutionCtx,\n private readonly _shared: SharedResolutionState,\n private readonly _slotValuePairs: SlotValuePair<unknown>[],\n ) {}\n\n addDeclaration(declaration: WgslResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void {\n if (bindable.usage === 'vertex') {\n this._shared.registerBindingNoEntry(bindable);\n return;\n }\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n addRenderResource(\n resource: WgslRenderResource,\n identifier: WgslIdentifier,\n ): void {\n const { group, idx } = this._shared.reserveRenderResourceEntry(resource);\n\n if (\n isSamplerType(resource.type) ||\n isExternalTextureType(resource.type) ||\n isDepthTextureType(resource.type)\n ) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type};`,\n );\n return;\n }\n\n if (isTextureView(resource)) {\n if (resource.access !== undefined) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.texture.descriptor.format}, ${resource.access}>;`,\n );\n return;\n }\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.dataType}>;`,\n );\n return;\n }\n\n throw new Error(`Unsupported resource type: ${resource.type}`);\n }\n\n addBuiltin(builtin: Builtin): void {\n this._shared.addBuiltin(builtin);\n }\n\n nameFor(token: WgslResolvable): string {\n return this._shared.names.nameFor(token);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n const slotToValuePair = this._slotValuePairs.find(\n ([boundSlot]) => boundSlot === slot,\n ) as SlotValuePair<T> | undefined;\n\n if (!slotToValuePair) {\n // Not yet available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n // Maybe the parent ctx has it.\n return this._parent.readSlot(slot);\n }\n\n // Available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n return slotToValuePair[1];\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeSlot = eventual;\n\n // Unwrapping all layers of slots.\n while (isSlot(maybeSlot)) {\n maybeSlot = this.readSlot(maybeSlot);\n }\n\n return maybeSlot;\n }\n\n resolve(\n item: Wgsl,\n slotValueOverrides: SlotValuePair<unknown>[] = [],\n ): string {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n return this._shared.getOrInstantiate(item, itemCtx);\n }\n}\n","import type { AnySchema } from 'typed-binary';\nimport type { SimpleWgslData } from './data';\nimport { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport type { TypeGpuRuntime } from './typegpuRuntime';\nimport type {\n AnyWgslData,\n BufferUsage,\n WgslBindable,\n WgslResolvable,\n} from './types';\nimport { getUsedBuiltinsNamed } from './wgslBuiltin';\nimport { type BoundWgslCode, type WgslCode, code } from './wgslCode';\nimport { isSampler } from './wgslSampler';\nimport { isExternalTexture, isTextureView } from './wgslTexture';\n\nexport type Program = {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly bindGroup: GPUBindGroup;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nconst usageToBindingTypeMap: Record<\n Exclude<BufferUsage, 'vertex'>,\n GPUBufferBindingType\n> = {\n uniform: 'uniform',\n mutable: 'storage',\n readonly: 'read-only-storage',\n};\n\nexport default class ProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private root: WgslResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.root);\n const usedBindables = Array.from(ctx.usedBindables);\n const usedRenderResources = Array.from(ctx.usedRenderResources);\n const usedSamplers = usedRenderResources.filter(isSampler);\n const usedTextures = usedRenderResources.filter(isTextureView);\n const usedExternalTextures = usedRenderResources.filter(isExternalTexture);\n\n const allEntries: GPUBindGroupLayoutEntry[] = [];\n for (const textureView of usedTextures) {\n if (textureView.access === undefined) {\n allEntries.push({\n binding: ctx.getIndexFor(textureView),\n visibility: options.shaderStage,\n texture: {},\n });\n } else {\n allEntries.push({\n binding: ctx.getIndexFor(textureView),\n visibility: options.shaderStage,\n storageTexture: { format: textureView.texture.descriptor.format },\n });\n }\n }\n for (const external of usedExternalTextures) {\n allEntries.push({\n binding: ctx.getIndexFor(external),\n visibility: options.shaderStage,\n externalTexture: {},\n });\n }\n for (const sampler of usedSamplers) {\n allEntries.push({\n binding: ctx.getIndexFor(sampler),\n visibility: options.shaderStage,\n sampler: {},\n });\n }\n for (const bindable of usedBindables) {\n if (bindable.usage === 'vertex') continue;\n allEntries.push({\n binding: ctx.getIndexFor(bindable),\n visibility: options.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[bindable.usage],\n },\n });\n }\n\n const allBindGroupEntries: GPUBindGroupEntry[] = [];\n for (const texture of usedTextures) {\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(texture),\n resource: this.runtime.viewFor(texture),\n });\n }\n for (const externalTexture of usedExternalTextures) {\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(externalTexture),\n resource: this.runtime.externalTextureFor(externalTexture),\n });\n }\n for (const sampler of usedSamplers) {\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(sampler),\n resource: this.runtime.samplerFor(sampler),\n });\n }\n for (const bindable of usedBindables) {\n if (bindable.usage === 'vertex') continue;\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(bindable),\n resource: {\n buffer: this.runtime.bufferFor(bindable.allocatable),\n },\n });\n }\n\n const bindGroupLayout = this.runtime.device.createBindGroupLayout({\n entries: allEntries,\n });\n\n const bindGroup = this.runtime.device.createBindGroup({\n layout: bindGroupLayout,\n entries: allBindGroupEntries,\n });\n\n return {\n bindGroupLayout,\n bindGroup,\n code: codeString,\n };\n }\n}\n\nexport class RenderProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private vertexRoot: WgslCode | BoundWgslCode,\n private fragmentRoot: WgslCode | BoundWgslCode,\n private vertexOutputFormat: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyWgslData;\n },\n ) {}\n\n build(\n options: Omit<BuildOptions, 'shaderStage'>,\n ): [Program, Program, WgslBindable<AnyWgslData, 'vertex'>[]] {\n const symbolOutputs = Object.getOwnPropertySymbols(\n this.vertexOutputFormat,\n ).map((symbol) => {\n const name = this.vertexOutputFormat[symbol];\n if (typeof name !== 'string') {\n throw new Error('Output names must be strings.');\n }\n return { symbol, name };\n });\n const symbolRecord: Record<symbol, string> = Object.fromEntries(\n symbolOutputs.map(({ symbol, name }) => [symbol, name]),\n );\n\n const vertexOutputBuiltins = getUsedBuiltinsNamed(symbolRecord);\n const outputVars = Object.keys(this.vertexOutputFormat);\n const vertexOutput = outputVars.map((name, index) => {\n const varInfo = this.vertexOutputFormat[name];\n if (!varInfo) {\n throw new Error('Output names must be strings.');\n }\n return { name, varInfo, index };\n });\n\n const structFields = [\n ...vertexOutputBuiltins.map(\n (entry) =>\n code`\n @builtin(${entry.builtin.name}) ${entry.name}: ${entry.builtin.type},\n `,\n ),\n ...vertexOutput.map(\n ({ name, varInfo, index }) =>\n code`\n @location(${index}) ${name}: ${varInfo},\n `,\n ),\n ];\n\n const vertexContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n vertexContext.resolve(this.vertexRoot);\n const vertexBuffers = Array.from(vertexContext.usedBindables).filter(\n (bindable) => bindable.usage === 'vertex',\n ) as WgslBindable<AnyWgslData, 'vertex'>[];\n const entries = vertexBuffers.map((elem) => {\n return {\n bindable: elem,\n underlyingType: elem.allocatable.dataType as SimpleWgslData<AnySchema>,\n };\n });\n\n const vertexUserArgs = entries.map(\n (entry, idx) => code`\n @location(${idx}) ${entry.bindable} : ${entry.underlyingType.getUnderlyingTypeString()},\n `,\n );\n const vertexBuiltins = Array.from(vertexContext.usedBuiltins);\n const vertexBuiltinsArgs = vertexBuiltins.map(\n (builtin) => code`\n @builtin(${builtin.name}) ${builtin.identifier}: ${builtin.type},\n `,\n );\n const vertexArgs = [...vertexBuiltinsArgs, ...vertexUserArgs];\n\n const vertexCode = code`\n struct VertexOutput {\n ${structFields}\n };\n\n @vertex\n fn main(${vertexArgs}) -> VertexOutput {\n ${this.vertexRoot}\n var output: VertexOutput;\n ${vertexOutputBuiltins.map(\n (entry) =>\n code`\n output.${entry.name} = ${entry.name};\n `,\n )}\n ${vertexOutput.map(\n ({ name }) =>\n code`\n output.${name} = ${name};\n `,\n )}\n return output;\n }\n `;\n const fragmentContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n fragmentContext.resolve(this.fragmentRoot);\n\n const fragmentUsedBuiltins = Array.from(fragmentContext.usedBuiltins);\n const fragmentBuiltinArgs = fragmentUsedBuiltins.map(\n (builtin) => code`\n @builtin(${builtin.name}) ${builtin.identifier}: ${builtin.type},\n `,\n );\n\n const fragmentInputs = vertexOutput.map(\n ({ name, varInfo }, idx) => code`\n @location(${idx}) ${name}: ${varInfo},\n `,\n );\n const fragmentArgs = [...fragmentBuiltinArgs, ...fragmentInputs];\n const fragmentCode = code`\n @fragment\n fn main(${fragmentArgs}) -> @location(0) vec4f {\n ${this.fragmentRoot}\n }\n `;\n\n const vertexProgram = new ProgramBuilder(this.runtime, vertexCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.VERTEX,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n const fragmentProgram = new ProgramBuilder(\n this.runtime,\n fragmentCode,\n ).build({\n bindingGroup: options.bindingGroup + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n return [vertexProgram, fragmentProgram, vertexBuffers];\n }\n}\n\nexport class ComputeProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private computeRoot: WgslCode | BoundWgslCode,\n private workgroupSize: readonly [\n number,\n (number | null)?,\n (number | null)?,\n ],\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): Program {\n const context = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n context.resolve(this.computeRoot);\n\n const usedBuiltins = Array.from(context.usedBuiltins);\n const builtinArgs = usedBuiltins.map(\n (builtin) => code`\n @builtin(${builtin.name}) ${builtin.identifier}: ${builtin.type},\n `,\n );\n\n const workgroupSizeDeclaration = `@workgroup_size(${this.workgroupSize[0]}, ${this.workgroupSize[1] ?? 1}, ${this.workgroupSize[2] ?? 1})`;\n\n const shaderCode = code`\n @compute ${workgroupSizeDeclaration}\n fn main(${builtinArgs}) {\n ${this.computeRoot}\n }\n `;\n\n const program = new ProgramBuilder(this.runtime, shaderCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.COMPUTE,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n return program;\n }\n}\n","import type {\n AnyWgslData,\n BufferUsage,\n ResolutionCtx,\n WgslBindable,\n} from './types';\nimport type { WgslBuffer } from './wgslBuffer';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = BufferUsage,\n> extends WgslBindable<TData, TUsage> {\n $name(label: string): WgslBufferUsage<TData, TUsage>;\n}\n\nexport function bufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n>(\n buffer: WgslBuffer<TData, TUsage>,\n usage: TUsage,\n): WgslBufferUsage<TData, TUsage> {\n return new WgslBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferUsageImpl<TData extends AnyWgslData, TUsage extends BufferUsage>\n implements WgslBufferUsage<TData, TUsage>\n{\n private _label: string | undefined;\n\n constructor(\n public readonly buffer: WgslBuffer<TData, TUsage>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier();\n\n ctx.addBinding(this, identifier);\n\n return ctx.resolve(identifier);\n }\n\n toString(): string {\n return `${this.usage}:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { AnySchema, Parsed } from 'typed-binary';\nimport { SimpleWgslData } from './data';\nimport type { AnyWgslData, BufferUsage, WgslAllocatable } from './types';\nimport { type WgslBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { WgslPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\ntype UsageGuard<\n TUsage extends BufferUsage,\n TData extends AnyWgslData,\n TAllows,\n> = TUsage extends TAllows ? WgslBufferUsage<TData, TUsage> : null;\n\nexport interface WgslBuffer<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> extends WgslAllocatable<TData> {\n $name(label: string): WgslBuffer<TData, TAllows>;\n $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;\n $allowReadonly(): WgslBuffer<TData, TAllows | 'readonly'>;\n $allowMutable(): WgslBuffer<TData, TAllows | 'mutable'>;\n $allowVertex(\n stepMode: 'vertex' | 'instance',\n ): WgslBuffer<TData, TAllows | 'vertex'>;\n $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;\n\n asUniform(): UsageGuard<'uniform', TData, TAllows>;\n asMutable(): UsageGuard<'mutable', TData, TAllows>;\n asReadonly(): UsageGuard<'readonly', TData, TAllows>;\n asVertex(): UsageGuard<'vertex', TData, TAllows>;\n}\n\nexport function buffer<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = never,\n>(\n typeSchema: TData,\n initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined,\n): WgslBuffer<TData, TUsage> {\n return new WgslBufferImpl<TData, TUsage>(typeSchema, initial);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferImpl<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> implements WgslBuffer<TData, TAllows>\n{\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n\n public vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'> | null = null;\n private _allowedUsages: {\n uniform: WgslBufferUsage<TData, TAllows | 'uniform'> | null;\n mutable: WgslBufferUsage<TData, TAllows | 'mutable'> | null;\n readonly: WgslBufferUsage<TData, TAllows | 'readonly'> | null;\n vertex: WgslBufferUsage<TData, TAllows | 'vertex'> | null;\n } = {\n uniform: null,\n mutable: null,\n readonly: null,\n vertex: null,\n };\n\n private _label: string | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $allowUniform() {\n this.$addFlags(GPUBufferUsage.UNIFORM);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'uniform'>;\n if (!this._allowedUsages.uniform) {\n this._allowedUsages.uniform = bufferUsage(enrichedThis, 'uniform');\n }\n\n return enrichedThis;\n }\n\n $allowReadonly() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'readonly'>;\n if (!this._allowedUsages.readonly) {\n this._allowedUsages.readonly = bufferUsage(enrichedThis, 'readonly');\n }\n\n return enrichedThis;\n }\n\n $allowMutable() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'mutable'>;\n if (!this._allowedUsages.mutable) {\n this._allowedUsages.mutable = bufferUsage(enrichedThis, 'mutable');\n }\n\n return enrichedThis;\n }\n\n $allowVertex(stepMode: 'vertex' | 'instance' = 'vertex') {\n this.$addFlags(GPUBufferUsage.VERTEX);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'vertex'>;\n if (!this.vertexLayout) {\n if (!(this.dataType instanceof SimpleWgslData)) {\n throw new Error('Only simple data types can be used as vertex buffers');\n }\n\n let underlyingThis = this.dataType as SimpleWgslData<AnySchema>;\n underlyingThis = underlyingThis.getUnderlyingType();\n this.vertexLayout = {\n arrayStride: underlyingThis.size,\n stepMode,\n };\n\n this._allowedUsages.vertex = bufferUsage(enrichedThis, 'vertex');\n }\n\n if (this.vertexLayout.stepMode !== stepMode) {\n throw new Error('Cannot change step mode of a vertex buffer');\n }\n\n return enrichedThis;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n asUniform() {\n return this._allowedUsages.uniform as UsageGuard<'uniform', TData, TAllows>;\n }\n\n asMutable() {\n return this._allowedUsages.mutable as UsageGuard<'mutable', TData, TAllows>;\n }\n\n asReadonly() {\n return this._allowedUsages.readonly as UsageGuard<\n 'readonly',\n TData,\n TAllows\n >;\n }\n\n asVertex() {\n return this._allowedUsages.vertex as UsageGuard<'vertex', TData, TAllows>;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslConst extends WgslResolvable {\n $name(label: string): WgslConst;\n}\n\n/**\n * Creates a constant is computed at shader initialization according\n * to the passed in expression.\n */\nexport function constant(expr: Wgsl): WgslConst {\n return new WgslConstImpl(expr);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslConstImpl implements WgslConst {\n private _label: string | undefined;\n\n constructor(private readonly expr: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`const ${identifier} = ${this.expr};`);\n\n return ctx.resolve(identifier);\n }\n}\n","import type {\n InlineResolve,\n ResolutionCtx,\n Wgsl,\n WgslResolvable,\n} from './types';\nimport { code } from './wgslCode';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslDeclare extends WgslResolvable {}\n\nexport function declare(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): WgslDeclare {\n return new WgslDeclareImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslDeclareImpl implements WgslDeclare {\n constructor(private readonly _declaration: Wgsl) {}\n\n resolve(ctx: ResolutionCtx): string {\n ctx.addDeclaration(code`${this._declaration}`);\n return '';\n }\n}\n","import type {\n Eventual,\n InlineResolve,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn extends WgslResolvable {\n $name(label: string): WgslFn;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;\n}\n\nexport type BoundWgslFn = Omit<WgslFn, '$name'>;\n\nexport function fn(\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n): WgslFn {\n return new WgslFnImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslFnImpl implements WgslFn {\n private _label: string | undefined;\n\n constructor(private readonly body: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`fn ${identifier}${this.body}`.$name(this._label));\n\n return ctx.resolve(identifier);\n }\n\n with<T>(slot: WgslSlot<T>, value: T): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `fn:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslFnImpl<T> implements BoundWgslFn {\n constructor(\n private readonly _innerFn: BoundWgslFn,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this._innerFn, [this._slotValuePair]);\n }\n\n toString(): string {\n const [slot, value] = this._slotValuePair;\n return `fn:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import Callable, { type AsCallable } from './callable';\nimport { isPointer } from './types';\nimport type {\n AnyWgslData,\n ResolutionCtx,\n Wgsl,\n WgslFnArgument,\n WgslResolvable,\n WgslValue,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> extends WgslResolvable,\n Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n > {}\n\nexport function fn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n>(argTypes: TArgTypes, returnType?: TReturn) {\n const argPairs = argTypes.map(\n (argType) => [new WgslIdentifier(), argType] as const,\n ) as PairsFromTypes<TArgTypes>;\n\n const argValues = argPairs.map(\n ([argIdent, argType]) =>\n argIdent as WgslValue<typeof argType> & WgslIdentifier,\n );\n\n type TArgValues = ValuesFromTypes<TArgTypes>;\n return (bodyProducer: (...args: TArgValues) => Wgsl) => {\n const body = bodyProducer(...(argValues as TArgValues));\n\n const fnInstance = new WgslFnImpl<TArgTypes, TReturn>(\n argPairs,\n returnType,\n body,\n );\n\n return fnInstance as AsCallable<\n typeof fnInstance,\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes>\n >;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;\n};\n\ntype PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];\n};\n\ntype SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: Wgsl;\n};\n\nclass WgslFunctionCall<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> implements WgslResolvable\n{\n constructor(\n private usedFn: WgslFn<TArgTypes, TReturn>,\n private readonly args: SegmentsFromTypes<TArgTypes>,\n ) {}\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.args.map((argSegment, idx) => {\n const comma = idx < this.args.length - 1 ? ', ' : '';\n return code`${argSegment}${comma}`;\n });\n\n return ctx.resolve(code`${this.usedFn}(${argsCode})`.$name('internal'));\n }\n\n toString(): string {\n return `fun:${this.usedFn.label ?? '<unnamed>'}()`;\n }\n}\n\nclass WgslFnImpl<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n // TArgPairs extends (readonly [WgslIdentifier, WgslFnArgument])[],\n TReturn extends AnyWgslData | undefined = undefined,\n >\n extends Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n >\n implements WgslFn<TArgTypes, TReturn>\n{\n private _label: string | undefined;\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n const argsCode = this.argPairs.map(([ident, argType], idx) => {\n const comma = idx < this.argPairs.length - 1 ? ', ' : '';\n\n if (isPointer(argType)) {\n return code`${ident}: ptr<${argType.scope}, ${argType.pointsTo}>${comma}`;\n }\n\n return code`${ident}: ${argType}${comma}`;\n });\n\n if (this.returnType !== undefined) {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\n }\n\n toString(): string {\n return `fun:${this._label ?? '<unnamed>'}`;\n }\n}\n","export const WgslSettableTrait = Symbol(\n 'This item can be set, owns its value (does not get value from an external source)',\n);\n\nexport interface WgslSettable {\n readonly [WgslSettableTrait]: true;\n}\n\nexport function isSettable(\n value: WgslSettable | unknown,\n): value is WgslSettable {\n return (value as WgslSettable)[WgslSettableTrait] === true;\n}\n","import { type WgslSettable, WgslSettableTrait } from './settableTrait';\nimport type { Wgsl, WgslResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport type Getter = <T>(plum: WgslPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends WgslPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface WgslPlum<TValue = unknown> {\n readonly __brand: 'WgslPlum';\n\n $name(label: string): this;\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const WgslExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\nexport interface WgslExternalPlum {\n readonly [WgslExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | WgslExternalPlum,\n): value is WgslExternalPlum {\n return (value as WgslExternalPlum)[WgslExternalPlumTrait] === true;\n}\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T extends Wgsl>(\n compute: (get: Getter) => T,\n): WgslPlum<T> & WgslResolvable;\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T>(compute: (get: Getter) => T): WgslPlum<T>;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T extends Wgsl>(\n initial: T,\n): WgslPlum<T> & WgslSettable & WgslResolvable;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T>(initial: T): WgslPlum<T> & WgslSettable;\n\nexport function plum<T>(\n initialOrCompute: T | ((get: Getter) => T),\n): WgslPlum<T> | (WgslPlum<T> & WgslSettable) {\n if (typeof initialOrCompute === 'function') {\n return new WgslDerivedPlumImpl(initialOrCompute as (get: Getter) => T);\n }\n\n return new WgslSourcePlumImpl(initialOrCompute);\n}\n\nexport function plumFromEvent<T>(\n subscribe: (listener: () => unknown) => Unsubscribe,\n getLatest: () => T,\n): WgslPlum<T> & WgslExternalPlum {\n return new WgslExternalPlumImpl(subscribe, getLatest);\n}\n\nexport function isPlum<T>(value: WgslPlum<T> | unknown): value is WgslPlum<T> {\n return (value as WgslPlum).__brand === 'WgslPlum';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSourcePlumImpl<TValue> implements WgslPlum<TValue>, WgslSettable {\n readonly __brand = 'WgslPlum';\n readonly [WgslSettableTrait] = true;\n\n private _label: string | undefined;\n\n constructor(private readonly _initial: TValue) {}\n\n compute(_get: Getter) {\n return this._initial;\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslDerivedPlumImpl<TValue> implements WgslPlum<TValue> {\n readonly __brand = 'WgslPlum';\n private _label: string | undefined;\n\n constructor(private readonly _compute: (get: Getter) => TValue) {}\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n compute(get: Getter): TValue {\n return this._compute(get);\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslExternalPlumImpl<TValue>\n implements WgslPlum<TValue>, WgslExternalPlum\n{\n readonly __brand = 'WgslPlum';\n readonly [WgslExternalPlumTrait] = true;\n\n private _label: string | undefined;\n private _prev: TValue;\n private _version = 0;\n\n constructor(\n private readonly _subscribe: (listener: () => unknown) => Unsubscribe,\n private readonly _getLatest: () => TValue,\n ) {\n this._prev = _getLatest();\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get version(): number {\n return this._version;\n }\n\n subscribe(listener: () => unknown): Unsubscribe {\n return this._subscribe(listener);\n }\n\n compute(): TValue {\n const latest = this._getLatest();\n\n if (!Object.is(latest, this._prev)) {\n this._version++;\n this._prev = latest;\n }\n\n return this._prev;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n","import {\n type ResolutionCtx,\n type Wgsl,\n type WgslResolvable,\n type WgslResolvableSlot,\n type WgslSlot,\n isWgsl,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T> {\n return new WgslSlotImpl(defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSlotImpl<T> implements WgslResolvable, WgslSlot<T> {\n readonly __brand = 'WgslSlot';\n public label?: string | undefined;\n\n constructor(public defaultValue: T | undefined = undefined) {}\n\n public $name(label: string) {\n this.label = label;\n return this;\n }\n\n areEqual(a: T, b: T): boolean {\n return Object.is(a, b);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const value = ctx.unwrap(this);\n\n if (!isWgsl(value)) {\n throw new Error(\n `Cannot inject value of type ${typeof value} of slot '${this.label ?? '<unnamed>'}' in code.`,\n );\n }\n\n return ctx.resolve(value);\n }\n\n toString(): string {\n return `slot:${this.label ?? '<unnamed>'}`;\n }\n}\n","import type { AnyWgslData, ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport type VariableScope = 'private' | 'workgroup';\n\nexport interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {\n $name(label: string): WgslVar<TDataType>;\n}\n\n/**\n * Creates a variable, with an optional initial value.\n */\nexport const variable = <TDataType extends AnyWgslData>(\n dataType: TDataType,\n initialValue?: Wgsl,\n scope: VariableScope = 'private',\n): WgslVar<TDataType> => new WgslVarImpl(dataType, initialValue, scope);\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslVarImpl<TDataType extends AnyWgslData> implements WgslVar<TDataType> {\n public identifier = new WgslIdentifier();\n\n constructor(\n private readonly _dataType: TDataType,\n private readonly _initialValue: Wgsl | undefined,\n public readonly scope: VariableScope,\n ) {}\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n if (this._initialValue) {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`,\n );\n } else {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType};`,\n );\n }\n\n return ctx.resolve(this.identifier);\n }\n}\n","import { buffer } from './wgslBuffer';\nimport { builtin } from './wgslBuiltin';\nimport { code } from './wgslCode';\nimport { constant } from './wgslConstant';\nimport { declare } from './wgslDeclare';\nimport { fn } from './wgslFunction';\nimport { fn as fun } from './wgslFunctionExperimental';\nimport { plum, plumFromEvent } from './wgslPlum';\nimport { sampler } from './wgslSampler';\nimport { slot } from './wgslSlot';\nimport { texture, textureExternal } from './wgslTexture';\nimport { variable } from './wgslVariable';\n\nexport default Object.assign(code, {\n code,\n fn,\n fun,\n buffer,\n plum,\n plumFromEvent,\n slot,\n constant,\n declare,\n var: variable,\n sampler,\n texture,\n textureExternal,\n builtin,\n});\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { SimpleWgslData } from './data';\nimport { roundUp } from './mathUtils';\nimport { type PlumListener, PlumStore } from './plumStore';\nimport {\n ComputeProgramBuilder,\n type Program,\n RenderProgramBuilder,\n} from './programBuilder';\nimport type { WgslSettable } from './settableTrait';\nimport { TaskQueue } from './taskQueue';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n SetPlumAction,\n TypeGpuRuntime,\n} from './typegpuRuntime';\nimport { deriveVertexFormat } from './typegpuRuntime';\nimport type { AnyWgslData, WgslAllocatable } from './types';\nimport {\n type ExtractPlumValue,\n type Unsubscribe,\n type WgslPlum,\n isPlum,\n} from './wgslPlum';\nimport type { WgslSampler } from './wgslSampler';\nimport type {\n WgslAnyTexture,\n WgslAnyTextureView,\n WgslTextureExternal,\n} from './wgslTexture';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a runtime can interact via GPU buffers.\n */\nclass TypeGpuRuntimeImpl {\n private _entryToBufferMap = new Map<WgslAllocatable, GPUBuffer>();\n private _samplers = new WeakMap<WgslSampler, GPUSampler>();\n private _textures = new WeakMap<WgslAnyTexture, GPUTexture>();\n private _textureViews = new WeakMap<WgslAnyTextureView, GPUTextureView>();\n private _pipelineExecutors: PipelineExecutor<\n GPURenderPipeline | GPUComputePipeline\n >[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n // Used for reading GPU buffers ad hoc.\n private _readBuffer: GPUBuffer | null = null;\n private _taskQueue = new TaskQueue();\n private readonly _plumStore = new PlumStore();\n private readonly _allocSubscriptions = new Map<\n WgslAllocatable,\n Unsubscribe\n >();\n\n constructor(public readonly device: GPUDevice) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n dispose() {\n for (const unsub of this._allocSubscriptions.values()) {\n unsub();\n }\n this._allocSubscriptions.clear();\n\n for (const buffer of this._entryToBufferMap.values()) {\n buffer.destroy();\n }\n\n this._entryToBufferMap.clear();\n\n this._readBuffer?.destroy();\n }\n\n bufferFor(allocatable: WgslAllocatable) {\n let buffer = this._entryToBufferMap.get(allocatable);\n\n if (!buffer) {\n buffer = this.device.createBuffer({\n usage: allocatable.flags,\n size: roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n ),\n mappedAtCreation: allocatable.initial !== undefined,\n });\n\n if (!buffer) {\n throw new Error(`Failed to create buffer for ${allocatable}`);\n }\n\n if (allocatable.initial !== undefined) {\n const writer = new BufferWriter(buffer.getMappedRange());\n\n if (isPlum(allocatable.initial)) {\n const plum = allocatable.initial;\n\n allocatable.dataType.write(writer, this._plumStore.get(plum));\n\n this._allocSubscriptions.set(\n allocatable,\n this._plumStore.subscribe(plum, () => {\n this.writeBuffer(allocatable, this._plumStore.get(plum));\n }),\n );\n } else {\n allocatable.dataType.write(writer, allocatable.initial);\n }\n\n buffer.unmap();\n }\n\n this._entryToBufferMap.set(allocatable, buffer);\n }\n\n return buffer;\n }\n\n textureFor(view: WgslAnyTexture | WgslAnyTextureView): GPUTexture {\n let source: WgslAnyTexture;\n if ('texture' in view) {\n source = view.texture;\n } else {\n source = view;\n }\n\n let texture = this._textures.get(source);\n\n if (!texture) {\n const descriptor = {\n ...source.descriptor,\n usage: source.flags,\n } as GPUTextureDescriptor;\n texture = this.device.createTexture(descriptor);\n\n if (!texture) {\n throw new Error(`Failed to create texture for ${view}`);\n }\n this._textures.set(source, texture);\n }\n\n return texture;\n }\n\n viewFor(view: WgslAnyTextureView): GPUTextureView {\n let textureView = this._textureViews.get(view);\n if (!textureView) {\n textureView = this.textureFor(view.texture).createView(view.descriptor);\n this._textureViews.set(view, textureView);\n }\n return textureView;\n }\n\n externalTextureFor(texture: WgslTextureExternal): GPUExternalTexture {\n return this.device.importExternalTexture(texture.descriptor);\n }\n\n samplerFor(sampler: WgslSampler): GPUSampler {\n let gpuSampler = this._samplers.get(sampler);\n\n if (!gpuSampler) {\n gpuSampler = this.device.createSampler(sampler.descriptor);\n\n if (!gpuSampler) {\n throw new Error(`Failed to create sampler for ${sampler}`);\n }\n this._samplers.set(sampler, gpuSampler);\n }\n\n return gpuSampler;\n }\n\n async readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>> {\n return this._taskQueue.enqueue(async () => {\n // Flushing any commands to be encoded.\n this.flush();\n\n if (\n !this._readBuffer ||\n this._readBuffer.size < allocatable.dataType.size\n ) {\n // destroying the previous buffer\n this._readBuffer?.destroy();\n\n this._readBuffer = this.device.createBuffer({\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n size: allocatable.dataType.size,\n });\n }\n\n const buffer = this.bufferFor(allocatable);\n const commandEncoder = this.device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n buffer,\n 0,\n this._readBuffer,\n 0,\n allocatable.dataType.size,\n );\n\n this.device.queue.submit([commandEncoder.finish()]);\n await this.device.queue.onSubmittedWorkDone();\n await this._readBuffer.mapAsync(\n GPUMapMode.READ,\n 0,\n allocatable.dataType.size,\n );\n\n const res = allocatable.dataType.read(\n new BufferReader(this._readBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n this._readBuffer.unmap();\n\n return res;\n });\n }\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ) {\n const gpuBuffer = this.bufferFor(allocatable);\n\n const size = roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n );\n\n const hostBuffer = new ArrayBuffer(size);\n allocatable.dataType.write(new BufferWriter(hostBuffer), data);\n this.device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ) {\n type Value = ExtractPlumValue<TPlum>;\n\n if (typeof value === 'function') {\n const compute = value as (prev: Value) => Value;\n this._plumStore.set(plum, compute(this._plumStore.get(plum)));\n } else {\n this._plumStore.set(plum, value);\n }\n }\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const [vertexProgram, fragmentProgram, vertexBuffers] =\n new RenderProgramBuilder(\n this,\n options.vertex.code,\n options.fragment.code,\n options.vertex.output,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n });\n\n const vertexBufferDescriptors = vertexBuffers.map((buffer, idx) => {\n if (!buffer.allocatable.vertexLayout) {\n throw new Error(\n `Buffer ${buffer.allocatable} does not have a vertex layout`,\n );\n }\n return {\n ...buffer.allocatable.vertexLayout,\n attributes: [\n {\n shaderLocation: idx,\n offset: 0,\n format: deriveVertexFormat(\n buffer.allocatable.dataType as SimpleWgslData<AnyWgslData>,\n ),\n },\n ],\n };\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupLayout,\n fragmentProgram.bindGroupLayout,\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers: vertexBufferDescriptors,\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment?.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const buffers = vertexBuffers.map(\n (buffer, idx) => [this.bufferFor(buffer.allocatable), idx] as const,\n );\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n vertexProgram,\n fragmentProgram,\n options.externalLayouts?.length ?? 0,\n buffers,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const program = new ComputeProgramBuilder(\n this,\n options.code,\n options.workgroupSize ?? [1],\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n });\n\n const shaderModule = this.device.createShaderModule({\n code: program.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n program.bindGroupLayout,\n ],\n });\n\n const computePipeline = this.device.createComputePipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n },\n });\n\n const executor = new ComputePipelineExecutor(\n this,\n computePipeline,\n [program],\n options.externalLayouts?.length ?? 0,\n );\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n flush() {\n if (!this._commandEncoder) {\n return;\n }\n\n this.device.queue.submit([this._commandEncoder.finish()]);\n this._commandEncoder = null;\n }\n}\n\nclass PipelineExecutor<T extends GPURenderPipeline | GPUComputePipeline> {\n constructor(\n protected _runtime: TypeGpuRuntime,\n public pipeline: T,\n public programs: Program[],\n public externalLayoutCount: number,\n protected label?: string,\n ) {}\n}\n\nclass RenderPipelineExecutor extends PipelineExecutor<GPURenderPipeline> {\n private _vertexProgram: Program;\n private _fragmentProgram: Program;\n private _usedVertexBuffers: Set<readonly [GPUBuffer, number]>;\n\n constructor(\n runtime: TypeGpuRuntime,\n pipeline: GPURenderPipeline,\n vertexProgram: Program,\n fragmentProgram: Program,\n externalLayoutCount: number,\n usedVertexBuffers: (readonly [GPUBuffer, number])[],\n ) {\n super(\n runtime,\n pipeline,\n [vertexProgram, fragmentProgram],\n externalLayoutCount,\n );\n this._vertexProgram = vertexProgram;\n this._fragmentProgram = fragmentProgram;\n this._usedVertexBuffers = new Set(usedVertexBuffers);\n }\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length,\n this._vertexProgram.bindGroup,\n );\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + 1,\n this._fragmentProgram.bindGroup,\n );\n\n for (const [buffer, index] of this._usedVertexBuffers) {\n passEncoder.setVertexBuffer(index, buffer);\n }\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor extends PipelineExecutor<GPUComputePipeline> {\n execute(options?: ComputePipelineExecutorOptions) {\n const { workgroups = [1, 1], externalBindGroups } = options ?? {};\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginComputePass({\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n this.programs.forEach((program, i) =>\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link createRuntime}.\n */\nexport type CreateRuntimeOptions = {\n adapter: GPURequestAdapterOptions | undefined;\n device: GPUDeviceDescriptor | undefined;\n};\n\n/**\n * @param options\n * @returns\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * createRuntime();\n * ```\n *\n * @example\n * If there are specific options that should be used when requesting a device, you can pass those in.\n * ```ts\n * const adapterOptions: GPURequestAdapterOptions = ...;\n * const deviceDescriptor: GPUDeviceDescriptor = ...;\n * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n *\n * @example\n * If a specific device should be used instead, it can be passed in as a parameter.\n * ```ts\n * const device: GPUDevice = ...;\n * createRuntime(device);\n * ```\n */\nexport async function createRuntime(\n options?: CreateRuntimeOptions | GPUDevice,\n): Promise<TypeGpuRuntime> {\n if (options instanceof GPUDevice) {\n return new TypeGpuRuntimeImpl(options);\n }\n\n if (!navigator.gpu) {\n throw new Error('WebGPU is not supported by this browser.');\n }\n\n const adapter = await navigator.gpu.requestAdapter(options?.adapter);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new TypeGpuRuntimeImpl(await adapter.requestDevice(options?.device));\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import type { WgslSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type WgslPlum,\n isExternalPlum,\n} from './wgslPlum';\n\nexport type PlumListener<T> = (newValue: T) => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<WgslPlum, number>;\n active?: PlumActiveState<T> | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState<T> = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<PlumListener<T>>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<WgslPlum, PlumState>();\n\n /**\n * Used to inspect the current state of a plum.\n * To be used mostly in unit tests.\n */\n inspect(plum: WgslPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: WgslPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n } as PlumState<T>;\n\n this._stateMap.set(plum, state as PlumState);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: WgslPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener(state.value);\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: WgslPlum<T>) {\n const dependencies = new Map<WgslPlum, number>();\n\n const getter = (<T>(dep: WgslPlum<T>) => {\n // registering dependency.\n if (!dependencies.has(dep)) {\n const depState = this._getState(dep);\n dependencies.set(dep, depState.version);\n }\n\n return this.get(dep);\n }) as Getter;\n\n return { value: plum.compute(getter), dependencies };\n }\n\n private _recompute<T>(plum: WgslPlum<T>): T {\n const state = this._getState(plum);\n\n if (state.active) {\n // Unsubscribing from old dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n }\n\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state.dependencies = dependencies;\n if (state.active) {\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n state.active.unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n }\n\n if (Object.is(state.value, value)) {\n return state.value;\n }\n\n state.value = value;\n state.version = isExternalPlum(plum) ? plum.version : state.version + 1;\n\n this._notifyListeners(plum);\n\n return state.value;\n }\n\n get<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n const state = this._getState(plum);\n\n if (state.active) {\n // Return memoized value, the dependencies are keeping it up to date.\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n let dirty = false;\n\n if (isExternalPlum(plum)) {\n plum.compute(null as unknown as Getter); // external plums do not use 'get'\n dirty = state.version !== plum.version;\n } else if (state.dependencies.size > 0) {\n dirty = [...state.dependencies.entries()].some(([dep, prevVersion]) => {\n this.get(dep); // allowing dependencies to recompute if necessary.\n const depState = this._getState(dep);\n\n return depState.version !== prevVersion;\n });\n }\n\n if (!dirty) {\n // No need to recompute\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n return this._recompute(plum) as ExtractPlumValue<TPlum>;\n }\n\n set<T>(plum: WgslPlum<T> & WgslSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe<T>(plum: WgslPlum<T>, listener: PlumListener<T>): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","export class TaskQueue<T> {\n private _queue: (() => Promise<void>)[] = [];\n private _pending = false;\n\n enqueue<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this._queue.push(async () => {\n try {\n resolve(await task());\n } catch (e) {\n reject(e);\n }\n });\n this._processQueue();\n });\n }\n\n private async _processQueue() {\n if (this._pending) {\n return;\n }\n this._pending = true;\n while (this._queue.length > 0) {\n const task = this._queue.shift();\n if (task) {\n await task();\n }\n }\n this._pending = false;\n }\n}\n"],"mappings":"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","names":["Callable","__publicField","callable_default","typeToVertexFormatMap","deriveVertexFormat","typeSchema","code","vertexFormat","RandomNameRegistry","__publicField","item","name","label","StrictNameRegistry","assignedName","index","unusedName","sampler","descriptor","WgslSamplerImpl","__publicField","label","ctx","identifier","WgslIdentifier","isSampler","resource","texture","descriptor","WgslTextureImpl","textureExternal","WgslTextureExternalImpl","__publicField","label","flags","enrichedThis","params","stringified","hashFromShallowObj","existing","type","texelFormatToWgslType","view","WgslTextureViewImpl","maybeView","dataType","access","ctx","identifier","WgslIdentifier","isExternalTexture","isSampler","isTextureView","vec4f","vec4u","vec4i","obj","withKeysSorted","a","b","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","__publicField","item","itemCtx","_a","instances","instance","slot","expectedValue","result","err","ResolutionError","slotToValueMap","usedSlot","bindable","nextIdx","resource","declaration","builtin","ResolutionCtxImpl","bindingGroup","_declaration","_bindable","_identifier","identifier","MissingSlotValueError","eventual","slotValueOverrides","isResolvable","ScopedResolutionCtx","index","_ScopedResolutionCtx","_parent","_shared","_slotValuePairs","group","idx","code","isSamplerType","isExternalTextureType","isDepthTextureType","isTextureView","token","slotToValuePair","boundSlot","maybeSlot","isSlot","usageToBindingTypeMap","ProgramBuilder","runtime","root","options","_a","ctx","ResolutionCtxImpl","RandomNameRegistry","codeString","usedBindables","usedRenderResources","usedSamplers","isSampler","usedTextures","isTextureView","usedExternalTextures","isExternalTexture","allEntries","textureView","external","sampler","bindable","allBindGroupEntries","texture","externalTexture","bindGroupLayout","bindGroup","RenderProgramBuilder","vertexRoot","fragmentRoot","vertexOutputFormat","_b","_c","_d","symbolOutputs","symbol","name","symbolRecord","vertexOutputBuiltins","getUsedBuiltinsNamed","vertexOutput","index","varInfo","structFields","entry","code","vertexContext","vertexBuffers","vertexUserArgs","elem","idx","vertexArgs","builtin","vertexCode","fragmentContext","fragmentBuiltinArgs","fragmentInputs","fragmentArgs","fragmentCode","vertexProgram","fragmentProgram","ComputeProgramBuilder","computeRoot","workgroupSize","context","builtinArgs","workgroupSizeDeclaration","shaderCode","bufferUsage","buffer","usage","WgslBufferUsageImpl","__publicField","label","ctx","identifier","WgslIdentifier","_a","buffer","typeSchema","initial","WgslBufferImpl","dataType","__publicField","label","enrichedThis","bufferUsage","stepMode","SimpleWgslData","underlyingThis","flags","_a","constant","expr","WgslConstImpl","__publicField","label","ctx","identifier","WgslIdentifier","code","declare","strings","params","WgslDeclareImpl","code","_declaration","ctx","fn","strings","params","WgslFnImpl","code","body","__publicField","label","ctx","identifier","WgslIdentifier","slot","value","BoundWgslFnImpl","_a","_BoundWgslFnImpl","_innerFn","_slotValuePair","_b","fn","argTypes","returnType","argPairs","argType","WgslIdentifier","argValues","argIdent","bodyProducer","body","WgslFnImpl","WgslFunctionCall","usedFn","args","ctx","argsCode","argSegment","idx","comma","code","_a","callable_default","__publicField","label","identifier","ident","isPointer","WgslSettableTrait","WgslExternalPlumTrait","isExternalPlum","value","plum","initialOrCompute","WgslDerivedPlumImpl","WgslSourcePlumImpl","plumFromEvent","subscribe","getLatest","WgslExternalPlumImpl","isPlum","_a","_initial","__publicField","_get","label","WgslSettableTrait","_compute","get","_subscribe","_getLatest","listener","latest","slot","defaultValue","WgslSlotImpl","__publicField","label","a","b","ctx","_a","value","isWgsl","variable","dataType","initialValue","scope","WgslVarImpl","_dataType","_initialValue","__publicField","WgslIdentifier","label","ctx","code","wgsl_default","code","fn","buffer","plum","plumFromEvent","slot","constant","declare","variable","sampler","texture","textureExternal","builtin","BufferReader","BufferWriter","roundUp","value","modulo","bitMask","invBitMask","PlumStore","__publicField","plum","state","value","dependencies","listeners","listener","getter","dep","depState","unsub","isExternalPlum","dirty","prevVersion","externalUnsub","unsubs","TaskQueue","__publicField","task","resolve","reject","e","TypeGpuRuntimeImpl","device","__publicField","TaskQueue","PlumStore","_a","unsub","buffer","allocatable","roundUp","writer","BufferWriter","isPlum","plum","view","source","texture","descriptor","__spreadProps","__spreadValues","textureView","sampler","gpuSampler","commandEncoder","res","BufferReader","data","gpuBuffer","size","hostBuffer","value","compute","listener","options","_b","_c","_d","_e","_f","_g","_h","vertexProgram","fragmentProgram","vertexBuffers","RenderProgramBuilder","vertexBufferDescriptors","idx","deriveVertexFormat","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","buffers","executor","RenderPipelineExecutor","program","ComputeProgramBuilder","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","label","runtime","usedVertexBuffers","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","__objRest","passEncoder","group","index","workgroups","i","createRuntime","adapter"]}
package/macro/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkJYXJ5NFXcjs = require('../chunk-JYXJ5NFX.cjs');function p(l,s){return _chunkJYXJ5NFXcjs.i`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new (0, _chunkJYXJ5NFXcjs.j)().$name("i");return typeof n=="function"?_chunkJYXJ5NFXcjs.i`
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk7HTWRNOHcjs = require('../chunk-7HTWRNOH.cjs');function p(l,s){return _chunk7HTWRNOHcjs.O`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new (0, _chunk7HTWRNOHcjs.F)().$name("i");return typeof n=="function"?_chunk7HTWRNOHcjs.O`
2
2
  for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
3
3
  ${n(e)}
4
- }`:_chunkJYXJ5NFXcjs.i`
4
+ }`:_chunk7HTWRNOHcjs.O`
5
5
  for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
6
6
  ${n}
7
- }`}return typeof n=="function"?_chunkJYXJ5NFXcjs.i`${Array.from({length:r},(e,i)=>n(i))}`:_chunkJYXJ5NFXcjs.i`${Array.from({length:r},()=>n)}`}}`}exports.repeat = p;
7
+ }`}return typeof n=="function"?_chunk7HTWRNOHcjs.O`${Array.from({length:r},(e,i)=>n(i))}`:_chunk7HTWRNOHcjs.O`${Array.from({length:r},()=>n)}`}}`}exports.repeat = p;
8
8
  //# sourceMappingURL=index.cjs.map
package/macro/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { g as Eventual, e as Wgsl } from '../types-DeF6xFAt.cjs';
1
+ import { E as Eventual, b as Wgsl } from '../types-ENDwr_p9.cjs';
2
2
  import 'typed-binary';
3
3
 
4
4
  declare function repeat(count: Eventual<Wgsl>, snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>): Wgsl;
package/macro/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { g as Eventual, e as Wgsl } from '../types-DeF6xFAt.js';
1
+ import { E as Eventual, b as Wgsl } from '../types-ENDwr_p9.js';
2
2
  import 'typed-binary';
3
3
 
4
4
  declare function repeat(count: Eventual<Wgsl>, snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>): Wgsl;
package/macro/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{i as t,j as u}from"../chunk-NTGWE7PR.js";function p(l,s){return t`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new u().$name("i");return typeof n=="function"?t`
1
+ import{F as u,O as t}from"../chunk-K2GYQABQ.js";function p(l,s){return t`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new u().$name("i");return typeof n=="function"?t`
2
2
  for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
3
3
  ${n(e)}
4
4
  }`:t`