typegpu 0.0.0-alpha.3 → 0.0.0-alpha.5
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +29 -0
- package/chunk-337KOXP7.js +2 -0
- package/chunk-337KOXP7.js.map +1 -0
- package/chunk-6WFXH2OR.js +8 -0
- package/chunk-6WFXH2OR.js.map +1 -0
- package/chunk-G6QA55EY.cjs +8 -0
- package/chunk-G6QA55EY.cjs.map +1 -0
- package/chunk-S55XYV7U.cjs +2 -0
- package/chunk-S55XYV7U.cjs.map +1 -0
- package/data/index.cjs +1 -9
- package/data/index.cjs.map +1 -1
- package/data/index.d.cts +41 -46
- package/data/index.d.ts +41 -46
- package/data/index.js +1 -9
- package/data/index.js.map +1 -1
- package/index.cjs +1 -28
- package/index.cjs.map +1 -1
- package/index.d.cts +54 -250
- package/index.d.ts +54 -250
- package/index.js +1 -28
- package/index.js.map +1 -1
- package/macro/index.cjs +3 -3
- package/macro/index.cjs.map +1 -1
- package/macro/index.d.cts +1 -1
- package/macro/index.d.ts +1 -1
- package/macro/index.js +2 -2
- package/macro/index.js.map +1 -1
- package/package.json +15 -14
- package/types-DU0c7BuW.d.cts +207 -0
- package/types-DU0c7BuW.d.ts +207 -0
- package/.DS_Store +0 -0
- package/chunk-G3WAZR24.cjs +0 -4
- package/chunk-G3WAZR24.cjs.map +0 -1
- package/chunk-JYXJ5NFX.cjs +0 -2
- package/chunk-JYXJ5NFX.cjs.map +0 -1
- package/chunk-K6N2A55L.js +0 -4
- package/chunk-K6N2A55L.js.map +0 -1
- package/chunk-NTGWE7PR.js +0 -2
- package/chunk-NTGWE7PR.js.map +0 -1
- package/struct-ER9XI7ad.d.cts +0 -9
- package/struct-udnQvwHG.d.ts +0 -9
- package/types-DeF6xFAt.d.cts +0 -148
- package/types-DeF6xFAt.d.ts +0 -148
package/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/callable.ts","../src/nameRegistry.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/wgslBufferUsage.ts","../src/wgslBuffer.ts","../src/wgslConstant.ts","../src/wgslDeclare.ts","../src/wgslFunction.ts","../src/wgslFunctionExperimental.ts","../src/settableTrait.ts","../src/wgslPlum.ts","../src/wgslSlot.ts","../src/wgslVariable.ts","../src/wgsl.ts","../src/createRuntime.ts","../src/mathUtils.ts","../src/plumStore.ts","../src/taskQueue.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: <generics>\nabstract class Callable<TArgs extends [...any[]], TReturn> extends Function {\n _bound: Callable<TArgs, TReturn>;\n\n constructor() {\n // We create a new Function object using `super`, with a `this` reference\n // to itself (the Function object) provided by binding it to `this`,\n // then returning the bound Function object (which is a wrapper around the\n // the original `this`/Function object). We then also have to store\n // a reference to the bound Function object, as `_bound` on the unbound `this`,\n // so the bound function has access to the new bound object.\n // Pro: Works well, doesn't rely on deprecated features.\n // Con: A little convoluted, and requires wrapping `this` in a bound object.\n\n super('...args', 'return this._bound._call(...args)');\n // Or without the spread/rest operator:\n // super('return this._bound._call.apply(this._bound, arguments)')\n this._bound = this.bind(this);\n\n // biome-ignore lint/correctness/noConstructorReturn: <quirks of creating a custom callable>\n return this._bound;\n }\n\n abstract _call(...args: TArgs): TReturn;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type ICallable<TArgs extends [...any[]], TReturn> = (\n ...args: TArgs\n) => TReturn;\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type AsCallable<T, TArgs extends [...any[]], TReturn> = T &\n ICallable<TArgs, TReturn>;\n\nexport default Callable;\n","import type { WgslResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: WgslResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable) {\n let name = this.names.get(item);\n\n if (name === undefined) {\n // creating sanitized name\n let label: string;\n if (item.label) {\n label = item.label.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n name = `${label}_${this.lastUniqueId++}`;\n this.names.set(item, name);\n }\n\n return name;\n }\n}\n\nexport class StrictNameRegistry implements NameRegistry {\n /**\n * Allows to provide a good fallback for instances of the\n * same function that are bound to different slot values.\n */\n private readonly _usedNames = new Set<string>();\n\n private readonly _assignedNames = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable): string {\n const assignedName = this._assignedNames.get(item);\n if (assignedName !== undefined) {\n return assignedName;\n }\n\n if (item.label === undefined) {\n throw new Error('Unnamed item found when using a strict NameRegistry');\n }\n\n let index = 0;\n let unusedName = item.label;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${item.label}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n this._assignedNames.set(item, unusedName);\n return unusedName;\n }\n}\n","import { MissingSlotValueError, ResolutionError } from './errors';\nimport type { NameRegistry } from './nameRegistry';\nimport {\n type BufferUsage,\n type Eventual,\n type ResolutionCtx,\n type SlotValuePair,\n type Wgsl,\n type WgslBindable,\n type WgslResolvable,\n type WgslSlot,\n isResolvable,\n isSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport type { WgslIdentifier } from './wgslIdentifier';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n};\n\ntype SlotToValueMap = Map<WgslSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<BufferUsage, string> = {\n uniform: 'uniform',\n mutable_storage: 'storage, read_write',\n readonly_storage: 'storage, read',\n};\n\nclass SharedResolutionState {\n private readonly _memoizedResolves = new WeakMap<\n // WeakMap because if the resolvable does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n WgslResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private _nextFreeBindingIdx = 0;\n private readonly _usedBindables = new Set<WgslBindable>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n ) {}\n\n get usedBindables(): Iterable<WgslBindable> {\n return this._usedBindables;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved\n * with the `compute` method.\n * @param compute Returns the resolved item and the corresponding bindingMap. This result will be discarded if a sufficient cache entry is found.\n */\n getOrInstantiate(item: WgslResolvable, itemCtx: ScopedResolutionCtx): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) => itemCtx.readSlot(slot) === expectedValue,\n )\n ) {\n return instance.result;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n let result: string;\n try {\n result = item.resolve(itemCtx);\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(item);\n }\n\n throw new ResolutionError(err, [item]);\n }\n\n // We know which bindables the item used while resolving\n const slotToValueMap = new Map<WgslSlot<unknown>, unknown>();\n for (const usedSlot of itemCtx.usedSlots) {\n slotToValueMap.set(usedSlot, itemCtx.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n }\n\n reserveBindingEntry(_bindable: WgslBindable) {\n this._usedBindables.add(_bindable);\n\n return { group: this._bindingGroup, idx: this._nextFreeBindingIdx++ };\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\n private readonly _shared: SharedResolutionState;\n\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor({ names, bindingGroup }: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(names, bindingGroup ?? 0);\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n addDeclaration(_declaration: WgslResolvable) {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBinding(_bindable: WgslBindable, _identifier: WgslIdentifier): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n nameFor(item: WgslResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n if (slot.defaultValue === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return slot.defaultValue;\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n const result = this._shared.getOrInstantiate(item, itemCtx);\n\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n}\n\nclass ScopedResolutionCtx implements ResolutionCtx {\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor(\n private readonly _parent: ResolutionCtxImpl | ScopedResolutionCtx,\n private readonly _shared: SharedResolutionState,\n private readonly _slotValuePairs: SlotValuePair<unknown>[],\n ) {}\n\n addDeclaration(declaration: WgslResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void {\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n nameFor(token: WgslResolvable): string {\n return this._shared.names.nameFor(token);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n const slotToValuePair = this._slotValuePairs.find(\n ([boundSlot]) => boundSlot === slot,\n ) as SlotValuePair<T> | undefined;\n\n if (!slotToValuePair) {\n // Not yet available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n // Maybe the parent ctx has it.\n return this._parent.readSlot(slot);\n }\n\n // Available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n return slotToValuePair[1];\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeSlot = eventual;\n\n // Unwrapping all layers of slots.\n while (isSlot(maybeSlot)) {\n maybeSlot = this.readSlot(maybeSlot);\n }\n\n return maybeSlot;\n }\n\n resolve(\n item: Wgsl,\n slotValueOverrides: SlotValuePair<unknown>[] = [],\n ): string {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n return this._shared.getOrInstantiate(item, itemCtx);\n }\n}\n","import { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport type { TypeGpuRuntime } from './typegpuRuntime';\nimport type { BufferUsage, WgslResolvable } from './types';\n\nexport type Program = {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly bindGroup: GPUBindGroup;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nconst usageToBindingTypeMap: Record<BufferUsage, GPUBufferBindingType> = {\n uniform: 'uniform',\n mutable_storage: 'storage',\n readonly_storage: 'read-only-storage',\n};\n\nexport default class ProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private root: WgslResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.root);\n const usedBindables = Array.from(ctx.usedBindables);\n\n const bindGroupLayout = this.runtime.device.createBindGroupLayout({\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n visibility: options.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[bindable.usage],\n },\n })),\n });\n\n const bindGroup = this.runtime.device.createBindGroup({\n layout: bindGroupLayout,\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n resource: {\n buffer: this.runtime.bufferFor(bindable.allocatable),\n },\n })),\n });\n\n return {\n bindGroupLayout,\n bindGroup,\n code: codeString,\n };\n }\n}\n","import type {\n AnyWgslData,\n BufferUsage,\n ResolutionCtx,\n WgslBindable,\n} from './types';\nimport type { WgslBuffer } from './wgslBuffer';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n> extends WgslBindable<TData, TUsage> {\n $name(label: string): WgslBufferUsage<TData, TUsage>;\n}\n\nexport function bufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n>(\n buffer: WgslBuffer<TData, TUsage>,\n usage: TUsage,\n): WgslBufferUsage<TData, TUsage> {\n return new WgslBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferUsageImpl<TData extends AnyWgslData, TUsage extends BufferUsage>\n implements WgslBufferUsage<TData, TUsage>\n{\n private _label: string | undefined;\n\n constructor(\n public readonly buffer: WgslBuffer<TData, TUsage>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier();\n\n ctx.addBinding(this, identifier);\n\n return ctx.resolve(identifier);\n }\n\n toString(): string {\n return `${this.usage}:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { Parsed } from 'typed-binary';\nimport type { AnyWgslData, BufferUsage, WgslAllocatable } from './types';\nimport { type WgslBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { WgslPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBuffer<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> extends WgslAllocatable<TData> {\n $name(label: string): WgslBuffer<TData, TAllows>;\n $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;\n $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;\n $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;\n $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;\n\n asUniform(): 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n\n asMutableStorage(): 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n\n asReadonlyStorage(): 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n}\n\nexport function buffer<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = never,\n>(\n typeSchema: TData,\n initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined,\n): WgslBuffer<TData, TUsage> {\n return new WgslBufferImpl<TData, TUsage>(typeSchema, initial);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferImpl<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> implements WgslBuffer<TData, TAllows>\n{\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n\n private _allowedUsages: {\n uniform: WgslBufferUsage<TData, TAllows | 'uniform'> | null;\n mutableStorage: WgslBufferUsage<TData, TAllows | 'mutable_storage'> | null;\n readonlyStorage: WgslBufferUsage<\n TData,\n TAllows | 'readonly_storage'\n > | null;\n } = {\n uniform: null,\n mutableStorage: null,\n readonlyStorage: null,\n };\n\n private _label: string | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $allowUniform() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'uniform'>;\n this.$addFlags(GPUBufferUsage.UNIFORM);\n if (!this._allowedUsages.uniform) {\n this._allowedUsages.uniform = bufferUsage(enrichedThis, 'uniform');\n }\n return enrichedThis;\n }\n\n $allowReadonlyStorage() {\n const enrichedThis = this as WgslBuffer<\n TData,\n TAllows | 'readonly_storage'\n >;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.readonlyStorage) {\n this._allowedUsages.readonlyStorage = bufferUsage(\n enrichedThis,\n 'readonly_storage',\n );\n }\n return enrichedThis;\n }\n\n $allowMutableStorage() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'mutable_storage'>;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.mutableStorage) {\n this._allowedUsages.mutableStorage = bufferUsage(\n enrichedThis,\n 'mutable_storage',\n );\n }\n return enrichedThis;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n asUniform() {\n return this._allowedUsages.uniform as 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n }\n\n asMutableStorage() {\n return this._allowedUsages\n .mutableStorage as 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n }\n\n asReadonlyStorage() {\n return this._allowedUsages\n .readonlyStorage as 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslConst extends WgslResolvable {\n $name(label: string): WgslConst;\n}\n\n/**\n * Creates a constant is computed at shader initialization according\n * to the passed in expression.\n */\nexport function constant(expr: Wgsl): WgslConst {\n return new WgslConstImpl(expr);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslConstImpl implements WgslConst {\n private _label: string | undefined;\n\n constructor(private readonly expr: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`const ${identifier} = ${this.expr};`);\n\n return ctx.resolve(identifier);\n }\n}\n","import type {\n InlineResolve,\n ResolutionCtx,\n Wgsl,\n WgslResolvable,\n} from './types';\nimport { code } from './wgslCode';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslDeclare extends WgslResolvable {}\n\nexport function declare(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): WgslDeclare {\n return new WgslDeclareImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslDeclareImpl implements WgslDeclare {\n constructor(private readonly _declaration: Wgsl) {}\n\n resolve(ctx: ResolutionCtx): string {\n ctx.addDeclaration(code`${this._declaration}`);\n return '';\n }\n}\n","import type {\n Eventual,\n InlineResolve,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn extends WgslResolvable {\n $name(label: string): WgslFn;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;\n}\n\nexport type BoundWgslFn = Omit<WgslFn, '$name'>;\n\nexport function fn(\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n): WgslFn {\n return new WgslFnImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslFnImpl implements WgslFn {\n private _label: string | undefined;\n\n constructor(private readonly body: Wgsl) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`fn ${identifier}${this.body}`.$name(this._label));\n\n return ctx.resolve(identifier);\n }\n\n with<T>(slot: WgslSlot<T>, value: T): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `fn:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslFnImpl<T> implements BoundWgslFn {\n constructor(\n private readonly _innerFn: BoundWgslFn,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this._innerFn, [this._slotValuePair]);\n }\n\n toString(): string {\n const [slot, value] = this._slotValuePair;\n return `fn:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import Callable, { type AsCallable } from './callable';\nimport { isPointer } from './types';\nimport type {\n AnyWgslData,\n ResolutionCtx,\n Wgsl,\n WgslFnArgument,\n WgslResolvable,\n WgslValue,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> extends WgslResolvable,\n Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n > {}\n\nexport function fn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n>(argTypes: TArgTypes, returnType?: TReturn) {\n const argPairs = argTypes.map(\n (argType) => [new WgslIdentifier(), argType] as const,\n ) as PairsFromTypes<TArgTypes>;\n\n const argValues = argPairs.map(\n ([argIdent, argType]) =>\n argIdent as WgslValue<typeof argType> & WgslIdentifier,\n );\n\n type TArgValues = ValuesFromTypes<TArgTypes>;\n return (bodyProducer: (...args: TArgValues) => Wgsl) => {\n const body = bodyProducer(...(argValues as TArgValues));\n\n const fnInstance = new WgslFnImpl<TArgTypes, TReturn>(\n argPairs,\n returnType,\n body,\n );\n\n return fnInstance as AsCallable<\n typeof fnInstance,\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes>\n >;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;\n};\n\ntype PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];\n};\n\ntype SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: Wgsl;\n};\n\nclass WgslFunctionCall<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> implements WgslResolvable\n{\n constructor(\n private usedFn: WgslFn<TArgTypes, TReturn>,\n private readonly args: SegmentsFromTypes<TArgTypes>,\n ) {}\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.args.map((argSegment, idx) => {\n const comma = idx < this.args.length - 1 ? ', ' : '';\n return code`${argSegment}${comma}`;\n });\n\n return ctx.resolve(code`${this.usedFn}(${argsCode})`.$name('internal'));\n }\n\n toString(): string {\n return `fun:${this.usedFn.label ?? '<unnamed>'}()`;\n }\n}\n\nclass WgslFnImpl<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n // TArgPairs extends (readonly [WgslIdentifier, WgslFnArgument])[],\n TReturn extends AnyWgslData | undefined = undefined,\n >\n extends Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n >\n implements WgslFn<TArgTypes, TReturn>\n{\n private _label: string | undefined;\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n const argsCode = this.argPairs.map(([ident, argType], idx) => {\n const comma = idx < this.argPairs.length - 1 ? ', ' : '';\n\n if (isPointer(argType)) {\n return code`${ident}: ptr<${argType.scope}, ${argType.pointsTo}>${comma}`;\n }\n\n return code`${ident}: ${argType}${comma}`;\n });\n\n if (this.returnType !== undefined) {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\n }\n\n toString(): string {\n return `fun:${this._label ?? '<unnamed>'}`;\n }\n}\n","export const WgslSettableTrait = Symbol(\n 'This item can be set, owns its value (does not get value from an external source)',\n);\n\nexport interface WgslSettable {\n readonly [WgslSettableTrait]: true;\n}\n\nexport function isSettable(\n value: WgslSettable | unknown,\n): value is WgslSettable {\n return (value as WgslSettable)[WgslSettableTrait] === true;\n}\n","import { type WgslSettable, WgslSettableTrait } from './settableTrait';\nimport type { Wgsl, WgslResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport type Getter = <T>(plum: WgslPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends WgslPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface WgslPlum<TValue = unknown> {\n readonly __brand: 'WgslPlum';\n\n $name(label: string): this;\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const WgslExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\nexport interface WgslExternalPlum {\n readonly [WgslExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | WgslExternalPlum,\n): value is WgslExternalPlum {\n return (value as WgslExternalPlum)[WgslExternalPlumTrait] === true;\n}\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T extends Wgsl>(\n compute: (get: Getter) => T,\n): WgslPlum<T> & WgslResolvable;\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T>(compute: (get: Getter) => T): WgslPlum<T>;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T extends Wgsl>(\n initial: T,\n): WgslPlum<T> & WgslSettable & WgslResolvable;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T>(initial: T): WgslPlum<T> & WgslSettable;\n\nexport function plum<T>(\n initialOrCompute: T | ((get: Getter) => T),\n): WgslPlum<T> | (WgslPlum<T> & WgslSettable) {\n if (typeof initialOrCompute === 'function') {\n return new WgslDerivedPlumImpl(initialOrCompute as (get: Getter) => T);\n }\n\n return new WgslSourcePlumImpl(initialOrCompute);\n}\n\nexport function plumFromEvent<T>(\n subscribe: (listener: () => unknown) => Unsubscribe,\n getLatest: () => T,\n): WgslPlum<T> & WgslExternalPlum {\n return new WgslExternalPlumImpl(subscribe, getLatest);\n}\n\nexport function isPlum<T>(value: WgslPlum<T> | unknown): value is WgslPlum<T> {\n return (value as WgslPlum).__brand === 'WgslPlum';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSourcePlumImpl<TValue> implements WgslPlum<TValue>, WgslSettable {\n readonly __brand = 'WgslPlum';\n readonly [WgslSettableTrait] = true;\n\n private _label: string | undefined;\n\n constructor(private readonly _initial: TValue) {}\n\n compute(_get: Getter) {\n return this._initial;\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslDerivedPlumImpl<TValue> implements WgslPlum<TValue> {\n readonly __brand = 'WgslPlum';\n private _label: string | undefined;\n\n constructor(private readonly _compute: (get: Getter) => TValue) {}\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n compute(get: Getter): TValue {\n return this._compute(get);\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslExternalPlumImpl<TValue>\n implements WgslPlum<TValue>, WgslExternalPlum\n{\n readonly __brand = 'WgslPlum';\n readonly [WgslExternalPlumTrait] = true;\n\n private _label: string | undefined;\n private _prev: TValue;\n private _version = 0;\n\n constructor(\n private readonly _subscribe: (listener: () => unknown) => Unsubscribe,\n private readonly _getLatest: () => TValue,\n ) {\n this._prev = _getLatest();\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get version(): number {\n return this._version;\n }\n\n subscribe(listener: () => unknown): Unsubscribe {\n return this._subscribe(listener);\n }\n\n compute(): TValue {\n const latest = this._getLatest();\n\n if (!Object.is(latest, this._prev)) {\n this._version++;\n this._prev = latest;\n }\n\n return this._prev;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n","import {\n type ResolutionCtx,\n type Wgsl,\n type WgslResolvable,\n type WgslResolvableSlot,\n type WgslSlot,\n isWgsl,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T> {\n return new WgslSlotImpl(defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSlotImpl<T> implements WgslResolvable, WgslSlot<T> {\n readonly __brand = 'WgslSlot';\n public label?: string | undefined;\n\n constructor(public defaultValue: T | undefined = undefined) {}\n\n public $name(label: string) {\n this.label = label;\n return this;\n }\n\n areEqual(a: T, b: T): boolean {\n return Object.is(a, b);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const value = ctx.unwrap(this);\n\n if (!isWgsl(value)) {\n throw new Error(\n `Cannot inject value of type ${typeof value} of slot '${this.label ?? '<unnamed>'}' in code.`,\n );\n }\n\n return ctx.resolve(value);\n }\n\n toString(): string {\n return `slot:${this.label ?? '<unnamed>'}`;\n }\n}\n","import type { AnyWgslData, ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport type VariableScope = 'private';\n\nexport interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {\n $name(label: string): WgslVar<TDataType>;\n}\n\n/**\n * Creates a variable, with an optional initial value.\n */\nexport const variable = <TDataType extends AnyWgslData>(\n dataType: TDataType,\n initialValue?: Wgsl,\n): WgslVar<TDataType> => new WgslVarImpl(dataType, initialValue, 'private');\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslVarImpl<TDataType extends AnyWgslData> implements WgslVar<TDataType> {\n public identifier = new WgslIdentifier();\n\n constructor(\n private readonly _dataType: TDataType,\n private readonly _initialValue: Wgsl | undefined,\n public readonly scope: VariableScope,\n ) {}\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n if (this._initialValue) {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`,\n );\n } else {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType};`,\n );\n }\n\n return ctx.resolve(this.identifier);\n }\n}\n","import { buffer } from './wgslBuffer';\nimport { code } from './wgslCode';\nimport { constant } from './wgslConstant';\nimport { declare } from './wgslDeclare';\nimport { fn } from './wgslFunction';\nimport { fn as fun } from './wgslFunctionExperimental';\nimport { plum, plumFromEvent } from './wgslPlum';\nimport { slot } from './wgslSlot';\nimport { variable } from './wgslVariable';\n\nexport default Object.assign(code, {\n code,\n fn,\n fun,\n buffer,\n plum,\n plumFromEvent,\n slot,\n constant,\n declare,\n var: variable,\n});\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport { roundUp } from './mathUtils';\nimport { PlumStore } from './plumStore';\nimport ProgramBuilder, { type Program } from './programBuilder';\nimport type { WgslSettable } from './settableTrait';\nimport { TaskQueue } from './taskQueue';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n TypeGpuRuntime,\n} from './typegpuRuntime';\nimport type { AnyWgslData, WgslAllocatable } from './types';\nimport { code } from './wgslCode';\nimport {\n type ExtractPlumValue,\n type Unsubscribe,\n type WgslPlum,\n isPlum,\n} from './wgslPlum';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a runtime can interact via GPU buffers.\n */\nclass TypeGpuRuntimeImpl {\n private _entryToBufferMap = new Map<WgslAllocatable, GPUBuffer>();\n private _pipelineExecutors: PipelineExecutor<\n GPURenderPipeline | GPUComputePipeline\n >[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n // Used for reading GPU buffers ad hoc.\n private _readBuffer: GPUBuffer | null = null;\n private _taskQueue = new TaskQueue();\n private readonly _plumStore = new PlumStore();\n private readonly _allocSubscriptions = new Map<\n WgslAllocatable,\n Unsubscribe\n >();\n\n constructor(public readonly device: GPUDevice) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n dispose() {\n for (const unsub of this._allocSubscriptions.values()) {\n unsub();\n }\n this._allocSubscriptions.clear();\n\n for (const buffer of this._entryToBufferMap.values()) {\n buffer.destroy();\n }\n\n this._entryToBufferMap.clear();\n\n this._readBuffer?.destroy();\n }\n\n bufferFor(allocatable: WgslAllocatable) {\n let buffer = this._entryToBufferMap.get(allocatable);\n\n if (!buffer) {\n buffer = this.device.createBuffer({\n usage: allocatable.flags,\n size: roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n ),\n mappedAtCreation: allocatable.initial !== undefined,\n });\n\n if (!buffer) {\n throw new Error(`Failed to create buffer for ${allocatable}`);\n }\n\n if (allocatable.initial !== undefined) {\n const writer = new BufferWriter(buffer.getMappedRange());\n\n if (isPlum(allocatable.initial)) {\n const plum = allocatable.initial;\n\n allocatable.dataType.write(writer, this._plumStore.get(plum));\n\n this._allocSubscriptions.set(\n allocatable,\n this._plumStore.subscribe(plum, () => {\n this.writeBuffer(allocatable, this._plumStore.get(plum));\n }),\n );\n } else {\n allocatable.dataType.write(writer, allocatable.initial);\n }\n\n buffer.unmap();\n }\n\n this._entryToBufferMap.set(allocatable, buffer);\n }\n\n return buffer;\n }\n\n async readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>> {\n return this._taskQueue.enqueue(async () => {\n // Flushing any commands to be encoded.\n this.flush();\n\n if (\n !this._readBuffer ||\n this._readBuffer.size < allocatable.dataType.size\n ) {\n // destroying the previous buffer\n this._readBuffer?.destroy();\n\n this._readBuffer = this.device.createBuffer({\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n size: allocatable.dataType.size,\n });\n }\n\n const buffer = this.bufferFor(allocatable);\n const commandEncoder = this.device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n buffer,\n 0,\n this._readBuffer,\n 0,\n allocatable.dataType.size,\n );\n\n this.device.queue.submit([commandEncoder.finish()]);\n await this.device.queue.onSubmittedWorkDone();\n await this._readBuffer.mapAsync(\n GPUMapMode.READ,\n 0,\n allocatable.dataType.size,\n );\n\n const res = allocatable.dataType.read(\n new BufferReader(this._readBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n this._readBuffer.unmap();\n\n return res;\n });\n }\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ) {\n const gpuBuffer = this.bufferFor(allocatable);\n\n const size = roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n );\n\n const hostBuffer = new ArrayBuffer(size);\n allocatable.dataType.write(new BufferWriter(hostBuffer), data);\n this.device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: ExtractPlumValue<TPlum>,\n ) {\n this._plumStore.set(plum, value);\n }\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: () => unknown,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const vertexProgram = new ProgramBuilder(\n this,\n code`\n @vertex fn main_vertex(${options.vertex.args.flatMap((arg) => [arg, ', '])}) -> ${options.vertex.output} {\n ${options.vertex.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.VERTEX,\n });\n\n const fragmentProgram = new ProgramBuilder(\n this,\n code`\n @fragment fn main_frag(${options.fragment.args.flatMap((arg) => [arg, ', '])}) -> ${options.fragment.output} {\n ${options.fragment.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupLayout,\n fragmentProgram.bindGroupLayout,\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers: options.vertex.buffersLayouts ?? [],\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n [vertexProgram, fragmentProgram],\n options.externalLayouts?.length ?? 0,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const { args = [], workgroupSize = [1, 1] } = options;\n\n const program = new ProgramBuilder(\n this,\n code`\n @compute @workgroup_size(${workgroupSize.join(', ')}) fn main_compute(${args.flatMap((arg) => [arg, ', '])}) {\n ${options.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.COMPUTE,\n });\n\n const shaderModule = this.device.createShaderModule({\n code: program.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n program.bindGroupLayout,\n ],\n });\n\n const computePipeline = this.device.createComputePipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n },\n });\n\n const executor = new ComputePipelineExecutor(\n this,\n computePipeline,\n [program],\n options.externalLayouts?.length ?? 0,\n );\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n flush() {\n if (!this._commandEncoder) {\n return;\n }\n\n this.device.queue.submit([this._commandEncoder.finish()]);\n this._commandEncoder = null;\n }\n}\n\nclass PipelineExecutor<T extends GPURenderPipeline | GPUComputePipeline> {\n constructor(\n protected _runtime: TypeGpuRuntime,\n public pipeline: T,\n public programs: Program[],\n public externalLayoutCount: number,\n protected label?: string,\n ) {}\n}\n\nclass RenderPipelineExecutor extends PipelineExecutor<GPURenderPipeline> {\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n externalVertexBuffers,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n (externalVertexBuffers ?? []).forEach((group, index) =>\n passEncoder.setVertexBuffer(index, group),\n );\n\n this.programs.forEach((program, i) => {\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n );\n });\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor extends PipelineExecutor<GPUComputePipeline> {\n execute(options?: ComputePipelineExecutorOptions) {\n const { workgroups = [1, 1], externalBindGroups } = options ?? {};\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginComputePass({\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n this.programs.forEach((program, i) =>\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link createRuntime}.\n */\nexport type CreateRuntimeOptions = {\n adapter: GPURequestAdapterOptions | undefined;\n device: GPUDeviceDescriptor | undefined;\n};\n\n/**\n * @param options\n * @returns\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * createRuntime();\n * ```\n *\n * @example\n * If there are specific options that should be used when requesting a device, you can pass those in.\n * ```ts\n * const adapterOptions: GPURequestAdapterOptions = ...;\n * const deviceDescriptor: GPUDeviceDescriptor = ...;\n * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n *\n * @example\n * If a specific device should be used instead, it can be passed in as a parameter.\n * ```ts\n * const device: GPUDevice = ...;\n * createRuntime(device);\n * ```\n */\nexport async function createRuntime(\n options?: CreateRuntimeOptions | GPUDevice,\n): Promise<TypeGpuRuntime> {\n if (options instanceof GPUDevice) {\n return new TypeGpuRuntimeImpl(options);\n }\n\n if (!navigator.gpu) {\n throw new Error('WebGPU is not supported by this browser.');\n }\n\n const adapter = await navigator.gpu.requestAdapter(options?.adapter);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new TypeGpuRuntimeImpl(await adapter.requestDevice(options?.device));\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import type { WgslSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type WgslPlum,\n isExternalPlum,\n} from './wgslPlum';\n\ntype Listener = () => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<WgslPlum, number>;\n active?: PlumActiveState | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<Listener>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<WgslPlum, PlumState>();\n\n /**\n * Used to inspect the current state of a plum.\n * To be used mostly in unit tests.\n */\n inspect(plum: WgslPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: WgslPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n };\n this._stateMap.set(plum, state);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: WgslPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener();\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: WgslPlum<T>) {\n const dependencies = new Map<WgslPlum, number>();\n\n const getter = (<T>(dep: WgslPlum<T>) => {\n // registering dependency.\n if (!dependencies.has(dep)) {\n const depState = this._getState(dep);\n dependencies.set(dep, depState.version);\n }\n\n return this.get(dep);\n }) as Getter;\n\n return { value: plum.compute(getter), dependencies };\n }\n\n private _recompute<T>(plum: WgslPlum<T>): T {\n const state = this._getState(plum);\n\n if (state.active) {\n // Unsubscribing from old dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n }\n\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state.dependencies = dependencies;\n if (state.active) {\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n state.active.unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n }\n\n if (Object.is(state.value, value)) {\n return state.value;\n }\n\n state.value = value;\n state.version = isExternalPlum(plum) ? plum.version : state.version + 1;\n\n this._notifyListeners(plum);\n\n return state.value;\n }\n\n get<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n const state = this._getState(plum);\n\n if (state.active) {\n // Return memoized value, the dependencies are keeping it up to date.\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n let dirty = false;\n\n if (isExternalPlum(plum)) {\n plum.compute(null as unknown as Getter); // external plums do not use 'get'\n dirty = state.version !== plum.version;\n } else if (state.dependencies.size > 0) {\n dirty = [...state.dependencies.entries()].some(([dep, prevVersion]) => {\n this.get(dep); // allowing dependencies to recompute if necessary.\n const depState = this._getState(dep);\n\n return depState.version !== prevVersion;\n });\n }\n\n if (!dirty) {\n // No need to recompute\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n return this._recompute(plum) as ExtractPlumValue<TPlum>;\n }\n\n set<T>(plum: WgslPlum<T> & WgslSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe(plum: WgslPlum, listener: Listener): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","export class TaskQueue<T> {\n private _queue: (() => Promise<void>)[] = [];\n private _pending = false;\n\n enqueue<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this._queue.push(async () => {\n try {\n resolve(await task());\n } catch (e) {\n reject(e);\n }\n });\n this._processQueue();\n });\n }\n\n private async _processQueue() {\n if (this._pending) {\n return;\n }\n this._pending = true;\n while (this._queue.length > 0) {\n const task = this._queue.shift();\n if (task) {\n await task();\n }\n }\n this._pending = false;\n }\n}\n"],"mappings":"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","names":["Callable","__publicField","callable_default","RandomNameRegistry","__publicField","item","name","label","StrictNameRegistry","assignedName","index","unusedName","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","__publicField","item","itemCtx","_a","instances","instance","slot","expectedValue","result","err","ResolutionError","slotToValueMap","usedSlot","_bindable","declaration","ResolutionCtxImpl","bindingGroup","_declaration","_identifier","MissingSlotValueError","eventual","slotValueOverrides","isResolvable","ScopedResolutionCtx","_ScopedResolutionCtx","_parent","_shared","_slotValuePairs","bindable","identifier","group","idx","code","token","slotToValuePair","boundSlot","maybeSlot","isSlot","usageToBindingTypeMap","ProgramBuilder","runtime","root","options","_a","ctx","ResolutionCtxImpl","RandomNameRegistry","codeString","usedBindables","bindGroupLayout","bindable","idx","bindGroup","bufferUsage","buffer","usage","WgslBufferUsageImpl","__publicField","label","ctx","identifier","WgslIdentifier","_a","buffer","typeSchema","initial","WgslBufferImpl","dataType","__publicField","label","enrichedThis","bufferUsage","flags","_a","constant","expr","WgslConstImpl","__publicField","label","ctx","identifier","WgslIdentifier","code","declare","strings","params","WgslDeclareImpl","code","_declaration","ctx","fn","strings","params","WgslFnImpl","code","body","__publicField","label","ctx","identifier","WgslIdentifier","slot","value","BoundWgslFnImpl","_a","_BoundWgslFnImpl","_innerFn","_slotValuePair","_b","fn","argTypes","returnType","argPairs","argType","WgslIdentifier","argValues","argIdent","bodyProducer","body","WgslFnImpl","WgslFunctionCall","usedFn","args","ctx","argsCode","argSegment","idx","comma","code","_a","callable_default","__publicField","label","identifier","ident","isPointer","WgslSettableTrait","WgslExternalPlumTrait","isExternalPlum","value","plum","initialOrCompute","WgslDerivedPlumImpl","WgslSourcePlumImpl","plumFromEvent","subscribe","getLatest","WgslExternalPlumImpl","isPlum","_a","_initial","__publicField","_get","label","WgslSettableTrait","_compute","get","_subscribe","_getLatest","listener","latest","slot","defaultValue","WgslSlotImpl","__publicField","label","a","b","ctx","_a","value","isWgsl","variable","dataType","initialValue","WgslVarImpl","_dataType","_initialValue","scope","__publicField","WgslIdentifier","label","ctx","code","wgsl_default","code","fn","buffer","plum","plumFromEvent","slot","constant","declare","variable","BufferReader","BufferWriter","roundUp","value","modulo","bitMask","invBitMask","PlumStore","__publicField","plum","state","value","dependencies","listeners","listener","getter","dep","depState","unsub","isExternalPlum","dirty","prevVersion","externalUnsub","unsubs","TaskQueue","__publicField","task","resolve","reject","e","TypeGpuRuntimeImpl","device","__publicField","TaskQueue","PlumStore","_a","unsub","buffer","allocatable","roundUp","writer","BufferWriter","isPlum","plum","commandEncoder","res","BufferReader","data","gpuBuffer","size","hostBuffer","value","listener","options","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","vertexProgram","ProgramBuilder","code","arg","fragmentProgram","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","args","workgroupSize","program","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","label","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers","descriptor","__objRest","passEncoder","__spreadProps","__spreadValues","group","index","i","workgroups","createRuntime","adapter"]}
|
1
|
+
{"version":3,"sources":["../src/tgpuBufferUtils.ts","../src/wgslBuffer.ts","../src/wgslBufferUsage.ts","../src/tgpu.ts","../src/data/vectorOps.ts","../src/std.ts","../src/index.ts"],"sourcesContent":["import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport { roundUp } from './mathUtils';\nimport type { AnyTgpuData } from './types';\nimport type { TgpuBuffer, Unmanaged } from './wgslBuffer';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n data: Parsed<TData>,\n): void {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n buffer.dataType.write(new BufferWriter(mapped), data);\n return;\n }\n\n const size = roundUp(buffer.dataType.size, buffer.dataType.byteAlignment);\n const hostBuffer = new ArrayBuffer(size);\n buffer.dataType.write(new BufferWriter(hostBuffer), data);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n): Promise<Parsed<TData>> {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n return res;\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: buffer.dataType.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer,\n 0,\n stagingBuffer,\n 0,\n buffer.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, buffer.dataType.size);\n\n const res = buffer.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n}\n","import { BufferWriter, type Parsed } from 'typed-binary';\nimport { SimpleTgpuData, TgpuArrayImpl } from './data';\nimport {\n type AnyTgpuData,\n type BufferUsage,\n type TgpuAllocatable,\n type TgpuNamable,\n isGPUBuffer,\n} from './types';\nimport { type TgpuBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { TgpuPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Unmanaged {\n readonly device: GPUDevice;\n readonly buffer: GPUBuffer;\n}\n\nexport interface AllowUniform {\n uniformAllowed: true;\n}\nexport interface AllowReadonly {\n readonlyAllowed: true;\n}\nexport interface AllowMutable {\n mutableAllowed: true;\n}\nexport interface AllowVertex {\n vertexAllowed: true;\n}\n\ntype AllowedUsages<TData extends AnyTgpuData> = {\n uniform: TgpuBufferUsage<TData, 'uniform'> | null;\n mutable: TgpuBufferUsage<TData, 'mutable'> | null;\n readonly: TgpuBufferUsage<TData, 'readonly'> | null;\n vertex: TgpuBufferUsage<TData, 'vertex'> | null;\n};\n\nexport interface TgpuBuffer<TData extends AnyTgpuData>\n extends TgpuAllocatable<TData>,\n TgpuNamable {\n $allowUniform(): this & AllowUniform;\n $allowReadonly(): this & AllowReadonly;\n $allowMutable(): this & AllowMutable;\n $allowVertex(stepMode: 'vertex' | 'instance'): this & AllowVertex;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this & Unmanaged;\n\n _usages: AllowedUsages<TData>;\n readonly label: string | undefined;\n}\n\nexport function buffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\nexport function buffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\nexport function buffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(typeSchema, initialOrBuffer);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n\n _usages: AllowedUsages<TData> = {\n uniform: null,\n mutable: null,\n readonly: null,\n vertex: null,\n };\n\n public vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'> | null = null;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initialOrBuffer?:\n | Parsed<TData>\n | TgpuPlum<Parsed<TData>>\n | GPUBuffer\n | undefined,\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._buffer = initialOrBuffer;\n } else {\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n if (!this._device) {\n throw new Error(\n 'To use this property, make the buffer unmanaged by passing a GPUDevice to $device',\n );\n }\n if (!this._buffer) {\n this._buffer = this._device.createBuffer({\n size: this.dataType.size,\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n });\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n this.dataType.write(writer, this.initial);\n this._buffer.unmap();\n }\n }\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer is managed by TypeGPU and cannot be used directly',\n );\n }\n return this._device;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $allowUniform() {\n this.$addFlags(GPUBufferUsage.UNIFORM);\n if (!this._usages.uniform) {\n this._usages.uniform = bufferUsage(this, 'uniform');\n }\n\n return this as this & AllowUniform;\n }\n\n $allowReadonly() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n if (!this._usages.readonly) {\n this._usages.readonly = bufferUsage(this, 'readonly');\n }\n\n return this as this & AllowReadonly;\n }\n\n $allowMutable() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n if (!this._usages.mutable) {\n this._usages.mutable = bufferUsage(this, 'mutable');\n }\n\n return this as this & AllowMutable;\n }\n\n $allowVertex(stepMode: 'vertex' | 'instance' = 'vertex') {\n this.$addFlags(GPUBufferUsage.VERTEX);\n\n if (!this.vertexLayout) {\n if (this.dataType instanceof SimpleTgpuData) {\n this.vertexLayout = {\n arrayStride: this.dataType.size,\n stepMode,\n };\n\n this._usages.vertex = bufferUsage(this, 'vertex');\n } else if (this.dataType instanceof TgpuArrayImpl) {\n this.vertexLayout = {\n arrayStride: this.dataType.elementType.size,\n stepMode,\n };\n\n this._usages.vertex = bufferUsage(this, 'vertex');\n } else {\n throw new Error('Only simple data types can be used as vertex buffers');\n }\n }\n\n if (this.vertexLayout.stepMode !== stepMode) {\n throw new Error('Cannot change step mode of a vertex buffer');\n }\n\n return this as this & AllowVertex;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n $device(device: GPUDevice) {\n this._device = device;\n return this;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n\nfunction capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nfunction asUsage<\n TUsage extends BufferUsage,\n TType extends AllowVertex | AllowUniform | AllowReadonly | AllowMutable,\n>(usage: TUsage, _: TType) {\n return <TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & TType,\n ): TgpuBufferUsage<TData, TUsage> => {\n if (buffer._usages[usage] === null) {\n throw new Error(\n `Cannot pass ${buffer} to as${capitalizeFirstLetter(usage)} function, as the buffer does not allow ${usage} usage. To allow it, use $allow${capitalizeFirstLetter(usage)} TgpuBuffer method.`,\n );\n }\n return buffer._usages[usage] as TgpuBufferUsage<TData, TUsage>;\n };\n}\n\nexport const asUniform = asUsage('uniform', {\n uniformAllowed: true,\n} as AllowUniform);\nexport const asReadonly = asUsage('readonly', {\n readonlyAllowed: true,\n} as AllowReadonly);\nexport const asMutable = asUsage('mutable', {\n mutableAllowed: true,\n} as AllowMutable);\nexport const asVertex = asUsage('vertex', {\n vertexAllowed: true,\n} as AllowVertex);\n","import type {\n AnyTgpuData,\n BufferUsage,\n ResolutionCtx,\n TgpuBindable,\n} from './types';\nimport type { TgpuBuffer } from './wgslBuffer';\nimport { TgpuIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUsage<\n TData extends AnyTgpuData,\n TUsage extends BufferUsage = BufferUsage,\n> extends TgpuBindable<TData, TUsage> {}\n\nexport function bufferUsage<\n TData extends AnyTgpuData,\n TUsage extends BufferUsage,\n>(buffer: TgpuBuffer<TData>, usage: TUsage): TgpuBufferUsage<TData, TUsage> {\n return new TgpuBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferUsageImpl<TData extends AnyTgpuData, TUsage extends BufferUsage>\n implements TgpuBufferUsage<TData, TUsage>\n{\n constructor(\n public readonly buffer: TgpuBuffer<TData>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this.buffer.label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new TgpuIdentifier().$name(this.label);\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 { read, write } from './tgpuBufferUtils';\nimport { buffer } from './wgslBuffer';\n\nexport const tgpu = {\n createBuffer: buffer,\n read,\n write,\n};\n","import {\n type VecKind,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n type vecBase,\n} from './vector';\n\nconst lengthVec2 = (v: vec2f | vec2i | vec2u) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: vec3f | vec3i | vec3u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: vec4f | vec4i | vec4u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nexport const VectorOps = {\n length: {\n vec2f: lengthVec2,\n vec2i: lengthVec2,\n vec2u: lengthVec2,\n vec3f: lengthVec3,\n vec3i: lengthVec3,\n vec3u: lengthVec3,\n vec4f: lengthVec4,\n vec4i: lengthVec4,\n vec4u: lengthVec4,\n } as Record<VecKind, (v: vecBase) => number>,\n\n add: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x + b.x, a.y + b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x + b.x, a.y + b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x + b.x, a.y + b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x + b.x, a.y + b.y, a.z + b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n sub: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x - b.x, a.y - b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x - b.x, a.y - b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x - b.x, a.y - b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x - b.x, a.y - b.y, a.z - b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n mul: {\n vec2f: (s: number, v: vec2f) => vec2f(s * v.x, s * v.y),\n vec2i: (s: number, v: vec2i) => vec2i(s * v.x, s * v.y),\n vec2u: (s: number, v: vec2u) => vec2u(s * v.x, s * v.y),\n\n vec3f: (s: number, v: vec3f) => vec3f(s * v.x, s * v.y, s * v.z),\n vec3i: (s: number, v: vec3i) => vec3i(s * v.x, s * v.y, s * v.z),\n vec3u: (s: number, v: vec3u) => vec3u(s * v.x, s * v.y, s * v.z),\n\n vec4f: (s: number, v: vec4f) => vec4f(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4i: (s: number, v: vec4i) => vec4i(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4u: (s: number, v: vec4u) => vec4u(s * v.x, s * v.y, s * v.z, s * v.w),\n } as Record<VecKind, <T extends vecBase>(s: number, v: T) => T>,\n\n dot: {\n vec2f: (lhs: vec2f, rhs: vec2f) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2i: (lhs: vec2i, rhs: vec2i) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2u: (lhs: vec2u, rhs: vec2u) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec3f: (lhs: vec3f, rhs: vec3f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3i: (lhs: vec3i, rhs: vec3i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3u: (lhs: vec3u, rhs: vec3u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec4f: (lhs: vec4f, rhs: vec4f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4i: (lhs: vec4i, rhs: vec4i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4u: (lhs: vec4u, rhs: vec4u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: vec2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2i: (v: vec2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: vec2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: vec3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: vec3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: vec3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: vec4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: vec4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: vec4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vecBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: vec3f, b: vec3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3i: (a: vec3i, b: vec3i) => {\n return vec3i(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3u: (a: vec3u, b: vec3u) => {\n return vec3u(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3i' | 'vec3u',\n <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T\n >,\n};\n","import type { vec3f, vec3i, vec3u, vecBase } from './data';\nimport { VectorOps } from './data/vectorOps';\n\nexport const std = {\n add: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.add[lhs.kind](lhs, rhs),\n sub: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.sub[lhs.kind](lhs, rhs),\n mul: <T extends vecBase>(s: number, v: T): T => VectorOps.mul[v.kind](s, v),\n dot: <T extends vecBase>(lhs: T, rhs: T): number =>\n VectorOps.dot[lhs.kind](lhs, rhs),\n normalize: <T extends vecBase>(v: T): T => VectorOps.normalize[v.kind](v),\n cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T): T =>\n VectorOps.cross[a.kind](a, b),\n fract: (a: number): number => a - Math.floor(a),\n length: <T extends vecBase>(vector: T): number =>\n VectorOps.length[vector.kind](vector),\n sin: Math.sin,\n cos: Math.cos,\n};\n","/**\n * @module typegpu\n */\n\nimport { tgpu } from './tgpu';\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n TexelFormat,\n} from './types';\nexport { std } from './std';\n\nexport type { TgpuBuffer } from './wgslBuffer';\n\nexport default tgpu;\n"],"mappings":"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","names":["BufferReader","BufferWriter","write","buffer","data","gpuBuffer","device","mapped","BufferWriter","size","roundUp","hostBuffer","read","BufferReader","res","stagingBuffer","commandEncoder","BufferWriter","bufferUsage","buffer","usage","TgpuBufferUsageImpl","ctx","identifier","TgpuIdentifier","_a","buffer","typeSchema","initialOrBuffer","TgpuBufferImpl","dataType","__publicField","isGPUBuffer","writer","BufferWriter","label","bufferUsage","stepMode","SimpleTgpuData","TgpuArrayImpl","flags","device","_a","capitalizeFirstLetter","string","asUsage","usage","_","asUniform","asReadonly","asMutable","asVertex","tgpu","buffer","read","write","lengthVec2","v","lengthVec3","lengthVec4","VectorOps","a","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","s","lhs","rhs","len","std","lhs","rhs","VectorOps","s","v","a","b","vector","src_default","tgpu"]}
|
package/macro/index.cjs
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkS55XYV7Ucjs = require('../chunk-S55XYV7U.cjs');function i(l,s){return _chunkS55XYV7Ucjs.d`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new (0, _chunkS55XYV7Ucjs.c)().$name("i");return typeof n=="function"?_chunkS55XYV7Ucjs.d`
|
2
2
|
for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
|
3
3
|
${n(e)}
|
4
|
-
}`:
|
4
|
+
}`:_chunkS55XYV7Ucjs.d`
|
5
5
|
for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
|
6
6
|
${n}
|
7
|
-
}`}return typeof n=="function"?
|
7
|
+
}`}return typeof n=="function"?_chunkS55XYV7Ucjs.d`${Array.from({length:r},(e,p)=>n(p))}`:_chunkS55XYV7Ucjs.d`${Array.from({length:r},()=>n)}`}}`}exports.repeat = i;
|
8
8
|
//# sourceMappingURL=index.cjs.map
|
package/macro/index.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/macro/repeat.ts"],"names":["repeat","count","snippet","code","get","countValue","snippetValue","index","
|
1
|
+
{"version":3,"sources":["../../src/macro/repeat.ts"],"names":["repeat","count","snippet","code","get","countValue","snippetValue","index","TgpuIdentifier","_","idx"],"mappings":"iDAcO,SAASA,EACdC,EACAC,EACM,CACN,OAAOC,IAAQC,GAAQ,CACrB,IAAMC,EAAaD,EAAIH,CAAK,EACtBK,EAAeF,EAAIF,CAAO,EAEhC,GAAI,OAAOG,GAAe,SAAU,CAClC,IAAME,EAAQ,IAAIC,EAAe,EAAE,MAAM,GAAG,EAE5C,OAAI,OAAOF,GAAiB,WACnBH;AAAA,qBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,cACpDD,EAAaC,CAA0B,CAA0C;AAAA,aAIlFJ;AAAA,mBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,YACpDD,CAAY;AAAA,UAEpB,CAEA,OAAI,OAAOA,GAAiB,WACnBH,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,CAACI,EAAGC,IAAQJ,EAAaI,CAAG,CAAC,CAAC,GAG1EP,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,IAAMC,CAAY,CAAC,EACtE,CAAC,EACH","sourcesContent":["import type { Eventual, Wgsl } from '../types';\nimport { code } from '../wgslCode';\nimport { TgpuIdentifier } from '../wgslIdentifier';\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<number>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl) | ((idx: Wgsl) => Wgsl)>,\n): Wgsl {\n return code`${(get) => {\n const countValue = get(count);\n const snippetValue = get(snippet);\n\n if (typeof countValue !== 'number') {\n const index = new TgpuIdentifier().$name('i');\n\n if (typeof snippetValue === 'function') {\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue(index as unknown as number) /* silencing TypeScript with the cast */}\n }`;\n }\n\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue}\n }`;\n }\n\n if (typeof snippetValue === 'function') {\n return code`${Array.from({ length: countValue }, (_, idx) => snippetValue(idx))}`;\n }\n\n return code`${Array.from({ length: countValue }, () => snippetValue)}`;\n }}`;\n}\n"]}
|
package/macro/index.d.cts
CHANGED
package/macro/index.d.ts
CHANGED
package/macro/index.js
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
import{
|
1
|
+
import{c as u,d as t}from"../chunk-337KOXP7.js";function i(l,s){return t`${o=>{let r=o(l),n=o(s);if(typeof r!="number"){let e=new u().$name("i");return typeof n=="function"?t`
|
2
2
|
for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
|
3
3
|
${n(e)}
|
4
4
|
}`:t`
|
5
5
|
for (var ${e} = 0; ${e} < ${r}; ${e} += 1) {
|
6
6
|
${n}
|
7
|
-
}`}return typeof n=="function"?t`${Array.from({length:r},(e,
|
7
|
+
}`}return typeof n=="function"?t`${Array.from({length:r},(e,p)=>n(p))}`:t`${Array.from({length:r},()=>n)}`}}`}export{i as repeat};
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/macro/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/macro/repeat.ts"],"sourcesContent":["import type { Eventual, Wgsl } from '../types';\nimport { code } from '../wgslCode';\nimport {
|
1
|
+
{"version":3,"sources":["../../src/macro/repeat.ts"],"sourcesContent":["import type { Eventual, Wgsl } from '../types';\nimport { code } from '../wgslCode';\nimport { TgpuIdentifier } from '../wgslIdentifier';\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: Wgsl) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<number>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl)>,\n): Wgsl;\n\nexport function repeat(\n count: Eventual<Wgsl>,\n snippet: Eventual<Wgsl | ((idx: number) => Wgsl) | ((idx: Wgsl) => Wgsl)>,\n): Wgsl {\n return code`${(get) => {\n const countValue = get(count);\n const snippetValue = get(snippet);\n\n if (typeof countValue !== 'number') {\n const index = new TgpuIdentifier().$name('i');\n\n if (typeof snippetValue === 'function') {\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue(index as unknown as number) /* silencing TypeScript with the cast */}\n }`;\n }\n\n return code`\n for (var ${index} = 0; ${index} < ${countValue}; ${index} += 1) {\n ${snippetValue}\n }`;\n }\n\n if (typeof snippetValue === 'function') {\n return code`${Array.from({ length: countValue }, (_, idx) => snippetValue(idx))}`;\n }\n\n return code`${Array.from({ length: countValue }, () => snippetValue)}`;\n }}`;\n}\n"],"mappings":"gDAcO,SAASA,EACdC,EACAC,EACM,CACN,OAAOC,IAAQC,GAAQ,CACrB,IAAMC,EAAaD,EAAIH,CAAK,EACtBK,EAAeF,EAAIF,CAAO,EAEhC,GAAI,OAAOG,GAAe,SAAU,CAClC,IAAME,EAAQ,IAAIC,EAAe,EAAE,MAAM,GAAG,EAE5C,OAAI,OAAOF,GAAiB,WACnBH;AAAA,qBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,cACpDD,EAAaC,CAA0B,CAA0C;AAAA,aAIlFJ;AAAA,mBACMI,CAAK,SAASA,CAAK,MAAMF,CAAU,KAAKE,CAAK;AAAA,YACpDD,CAAY;AAAA,UAEpB,CAEA,OAAI,OAAOA,GAAiB,WACnBH,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,CAACI,EAAGC,IAAQJ,EAAaI,CAAG,CAAC,CAAC,GAG1EP,IAAO,MAAM,KAAK,CAAE,OAAQE,CAAW,EAAG,IAAMC,CAAY,CAAC,EACtE,CAAC,EACH","names":["repeat","count","snippet","code","get","countValue","snippetValue","index","TgpuIdentifier","_","idx"]}
|
package/package.json
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "typegpu",
|
3
|
-
"
|
3
|
+
"private": false,
|
4
|
+
"version": "0.0.0-alpha.5",
|
4
5
|
"description": "A thin layer between JS and WebGPU/WGSL that improves development experience and allows for faster iteration.",
|
5
6
|
"license": "MIT",
|
6
7
|
"type": "module",
|
@@ -31,11 +32,14 @@
|
|
31
32
|
"module": "./macro/index.js",
|
32
33
|
"import": "./macro/index.js",
|
33
34
|
"default": "./macro/index.cjs"
|
35
|
+
},
|
36
|
+
"./experimental": {
|
37
|
+
"types": "./experimental/index.d.ts",
|
38
|
+
"module": "./experimental/index.js",
|
39
|
+
"import": "./experimental/index.js",
|
40
|
+
"default": "./experimental/index.cjs"
|
34
41
|
}
|
35
42
|
},
|
36
|
-
"files": [
|
37
|
-
"**"
|
38
|
-
],
|
39
43
|
"sideEffects": false,
|
40
44
|
"engines": {
|
41
45
|
"node": ">=12.20.0"
|
@@ -57,20 +61,17 @@
|
|
57
61
|
"bugs": {
|
58
62
|
"url": "https://github.com/software-mansion/typegpu/issues"
|
59
63
|
},
|
60
|
-
"homepage": "https://
|
64
|
+
"homepage": "https://docs.swmansion.com/typegpu",
|
61
65
|
"devDependencies": {
|
66
|
+
"@webgpu/types": "^0.1.43",
|
67
|
+
"remeda": "^2.3.0",
|
62
68
|
"tsup": "^8.0.2",
|
63
|
-
"
|
64
|
-
"
|
65
|
-
"@webgpu/types": "^0.1.43"
|
69
|
+
"tsx": "^4.16.2",
|
70
|
+
"typescript": "^5.3.3"
|
66
71
|
},
|
67
72
|
"packageManager": "pnpm@8.15.8+sha256.691fe176eea9a8a80df20e4976f3dfb44a04841ceb885638fe2a26174f81e65e",
|
68
|
-
"
|
73
|
+
"dependencies": {
|
69
74
|
"typed-binary": "^4.0.1"
|
70
75
|
},
|
71
|
-
"scripts": {
|
72
|
-
"dev": "tsup --watch",
|
73
|
-
"build": "tsup",
|
74
|
-
"test:types": "pnpm tsc --p ./tsconfig.json --noEmit && pnpm tsc --p ./tsconfig.test.json --noEmit"
|
75
|
-
}
|
76
|
+
"scripts": {}
|
76
77
|
}
|
@@ -0,0 +1,207 @@
|
|
1
|
+
import { ISchema, Parsed } from 'typed-binary';
|
2
|
+
|
3
|
+
interface Swizzle2<T2> {
|
4
|
+
readonly xx: T2;
|
5
|
+
readonly xy: T2;
|
6
|
+
readonly yx: T2;
|
7
|
+
readonly yy: T2;
|
8
|
+
}
|
9
|
+
interface Swizzle3<T2, T3> extends Swizzle2<T2> {
|
10
|
+
}
|
11
|
+
interface Swizzle4<T2, T3, T4> extends Swizzle3<T2, T3> {
|
12
|
+
}
|
13
|
+
interface vec2 {
|
14
|
+
x: number;
|
15
|
+
y: number;
|
16
|
+
length: 2;
|
17
|
+
at(idx: 0 | 1): number;
|
18
|
+
}
|
19
|
+
interface vec3 {
|
20
|
+
x: number;
|
21
|
+
y: number;
|
22
|
+
z: number;
|
23
|
+
length: 3;
|
24
|
+
at(idx: 0 | 1 | 2): number;
|
25
|
+
}
|
26
|
+
interface vec4 {
|
27
|
+
x: number;
|
28
|
+
y: number;
|
29
|
+
z: number;
|
30
|
+
w: number;
|
31
|
+
length: 4;
|
32
|
+
at(idx: 0 | 1 | 2 | 3): number;
|
33
|
+
}
|
34
|
+
type VecKind = 'vec2f' | 'vec2i' | 'vec2u' | 'vec3f' | 'vec3i' | 'vec3u' | 'vec4f' | 'vec4i' | 'vec4u';
|
35
|
+
interface vecBase {
|
36
|
+
kind: VecKind;
|
37
|
+
length: number;
|
38
|
+
at(idx: number): number;
|
39
|
+
}
|
40
|
+
type Vec2f = TgpuData<vec2f> & ((x: number, y: number) => vec2f) & ((xy: number) => vec2f) & (() => vec2f);
|
41
|
+
interface vec2f extends vec2, Swizzle2<vec2f> {
|
42
|
+
/** use to distinguish between vectors of the same size on the type level */
|
43
|
+
kind: 'vec2f';
|
44
|
+
}
|
45
|
+
declare const vec2f: Vec2f;
|
46
|
+
type Vec2i = TgpuData<vec2i> & ((x: number, y: number) => vec2i) & ((xy: number) => vec2i) & (() => vec2i);
|
47
|
+
interface vec2i extends vec2, Swizzle2<vec2i> {
|
48
|
+
/** use to distinguish between vectors of the same size on the type level */
|
49
|
+
kind: 'vec2i';
|
50
|
+
}
|
51
|
+
declare const vec2i: Vec2i;
|
52
|
+
type Vec2u = TgpuData<vec2u> & ((x: number, y: number) => vec2u) & ((xy: number) => vec2u) & (() => vec2u);
|
53
|
+
interface vec2u extends vec2, Swizzle2<vec2u> {
|
54
|
+
/** use to distinguish between vectors of the same size on the type level */
|
55
|
+
kind: 'vec2u';
|
56
|
+
}
|
57
|
+
declare const vec2u: Vec2u;
|
58
|
+
type Vec3f = TgpuData<vec3f> & ((x: number, y: number, z: number) => vec3f) & ((xyz: number) => vec3f) & (() => vec3f);
|
59
|
+
interface vec3f extends vec3, Swizzle3<vec2f, vec3f> {
|
60
|
+
/** use to distinguish between vectors of the same size on the type level */
|
61
|
+
kind: 'vec3f';
|
62
|
+
}
|
63
|
+
declare const vec3f: Vec3f;
|
64
|
+
type Vec3i = TgpuData<vec3i> & ((x: number, y: number, z: number) => vec3i) & ((xyz: number) => vec3i) & (() => vec3i);
|
65
|
+
interface vec3i extends vec3, Swizzle3<vec2i, vec3i> {
|
66
|
+
/** use to distinguish between vectors of the same size on the type level */
|
67
|
+
kind: 'vec3i';
|
68
|
+
}
|
69
|
+
declare const vec3i: Vec3i;
|
70
|
+
type Vec3u = TgpuData<vec3u> & ((x: number, y: number, z: number) => vec3u) & ((xyz: number) => vec3u) & (() => vec3u);
|
71
|
+
interface vec3u extends vec3, Swizzle3<vec2u, vec3u> {
|
72
|
+
/** use to distinguish between vectors of the same size on the type level */
|
73
|
+
kind: 'vec3u';
|
74
|
+
}
|
75
|
+
declare const vec3u: Vec3u;
|
76
|
+
type Vec4f = TgpuData<vec4f> & ((x: number, y: number, z: number, w: number) => vec4f) & ((xyzw: number) => vec4f) & (() => vec4f);
|
77
|
+
interface vec4f extends vec4, Swizzle4<vec2f, vec3f, vec4f> {
|
78
|
+
/** use to distinguish between vectors of the same size on the type level */
|
79
|
+
kind: 'vec4f';
|
80
|
+
}
|
81
|
+
declare const vec4f: Vec4f;
|
82
|
+
type Vec4i = TgpuData<vec4i> & ((x: number, y: number, z: number, w: number) => vec4i) & ((xyzw: number) => vec4i) & (() => vec4i);
|
83
|
+
interface vec4i extends vec4, Swizzle4<vec2i, vec3i, vec4i> {
|
84
|
+
/** use to distinguish between vectors of the same size on the type level */
|
85
|
+
kind: 'vec4i';
|
86
|
+
}
|
87
|
+
declare const vec4i: Vec4i;
|
88
|
+
type Vec4u = TgpuData<vec4u> & ((x: number, y: number, z: number, w: number) => vec4u) & ((xyzw: number) => vec4u) & (() => vec4u);
|
89
|
+
interface vec4u extends vec4, Swizzle4<vec2u, vec3u, vec4u> {
|
90
|
+
/** use to distinguish between vectors of the same size on the type level */
|
91
|
+
kind: 'vec4u';
|
92
|
+
}
|
93
|
+
declare const vec4u: Vec4u;
|
94
|
+
|
95
|
+
/**
|
96
|
+
* Helpful when creating new Resolvable types. For internal use.
|
97
|
+
*/
|
98
|
+
declare class TgpuIdentifier implements TgpuResolvable, TgpuNamable {
|
99
|
+
label?: string | undefined;
|
100
|
+
$name(label: string | undefined): this;
|
101
|
+
resolve(ctx: ResolutionCtx): string;
|
102
|
+
toString(): string;
|
103
|
+
}
|
104
|
+
|
105
|
+
interface Builtin {
|
106
|
+
symbol: symbol;
|
107
|
+
name: string;
|
108
|
+
stage: 'vertex' | 'fragment' | 'compute';
|
109
|
+
direction: 'input' | 'output';
|
110
|
+
identifier: TgpuIdentifier;
|
111
|
+
}
|
112
|
+
|
113
|
+
type Getter = <T>(plum: TgpuPlum<T>) => T;
|
114
|
+
interface TgpuPlum<TValue = unknown> extends TgpuNamable {
|
115
|
+
readonly __brand: 'TgpuPlum';
|
116
|
+
/**
|
117
|
+
* Computes the value of this plum. Circumvents the store
|
118
|
+
* memoization, so use with care.
|
119
|
+
*/
|
120
|
+
compute(get: Getter): TValue;
|
121
|
+
}
|
122
|
+
|
123
|
+
type Wgsl = string | number | TgpuResolvable | symbol | boolean;
|
124
|
+
/**
|
125
|
+
* Passed into each resolvable item. All sibling items share a resolution ctx,
|
126
|
+
* and a new resolution ctx is made when going down each level in the tree.
|
127
|
+
*/
|
128
|
+
interface ResolutionCtx {
|
129
|
+
/**
|
130
|
+
* Slots that were used by items resolved by this context.
|
131
|
+
*/
|
132
|
+
readonly usedSlots: Iterable<TgpuSlot<unknown>>;
|
133
|
+
addDeclaration(item: TgpuResolvable): void;
|
134
|
+
addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void;
|
135
|
+
addRenderResource(resource: TgpuRenderResource, identifier: TgpuIdentifier): void;
|
136
|
+
addBuiltin(builtin: Builtin): void;
|
137
|
+
nameFor(token: TgpuResolvable): string;
|
138
|
+
/**
|
139
|
+
* Unwraps all layers of slot indirection and returns the concrete value if available.
|
140
|
+
* @throws {MissingSlotValueError}
|
141
|
+
*/
|
142
|
+
unwrap<T>(eventual: Eventual<T>): T;
|
143
|
+
resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
|
144
|
+
}
|
145
|
+
interface TgpuResolvable {
|
146
|
+
readonly label?: string | undefined;
|
147
|
+
resolve(ctx: ResolutionCtx): string;
|
148
|
+
}
|
149
|
+
/**
|
150
|
+
* Can be assigned a name. Not to be confused with
|
151
|
+
* being able to HAVE a name.
|
152
|
+
*/
|
153
|
+
interface TgpuNamable {
|
154
|
+
$name(label?: string | undefined): this;
|
155
|
+
}
|
156
|
+
interface TgpuSlot<T> extends TgpuNamable {
|
157
|
+
readonly __brand: 'TgpuSlot';
|
158
|
+
readonly defaultValue: T | undefined;
|
159
|
+
readonly label?: string | undefined;
|
160
|
+
/**
|
161
|
+
* Used to determine if code generated using either value `a` or `b` in place
|
162
|
+
* of the slot will be equivalent. Defaults to `Object.is`.
|
163
|
+
*/
|
164
|
+
areEqual(a: T, b: T): boolean;
|
165
|
+
}
|
166
|
+
/**
|
167
|
+
* Represents a value that is available at resolution time.
|
168
|
+
*/
|
169
|
+
type Eventual<T> = T | TgpuSlot<T>;
|
170
|
+
type SlotValuePair<T> = [TgpuSlot<T>, T];
|
171
|
+
interface TgpuAllocatable<TData extends AnyTgpuData = AnyTgpuData> {
|
172
|
+
/**
|
173
|
+
* The data type this allocatable was constructed with.
|
174
|
+
* It informs the size and format of data in both JS and
|
175
|
+
* binary.
|
176
|
+
*/
|
177
|
+
readonly dataType: TData;
|
178
|
+
vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'> | null;
|
179
|
+
readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;
|
180
|
+
readonly flags: GPUBufferUsageFlags;
|
181
|
+
}
|
182
|
+
interface TgpuBindable<TData extends AnyTgpuData = AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuResolvable {
|
183
|
+
readonly allocatable: TgpuAllocatable<TData>;
|
184
|
+
readonly usage: TUsage;
|
185
|
+
}
|
186
|
+
type TgpuSamplerType = 'sampler' | 'sampler_comparison';
|
187
|
+
type TgpuTypedTextureType = 'texture_1d' | 'texture_2d' | 'texture_2d_array' | 'texture_3d' | 'texture_cube' | 'texture_cube_array' | 'texture_multisampled_2d';
|
188
|
+
type TgpuDepthTextureType = 'texture_depth_2d' | 'texture_depth_2d_array' | 'texture_depth_cube' | 'texture_depth_cube_array' | 'texture_depth_multisampled_2d';
|
189
|
+
type TgpuStorageTextureType = 'texture_storage_1d' | 'texture_storage_2d' | 'texture_storage_2d_array' | 'texture_storage_3d';
|
190
|
+
type TgpuExternalTextureType = 'texture_external';
|
191
|
+
type TgpuRenderResourceType = TgpuSamplerType | TgpuTypedTextureType | TgpuDepthTextureType | TgpuStorageTextureType | TgpuExternalTextureType;
|
192
|
+
interface TgpuRenderResource extends TgpuResolvable {
|
193
|
+
readonly type: TgpuRenderResourceType;
|
194
|
+
}
|
195
|
+
type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';
|
196
|
+
interface TgpuData<TInner> extends ISchema<TInner>, TgpuResolvable {
|
197
|
+
readonly byteAlignment: number;
|
198
|
+
readonly size: number;
|
199
|
+
}
|
200
|
+
type AnyTgpuData = TgpuData<unknown>;
|
201
|
+
type TexelFormat = Vec4u | Vec4i | Vec4f;
|
202
|
+
interface TgpuPointer<TScope extends 'function', TInner extends AnyTgpuData> {
|
203
|
+
readonly scope: TScope;
|
204
|
+
readonly pointsTo: TInner;
|
205
|
+
}
|
206
|
+
|
207
|
+
export { type AnyTgpuData as A, type BufferUsage as B, type Eventual as E, type ResolutionCtx as R, type TgpuBindable as T, type VecKind as V, type Wgsl as W, type TgpuAllocatable as a, type TgpuNamable as b, type TgpuPlum as c, vec3f as d, vec3i as e, vec3u as f, type TgpuData as g, type TexelFormat as h, type TgpuPointer as i, vec2f as j, vec2i as k, vec2u as l, vec4f as m, vec4i as n, vec4u as o, type Vec2f as p, type Vec2i as q, type Vec2u as r, type Vec3f as s, type Vec3i as t, type Vec3u as u, type vecBase as v, type Vec4f as w, type Vec4i as x, type Vec4u as y };
|