typegpu 0.0.0-alpha.1 → 0.0.0-alpha.3
Sign up to get free protection for your applications and to get access to all the features.
- package/.DS_Store +0 -0
- package/chunk-G3WAZR24.cjs +4 -0
- package/chunk-G3WAZR24.cjs.map +1 -0
- package/chunk-JYXJ5NFX.cjs +2 -0
- package/chunk-JYXJ5NFX.cjs.map +1 -0
- package/chunk-K6N2A55L.js +4 -0
- package/chunk-K6N2A55L.js.map +1 -0
- package/chunk-NTGWE7PR.js +2 -0
- package/chunk-NTGWE7PR.js.map +1 -0
- package/{dist/data → data}/index.cjs +4 -4
- package/{dist/data → data}/index.cjs.map +1 -1
- package/{dist/data → data}/index.d.cts +3 -3
- package/{dist/data → data}/index.d.ts +3 -3
- package/{dist/data → data}/index.js +1 -1
- package/{dist/data → data}/index.js.map +1 -1
- package/index.cjs +29 -0
- package/index.cjs.map +1 -0
- package/{dist/index.d.cts → index.d.cts} +39 -16
- package/{dist/index.d.ts → index.d.ts} +39 -16
- package/index.js +29 -0
- package/index.js.map +1 -0
- package/macro/index.cjs +8 -0
- package/{dist/macro → macro}/index.d.cts +1 -1
- package/{dist/macro → macro}/index.d.ts +1 -1
- package/{dist/macro → macro}/index.js +1 -1
- package/package.json +19 -28
- package/{dist/struct-CpjQEnf9.d.cts → struct-ER9XI7ad.d.cts} +1 -1
- package/{dist/struct-HAlb4aG-.d.ts → struct-udnQvwHG.d.ts} +1 -1
- package/{dist/types-gpN_64mT.d.cts → types-DeF6xFAt.d.cts} +1 -1
- package/{dist/types-gpN_64mT.d.ts → types-DeF6xFAt.d.ts} +1 -1
- package/dist/chunk-3VCFA6WZ.cjs +0 -2
- package/dist/chunk-3VCFA6WZ.cjs.map +0 -1
- package/dist/chunk-G3U6RTMF.cjs +0 -2
- package/dist/chunk-G3U6RTMF.cjs.map +0 -1
- package/dist/chunk-GHP25GEO.js +0 -2
- package/dist/chunk-GHP25GEO.js.map +0 -1
- package/dist/chunk-XGSMOADT.js +0 -2
- package/dist/chunk-XGSMOADT.js.map +0 -1
- package/dist/index.cjs +0 -29
- package/dist/index.cjs.map +0 -1
- package/dist/index.js +0 -29
- package/dist/index.js.map +0 -1
- package/dist/macro/index.cjs +0 -8
- /package/{dist/macro → macro}/index.cjs.map +0 -0
- /package/{dist/macro → macro}/index.js.map +0 -0
package/dist/index.cjs.map
DELETED
@@ -1 +0,0 @@
|
|
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/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"],"names":["Callable","__publicField","callable_default","RandomNameRegistry","item","name","label","StrictNameRegistry","assignedName","index","unusedName","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","itemCtx","_a","instances","instance","slot","expectedValue","result","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","ctx","codeString","usedBindables","bindGroupLayout","bindGroup","bufferUsage","buffer","usage","WgslBufferUsageImpl","WgslIdentifier","typeSchema","initial","WgslBufferImpl","dataType","enrichedThis","flags","constant","expr","WgslConstImpl","fn","strings","params","func","WgslFnImpl","body","value","BoundWgslFnImpl","_BoundWgslFnImpl","_innerFn","_slotValuePair","_b","argTypes","returnType","argPairs","argType","argValues","argIdent","bodyProducer","WgslFunctionCall","usedFn","args","argsCode","argSegment","comma","ident","isPointer","WgslSettableTrait","WgslExternalPlumTrait","isExternalPlum","plum","initialOrCompute","WgslDerivedPlumImpl","WgslSourcePlumImpl","plumFromEvent","subscribe","getLatest","WgslExternalPlumImpl","isPlum","_initial","_get","_compute","get","_subscribe","_getLatest","listener","latest","defaultValue","WgslSlotImpl","a","b","isWgsl","variable","initialValue","WgslVarImpl","_dataType","_initialValue","scope","wgsl_default","BufferReader","BufferWriter","roundUp","modulo","bitMask","invBitMask","PlumStore","state","dependencies","listeners","getter","dep","depState","unsub","dirty","prevVersion","externalUnsub","unsubs","TaskQueue","task","resolve","reject","e","TypeGpuRuntimeImpl","device","allocatable","writer","commandEncoder","res","data","gpuBuffer","size","hostBuffer","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","vertexProgram","arg","fragmentProgram","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","workgroupSize","program","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers","descriptor","__objRest","passEncoder","__spreadProps","__spreadValues","i","workgroups","createRuntime","adapter"],"mappings":"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","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 } 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 const result = item.resolve(itemCtx);\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 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(label?: string) {\n return (\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n ): WgslFn => {\n const func = new WgslFnImpl(code(strings, ...params));\n if (label) {\n func.$name(label);\n }\n return func;\n };\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})`);\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 identifier = new WgslIdentifier();\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\n }\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\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 ${this.identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${this.identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(this.identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\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 { 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 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"]}
|
package/dist/index.js
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
import{a as ne,b as Ae}from"./chunk-XGSMOADT.js";import{a as te,b as re,c as se,d as a,e as $,f as ae,g as le,h as ie,i as o,j as m}from"./chunk-GHP25GEO.js";var D=class extends Function{constructor(){super("...args","return this._bound._call(...args)");a(this,"_bound");return this._bound=this.bind(this),this._bound}},oe=D;var x=class{constructor(){a(this,"lastUniqueId",0);a(this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let r;e.label?(r=e.label.replaceAll(/\s/g,"_"),r=r.replaceAll(/[^\w\d]/g,"")):r="item",t=`${r}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},E=class{constructor(){a(this,"_usedNames",new Set);a(this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let r=0,s=e.label;for(;this._usedNames.has(s);)r++,s=`${e.label}_${r}`;return this._usedNames.add(s),this._assignedNames.set(e,s),s}};var ve={uniform:"uniform",mutable_storage:"storage, read_write",readonly_storage:"storage, read"},V=class{constructor(e,t){this.names=e;this._bindingGroup=t;a(this,"_memoizedResolves",new WeakMap);a(this,"_nextFreeBindingIdx",0);a(this,"_usedBindables",new Set);a(this,"_declarations",[])}get usedBindables(){return this._usedBindables}get declarations(){return this._declarations}getOrInstantiate(e,t){var i;let r=(i=this._memoizedResolves.get(e))!=null?i:[];for(let u of r)if([...u.slotToValueMap.entries()].every(([g,c])=>t.readSlot(g)===c))return u.result;let s=e.resolve(t),l=new Map;for(let u of t.usedSlots)l.set(u,t.readSlot(u));return r.push({slotToValueMap:l,result:s}),this._memoizedResolves.set(e,r),s}reserveBindingEntry(e){return this._usedBindables.add(e),{group:this._bindingGroup,idx:this._nextFreeBindingIdx++}}addDeclaration(e){this._declarations.push(e)}},P=class{constructor({names:e,bindingGroup:t}){a(this,"_shared");a(this,"usedSlots",new Set);this._shared=new V(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new ne(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!$(e))return String(e);let r=new C(this,this._shared,t),s=this._shared.getOrInstantiate(e,r);return`${[...this._shared.declarations].join(`
|
2
|
-
|
3
|
-
`)}${s}`}},C=class n{constructor(e,t,r){this._parent=e;this._shared=t;this._slotValuePairs=r;a(this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){let{group:r,idx:s}=this._shared.reserveBindingEntry(e);this.addDeclaration(o`@group(${r}) @binding(${s}) var<${ve[e.usage]}> ${t}: ${e.allocatable.dataType};`)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([r])=>r===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;le(t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!$(e))return String(e);let r=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,r)}};var _e={uniform:"uniform",mutable_storage:"storage",readonly_storage:"read-only-storage"},b=class{constructor(e,t){this.runtime=e;this.root=t}build(e){var u;let t=new P({names:(u=e.nameRegistry)!=null?u:new x,bindingGroup:e.bindingGroup}),r=t.resolve(this.root),s=Array.from(t.usedBindables),l=this.runtime.device.createBindGroupLayout({entries:s.map((d,g)=>({binding:g,visibility:e.shaderStage,buffer:{type:_e[d.usage]}}))}),i=this.runtime.device.createBindGroup({layout:l,entries:s.map((d,g)=>({binding:g,resource:{buffer:this.runtime.bufferFor(d.allocatable)}}))});return{bindGroupLayout:l,bindGroup:i,code:r}}};function w(n,e){return new F(n,e)}var F=class{constructor(e,t){this.buffer=e;this.usage=t;a(this,"_label")}get label(){return this._label}get allocatable(){return this.buffer}$name(e){return this._label=e,this}resolve(e){let t=new m;return e.addBinding(this,t),e.resolve(t)}toString(){var e;return`${this.usage}:${(e=this._label)!=null?e:"<unnamed>"}`}};function ue(n,e){return new G(n,e)}var G=class{constructor(e,t){this.dataType=e;this.initial=t;a(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);a(this,"_allowedUsages",{uniform:null,mutableStorage:null,readonlyStorage:null});a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}$allowUniform(){let e=this;return this.$addFlags(GPUBufferUsage.UNIFORM),this._allowedUsages.uniform||(this._allowedUsages.uniform=w(e,"uniform")),e}$allowReadonlyStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.readonlyStorage||(this._allowedUsages.readonlyStorage=w(e,"readonly_storage")),e}$allowMutableStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.mutableStorage||(this._allowedUsages.mutableStorage=w(e,"mutable_storage")),e}$addFlags(e){return this.flags|=e,this}asUniform(){return this._allowedUsages.uniform}asMutableStorage(){return this._allowedUsages.mutableStorage}asReadonlyStorage(){return this._allowedUsages.readonlyStorage}toString(){var e;return`buffer:${(e=this._label)!=null?e:"<unnamed>"}`}};function ge(n){return new M(n)}var M=class{constructor(e){this.expr=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new m().$name(this._label);return e.addDeclaration(o`const ${t} = ${this.expr};`),e.resolve(t)}};function de(n){return(e,...t)=>{let r=new k(o(e,...t));return n&&r.$name(n),r}}var k=class{constructor(e){this.body=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new m().$name(this._label);return e.addDeclaration(o`fn ${t}${this.body}`.$name(this._label)),e.resolve(t)}with(e,t){return new L(this,[e,t])}toString(){var e;return`fn:${(e=this.label)!=null?e:"<unnamed>"}`}},L=class n{constructor(e,t){this._innerFn=e;this._slotValuePair=t}get label(){return this._innerFn.label}with(e,t){return new n(this,[e,t])}resolve(e){return e.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,s;let[e,t]=this._slotValuePair;return`fn:${(r=this.label)!=null?r:"<unnamed>"}[${(s=e.label)!=null?s:"<unnamed>"}=${t}]`}};function pe(n,e){let t=n.map(s=>[new m,s]),r=t.map(([s,l])=>s);return s=>{let l=s(...r);return new I(t,e,l)}}var O=class{constructor(e,t){this.usedFn=e;this.args=t}resolve(e){let t=this.args.map((r,s)=>{let l=s<this.args.length-1?", ":"";return o`${r}${l}`});return e.resolve(o`${this.usedFn}(${t})`)}},I=class extends oe{constructor(t,r,s){super();this.argPairs=t;this.returnType=r;this.body=s;a(this,"identifier",new m)}$name(t){return this.identifier.$name(t),this}resolve(t){let r=this.argPairs.map(([s,l],i)=>{let u=i<this.argPairs.length-1?", ":"";return ie(l)?o`${s}: ptr<${l.scope}, ${l.pointsTo}>${u}`:o`${s}: ${l}${u}`});return this.returnType!==void 0?t.addDeclaration(o`fn ${this.identifier}(${r}) -> ${this.returnType} {
|
4
|
-
${this.body}
|
5
|
-
}`):t.addDeclaration(o`fn ${this.identifier}(${r}) {
|
6
|
-
${this.body}
|
7
|
-
}`),t.resolve(this.identifier)}_call(...t){return new O(this,t)}};var fe=Symbol("This item can be set, owns its value (does not get value from an external source)");var me=Symbol("This plum's value is sourced from outside the runtime.");function S(n){return n[me]===!0}function ce(n){return typeof n=="function"?new z(n):new N(n)}function Te(n,e){return new q(n,e)}function he(n){return n.__brand==="WgslPlum"}var xe,N=class{constructor(e){this._initial=e;a(this,"__brand","WgslPlum");a(this,xe,!0);a(this,"_label")}compute(e){return this._initial}$name(e){return this._label=e,this}get label(){return this._label}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};xe=fe;var z=class{constructor(e){this._compute=e;a(this,"__brand","WgslPlum");a(this,"_label")}$name(e){return this._label=e,this}get label(){return this._label}compute(e){return this._compute(e)}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}},Pe,q=class{constructor(e,t){this._subscribe=e;this._getLatest=t;a(this,"__brand","WgslPlum");a(this,Pe,!0);a(this,"_label");a(this,"_prev");a(this,"_version",0);this._prev=t()}$name(e){return this._label=e,this}get label(){return this._label}get version(){return this._version}subscribe(e){return this._subscribe(e)}compute(){let e=this._getLatest();return Object.is(e,this._prev)||(this._version++,this._prev=e),this._prev}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};Pe=me;function ye(n){return new j(n)}var j=class{constructor(e=void 0){this.defaultValue=e;a(this,"__brand","WgslSlot");a(this,"label")}$name(e){return this.label=e,this}areEqual(e,t){return Object.is(e,t)}resolve(e){var r;let t=e.unwrap(this);if(!ae(t))throw new Error(`Cannot inject value of type ${typeof t} of slot '${(r=this.label)!=null?r:"<unnamed>"}' in code.`);return e.resolve(t)}toString(){var e;return`slot:${(e=this.label)!=null?e:"<unnamed>"}`}};var be=(n,e)=>new K(n,e,"private"),K=class{constructor(e,t,r){this._dataType=e;this._initialValue=t;this.scope=r;a(this,"identifier",new m)}$name(e){return this.identifier.$name(e),this}resolve(e){return this._initialValue?e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`):e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType};`),e.resolve(this.identifier)}};var we=Object.assign(o,{code:o,fn:de,fun:pe,buffer:ue,plum:ce,plumFromEvent:Te,slot:ye,constant:ge,var:be});import{BufferReader as Se,BufferWriter as We}from"typed-binary";var Q=(n,e)=>{let t=e-1,r=~t;return n&t?(n&r)+e:n};var R=class{constructor(){a(this,"_stateMap",new WeakMap)}inspect(e){return this._stateMap.get(e)}_getState(e){let t=this._stateMap.get(e);if(!t){let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);t={value:r,dependencies:s,version:0},this._stateMap.set(e,t)}return t}_notifyListeners(e){let t=this._getState(e);if(!t.active)return;let r=[...t.active.listeners];for(let s of r)s()}_computeAndGatherDependencies(e){let t=new Map,r=s=>{if(!t.has(s)){let l=this._getState(s);t.set(s,l.version)}return this.get(s)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let l of t.active.unsubs)l();let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);if(t.dependencies=s,t.active)for(let[l]of t.dependencies)t.active.unsubs.add(this.subscribe(l,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=S(e)?e.version:t.version+1,this._notifyListeners(e)),t.value}get(e){let t=this._getState(e);if(t.active)return t.value;let r=!1;return S(e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([s,l])=>(this.get(s),this._getState(s).version!==l))),r?this._recompute(e):t.value}set(e,t){let r=this._getState(e);Object.is(r.value,t)||(r.value=t,r.version++,this._notifyListeners(e))}subscribe(e,t){let r=this._getState(e),s;if(!r.active){let l=new Set;r.active={listeners:new Set,unsubs:l};for(let[i]of r.dependencies)l.add(this.subscribe(i,()=>{this._recompute(e)}));S(e)&&(s=e.subscribe(()=>{this._recompute(e)}))}return r.active.listeners.add(t),()=>{if(r.active&&(r.active.listeners.delete(t),r.active.listeners.size===0)){for(let l of r.active.unsubs)l();s==null||s(),r.active=void 0}}}};var A=class{constructor(){a(this,"_queue",[]);a(this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(s){r(s)}}),this._processQueue()})}async _processQueue(){if(!this._pending){for(this._pending=!0;this._queue.length>0;){let e=this._queue.shift();e&&await e()}this._pending=!1}}};var U=class{constructor(e){this.device=e;a(this,"_entryToBufferMap",new Map);a(this,"_pipelineExecutors",[]);a(this,"_commandEncoder",null);a(this,"_readBuffer",null);a(this,"_taskQueue",new A);a(this,"_plumStore",new R);a(this,"_allocSubscriptions",new Map)}get commandEncoder(){return this._commandEncoder||(this._commandEncoder=this.device.createCommandEncoder()),this._commandEncoder}dispose(){var e;for(let t of this._allocSubscriptions.values())t();this._allocSubscriptions.clear();for(let t of this._entryToBufferMap.values())t.destroy();this._entryToBufferMap.clear(),(e=this._readBuffer)==null||e.destroy()}bufferFor(e){let t=this._entryToBufferMap.get(e);if(!t){if(t=this.device.createBuffer({usage:e.flags,size:Q(e.dataType.size,e.dataType.byteAlignment),mappedAtCreation:e.initial!==void 0}),!t)throw new Error(`Failed to create buffer for ${e}`);if(e.initial!==void 0){let r=new We(t.getMappedRange());if(he(e.initial)){let s=e.initial;e.dataType.write(r,this._plumStore.get(s)),this._allocSubscriptions.set(e,this._plumStore.subscribe(s,()=>{this.writeBuffer(e,this._plumStore.get(s))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var l;this.flush(),(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((l=this._readBuffer)==null||l.destroy(),this._readBuffer=this.device.createBuffer({usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,size:e.dataType.size}));let t=this.bufferFor(e),r=this.device.createCommandEncoder();r.copyBufferToBuffer(t,0,this._readBuffer,0,e.dataType.size),this.device.queue.submit([r.finish()]),await this.device.queue.onSubmittedWorkDone(),await this._readBuffer.mapAsync(GPUMapMode.READ,0,e.dataType.size);let s=e.dataType.read(new Se(this._readBuffer.getMappedRange()));return this._readBuffer.unmap(),s})}writeBuffer(e,t){let r=this.bufferFor(e),s=Q(e.dataType.size,e.dataType.byteAlignment),l=new ArrayBuffer(s);e.dataType.write(new We(l),t),this.device.queue.writeBuffer(r,0,l,0,s)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var g,c,T,h,y,p,f,_,v,H,J,Z,ee;let t=new b(this,o`
|
8
|
-
@vertex fn main_vertex(${e.vertex.args.flatMap(W=>[W,", "])}) -> ${e.vertex.output} {
|
9
|
-
${e.vertex.code}
|
10
|
-
}
|
11
|
-
|
12
|
-
${(c=(g=e.externalDeclarations)==null?void 0:g.flatMap(W=>[W,`
|
13
|
-
`]))!=null?c:""}
|
14
|
-
`).build({bindingGroup:((T=e.externalLayouts)!=null?T:[]).length,shaderStage:GPUShaderStage.VERTEX}),r=new b(this,o`
|
15
|
-
@fragment fn main_frag(${e.fragment.args.flatMap(W=>[W,", "])}) -> ${e.fragment.output} {
|
16
|
-
${e.fragment.code}
|
17
|
-
}
|
18
|
-
|
19
|
-
${(y=(h=e.externalDeclarations)==null?void 0:h.flatMap(W=>[W,`
|
20
|
-
`]))!=null?y:""}
|
21
|
-
`).build({bindingGroup:((p=e.externalLayouts)!=null?p:[]).length+1,shaderStage:GPUShaderStage.FRAGMENT}),s=this.device.createShaderModule({code:t.code}),l=this.device.createShaderModule({code:r.code}),i=this.device.createPipelineLayout({label:(f=e.label)!=null?f:"",bindGroupLayouts:[...(_=e.externalLayouts)!=null?_:[],t.bindGroupLayout,r.bindGroupLayout]}),u=this.device.createRenderPipeline({label:(v=e.label)!=null?v:"",layout:i,vertex:{module:s,buffers:(H=e.vertex.buffersLayouts)!=null?H:[]},fragment:{module:l,targets:(J=e.fragment.target)!=null?J:[]},primitive:e.primitive}),d=new Y(this,u,[t,r],(ee=(Z=e.externalLayouts)==null?void 0:Z.length)!=null?ee:0);return this._pipelineExecutors.push(d),d}makeComputePipeline(e){var g,c,T,h,y,p,f,_;let{args:t=[],workgroupSize:r=[1,1]}=e,s=new b(this,o`
|
22
|
-
@compute @workgroup_size(${r.join(", ")}) fn main_compute(${t.flatMap(v=>[v,", "])}) {
|
23
|
-
${e.code}
|
24
|
-
}
|
25
|
-
|
26
|
-
${(c=(g=e.externalDeclarations)==null?void 0:g.flatMap(v=>[v,`
|
27
|
-
`]))!=null?c:""}
|
28
|
-
`).build({bindingGroup:((T=e.externalLayouts)!=null?T:[]).length,shaderStage:GPUShaderStage.COMPUTE}),l=this.device.createShaderModule({code:s.code}),i=this.device.createPipelineLayout({label:(h=e.label)!=null?h:"",bindGroupLayouts:[...(y=e.externalLayouts)!=null?y:[],s.bindGroupLayout]}),u=this.device.createComputePipeline({label:(p=e.label)!=null?p:"",layout:i,compute:{module:l}}),d=new X(this,u,[s],(_=(f=e.externalLayouts)==null?void 0:f.length)!=null?_:0);return this._pipelineExecutors.push(d),d}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},B=class{constructor(e,t,r,s,l){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=s;this.label=l}},Y=class extends B{execute(e){var T,h,y;let c=e,{vertexCount:t,instanceCount:r,firstVertex:s,firstInstance:l,externalBindGroups:i,externalVertexBuffers:u}=c,d=se(c,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers"]);if(((T=i==null?void 0:i.length)!=null?T:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(h=i==null?void 0:i.length)!=null?h:0}`);let g=this._runtime.commandEncoder.beginRenderPass(re(te({},d),{label:(y=this.label)!=null?y:""}));g.setPipeline(this.pipeline),(i!=null?i:[]).forEach((p,f)=>g.setBindGroup(f,p)),(u!=null?u:[]).forEach((p,f)=>g.setVertexBuffer(f,p)),this.programs.forEach((p,f)=>{g.setBindGroup((i!=null?i:[]).length+f,p.bindGroup)}),g.draw(t,r,s,l),g.end()}},X=class extends B{execute(e){var l,i,u;let{workgroups:t=[1,1],externalBindGroups:r}=e!=null?e:{};if(((l=r==null?void 0:r.length)!=null?l:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(i=r==null?void 0:r.length)!=null?i:0}`);let s=this._runtime.commandEncoder.beginComputePass({label:(u=this.label)!=null?u:""});s.setPipeline(this.pipeline),(r!=null?r:[]).forEach((d,g)=>s.setBindGroup(g,d)),this.programs.forEach((d,g)=>s.setBindGroup((r!=null?r:[]).length+g,d.bindGroup)),s.dispatchWorkgroups(...t),s.end()}};async function Re(n){if(n instanceof GPUDevice)return new U(n);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(n==null?void 0:n.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new U(await e.requestDevice(n==null?void 0:n.device))}export{ne as MissingSlotValueError,b as ProgramBuilder,x as RandomNameRegistry,Ae as RecursiveDataTypeError,E as StrictNameRegistry,Re as createRuntime,ie as isPointer,$ as isResolvable,le as isSlot,ae as isWgsl,we as wgsl};
|
29
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
@@ -1 +0,0 @@
|
|
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/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 } 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 const result = item.resolve(itemCtx);\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 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(label?: string) {\n return (\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n ): WgslFn => {\n const func = new WgslFnImpl(code(strings, ...params));\n if (label) {\n func.$name(label);\n }\n return func;\n };\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})`);\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 identifier = new WgslIdentifier();\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\n }\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\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 ${this.identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${this.identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(this.identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\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 { 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 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","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","fn","label","strings","params","func","WgslFnImpl","code","body","__publicField","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","callable_default","__publicField","label","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","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"]}
|
package/dist/macro/index.cjs
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk3VCFA6WZcjs = require('../chunk-3VCFA6WZ.cjs');function p(l,s){return _chunk3VCFA6WZcjs.i`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new (0, _chunk3VCFA6WZcjs.j)().$name("i");return typeof n=="function"?_chunk3VCFA6WZcjs.i`
|
2
|
-
for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
|
3
|
-
${n(e)}
|
4
|
-
}`:_chunk3VCFA6WZcjs.i`
|
5
|
-
for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
|
6
|
-
${n}
|
7
|
-
}`}return typeof n=="function"?_chunk3VCFA6WZcjs.i`${Array.from({length:r},(e,i)=>n(i))}`:_chunk3VCFA6WZcjs.i`${Array.from({length:r},()=>n)}`}}`}exports.repeat = p;
|
8
|
-
//# sourceMappingURL=index.cjs.map
|
File without changes
|
File without changes
|