typegpu 0.2.0-alpha.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/memo.ts","../src/tgpuPlumTypes.ts","../src/plumStore.ts","../src/core/root/rootTypes.ts","../src/tgpuSampler.ts","../src/tgpuTexture.ts","../src/bindGroupResolver.ts","../src/builtin.ts","../src/builtinDataTypes.ts","../src/nameRegistry.ts","../src/smol/wgslGenerator.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/core/buffer/buffer.ts","../src/core/buffer/bufferUsage.ts","../src/tgpuBindGroupLayout.ts","../src/core/root/init.ts","../src/legacyBufferApi.ts","../src/tgpuBufferUtils.ts","../src/data/vectorOps.ts","../src/std.ts","../src/index.ts"],"names":["WeakMemo","_make","__publicField","key","args","value","TgpuExternalPlumTrait","isExternalPlum","isPlum","PlumStore","plum","state","dependencies","listeners","listener","getter","dep","depState","unsub","dirty","prevVersion","externalUnsub","unsubs","typeToVertexFormatMap","deriveVertexFormat","typeSchema","code","format","isSampler","resource","isExternalTexture","texture","isTextureView","usageToBindingTypeMap","BindGroupResolver","root","context","shaderStage","renderResources","vertexBuffers","index","buffer","entries","textureView","external","sampler","layout","bindGroup","vertexBufferDescriptors","idx","__spreadProps","__spreadValues","_a","TgpuBuiltinImpl","name","builtinNameToSymbol","ctx","builtin","builtinToType","u32","vec4f","arrayOf","f32","vec3u","typeForBuiltin","dataType","RandomNameRegistry","item","label","resolveRes","res","isWgsl","assertExhaustive","generateBoolean","bool","generateBlock","statement","generateStatement","generateIdentifier","id","generateExpression","expression","lhs","op","rhs","lhsExpr","rhsExpr","UnknownData","targetId","property","target","propertyStr","isResolvable","targetStr","idValue","argValues","arg","condition","consequent","alternate","eq","generateFunction","body","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","jitTranspiler","bindable","nextIdx","declaration","ItemStateStack","pairs","returnType","externalMap","layer","slot","i","boundValue","a","declarationType","INDENT","N","IndentController","str","ResolutionCtxImpl","opts","fn","shell","argNames","argList","identifier","group","isSamplerType","isExternalTextureType","isDepthTextureType","MissingSlotValueError","eventual","maybeSlot","isSlot","instances","instance","expectedValue","result","slotToValueMap","usedSlot","err","ResolutionError","slotValueOverrides","pushedLayer","onGPU","ProgramBuilder","rootNode","options","codeString","getUsedBuiltinsNamed","rec","builtinSymbol","builtinSymbolToName","RenderProgramBuilder","vertexRoot","fragmentRoot","vertexOutputFormat","_b","_c","_d","symbolOutputs","symbol","vertexOutputBuiltinObjects","vertexOutput","varInfo","structFields","outputName","nameForBuiltin","vertexContext","elem","vertexUserArgs","entry","vertexArgs","idForBuiltin","vertexCode","fragmentContext","fragmentBuiltinArgs","fragmentInputs","fragmentArgs","fragmentCode","vertexProgram","fragmentProgram","ComputeProgramBuilder","computeRoot","workgroupSize","builtinArgs","workgroupSizeDeclaration","shaderCode","BufferReader","BufferWriter","createBufferImpl","initialOrBuffer","TgpuBufferImpl","isBuffer","isUsableAsUniform","isUsableAsStorage","isUsableAsVertex","_group","isGPUBuffer","writer","usages","usage","flags","device","dataOrBuffer","gpuBuffer","mapped","size","sourceBuffer","commandEncoder","hostBuffer","stagingBuffer","isBufferUsage","bindGroupLayout","TgpuBindGroupLayoutImpl","isBindGroupLayout","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","unwrapper","visibility","binding","access","v","TgpuBindGroupImpl","NotUniformError","TgpuRootImpl","view","source","descriptor","gpuSampler","compute","_e","_f","_g","_h","_i","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","program","shaderModule","computePipeline","ComputePipelineExecutor","pipeline","externalLayoutCount","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","__objRest","passEncoder","programs","workgroups","init","adapter","initFromDevice","createBuffer","write","data","read","lengthVec2","lengthVec3","lengthVec4","VectorOps","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec4i","vec4u","s","len","std","inGPUMode","vector","radians","tgpu","src_default"],"mappings":"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","sourcesContent":["/**\n * Caches results of the function passed in as\n * the argument to the constructor.\n *\n * If the key can be garbage collected, it will be.\n */\nexport class WeakMemo<TKey extends object, TValue, TArgs extends unknown[]> {\n private readonly _map = new WeakMap<TKey, TValue>();\n\n constructor(private readonly _make: (key: TKey, ...args: TArgs) => TValue) {}\n\n getOrMake(key: TKey, ...args: TArgs): TValue {\n if (this._map.has(key)) {\n return this._map.get(key) as TValue;\n }\n\n const value = this._make(key, ...args);\n this._map.set(key, value);\n return value;\n }\n}\n","import type { TgpuNamable } from './namable';\n\nexport type Getter = <T>(plum: TgpuPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends TgpuPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface TgpuPlum<TValue = unknown> extends TgpuNamable {\n readonly __brand: 'TgpuPlum';\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 TgpuExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the root.`,\n);\n\nexport interface TgpuExternalPlum {\n readonly [TgpuExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | TgpuExternalPlum,\n): value is TgpuExternalPlum {\n return (value as TgpuExternalPlum)[TgpuExternalPlumTrait] === true;\n}\n\nexport function isPlum<T>(value: TgpuPlum<T> | unknown): value is TgpuPlum<T> {\n return (value as TgpuPlum).__brand === 'TgpuPlum';\n}\n","import type { TgpuSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type TgpuPlum,\n isExternalPlum,\n} from './tgpuPlumTypes';\n\nexport type PlumListener<T> = (newValue: T) => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<TgpuPlum, number>;\n active?: PlumActiveState<T> | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState<T> = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<PlumListener<T>>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<TgpuPlum, 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: TgpuPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: TgpuPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n } as PlumState<T>;\n\n this._stateMap.set(plum, state as PlumState);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: TgpuPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener(state.value);\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: TgpuPlum<T>) {\n const dependencies = new Map<TgpuPlum, number>();\n\n const getter = (<T>(dep: TgpuPlum<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: TgpuPlum<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 TgpuPlum>(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: TgpuPlum<T> & TgpuSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe<T>(plum: TgpuPlum<T>, listener: PlumListener<T>): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","import type { Parsed } from 'typed-binary';\n\nimport type { TgpuArray } from '../../data';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport type { PlumListener } from '../../plumStore';\nimport type { TgpuSettable } from '../../settableTrait';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport type {\n ExtractPlumValue,\n TgpuPlum,\n Unsubscribe,\n} from '../../tgpuPlumTypes';\nimport type { TgpuSampler } from '../../tgpuSampler';\nimport type {\n TgpuAnyTexture,\n TgpuAnyTextureView,\n TgpuTextureExternal,\n} from '../../tgpuTexture';\nimport type {\n AnyTgpuData,\n BoundTgpuCode,\n TgpuCode,\n TgpuData,\n} from '../../types';\nimport type { Unwrapper } from '../../unwrapper';\nimport type { TgpuBuffer } from '../buffer/buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport type SetPlumAction<T> = T | ((prev: T) => T);\n\nexport interface TgpuRoot extends Unwrapper {\n /**\n * The GPU device associated with this root.\n */\n readonly device: GPUDevice;\n\n /**\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n ): TgpuBuffer<TData>;\n\n /**\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n ): TgpuBuffer<TData>;\n\n unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;\n unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;\n unwrap(resource: TgpuBindGroup): GPUBindGroup;\n\n destroy(): void;\n}\n\nexport interface ExperimentalTgpuRoot extends TgpuRoot {\n readonly jitTranspiler?: JitTranspiler | undefined;\n /**\n * The current command encoder. This property will\n * hold the same value until `flush()` is called.\n */\n readonly commandEncoder: GPUCommandEncoder;\n\n readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum>;\n\n setPlum<TPlum extends TgpuPlum & TgpuSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ): void;\n\n onPlumChange<TValue>(\n plum: TgpuPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe;\n\n setSource(\n texture: TgpuTextureExternal,\n source: HTMLVideoElement | VideoFrame,\n ): void;\n\n isDirty(texture: TgpuTextureExternal): boolean;\n markClean(texture: TgpuTextureExternal): void;\n\n textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture;\n viewFor(view: TgpuAnyTextureView): GPUTextureView;\n externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture;\n samplerFor(sampler: TgpuSampler): GPUSampler;\n\n /**\n * Causes all commands enqueued by pipelines to be\n * submitted to the GPU.\n */\n flush(): void;\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;\n makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;\n}\n\nexport interface RenderPipelineOptions {\n vertex: {\n code: TgpuCode | BoundTgpuCode;\n output: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyTgpuData;\n };\n };\n fragment: {\n code: TgpuCode | BoundTgpuCode;\n target: Iterable<GPUColorTargetState | null>;\n };\n primitive: GPUPrimitiveState;\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport interface ComputePipelineOptions {\n code: TgpuCode | BoundTgpuCode;\n workgroupSize?: readonly [number, number?, number?];\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {\n vertexCount: number;\n instanceCount?: number;\n firstVertex?: number;\n firstInstance?: number;\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface RenderPipelineExecutor {\n execute(options: RenderPipelineExecutorOptions): void;\n}\n\nexport type ComputePipelineExecutorOptions = {\n workgroups?: readonly [number, number?, number?];\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface ComputePipelineExecutor {\n execute(options?: ComputePipelineExecutorOptions): void;\n}\n\nconst typeToVertexFormatMap: Record<string, GPUVertexFormat> = {\n f32: 'float32',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n u32: 'uint32',\n vec2u: 'uint32x2',\n vec3u: 'uint32x3',\n vec4u: 'uint32x4',\n i32: 'sint32',\n vec2i: 'sint32x2',\n vec3i: 'sint32x3',\n vec4i: 'sint32x4',\n};\n\nexport function deriveVertexFormat<\n TData extends TgpuData<AnyTgpuData> | TgpuArray<AnyTgpuData>,\n>(typeSchema: TData): GPUVertexFormat {\n if ('expressionCode' in typeSchema) {\n const code = typeSchema.expressionCode as string;\n const format = typeToVertexFormatMap[code];\n if (!format) {\n throw new Error(`Unsupported vertex format: ${code}`);\n }\n return format;\n }\n if ('elementType' in typeSchema) {\n return deriveVertexFormat(typeSchema.elementType as TData);\n }\n throw new Error('Invalid vertex format schema');\n}\n","import type { TgpuNamable } from './namable';\nimport { identifier } from './tgpuIdentifier';\nimport type {\n ResolutionCtx,\n TgpuRenderResource,\n TgpuSamplerType,\n} from './types';\n\nexport interface TgpuSampler extends TgpuRenderResource, TgpuNamable {\n readonly descriptor: GPUSamplerDescriptor;\n}\n\nexport function sampler(descriptor: GPUSamplerDescriptor): TgpuSampler {\n return new TgpuSamplerImpl(descriptor);\n}\n\nclass TgpuSamplerImpl implements TgpuSampler {\n private _label: string | undefined;\n private _type: TgpuSamplerType;\n\n constructor(public readonly descriptor: GPUSamplerDescriptor) {\n if (descriptor.compare === undefined) this._type = 'sampler';\n else this._type = 'sampler_comparison';\n }\n\n get label() {\n return this._label;\n }\n\n get type() {\n return this._type;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nexport function isSampler(\n resource: TgpuRenderResource,\n): resource is TgpuSampler {\n return resource.type === 'sampler' || resource.type === 'sampler_comparison';\n}\n","import { vec4f, vec4i, vec4u } from './data';\nimport type { TgpuNamable } from './namable';\nimport type {\n SampledTextureParams,\n StorageTextureAccess,\n StorageTextureParams,\n TexelFormat,\n TextureScalarFormat,\n} from './textureTypes';\nimport { identifier } from './tgpuIdentifier';\nimport { isSampler } from './tgpuSampler';\nimport type {\n ResolutionCtx,\n TextureUsage,\n TgpuRenderResource,\n TgpuRenderResourceType,\n} from './types';\n\ntype Optional<T> = {\n [P in keyof T]?: T[P] | undefined;\n};\n\nexport interface TgpuAnyTextureView extends TgpuRenderResource {\n readonly descriptor: GPUTextureViewDescriptor;\n readonly texture: TgpuAnyTexture;\n readonly dataType: TextureScalarFormat | TexelFormat;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface TgpuAnyTexture {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get flags(): GPUTextureUsageFlags;\n}\n\nexport interface TgpuTexture<TAllows extends TextureUsage = never>\n extends TgpuNamable {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get label(): string | undefined;\n get flags(): GPUTextureUsageFlags;\n\n $allowSampled(): TgpuTexture<TAllows | 'sampled'>;\n $allowStorage(): TgpuTexture<TAllows | 'storage'>;\n\n asStorage(\n params: StorageTextureParams,\n ): 'storage' extends TAllows ? TgpuTextureView<TexelFormat, 'storage'> : null;\n asSampled(\n params: SampledTextureParams,\n ): 'sampled' extends TAllows\n ? TgpuTextureView<typeof params.dataType, 'sampled'>\n : null;\n}\n\nexport interface TgpuTextureView<\n TData extends TextureScalarFormat | TexelFormat,\n TUsage extends TextureUsage,\n> extends TgpuRenderResource,\n TgpuNamable {\n readonly texture: TgpuTexture<TUsage>;\n readonly descriptor: Omit<GPUTextureViewDescriptor, 'usage'>;\n readonly type: TgpuRenderResourceType;\n readonly dataType: TData;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface TgpuTextureExternal extends TgpuRenderResource, TgpuNamable {\n readonly descriptor: Optional<GPUExternalTextureDescriptor>;\n get source(): HTMLVideoElement | VideoFrame | undefined;\n}\n\nexport function texture<TUsage extends TextureUsage = never>(\n descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n): TgpuTexture<TUsage> {\n return new TgpuTextureImpl(descriptor);\n}\n\nexport function textureExternal(\n source?: HTMLVideoElement | VideoFrame,\n colorSpace?: PredefinedColorSpace,\n): TgpuTextureExternal {\n return new TgpuTextureExternalImpl(source, colorSpace);\n}\n\nclass TgpuTextureImpl<TAllows extends TextureUsage = never>\n implements TgpuTexture<TAllows>, TgpuAnyTexture\n{\n private _flags: GPUTextureUsageFlags =\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.COPY_SRC |\n GPUTextureUsage.RENDER_ATTACHMENT;\n private _allowedUsages: {\n sampled: Map<\n string,\n TgpuTextureView<TextureScalarFormat, 'sampled'>\n > | null;\n storage: Map<string, TgpuTextureView<TexelFormat, 'storage'>> | null;\n } = {\n sampled: null,\n storage: null,\n };\n private _label: string | undefined;\n\n constructor(\n public readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get flags() {\n return this._flags;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $addFlags(flags: GPUTextureUsageFlags) {\n this._flags |= flags;\n return this;\n }\n\n $allowSampled() {\n const enrichedThis = this as TgpuTexture<TAllows | 'sampled'>;\n if (!this._allowedUsages.sampled) {\n this._allowedUsages.sampled = new Map();\n }\n this.$addFlags(GPUTextureUsage.TEXTURE_BINDING);\n return enrichedThis;\n }\n\n $allowStorage() {\n const enrichedThis = this as TgpuTexture<TAllows | 'storage'>;\n if (!this._allowedUsages.storage) {\n this._allowedUsages.storage = new Map();\n }\n this.$addFlags(GPUTextureUsage.STORAGE_BINDING);\n return enrichedThis;\n }\n\n private getStorageIfAllowed(\n params: StorageTextureParams,\n ): TgpuTextureView<TexelFormat, 'storage'> | null {\n if (!this._allowedUsages.storage) {\n return null;\n }\n const stringified = hashFromShallowObj(params);\n const existing = this._allowedUsages.storage.get(stringified);\n if (existing) {\n return existing;\n }\n const type = texelFormatToTgpuType[this.descriptor.format];\n if (!type) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n const view = new TgpuTextureViewImpl(\n params.type,\n this,\n type,\n params.descriptor,\n params.access,\n ) as unknown as TgpuTextureView<typeof type, 'storage'>;\n this._allowedUsages.storage.set(stringified, view);\n return view;\n }\n\n private getSampledIfAllowed(\n params: SampledTextureParams,\n ): TgpuTextureView<TextureScalarFormat, 'sampled'> | null {\n if (!this._allowedUsages.sampled) {\n return null;\n }\n const stringified = hashFromShallowObj({\n type: params.type,\n dataType: String(params.dataType),\n });\n const existing = this._allowedUsages.sampled.get(stringified);\n if (existing) {\n return existing;\n }\n const view = new TgpuTextureViewImpl(\n params.type,\n this,\n params.dataType,\n params.descriptor,\n ) as unknown as TgpuTextureView<typeof params.dataType, 'sampled'>;\n this._allowedUsages.sampled.set(stringified, view);\n return view;\n }\n\n asStorage(params: StorageTextureParams) {\n const maybeView = this.getStorageIfAllowed(params);\n const maybeType = texelFormatToTgpuType[this.descriptor.format];\n if (!maybeType) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n return maybeView as 'storage' extends TAllows\n ? TgpuTextureView<typeof maybeType, 'storage'>\n : null;\n }\n\n asSampled(params: SampledTextureParams) {\n return this.getSampledIfAllowed(params) as 'sampled' extends TAllows\n ? TgpuTextureView<typeof params.dataType, 'sampled'>\n : null;\n }\n}\n\nclass TgpuTextureViewImpl<\n TData extends TextureScalarFormat | TexelFormat,\n TUsage extends TextureUsage,\n> implements TgpuTextureView<TData, TUsage>, TgpuAnyTextureView\n{\n private _label: string | undefined;\n\n constructor(\n public readonly type: TgpuRenderResourceType,\n public readonly texture: TgpuTexture<TUsage>,\n public readonly dataType: TData,\n public readonly descriptor: GPUTextureViewDescriptor = {},\n public readonly access: StorageTextureAccess | undefined = undefined,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nclass TgpuTextureExternalImpl implements TgpuTextureExternal {\n private _label: string | undefined;\n public readonly type = 'texture_external';\n public readonly descriptor: Optional<GPUExternalTextureDescriptor>;\n\n constructor(\n source: HTMLVideoElement | VideoFrame | undefined,\n colorSpace: PredefinedColorSpace | undefined,\n ) {\n this.descriptor = { source, colorSpace };\n }\n\n get label() {\n return this._label;\n }\n\n get source() {\n return this.descriptor.source;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nexport function isExternalTexture(\n texture: TgpuRenderResource,\n): texture is TgpuTextureExternal {\n return !('texture' in texture) && !isSampler(texture);\n}\n\nexport function isTextureView(\n texture: TgpuRenderResource,\n): texture is TgpuAnyTextureView {\n return 'texture' in texture;\n}\n\nconst texelFormatToTgpuType: Record<string, TexelFormat> = {\n rgba8unorm: vec4f,\n rgba8snorm: vec4f,\n rgba8uint: vec4u,\n rgba8sint: vec4i,\n rgba16uint: vec4u,\n rgba16sint: vec4i,\n rgba16float: vec4f,\n r32uint: vec4u,\n r32sint: vec4i,\n r32float: vec4f,\n rg32uint: vec4u,\n rg32sint: vec4i,\n rg32float: vec4f,\n rgba32uint: vec4u,\n rgba32sint: vec4i,\n rgba32float: vec4f,\n bgra8unorm: vec4f,\n};\n\nfunction hashFromShallowObj(obj: object): string {\n const withKeysSorted = Object.fromEntries(\n Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n return JSON.stringify(withKeysSorted);\n}\n","import type { TgpuBufferVertex } from './core/buffer/bufferUsage';\nimport {\n type ExperimentalTgpuRoot,\n deriveVertexFormat,\n} from './core/root/rootTypes';\nimport type { ResolutionCtxImpl } from './resolutionCtx';\nimport { type TgpuSampler, isSampler } from './tgpuSampler';\nimport {\n type TgpuAnyTextureView,\n type TgpuTextureExternal,\n isExternalTexture,\n isTextureView,\n} from './tgpuTexture';\nimport type { AnyTgpuData, BufferUsage, TgpuBindable, TgpuData } from './types';\n\nconst usageToBindingTypeMap: Record<\n Exclude<BufferUsage, 'vertex'>,\n GPUBufferBindingType\n> = {\n uniform: 'uniform',\n mutable: 'storage',\n readonly: 'read-only-storage',\n};\n\nexport class BindGroupResolver {\n private samplers: TgpuSampler[] = [];\n private textureViews: TgpuAnyTextureView[] = [];\n private externalTextures: TgpuTextureExternal[] = [];\n private buffers: TgpuBindable<AnyTgpuData, BufferUsage>[] = [];\n private vertexBuffers: Map<TgpuBufferVertex<AnyTgpuData>, number> | null =\n null;\n\n private layout: GPUBindGroupLayout | null = null;\n private bindGroup: GPUBindGroup | null = null;\n private vertexLayout: GPUVertexBufferLayout[] | null = null;\n\n constructor(\n private root: ExperimentalTgpuRoot,\n private context: ResolutionCtxImpl,\n public readonly shaderStage: number,\n ) {\n const renderResources = Array.from(context.usedRenderResources);\n for (const resource of renderResources) {\n if (isSampler(resource)) {\n this.samplers.push(resource);\n } else if (isTextureView(resource)) {\n this.textureViews.push(resource);\n } else if (isExternalTexture(resource)) {\n this.externalTextures.push(resource);\n } else {\n throw new Error(`Invalid resource type: ${resource}`);\n }\n }\n this.buffers = Array.from(context.usedBindables);\n }\n\n setVertexBuffers(\n vertexBuffers: {\n index: number;\n buffer: TgpuBufferVertex<AnyTgpuData>;\n }[],\n ) {\n if (this.shaderStage !== GPUShaderStage.VERTEX) {\n throw new Error('Vertex buffers can only be set for vertex shader');\n }\n this.vertexBuffers = new Map(\n vertexBuffers.map(({ index, buffer }) => [buffer, index]),\n );\n }\n\n getBindGroupLayout() {\n if (this.layout) {\n return this.layout;\n }\n\n const entries: GPUBindGroupLayoutEntry[] = [];\n for (const textureView of this.textureViews) {\n if (textureView.access === undefined) {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n visibility: this.shaderStage,\n texture: {},\n });\n } else {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n visibility: this.shaderStage,\n storageTexture: { format: textureView.texture.descriptor.format },\n });\n }\n }\n for (const external of this.externalTextures) {\n entries.push({\n binding: this.context.getIndexFor(external),\n visibility: this.shaderStage,\n externalTexture: {},\n });\n }\n for (const sampler of this.samplers) {\n entries.push({\n binding: this.context.getIndexFor(sampler),\n visibility: this.shaderStage,\n sampler: {},\n });\n }\n for (const buffer of this.buffers) {\n if (buffer.usage === 'vertex') continue;\n entries.push({\n binding: this.context.getIndexFor(buffer),\n visibility: this.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[buffer.usage],\n },\n });\n }\n const layout = this.root.device.createBindGroupLayout({\n entries,\n });\n this.layout = layout;\n return layout;\n }\n\n getBindGroup() {\n this.checkBindGroupInvalidation();\n\n if (this.bindGroup) {\n return this.bindGroup;\n }\n\n const entries: GPUBindGroupEntry[] = [];\n for (const textureView of this.textureViews) {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n resource: this.root.viewFor(textureView),\n });\n }\n for (const external of this.externalTextures) {\n entries.push({\n binding: this.context.getIndexFor(external),\n resource: this.root.externalTextureFor(external),\n });\n }\n for (const sampler of this.samplers) {\n entries.push({\n binding: this.context.getIndexFor(sampler),\n resource: this.root.samplerFor(sampler),\n });\n }\n for (const buffer of this.buffers) {\n if (buffer.usage === 'vertex') continue;\n entries.push({\n binding: this.context.getIndexFor(buffer),\n resource: {\n buffer: buffer.allocatable.buffer,\n },\n });\n }\n const bindGroup = this.root.device.createBindGroup({\n layout: this.getBindGroupLayout(),\n entries,\n });\n\n this.bindGroup = bindGroup;\n return bindGroup;\n }\n\n getBindings() {\n return {\n bindGroupLayout: this.getBindGroupLayout(),\n bindGroup: this.getBindGroup(),\n };\n }\n\n getVertexBufferDescriptors() {\n if (this.vertexBuffers === null) {\n throw new Error('Vertex buffers not set');\n }\n\n if (this.vertexLayout) {\n return this.vertexLayout;\n }\n\n const vertexBufferDescriptors: GPUVertexBufferLayout[] = [];\n for (const [buffer, idx] of this.vertexBuffers.entries()) {\n vertexBufferDescriptors.push({\n ...buffer.vertexLayout,\n attributes: [\n {\n shaderLocation: idx,\n offset: 0,\n format: deriveVertexFormat(\n buffer.allocatable.dataType as TgpuData<AnyTgpuData>,\n ),\n },\n ],\n });\n }\n\n this.vertexLayout = vertexBufferDescriptors;\n return vertexBufferDescriptors;\n }\n\n getVertexBuffers() {\n if (this.vertexBuffers === null) {\n throw new Error('Vertex buffers not set');\n }\n return this.vertexBuffers.entries();\n }\n\n getVertexBufferIndex(buffer: TgpuBufferVertex<AnyTgpuData>) {\n const index = this.vertexBuffers?.get(buffer);\n if (this.vertexBuffers === null || index === undefined) {\n throw new Error('Vertex buffers not set');\n }\n return index;\n }\n\n invalidateBindGroup() {\n this.bindGroup = null;\n }\n\n checkBindGroupInvalidation() {\n for (const texture of this.externalTextures) {\n // check if texture is dirty (changed source) -> if so, invalidate bind group and mark clean\n if (this.root.isDirty(texture)) {\n this.invalidateBindGroup();\n this.root.markClean(texture);\n continue;\n }\n\n // check if any external texture is of type HTMLVideoElement -> if so, invalidate bind group as it expires on bind\n if (texture.source instanceof HTMLVideoElement) {\n this.invalidateBindGroup();\n }\n }\n }\n}\n","import type { vec3u, vec4f } from './data';\n\nimport { type BuiltinName, builtinNameToSymbol } from './builtinIdentifiers';\nimport { code } from './tgpuCode';\nimport type { ResolutionCtx, TgpuResolvable } from './types';\n\nexport interface TgpuBuiltin extends TgpuResolvable {\n readonly name: BuiltinName;\n readonly s: symbol;\n}\n\nclass TgpuBuiltinImpl implements TgpuBuiltin {\n public readonly s: symbol;\n\n constructor(public readonly name: BuiltinName) {\n this.s = builtinNameToSymbol.get(name) as symbol;\n }\n\n get label() {\n return this.name;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(code`${this.s}`);\n }\n}\n\nexport type BuiltinVertexIndex = TgpuBuiltin & number;\nexport type BuiltinInstanceIndex = TgpuBuiltin & number;\nexport type BuiltinPosition = TgpuBuiltin & vec4f;\nexport type BuiltinClipDistances = TgpuBuiltin & number[];\nexport type BuiltinFrontFacing = TgpuBuiltin & boolean;\nexport type BuiltinFragDepth = TgpuBuiltin & number;\nexport type BuiltinSampleIndex = TgpuBuiltin & number;\nexport type BuiltinSampleMask = TgpuBuiltin & vec4f;\nexport type BuiltinFragment = TgpuBuiltin & vec4f;\nexport type BuiltinLocalInvocationId = TgpuBuiltin & vec3u;\nexport type BuiltinLocalInvocationIndex = TgpuBuiltin & number;\nexport type BuiltinGlobalInvocationId = TgpuBuiltin & vec3u;\nexport type BuiltinWorkgroupId = TgpuBuiltin & vec3u;\nexport type BuiltinNumWorkgroups = TgpuBuiltin & vec3u;\n\nexport const builtin = {\n vertexIndex: new TgpuBuiltinImpl('vertex_index') as BuiltinVertexIndex,\n instanceIndex: new TgpuBuiltinImpl('instance_index') as BuiltinInstanceIndex,\n position: new TgpuBuiltinImpl('position') as BuiltinPosition,\n clipDistances: new TgpuBuiltinImpl('clip_distances') as BuiltinClipDistances,\n frontFacing: new TgpuBuiltinImpl('front_facing') as BuiltinFrontFacing,\n fragDepth: new TgpuBuiltinImpl('frag_depth') as BuiltinFragDepth,\n sampleIndex: new TgpuBuiltinImpl('sample_index') as BuiltinSampleIndex,\n sampleMask: new TgpuBuiltinImpl('sample_mask') as BuiltinSampleMask,\n fragment: new TgpuBuiltinImpl('fragment') as BuiltinFragment,\n localInvocationId: new TgpuBuiltinImpl(\n 'local_invocation_id',\n ) as BuiltinLocalInvocationId,\n localInvocationIndex: new TgpuBuiltinImpl(\n 'local_invocation_index',\n ) as BuiltinLocalInvocationIndex,\n globalInvocationId: new TgpuBuiltinImpl(\n 'global_invocation_id',\n ) as BuiltinGlobalInvocationId,\n workgroupId: new TgpuBuiltinImpl('workgroup_id') as BuiltinWorkgroupId,\n numWorkgroups: new TgpuBuiltinImpl('num_workgroups') as BuiltinNumWorkgroups,\n} as const;\n\ntype Builtin = (typeof builtin)[keyof typeof builtin];\n\nexport type OmitBuiltins<S extends object> = {\n [Key in keyof S as S[Key] extends Builtin ? never : Key]: S[Key];\n};\n","import { builtin } from './builtin';\nimport {\n type F32,\n type TgpuArray,\n type U32,\n type Vec3u,\n type Vec4f,\n arrayOf,\n f32,\n u32,\n vec3u,\n vec4f,\n} from './data';\n\nexport type BuiltInPossibleTypes = U32 | F32 | Vec3u | Vec4f | TgpuArray<U32>;\n\nconst builtinToType: Record<symbol, BuiltInPossibleTypes> = {\n [builtin.vertexIndex.s]: u32,\n [builtin.instanceIndex.s]: u32,\n [builtin.position.s]: vec4f,\n [builtin.clipDistances.s]: arrayOf(u32, 8),\n [builtin.frontFacing.s]: f32,\n [builtin.fragDepth.s]: f32,\n [builtin.sampleIndex.s]: u32,\n [builtin.sampleMask.s]: u32,\n [builtin.fragment.s]: vec4f,\n [builtin.localInvocationId.s]: vec3u,\n [builtin.localInvocationIndex.s]: u32,\n [builtin.globalInvocationId.s]: vec3u,\n [builtin.workgroupId.s]: vec3u,\n [builtin.numWorkgroups.s]: vec3u,\n};\n\nexport function typeForBuiltin(key: symbol): BuiltInPossibleTypes {\n const dataType = builtinToType[key];\n if (!dataType) {\n throw new Error(`The symbol ${String(key)} in not a valid 'builtin'`);\n }\n\n return dataType;\n}\n","import type { TgpuResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: TgpuResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<TgpuResolvable, string>();\n\n nameFor(item: TgpuResolvable) {\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<TgpuResolvable, string>();\n\n nameFor(item: TgpuResolvable): 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 { bool } from '../data';\nimport {\n type ResolutionCtx,\n type Resource,\n UnknownData,\n type Wgsl,\n isResolvable,\n isWgsl,\n} from '../types';\nimport type * as smol from './nodes';\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n indent(): string;\n dedent(): string;\n getById(id: string): Resource;\n // getDataType(node: smol.AnyNode): AnyTgpuData;\n};\n\nfunction resolveRes(ctx: GenerationCtx, res: Resource): string {\n if (isWgsl(res.value)) {\n return ctx.resolve(res.value);\n }\n\n return String(res.value);\n}\n\nfunction assertExhaustive(value: unknown): never {\n throw new Error(\n `'${JSON.stringify(value)}' was not handled by the WGSL generator.`,\n );\n}\n\nfunction generateBoolean(ctx: GenerationCtx, value: boolean): Resource {\n return value\n ? { value: 'true', dataType: bool }\n : { value: 'false', dataType: bool };\n}\n\nfunction generateBlock(ctx: GenerationCtx, value: smol.Block): string {\n return `${ctx.indent()}{\n${value.block.map((statement) => generateStatement(ctx, statement)).join('\\n')}\n${ctx.dedent()}}`;\n}\n\nfunction generateIdentifier(ctx: GenerationCtx, id: string): Resource {\n return ctx.getById(id);\n}\n\nfunction generateExpression(\n ctx: GenerationCtx,\n expression: smol.Expression,\n): Resource {\n if (typeof expression === 'string') {\n return generateIdentifier(ctx, expression);\n }\n\n if (typeof expression === 'boolean') {\n return generateBoolean(ctx, expression);\n }\n\n if ('x2' in expression) {\n // Logical/Binary/Assignment Expression\n\n const [lhs, op, rhs] = expression.x2;\n const lhsExpr = resolveRes(ctx, generateExpression(ctx, lhs));\n const rhsExpr = resolveRes(ctx, generateExpression(ctx, rhs));\n return {\n value: `${lhsExpr} ${op} ${rhsExpr}`,\n // TODO: Infer data type from expression type and arguments.\n dataType: UnknownData,\n };\n }\n\n if ('.' in expression) {\n // Member Access\n\n const [targetId, property] = expression['.'];\n const target = generateExpression(ctx, targetId);\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n if (isResolvable(target.value) || typeof target.value === 'object') {\n // NOTE: Temporary solution, assuming that access to `.value` of resolvables should always resolve to just the target.\n if (propertyStr === 'value') {\n return {\n value: resolveRes(ctx, target),\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n return {\n // biome-ignore lint/suspicious/noExplicitAny: <sorry TypeScript>\n value: (target.value as any)[propertyStr],\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n const targetStr = resolveRes(ctx, target);\n\n return {\n value: `${targetStr}.${propertyStr}`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if ('[]' in expression) {\n // Index Access\n\n const [target, property] = expression['[]'];\n const targetStr = resolveRes(ctx, generateExpression(ctx, target));\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n return {\n value: `${targetStr}[${propertyStr}]`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if ('num' in expression) {\n // Numeric Literal\n\n // TODO: Infer numeric data type from literal\n return { value: expression.num, dataType: UnknownData };\n }\n\n if ('call' in expression) {\n // Function Call\n\n const id = generateExpression(ctx, expression.call);\n const idValue = id.value;\n\n const argResources = expression.args.map((arg) =>\n generateExpression(ctx, arg),\n );\n const argValues = argResources.map((res) => resolveRes(ctx, res));\n\n if (isResolvable(idValue) || typeof idValue === 'function') {\n // Assuming that `id` is callable\n // TODO: Pass in resources, not just values.\n const result = (idValue as unknown as (...args: unknown[]) => unknown)(\n ...argValues,\n ) as Wgsl;\n // TODO: Make function calls return resources instead of just values.\n return { value: result, dataType: UnknownData };\n }\n\n return {\n value: `${String(idValue)}(${argValues.join(', ')})`,\n dataType: UnknownData,\n };\n }\n\n assertExhaustive(expression);\n}\n\nfunction generateStatement(\n ctx: GenerationCtx,\n statement: smol.Statement,\n): string {\n if (typeof statement === 'string') {\n return `${ctx.pre}${resolveRes(ctx, generateIdentifier(ctx, statement))};`;\n }\n\n if (typeof statement === 'boolean') {\n return `${ctx.pre}${resolveRes(ctx, generateBoolean(ctx, statement))};`;\n }\n\n if ('return' in statement) {\n return statement.return === null\n ? `${ctx.pre}return;`\n : `${ctx.pre}return ${resolveRes(ctx, generateExpression(ctx, statement.return))};`;\n }\n\n if ('if' in statement) {\n const condition = resolveRes(ctx, generateExpression(ctx, statement.if));\n\n ctx.indent(); // {\n const consequent = generateStatement(ctx, statement.do);\n ctx.dedent(); // }\n\n ctx.indent(); // {\n const alternate = statement.else\n ? generateStatement(ctx, statement.else)\n : undefined;\n ctx.dedent(); // }\n\n if (!alternate) {\n return `\\\n${ctx.pre}if (${condition})\n${consequent}`;\n }\n\n return `\\\n${ctx.pre}if (${condition})\n${consequent}\n${ctx.pre}else\n${alternate}`;\n }\n\n if ('let' in statement || 'const' in statement) {\n const id = resolveRes(\n ctx,\n generateIdentifier(\n ctx,\n 'let' in statement ? statement.let : statement.const,\n ),\n );\n const eq = statement.eq ? generateExpression(ctx, statement.eq) : undefined;\n\n if (!eq) {\n throw new Error('Cannot create variable without an initial value.');\n }\n\n return `${ctx.pre}var ${id} = ${resolveRes(ctx, eq)};`;\n }\n\n if ('block' in statement) {\n // TODO: Push block scope layer onto the stack\n return generateBlock(ctx, statement);\n }\n\n return `${ctx.pre}${resolveRes(ctx, generateExpression(ctx, statement))};`;\n}\n\nexport function generateFunction(ctx: GenerationCtx, body: smol.Block): string {\n return generateBlock(ctx, body);\n}\n","import type { TgpuFnShellBase } from './core/function/fnCore';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { onGPU } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { type Block, generateFunction } from './smol';\nimport { code } from './tgpuCode';\nimport { isTextureView } from './tgpuTexture';\nimport type {\n AnyTgpuData,\n BufferUsage,\n Eventual,\n ResolutionCtx,\n Resource,\n SlotValuePair,\n TgpuBindable,\n TgpuIdentifier,\n TgpuRenderResource,\n TgpuResolvable,\n TgpuSlot,\n Wgsl,\n} from './types';\nimport {\n UnknownData,\n isDepthTextureType,\n isExternalTextureType,\n isResolvable,\n isSamplerType,\n isSlot,\n} from './types';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n readonly jitTranspiler?: JitTranspiler | undefined;\n};\n\ntype SlotToValueMap = Map<TgpuSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<Exclude<BufferUsage, 'vertex'>, string> = {\n uniform: 'uniform',\n mutable: 'storage, read_write',\n readonly: 'storage, read',\n};\n\nclass SharedResolutionState {\n private _nextFreeBindingIdx = 0;\n private _nextFreeVertexBindingIdx = 0;\n private readonly _usedBindables = new Set<TgpuBindable>();\n private readonly _usedRenderResources = new Set<TgpuRenderResource>();\n private readonly _resourceToIndexMap = new WeakMap<\n TgpuRenderResource | TgpuBindable,\n number\n >();\n private readonly _vertexBufferToIndexMap = new WeakMap<\n TgpuBindable,\n number\n >();\n private readonly _usedBuiltins = new Set<symbol>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n public readonly jitTranspiler: JitTranspiler | undefined,\n ) {}\n\n get usedBindables(): Iterable<TgpuBindable> {\n return this._usedBindables;\n }\n\n get usedRenderResources(): Iterable<TgpuRenderResource> {\n return this._usedRenderResources;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n get usedBuiltins(): Iterable<symbol> {\n return this._usedBuiltins;\n }\n\n reserveBindingEntry(bindable: TgpuBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(bindable, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n registerVertexEntry(bindable: TgpuBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeVertexBindingIdx++;\n this._vertexBufferToIndexMap.set(bindable, nextIdx);\n }\n\n reserveRenderResourceEntry(resource: TgpuRenderResource) {\n this._usedRenderResources.add(resource);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(resource, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n getBindingIndex(resource: TgpuRenderResource | TgpuBindable) {\n return this._resourceToIndexMap.get(resource);\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n\n addBuiltin(builtin: symbol) {\n this._usedBuiltins.add(builtin);\n }\n}\n\ntype ItemLayer = {\n type: 'item';\n usedSlots: Set<TgpuSlot<unknown>>;\n};\n\ntype SlotBindingLayer = {\n type: 'slotBinding';\n bindingMap: WeakMap<TgpuSlot<unknown>, unknown>;\n};\n\ntype FunctionScopeLayer = {\n type: 'functionScope';\n args: Resource[];\n externalMap: Record<string, unknown>;\n returnType: AnyTgpuData | undefined;\n};\n\ntype BlockScopeLayer = {\n type: 'blockScope';\n declarations: Map<string, AnyTgpuData | UnknownData>;\n};\n\nclass ItemStateStack {\n private _stack: (\n | ItemLayer\n | SlotBindingLayer\n | FunctionScopeLayer\n | BlockScopeLayer\n )[] = [];\n private _itemDepth = 0;\n\n get itemDepth(): number {\n return this._itemDepth;\n }\n\n get topItem(): ItemLayer {\n const state = this._stack[this._stack.length - 1];\n if (!state || state.type !== 'item') {\n throw new Error('Internal error, expected item layer to be on top.');\n }\n return state;\n }\n\n pushItem() {\n this._itemDepth++;\n this._stack.push({\n type: 'item',\n usedSlots: new Set(),\n });\n }\n\n pushSlotBindings(pairs: SlotValuePair<unknown>[]) {\n this._stack.push({\n type: 'slotBinding',\n bindingMap: new WeakMap(pairs),\n });\n }\n\n pushFunctionScope(\n args: Resource[],\n returnType: AnyTgpuData | undefined,\n externalMap: Record<string, unknown>,\n ) {\n this._stack.push({\n type: 'functionScope',\n args,\n returnType,\n externalMap,\n });\n }\n\n pop() {\n const layer = this._stack.pop();\n if (layer?.type === 'item') {\n this._itemDepth--;\n }\n }\n\n readSlot<T>(slot: TgpuSlot<T>): T | undefined {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n if (layer?.type === 'item') {\n // Binding not available yet, so this layer is dependent on the slot's value.\n layer.usedSlots.add(slot);\n } else if (layer?.type === 'slotBinding') {\n const boundValue = layer.bindingMap.get(slot);\n\n if (boundValue !== undefined) {\n return boundValue as T;\n }\n } else if (\n layer?.type === 'functionScope' ||\n layer?.type === 'blockScope'\n ) {\n // Skip\n } else {\n throw new Error('Unknown layer type.');\n }\n }\n\n return slot.defaultValue;\n }\n\n getResourceById(id: string): Resource | undefined {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n\n if (layer?.type === 'functionScope') {\n const arg = layer.args.find((a) => a.value === id);\n if (arg !== undefined) {\n return arg;\n }\n\n const external = layer.externalMap[id];\n if (external !== undefined) {\n // TODO: Extract the type of the external value.\n return { value: external, dataType: UnknownData };\n }\n } else if (layer?.type === 'blockScope') {\n const declarationType = layer.declarations.get(id);\n if (declarationType !== undefined) {\n return { value: id, dataType: declarationType };\n }\n } else {\n // Skip\n }\n }\n\n return undefined;\n }\n}\n\nconst INDENT = [\n '', // 0\n ' ', // 1\n ' ', // 2\n ' ', // 3\n ' ', // 4\n ' ', // 5\n ' ', // 6\n ' ', // 7\n ' ', // 8\n];\n\nconst N = INDENT.length - 1;\n\nexport class IndentController {\n private identLevel = 0;\n\n get pre(): string {\n return (\n INDENT[this.identLevel] ??\n (INDENT[N] as string).repeat(this.identLevel / N) +\n INDENT[this.identLevel % N]\n );\n }\n\n indent(): string {\n const str = this.pre;\n this.identLevel++;\n return str;\n }\n\n dedent(): string {\n this.identLevel--;\n return this.pre;\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\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 TgpuResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private readonly _shared: SharedResolutionState;\n private readonly _indentController = new IndentController();\n\n private _itemStateStack = new ItemStateStack();\n\n constructor(opts: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(\n opts.names,\n opts.bindingGroup ?? 0,\n opts.jitTranspiler,\n );\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n get usedRenderResources() {\n return this._shared.usedRenderResources;\n }\n\n get usedBuiltins() {\n return this._shared.usedBuiltins;\n }\n\n get pre(): string {\n return this._indentController.pre;\n }\n\n indent(): string {\n return this._indentController.indent();\n }\n\n dedent(): string {\n return this._indentController.dedent();\n }\n\n getById(id: string): Resource {\n // TODO: Provide access to external values\n // TODO: Provide data type information\n return (\n this._itemStateStack.getResourceById(id) ?? {\n value: id,\n dataType: UnknownData,\n }\n );\n }\n\n transpileFn(fn: string): {\n argNames: string[];\n body: Block;\n externalNames: string[];\n } {\n if (!this._shared.jitTranspiler) {\n throw new Error(\n 'Tried to execute a tgpu.fn function without providing a JIT transpiler, or transpiling at build time.',\n );\n }\n\n return this._shared.jitTranspiler.transpileFn(fn);\n }\n\n fnToWgsl(\n // biome-ignore lint/suspicious/noExplicitAny: <no need for generic magic>\n shell: TgpuFnShellBase<any, AnyTgpuData>,\n argNames: string[],\n body: Block,\n externalMap: Record<string, unknown>,\n ): { head: Wgsl; body: Wgsl } {\n const args: { value: string; dataType: AnyTgpuData }[] = argNames.map(\n (name, idx) => ({\n value: name,\n dataType: shell.argTypes[idx],\n }),\n );\n\n this._itemStateStack.pushFunctionScope(args, shell.returnType, externalMap);\n const str = generateFunction(this, body);\n this._itemStateStack.pop();\n\n const argList = args\n .map((arg) => `${arg.value}: ${this.resolve(arg.dataType)}`)\n .join(', ');\n\n return {\n head:\n shell.returnType !== undefined\n ? `(${argList}) -> ${this.resolve(shell.returnType)}`\n : `(${argList})`,\n body: str,\n };\n }\n\n addDeclaration(declaration: TgpuResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void {\n if (bindable.usage === 'vertex') {\n this._shared.registerVertexEntry(bindable);\n return;\n }\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n addRenderResource(\n resource: TgpuRenderResource,\n identifier: TgpuIdentifier,\n ): void {\n const { group, idx } = this._shared.reserveRenderResourceEntry(resource);\n\n if (\n isSamplerType(resource.type) ||\n isExternalTextureType(resource.type) ||\n isDepthTextureType(resource.type)\n ) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type};`,\n );\n return;\n }\n\n if (isTextureView(resource)) {\n if (resource.access !== undefined) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.texture.descriptor.format}, ${resource.access}>;`,\n );\n return;\n }\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.dataType}>;`,\n );\n return;\n }\n\n throw new Error(`Unsupported resource type: ${resource.type}`);\n }\n\n addBuiltin(builtin: symbol): void {\n this._shared.addBuiltin(builtin);\n }\n\n nameFor(item: TgpuResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: TgpuSlot<T>): T {\n const value = this._itemStateStack.readSlot(slot);\n\n if (value === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return value;\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 /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved.\n */\n _getOrInstantiate(item: TgpuResolvable): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n this._itemStateStack.pushItem();\n\n try {\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) =>\n this._itemStateStack.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(this);\n\n // We know which slots the item used while resolving\n const slotToValueMap = new Map<TgpuSlot<unknown>, unknown>();\n for (const usedSlot of this._itemStateStack.topItem.usedSlots) {\n slotToValueMap.set(usedSlot, this._itemStateStack.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(item);\n }\n\n throw new ResolutionError(err, [item]);\n } finally {\n this._itemStateStack.pop();\n }\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n let pushedLayer = false;\n if (slotValueOverrides.length > 0) {\n pushedLayer = true;\n this._itemStateStack.pushSlotBindings(slotValueOverrides);\n }\n\n try {\n if (this._itemStateStack.itemDepth === 0) {\n const result = onGPU(() => this._getOrInstantiate(item));\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n\n return this._getOrInstantiate(item);\n } finally {\n if (pushedLayer) {\n this._itemStateStack.pop();\n }\n }\n }\n\n getIndexFor(item: TgpuBindable | TgpuRenderResource) {\n const index = this._shared.getBindingIndex(item);\n if (index === undefined) {\n throw new Error('No index found for item');\n }\n return index;\n }\n}\n","import type { AnySchema } from 'typed-binary';\nimport { BindGroupResolver } from './bindGroupResolver';\nimport { typeForBuiltin } from './builtinDataTypes';\nimport {\n builtinSymbolToName,\n idForBuiltin,\n nameForBuiltin,\n} from './builtinIdentifiers';\nimport type { TgpuBufferVertex } from './core/buffer/bufferUsage';\nimport type { ExperimentalTgpuRoot } from './core/root/rootTypes';\nimport type { SimpleTgpuData, TgpuArray } from './data';\nimport { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport { code } from './tgpuCode';\nimport type {\n AnyTgpuData,\n BoundTgpuCode,\n TgpuCode,\n TgpuResolvable,\n Wgsl,\n} from './types';\n\nexport type Program = {\n readonly bindGroupResolver: BindGroupResolver;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nexport default class ProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private rootNode: TgpuResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.rootNode);\n\n return {\n bindGroupResolver: new BindGroupResolver(\n this.root,\n ctx,\n options.shaderStage,\n ),\n code: codeString,\n };\n }\n}\n\nfunction getUsedBuiltinsNamed(\n rec: Record<symbol, string>,\n): { name: string; builtinSymbol: symbol }[] {\n const res = Object.getOwnPropertySymbols(rec).map((builtinSymbol) => {\n const builtin = builtinSymbolToName.get(builtinSymbol);\n if (builtin === undefined) {\n throw new Error('Symbol is not a member of `builtin`');\n }\n const name = rec[builtinSymbol] as string;\n return { name, builtinSymbol };\n });\n\n return res;\n}\n\nexport class RenderProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private vertexRoot: TgpuCode | BoundTgpuCode,\n private fragmentRoot: TgpuCode | BoundTgpuCode,\n private vertexOutputFormat: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyTgpuData;\n },\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): {\n vertexProgram: Program;\n fragmentProgram: Program;\n } {\n const symbolOutputs = Object.getOwnPropertySymbols(\n this.vertexOutputFormat,\n ).map((symbol) => {\n const name = this.vertexOutputFormat[symbol];\n if (typeof name !== 'string') {\n throw new Error('Output names must be strings.');\n }\n return { symbol, name };\n });\n\n const vertexOutputBuiltinObjects = getUsedBuiltinsNamed(\n Object.fromEntries(\n symbolOutputs.map(({ symbol, name }) => [symbol, name]),\n ),\n );\n\n const vertexOutput = Object.keys(this.vertexOutputFormat).map(\n (name, index) => {\n const varInfo = this.vertexOutputFormat[name];\n if (!varInfo) {\n throw new Error('Output names must be strings.');\n }\n return { name, varInfo, index };\n },\n );\n\n const structFields = [\n ...vertexOutputBuiltinObjects.map((builtin) => {\n const outputName = this.vertexOutputFormat[builtin.builtinSymbol] ?? '';\n\n return code`\n @builtin(${nameForBuiltin(builtin.builtinSymbol)}) ${outputName}: ${typeForBuiltin(builtin.builtinSymbol)},\n `;\n }),\n ...vertexOutput.map(\n ({ name, varInfo, index }) =>\n code`\n @location(${index}) ${name}: ${varInfo},\n `,\n ),\n ];\n\n const vertexContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n vertexContext.resolve(this.vertexRoot);\n const vertexBuffers = Array.from(vertexContext.usedBindables).filter(\n (bindable): bindable is TgpuBufferVertex<AnyTgpuData> =>\n bindable.usage === 'vertex',\n );\n const entries = vertexBuffers.map((elem, idx) => {\n return {\n idx: idx,\n entry: {\n bindable: elem,\n underlyingType: elem.allocatable.dataType as\n | SimpleTgpuData<AnySchema>\n | TgpuArray<AnyTgpuData>,\n },\n };\n });\n\n const vertexUserArgs = entries.map(\n (entry) => code`\n @location(${entry.idx}) ${entry.entry.bindable} : ${\n 'expressionCode' in entry.entry.underlyingType\n ? entry.entry.underlyingType.expressionCode\n : entry.entry.underlyingType.elementType\n },\n `,\n );\n const vertexBuiltins = Array.from(vertexContext.usedBuiltins);\n const vertexBuiltinsArgs = vertexBuiltins.map(\n (builtin) =>\n code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `,\n );\n const vertexArgs = [...vertexBuiltinsArgs, ...vertexUserArgs];\n\n const vertexCode = code`\n struct VertexOutput {\n ${structFields}\n };\n\n @vertex\n fn main(${vertexArgs}) -> VertexOutput {\n ${this.vertexRoot}\n var output: VertexOutput;\n ${vertexOutputBuiltinObjects.map(\n (entry) =>\n code`\n output.${entry.name} = ${entry.name};\n `,\n )}\n ${vertexOutput.map(\n ({ name }) =>\n code`\n output.${name} = ${name};\n `,\n )}\n return output;\n }\n `;\n const fragmentContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n fragmentContext.resolve(this.fragmentRoot);\n\n const fragmentUsedBuiltins = Array.from(fragmentContext.usedBuiltins);\n const fragmentBuiltinArgs = fragmentUsedBuiltins.map((builtin) => {\n return code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `;\n });\n\n const fragmentInputs = vertexOutput.map(\n ({ name, varInfo }, idx) => code`\n @location(${idx}) ${name}: ${varInfo},\n `,\n );\n const fragmentArgs = [...fragmentBuiltinArgs, ...fragmentInputs];\n const fragmentCode = code`\n @fragment\n fn main(${fragmentArgs}) -> @location(0) vec4f {\n ${this.fragmentRoot}\n }\n `;\n\n const vertexProgram = new ProgramBuilder(this.root, vertexCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.VERTEX,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n const fragmentProgram = new ProgramBuilder(this.root, fragmentCode).build({\n bindingGroup: options.bindingGroup + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n vertexProgram.bindGroupResolver.setVertexBuffers(\n entries.map((entry) => {\n return {\n index: entry.idx,\n buffer: entry.entry.bindable,\n };\n }),\n );\n\n return { vertexProgram, fragmentProgram };\n }\n}\n\nexport class ComputeProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private computeRoot: Wgsl,\n private workgroupSize: readonly [\n number,\n (number | null)?,\n (number | null)?,\n ],\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): Program {\n const context = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n context.resolve(this.computeRoot);\n\n const usedBuiltins = Array.from(context.usedBuiltins);\n const builtinArgs = usedBuiltins.map(\n (builtin) => code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `,\n );\n\n const workgroupSizeDeclaration = `@workgroup_size(${this.workgroupSize[0]}, ${this.workgroupSize[1] ?? 1}, ${this.workgroupSize[2] ?? 1})`;\n\n const shaderCode = code`\n @compute ${workgroupSizeDeclaration}\n fn main(${builtinArgs}) {\n ${this.computeRoot}\n }\n `;\n\n const program = new ProgramBuilder(this.root, shaderCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.COMPUTE,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n return program;\n }\n}\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuNamable } from '../../namable';\nimport { type TgpuPlum, type Unsubscribe, isPlum } from '../../tgpuPlumTypes';\nimport { type AnyTgpuData, isGPUBuffer } from '../../types';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Uniform {\n usableAsUniform: true;\n}\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport interface Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Storage = { usableAsStorage: true } as Storage;\nexport const Vertex = { usableAsVertex: true } as Vertex;\n\ntype UnionToIntersection<U> =\n // biome-ignore lint/suspicious/noExplicitAny: <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\ntype LiteralToUsageType<T extends 'uniform' | 'storage' | 'vertex'> =\n T extends 'uniform'\n ? Uniform\n : T extends 'storage'\n ? Storage\n : T extends 'vertex'\n ? Vertex\n : never;\n\nexport interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuNamable {\n readonly resourceType: 'buffer';\n readonly dataType: TData;\n readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n readonly label: string | undefined;\n\n readonly buffer: GPUBuffer;\n readonly device: GPUDevice;\n readonly destroyed: boolean;\n\n $usage<T extends ('uniform' | 'storage' | 'vertex')[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this;\n\n write(data: Parsed<TData> | TgpuBuffer<TData>): void;\n read(): Promise<Parsed<TData>>;\n destroy(): void;\n}\n\nexport function createBufferImpl<TData extends AnyTgpuData>(\n group: ExperimentalTgpuRoot | undefined,\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);\n}\n\nexport function isBuffer<T extends TgpuBuffer<AnyTgpuData>>(\n value: T | unknown,\n): value is T {\n return (value as TgpuBuffer<AnyTgpuData>).resourceType === 'buffer';\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Storage {\n return !!(buffer as unknown as Storage).usableAsStorage;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Vertex {\n return !!(buffer as unknown as Vertex).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public readonly resourceType = 'buffer';\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n private _destroyed = false;\n private _subscription: Unsubscribe | null = null;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n public usableAsUniform = false;\n public usableAsStorage = false;\n public usableAsVertex = false;\n\n constructor(\n private readonly _group: ExperimentalTgpuRoot | undefined,\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 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\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\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n\n if (isPlum(this.initial)) {\n const group = this._group;\n\n if (!group) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n const plum = this.initial;\n\n this.dataType.write(writer, group.readPlum(plum));\n\n this._subscription = group.onPlumChange(plum, () => {\n this.write(group.readPlum(plum));\n });\n } else {\n this.dataType.write(writer, this.initial);\n }\n\n this._buffer.unmap();\n }\n }\n\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer has not been assigned a device. Use .$device(device) to assign a device',\n );\n }\n return this._device;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $usage<T extends ('uniform' | 'storage' | 'vertex')[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>> {\n for (const usage of usages) {\n this.flags |= usage === 'uniform' ? GPUBufferUsage.UNIFORM : 0;\n this.flags |= usage === 'storage' ? GPUBufferUsage.STORAGE : 0;\n this.flags |= usage === 'vertex' ? GPUBufferUsage.VERTEX : 0;\n this.usableAsUniform = this.usableAsUniform || usage === 'uniform';\n this.usableAsStorage = this.usableAsStorage || usage === 'storage';\n this.usableAsVertex = this.usableAsVertex || usage === 'vertex';\n }\n return this as this & UnionToIntersection<LiteralToUsageType<T[number]>>;\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 write(dataOrBuffer: Parsed<TData> | TgpuBuffer<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n if (isBuffer(dataOrBuffer)) {\n throw new Error('Cannot copy to a mapped buffer.');\n }\n this.dataType.write(new BufferWriter(mapped), dataOrBuffer);\n return;\n }\n\n const size = this.dataType.size;\n if (isBuffer(dataOrBuffer)) {\n const sourceBuffer = dataOrBuffer.buffer;\n\n if (this._group) {\n const encoder = this._group.commandEncoder;\n encoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n } else {\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n device.queue.submit([commandEncoder.finish()]);\n }\n } else {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const hostBuffer = new ArrayBuffer(size);\n this.dataType.write(new BufferWriter(hostBuffer), dataOrBuffer);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n }\n\n async read(): Promise<Parsed<TData>> {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = this.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 = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: this.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 this.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, this.dataType.size);\n\n const res = this.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n if (this._subscription) {\n this._subscription();\n }\n this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { Unwrap } from 'typed-binary';\nimport { isArraySchema } from '../../data';\nimport { inGPUMode } from '../../gpuMode';\nimport { identifier } from '../../tgpuIdentifier';\nimport type {\n AnyTgpuData,\n BufferUsage,\n ResolutionCtx,\n TgpuBindable,\n} from '../../types';\nimport {\n type Storage,\n type TgpuBuffer,\n type Uniform,\n type Vertex,\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUniform<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'uniform'> {\n readonly resourceType: 'buffer-usage';\n readonly value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferReadonly<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'readonly'> {\n readonly resourceType: 'buffer-usage';\n readonly value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferMutable<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'mutable'> {\n readonly resourceType: 'buffer-usage';\n value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferVertex<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'vertex'> {\n readonly resourceType: 'buffer-usage';\n vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'>;\n}\n\nexport interface TgpuBufferUsage<\n TData extends AnyTgpuData,\n TUsage extends BufferUsage = BufferUsage,\n> extends TgpuBindable<TData, TUsage> {\n readonly resourceType: 'buffer-usage';\n value: Unwrap<TData>;\n}\n\nexport function isBufferUsage<\n T extends\n | TgpuBufferUniform<AnyTgpuData>\n | TgpuBufferReadonly<AnyTgpuData>\n | TgpuBufferMutable<AnyTgpuData>\n | TgpuBufferVertex<AnyTgpuData>,\n>(value: T | unknown): value is T {\n return !!value && (value as T).resourceType === 'buffer-usage';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferUsageImpl<TData extends AnyTgpuData, TUsage extends BufferUsage>\n implements TgpuBufferUsage<TData, TUsage>\n{\n public readonly resourceType = 'buffer-usage' as const;\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 $name(label: string) {\n this.buffer.$name(label);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this.label);\n ctx.addBinding(this, ident);\n return ctx.resolve(ident);\n }\n\n toString(): string {\n return `${this.usage}:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Unwrap<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n return this as Unwrap<TData>;\n }\n}\n\nclass TgpuBufferVertexImpl<TData extends AnyTgpuData>\n implements TgpuBufferVertex<TData>\n{\n public readonly resourceType = 'buffer-usage' as const;\n public readonly usage = 'vertex';\n public readonly vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'>;\n\n constructor(\n public readonly allocatable: TgpuBuffer<TData>,\n stepMode: 'vertex' | 'instance',\n ) {\n const layout = getVertexLayoutIfValid(allocatable.dataType, stepMode);\n if (!layout) {\n throw new Error('Cannot create vertex buffer with complex data types.');\n }\n this.vertexLayout = layout;\n }\n\n get label() {\n return this.allocatable.label;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this.label);\n ctx.addBinding(this, ident);\n return ctx.resolve(ident);\n }\n\n toString(): string {\n return `vertex:${this.label ?? '<unnamed>'}`;\n }\n}\n\nconst mutableUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'mutable'>\n>();\n\nexport function asMutable<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Storage,\n): TgpuBufferMutable<TData> {\n if (!isUsableAsStorage(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asMutable, as it is not allowed to be used as storage. To allow it, call .$usage('storage') when creating the buffer.`,\n );\n }\n\n let usage = mutableUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'mutable');\n mutableUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferMutable<TData>;\n}\n\nconst readonlyUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'readonly'>\n>();\n\nexport function asReadonly<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Storage,\n): TgpuBufferReadonly<TData> {\n if (!isUsableAsStorage(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asReadonly, as it is not allowed to be used as storage. To allow it, call .$usage('storage') when creating the buffer.`,\n );\n }\n\n let usage = readonlyUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'readonly');\n readonlyUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferReadonly<TData>;\n}\n\nconst uniformUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'uniform'>\n>();\n\nexport function asUniform<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Uniform,\n): TgpuBufferUniform<TData> {\n if (!isUsableAsUniform(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asUniform, as it is not allowed to be used as a uniform. To allow it, call .$usage('uniform') when creating the buffer.`,\n );\n }\n\n let usage = uniformUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'uniform');\n uniformUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferUniform<TData>;\n}\n\nconst vertexUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n {\n vertex: TgpuBufferVertexImpl<AnyTgpuData>;\n instance: TgpuBufferVertexImpl<AnyTgpuData>;\n }\n>();\n\nexport function asVertex<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Vertex,\n stepMode: 'vertex' | 'instance',\n): TgpuBufferVertex<TData> {\n if (!isUsableAsVertex(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asVertex, as it is not allowed to be used as a vertex buffer. To allow it, call .$usage('vertex') when creating the buffer.`,\n );\n }\n\n let usage = vertexUsageMap.get(buffer);\n if (!usage) {\n usage = {\n vertex: new TgpuBufferVertexImpl(buffer, 'vertex'),\n instance: new TgpuBufferVertexImpl(buffer, 'instance'),\n };\n vertexUsageMap.set(buffer, usage);\n }\n return usage[stepMode] as unknown as TgpuBufferVertex<TData>;\n}\n\nfunction getVertexLayoutIfValid(\n type: AnyTgpuData,\n stepMode: 'vertex' | 'instance',\n): Omit<GPUVertexBufferLayout, 'attributes'> | null {\n // check if the type is a primitive (f32, i32, u32, or a vector)\n if ('expressionCode' in type) {\n return {\n arrayStride: type.size,\n stepMode: stepMode,\n };\n }\n // if the data type is an array, check if the element type is valid\n // as arrayOf(arrayOf(f32, x), y) would still be valid - we do it recursively\n if (isArraySchema(type)) {\n return getVertexLayoutIfValid(type.elementType, stepMode);\n }\n return null;\n}\n","import {\n type Storage,\n type TgpuBuffer,\n type Uniform,\n isBuffer,\n isUsableAsStorage,\n isUsableAsUniform,\n} from './core/buffer/buffer';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n type TgpuBufferUsage,\n isBufferUsage,\n} from './core/buffer/bufferUsage';\nimport { NotUniformError } from './errors';\nimport type { TgpuNamable } from './namable';\nimport type { TgpuSampler } from './tgpuSampler';\nimport type { AnyTgpuData, OmitProps, TgpuShaderStage } from './types';\nimport type { Unwrapper } from './unwrapper';\n\n// ----------\n// Public API\n// ----------\n\nexport type TgpuLayoutEntryBase = {\n /**\n * Limits this resource's visibility to specific shader stages.\n *\n * By default, each resource is visible to all shader stage types, but\n * depending on the underlying implementation, this may have performance implications.\n *\n * @default ['compute'] for mutable resources\n * @default ['compute','vertex','fragment'] for everything else\n */\n visibility?: TgpuShaderStage[];\n};\n\nexport type TgpuLayoutUniform = TgpuLayoutEntryBase & {\n uniform: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);\n};\n\nexport type TgpuLayoutStorage = TgpuLayoutEntryBase & {\n storage: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);\n /** @default 'readonly' */\n access?: 'mutable' | 'readonly';\n};\n\nexport type TgpuLayoutSampler = TgpuLayoutEntryBase & {\n sampler: GPUSamplerBindingType;\n};\nexport type TgpuLayoutTexture<\n TSampleType extends GPUTextureSampleType = GPUTextureSampleType,\n> = TgpuLayoutEntryBase & {\n /**\n * - 'float' - f32\n * - 'unfilterable-float' - f32, cannot be used with filtering samplers\n * - 'depth' - f32\n * - 'sint' - i32\n * - 'uint' - u32\n */\n texture: TSampleType;\n /**\n * @default '2d'\n */\n viewDimension?: GPUTextureViewDimension;\n /**\n * @default false\n */\n multisampled?: boolean;\n};\nexport type TgpuLayoutStorageTexture<\n TFormat extends GPUTextureFormat = GPUTextureFormat,\n> = TgpuLayoutEntryBase & {\n storageTexture: TFormat;\n /** @default 'writeonly' */\n access?: 'readonly' | 'writeonly' | 'mutable';\n /** @default '2d' */\n viewDimension?: GPUTextureViewDimension;\n};\nexport type TgpuLayoutExternalTexture = TgpuLayoutEntryBase & {\n externalTexture: Record<string, never>;\n};\n\nexport type TgpuLayoutEntry =\n | TgpuLayoutUniform\n | TgpuLayoutStorage\n | TgpuLayoutSampler\n | TgpuLayoutTexture\n | TgpuLayoutStorageTexture\n | TgpuLayoutExternalTexture;\n\ntype UnwrapRuntimeConstructorInner<\n T extends AnyTgpuData | ((_: number) => AnyTgpuData),\n> = T extends AnyTgpuData\n ? T\n : T extends (_: number) => infer Return\n ? Return\n : never;\n\nexport type UnwrapRuntimeConstructor<\n T extends AnyTgpuData | ((_: number) => AnyTgpuData),\n> = T extends unknown ? UnwrapRuntimeConstructorInner<T> : never;\n\nexport interface TgpuBindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> extends TgpuNamable {\n readonly resourceType: 'bind-group-layout';\n readonly label: string | undefined;\n readonly entries: Entries;\n // TODO: Expose when implemented\n // readonly bound: {\n // [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n // };\n\n populate(\n entries: {\n [K in keyof OmitProps<Entries, null>]: LayoutEntryToInput<Entries[K]>;\n },\n ): TgpuBindGroup<Entries>;\n\n /**\n * Creates a raw WebGPU resource based on the typed descriptor.\n * NOTE: This creates a new resource every time, better to use `root.unwrap(...)` instead.\n * @param unwrapper Used to unwrap any resources that this resource depends on.\n */\n unwrap(unwrapper: Unwrapper): GPUBindGroupLayout;\n}\n\nexport interface TgpuBindGroupLayoutExperimental<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> extends TgpuBindGroupLayout<Entries> {\n readonly bound: {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n}\n\ntype StorageUsageForEntry<T extends TgpuLayoutStorage> = T extends {\n access?: infer Access;\n} // Is the access defined on the type?\n ? 'mutable' | 'readonly' extends Access // Is the access ambiguous?\n ?\n | TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n : 'readonly' extends Access // Is the access strictly 'readonly'?\n ? TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n : 'mutable' extends Access // Is the access strictly 'mutable'?\n ? TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n :\n | TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n : TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>; // <- access is undefined, so default to 'readonly';\n\nexport type LayoutEntryToInput<T extends TgpuLayoutEntry | null> =\n T extends TgpuLayoutUniform\n ?\n | TgpuBufferUsage<UnwrapRuntimeConstructor<T['uniform']>, 'uniform'>\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & Uniform)\n | GPUBuffer\n : T extends TgpuLayoutStorage\n ?\n | StorageUsageForEntry<T>\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & Storage)\n | GPUBuffer\n : T extends TgpuLayoutSampler\n ? GPUSampler\n : T extends TgpuLayoutTexture\n ? GPUTextureView\n : T extends TgpuLayoutStorageTexture\n ? GPUTextureView\n : T extends TgpuLayoutExternalTexture\n ? GPUExternalTexture\n : never;\n\nexport type BindLayoutEntry<T extends TgpuLayoutEntry | null> =\n T extends TgpuLayoutUniform\n ? TgpuBufferUniform<UnwrapRuntimeConstructor<T['uniform']>>\n : T extends TgpuLayoutStorage\n ? StorageUsageForEntry<T>\n : T extends TgpuLayoutSampler\n ? TgpuSampler\n : never;\n\nexport type TgpuBindGroup<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> = {\n readonly resourceType: 'bind-group';\n readonly layout: TgpuBindGroupLayout<Entries>;\n unwrap(unwrapper: Unwrapper): GPUBindGroup;\n};\n\nexport function bindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayout<Entries> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function bindGroupLayoutExperimental<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayoutExperimental<Entries> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function isBindGroupLayout<T extends TgpuBindGroupLayout>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group-layout';\n}\n\nexport function isBindGroup<T extends TgpuBindGroup>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group';\n}\n\n/**\n * @category Errors\n */\nexport class MissingBindingError extends Error {\n constructor(groupLabel: string | undefined, key: string) {\n super(\n `Bind group '${groupLabel ?? '<unnamed>'}' is missing a required binding '${key}'`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingBindingError.prototype);\n }\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst DEFAULT_MUTABLE_VISIBILITY: TgpuShaderStage[] = ['compute'];\nconst DEFAULT_READONLY_VISIBILITY: TgpuShaderStage[] = [\n 'compute',\n 'vertex',\n 'fragment',\n];\n\nclass TgpuBindGroupLayoutImpl<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n> implements TgpuBindGroupLayoutExperimental<Entries>\n{\n private _label: string | undefined;\n\n public readonly resourceType = 'bind-group-layout' as const;\n\n // TODO: Fill bound values.\n public readonly bound = {} as {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n\n constructor(public readonly entries: Entries) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined): this {\n this._label = label;\n return this;\n }\n\n unwrap(unwrapper: Unwrapper) {\n const unwrapped = unwrapper.device.createBindGroupLayout({\n label: this.label ?? '',\n entries: Object.values(this.entries)\n .map((entry, idx) => {\n if (entry === null) {\n return null;\n }\n\n let visibility = entry.visibility;\n\n const binding: GPUBindGroupLayoutEntry = {\n binding: idx,\n visibility: 0,\n };\n\n if ('uniform' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.buffer = {\n type: 'uniform' as const,\n };\n } else if ('storage' in entry) {\n visibility =\n visibility ??\n (entry.access === 'mutable'\n ? DEFAULT_MUTABLE_VISIBILITY\n : DEFAULT_READONLY_VISIBILITY);\n\n binding.buffer = {\n type:\n entry.access === 'mutable'\n ? ('storage' as const)\n : ('read-only-storage' as const),\n };\n } else if ('sampler' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.sampler = {\n type: entry.sampler,\n };\n } else if ('texture' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.texture = {\n sampleType: entry.texture,\n viewDimension: entry.viewDimension ?? '2d',\n multisampled: entry.multisampled ?? false,\n };\n } else if ('storageTexture' in entry) {\n const access = entry.access ?? 'writeonly';\n\n visibility =\n visibility ??\n (access === 'readonly'\n ? DEFAULT_READONLY_VISIBILITY\n : DEFAULT_MUTABLE_VISIBILITY);\n\n binding.storageTexture = {\n format: entry.storageTexture,\n access: {\n mutable: 'read-write' as const,\n readonly: 'read-only' as const,\n writeonly: 'write-only' as const,\n }[access],\n viewDimension: entry.viewDimension ?? '2d',\n };\n } else if ('externalTexture' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n binding.externalTexture = {};\n }\n\n if (visibility?.includes('compute')) {\n binding.visibility |= GPUShaderStage.COMPUTE;\n }\n if (visibility?.includes('vertex')) {\n binding.visibility |= GPUShaderStage.VERTEX;\n }\n if (visibility?.includes('fragment')) {\n binding.visibility |= GPUShaderStage.FRAGMENT;\n }\n\n return binding;\n })\n .filter((v): v is Exclude<typeof v, null> => v !== null),\n });\n\n return unwrapped;\n }\n\n populate(\n entries: { [K in keyof Entries]: LayoutEntryToInput<Entries[K]> },\n ): TgpuBindGroup<Entries> {\n return new TgpuBindGroupImpl(this, entries);\n }\n}\n\nclass TgpuBindGroupImpl<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> implements TgpuBindGroup<Entries>\n{\n public readonly resourceType = 'bind-group' as const;\n\n constructor(\n public readonly layout: TgpuBindGroupLayout<Entries>,\n public readonly entries: {\n [K in keyof Entries]: LayoutEntryToInput<Entries[K]>;\n },\n ) {\n // Checking if all entries are present.\n for (const key of Object.keys(layout.entries)) {\n if (layout.entries[key] !== null && !(key in entries)) {\n throw new MissingBindingError(layout.label, key);\n }\n }\n }\n\n public unwrap(unwrapper: Unwrapper): GPUBindGroup {\n const unwrapped = unwrapper.device.createBindGroup({\n label: this.layout.label ?? '',\n layout: unwrapper.unwrap(this.layout),\n entries: Object.entries(this.layout.entries)\n .map(([key, entry], idx) => {\n if (entry === null) {\n return null;\n }\n\n const value = this.entries[key];\n\n if (value === undefined) {\n throw new Error(\n `'${key}' is a resource required to populate bind group layout '${this.layout.label ?? '<unnamed>'}'.`,\n );\n }\n\n if ('uniform' in entry) {\n let resource: GPUBufferBinding;\n\n if (isBuffer(value)) {\n if (!isUsableAsUniform(value)) {\n throw new NotUniformError(value);\n }\n resource = { buffer: unwrapper.unwrap(value) };\n } else if (isBufferUsage(value)) {\n if (!isUsableAsUniform(value.allocatable)) {\n throw new NotUniformError(value.allocatable);\n }\n resource = { buffer: unwrapper.unwrap(value.allocatable) };\n } else {\n resource = { buffer: value as GPUBuffer };\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('storage' in entry) {\n let resource: GPUBufferBinding;\n\n if (isBuffer(value)) {\n if (!isUsableAsStorage(value)) {\n throw new NotUniformError(value);\n }\n resource = { buffer: unwrapper.unwrap(value) };\n } else if (isBufferUsage(value)) {\n if (!isUsableAsStorage(value.allocatable)) {\n throw new NotUniformError(value.allocatable);\n }\n resource = { buffer: unwrapper.unwrap(value.allocatable) };\n } else {\n resource = { buffer: value as GPUBuffer };\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if (\n 'texture' in entry ||\n 'storageTexture' in entry ||\n 'externalTexture' in entry ||\n 'sampler' in entry\n ) {\n return {\n binding: idx,\n resource: value as\n | GPUTextureView\n | GPUExternalTexture\n | GPUSampler,\n };\n }\n\n throw new Error(\n `Malformed bind group entry: ${value} (${JSON.stringify(value)})`,\n );\n })\n .filter((v): v is Exclude<typeof v, null> => v !== null),\n });\n\n return unwrapped;\n }\n}\n","import type { Parsed } from 'typed-binary';\nimport { onGPU } from '../../gpuMode';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport { WeakMemo } from '../../memo';\nimport { type PlumListener, PlumStore } from '../../plumStore';\nimport {\n ComputeProgramBuilder,\n type Program,\n RenderProgramBuilder,\n} from '../../programBuilder';\nimport type { TgpuSettable } from '../../settableTrait';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport { isBindGroup, isBindGroupLayout } from '../../tgpuBindGroupLayout';\nimport type {\n ExtractPlumValue,\n TgpuPlum,\n Unsubscribe,\n} from '../../tgpuPlumTypes';\nimport type { TgpuSampler } from '../../tgpuSampler';\nimport type {\n TgpuAnyTexture,\n TgpuAnyTextureView,\n TgpuTextureExternal,\n} from '../../tgpuTexture';\nimport type { AnyTgpuData } from '../../types';\nimport { type TgpuBuffer, createBufferImpl, isBuffer } from '../buffer/buffer';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n ExperimentalTgpuRoot,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n SetPlumAction,\n} from './rootTypes';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a root can interact via GPU buffers.\n */\nclass TgpuRootImpl implements ExperimentalTgpuRoot {\n private _buffers: TgpuBuffer<AnyTgpuData>[] = [];\n private _samplers = new WeakMap<TgpuSampler, GPUSampler>();\n private _textures = new WeakMap<TgpuAnyTexture, GPUTexture>();\n private _textureViews = new WeakMap<TgpuAnyTextureView, GPUTextureView>();\n private _externalTexturesStatus = new WeakMap<\n TgpuTextureExternal,\n 'dirty' | 'clean'\n >();\n\n private _unwrappedBindGroupLayouts = new WeakMemo(\n (key: TgpuBindGroupLayout) => key.unwrap(this),\n );\n private _unwrappedBindGroups = new WeakMemo((key: TgpuBindGroup) =>\n key.unwrap(this),\n );\n\n private _pipelineExecutors: PipelineExecutor[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n private readonly _plumStore = new PlumStore();\n\n constructor(\n public readonly device: GPUDevice,\n public readonly jitTranspiler: JitTranspiler | undefined,\n ) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n ): TgpuBuffer<TData> {\n const buffer = createBufferImpl(this, typeSchema, initialOrBuffer).$device(\n this.device,\n );\n\n this._buffers.push(buffer);\n\n return buffer;\n }\n\n destroy() {\n for (const buffer of this._buffers) {\n buffer.destroy();\n }\n }\n\n unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;\n unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;\n unwrap(resource: TgpuBindGroup): GPUBindGroup;\n unwrap(\n resource: TgpuBuffer<AnyTgpuData> | TgpuBindGroupLayout | TgpuBindGroup,\n ): GPUBuffer | GPUBindGroupLayout | GPUBindGroup {\n if (isBuffer(resource)) {\n return resource.buffer;\n }\n\n if (isBindGroupLayout(resource)) {\n return this._unwrappedBindGroupLayouts.getOrMake(resource);\n }\n\n if (isBindGroup(resource)) {\n return this._unwrappedBindGroups.getOrMake(resource);\n }\n\n throw new Error(`Unknown resource type: ${resource}`);\n }\n\n textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture {\n let source: TgpuAnyTexture;\n if ('texture' in view) {\n source = view.texture;\n } else {\n source = view;\n }\n\n let texture = this._textures.get(source);\n\n if (!texture) {\n const descriptor = {\n ...source.descriptor,\n usage: source.flags,\n } as GPUTextureDescriptor;\n texture = this.device.createTexture(descriptor);\n\n if (!texture) {\n throw new Error(`Failed to create texture for ${view}`);\n }\n this._textures.set(source, texture);\n }\n\n return texture;\n }\n\n viewFor(view: TgpuAnyTextureView): GPUTextureView {\n let textureView = this._textureViews.get(view);\n if (!textureView) {\n textureView = this.textureFor(view.texture).createView(view.descriptor);\n this._textureViews.set(view, textureView);\n }\n return textureView;\n }\n\n externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture {\n this._externalTexturesStatus.set(texture, 'clean');\n if (texture.descriptor.source === undefined) {\n throw new Error('External texture source needs to be defined before use');\n }\n return this.device.importExternalTexture(\n texture.descriptor as GPUExternalTextureDescriptor,\n );\n }\n\n samplerFor(sampler: TgpuSampler): GPUSampler {\n let gpuSampler = this._samplers.get(sampler);\n\n if (!gpuSampler) {\n gpuSampler = this.device.createSampler(sampler.descriptor);\n\n if (!gpuSampler) {\n throw new Error(`Failed to create sampler for ${sampler}`);\n }\n this._samplers.set(sampler, gpuSampler);\n }\n\n return gpuSampler;\n }\n\n setSource(\n texture: TgpuTextureExternal,\n source: HTMLVideoElement | VideoFrame,\n ) {\n this._externalTexturesStatus.set(texture, 'dirty');\n texture.descriptor.source = source;\n }\n\n isDirty(texture: TgpuTextureExternal): boolean {\n return this._externalTexturesStatus.get(texture) === 'dirty';\n }\n\n markClean(texture: TgpuTextureExternal) {\n this._externalTexturesStatus.set(texture, 'clean');\n }\n\n readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends TgpuPlum & TgpuSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ) {\n type Value = ExtractPlumValue<TPlum>;\n\n if (typeof value === 'function') {\n const compute = value as (prev: Value) => Value;\n this._plumStore.set(plum, compute(this._plumStore.get(plum)));\n } else {\n this._plumStore.set(plum, value);\n }\n }\n\n onPlumChange<TValue>(\n plum: TgpuPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const { vertexProgram, fragmentProgram } = new RenderProgramBuilder(\n this,\n options.vertex.code,\n options.fragment.code,\n options.vertex.output,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupResolver.getBindGroupLayout(),\n fragmentProgram.bindGroupResolver.getBindGroupLayout(),\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers:\n vertexProgram.bindGroupResolver.getVertexBufferDescriptors() ?? [],\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,\n 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 program = onGPU(() =>\n new ComputeProgramBuilder(\n this,\n options.code,\n options.workgroupSize ?? [1],\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n }),\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.bindGroupResolver.getBindGroupLayout(),\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\ninterface PipelineExecutor {\n execute(\n options: RenderPipelineExecutorOptions | ComputePipelineExecutorOptions,\n ): void;\n}\n\nclass RenderPipelineExecutor implements PipelineExecutor {\n constructor(\n private root: ExperimentalTgpuRoot,\n private pipeline: GPURenderPipeline,\n private vertexProgram: Program,\n private fragmentProgram: Program,\n private externalLayoutCount: number,\n private label?: string,\n ) {}\n\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this.root.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length,\n this.vertexProgram.bindGroupResolver.getBindGroup(),\n );\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + 1,\n this.fragmentProgram.bindGroupResolver.getBindGroup(),\n );\n\n for (const [\n usage,\n index,\n ] of this.vertexProgram.bindGroupResolver.getVertexBuffers()) {\n passEncoder.setVertexBuffer(index, usage.allocatable.buffer);\n }\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor implements PipelineExecutor {\n constructor(\n private root: ExperimentalTgpuRoot,\n private pipeline: GPUComputePipeline,\n private programs: Program[],\n private externalLayoutCount: number,\n private label?: string,\n ) {}\n\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.root.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.bindGroupResolver.getBindGroup(),\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link init}.\n */\nexport type InitOptions = {\n adapter?: GPURequestAdapterOptions | undefined;\n device?: GPUDeviceDescriptor | undefined;\n unstable_jitTranspiler?: JitTranspiler | undefined;\n};\n\n/**\n * Options passed into {@link initFromDevice}.\n */\nexport type InitFromDeviceOptions = {\n device: GPUDevice;\n unstable_jitTranspiler?: JitTranspiler | undefined;\n};\n\n/**\n * Requests a new GPU device and creates a root around it.\n * If a specific device should be used instead, use @see initFromDevice.\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * const root = await tgpu.init();\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 * const root = await tgpu.init({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n */\nexport async function init(\n options?: InitOptions,\n): Promise<ExperimentalTgpuRoot> {\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 TgpuRootImpl(\n await adapter.requestDevice(options?.device),\n options?.unstable_jitTranspiler,\n );\n}\n\n/**\n * Creates a root from the given device, instead of requesting it like @see init.\n *\n * @example\n * ```ts\n * const device: GPUDevice = ...;\n * const root = tgpu.initFromDevice({ device });\n * ```\n */\nexport function initFromDevice(\n options: InitFromDeviceOptions,\n): ExperimentalTgpuRoot {\n return new TgpuRootImpl(options.device, options.unstable_jitTranspiler);\n}\n","import type { Parsed } from 'typed-binary';\nimport { type TgpuBuffer, createBufferImpl } from './core/buffer/buffer';\nimport type { TgpuPlum } from './tgpuPlumTypes';\nimport type { AnyTgpuData } from './types';\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n *\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n *\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return createBufferImpl(undefined, typeSchema, initialOrBuffer);\n}\n","import type { Parsed } from 'typed-binary';\nimport type { TgpuBuffer } from './core/buffer/buffer';\nimport type { AnyTgpuData } from './types';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n data: Parsed<TData>,\n): void {\n buffer.write(data);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n): Promise<Parsed<TData>> {\n return buffer.read();\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';\nimport { inGPUMode } from './gpuMode';\n\nexport const std = {\n add<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} + ${rhs})` as unknown as T;\n }\n return VectorOps.add[lhs.kind](lhs, rhs);\n },\n sub<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} - ${rhs})` as unknown as T;\n }\n return VectorOps.sub[lhs.kind](lhs, rhs);\n },\n mul: <T extends vecBase>(s: number, v: T): T => {\n if (inGPUMode()) {\n return `(${s} * ${v})` as unknown as T;\n }\n return VectorOps.mul[v.kind](s, v);\n },\n dot<T extends vecBase>(lhs: T, rhs: T): number {\n if (inGPUMode()) {\n return `dot(${lhs}, ${rhs})` as unknown as number;\n }\n return VectorOps.dot[lhs.kind](lhs, rhs);\n },\n normalize: <T extends vecBase>(v: T): T => {\n if (inGPUMode()) {\n return `normalize(${v})` as unknown as T;\n }\n return VectorOps.normalize[v.kind](v);\n },\n cross<T extends vec3f | vec3i | vec3u>(a: T, b: T): T {\n if (inGPUMode()) {\n return `cross(${a}, ${b})` as unknown as T;\n }\n return VectorOps.cross[a.kind](a, b);\n },\n fract(a: number): number {\n if (inGPUMode()) {\n return `fract(${a})` as unknown as number;\n }\n return a - Math.floor(a);\n },\n length<T extends vecBase>(vector: T): number {\n if (inGPUMode()) {\n return `length(${vector})` as unknown as number;\n }\n return VectorOps.length[vector.kind](vector);\n },\n sin(radians: number): number {\n if (inGPUMode()) {\n return `sin(${radians})` as unknown as number;\n }\n return Math.sin(radians);\n },\n cos(radians: number): number {\n if (inGPUMode()) {\n return `cos(${radians})` as unknown as number;\n }\n return Math.cos(radians);\n },\n};\n","/**\n * @module typegpu\n */\n\nimport { init, initFromDevice } from './core/root/init';\nimport { createBuffer } from './legacyBufferApi';\nimport { bindGroupLayout } from './tgpuBindGroupLayout';\nimport { read, write } from './tgpuBufferUtils';\n\nexport const tgpu = {\n /** @deprecated Use `'uniform'` string literal instead. */\n Uniform: 'uniform' as const,\n /** @deprecated Use `'storage'` string literal instead. */\n Storage: 'storage' as const,\n /** @deprecated Use `'vertex'` string literal instead. */\n Vertex: 'vertex' as const,\n\n bindGroupLayout,\n\n init,\n initFromDevice,\n\n createBuffer,\n read,\n write,\n};\nexport default tgpu;\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n} from './types';\nexport { std } from './std';\nexport {\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './core/buffer/buffer';\n\nexport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n TgpuLayoutSampler,\n TgpuLayoutUniform,\n BindLayoutEntry,\n LayoutEntryToInput,\n TgpuBindGroup,\n} from './tgpuBindGroupLayout';\nexport type {\n TgpuBuffer,\n Uniform,\n Storage,\n Vertex,\n} from './core/buffer/buffer';\n"]}
1
+ {"version":3,"sources":["../src/memo.ts","../src/tgpuPlumTypes.ts","../src/plumStore.ts","../src/core/root/rootTypes.ts","../src/tgpuSampler.ts","../src/tgpuTexture.ts","../src/bindGroupResolver.ts","../src/builtin.ts","../src/builtinDataTypes.ts","../src/nameRegistry.ts","../src/smol/wgslGenerator.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/core/buffer/buffer.ts","../src/core/buffer/bufferUsage.ts","../src/tgpuBindGroupLayout.ts","../src/core/root/init.ts","../src/legacyBufferApi.ts","../src/tgpuBufferUtils.ts","../src/data/vectorOps.ts","../src/std.ts","../src/index.ts"],"names":["WeakMemo","_make","__publicField","key","args","value","TgpuExternalPlumTrait","isExternalPlum","isPlum","PlumStore","plum","state","dependencies","listeners","listener","getter","dep","depState","unsub","dirty","prevVersion","externalUnsub","unsubs","typeToVertexFormatMap","deriveVertexFormat","typeSchema","code","format","isSampler","resource","isExternalTexture","texture","isTextureView","usageToBindingTypeMap","BindGroupResolver","root","context","shaderStage","renderResources","vertexBuffers","index","buffer","entries","textureView","external","sampler","layout","bindGroup","vertexBufferDescriptors","idx","__spreadProps","__spreadValues","_a","TgpuBuiltinImpl","name","builtinNameToSymbol","ctx","builtin","builtinToType","u32","vec4f","arrayOf","f32","vec3u","typeForBuiltin","dataType","RandomNameRegistry","item","label","resolveRes","res","isWgsl","assertExhaustive","generateBoolean","bool","generateBlock","statement","generateStatement","generateIdentifier","id","generateExpression","expression","lhs","op","rhs","lhsExpr","rhsExpr","UnknownData","targetId","property","target","propertyStr","isResolvable","targetStr","idValue","argValues","arg","condition","consequent","alternate","eq","generateFunction","body","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","jitTranspiler","bindable","nextIdx","declaration","ItemStateStack","pairs","returnType","externalMap","layer","slot","i","boundValue","a","declarationType","INDENT","N","IndentController","str","ResolutionCtxImpl","opts","fn","shell","argNames","argList","identifier","group","isSamplerType","isExternalTextureType","isDepthTextureType","MissingSlotValueError","eventual","maybeSlot","isSlot","instances","instance","expectedValue","result","slotToValueMap","usedSlot","err","ResolutionError","slotValueOverrides","pushedLayer","onGPU","ProgramBuilder","rootNode","options","codeString","getUsedBuiltinsNamed","rec","builtinSymbol","builtinSymbolToName","RenderProgramBuilder","vertexRoot","fragmentRoot","vertexOutputFormat","_b","_c","_d","symbolOutputs","symbol","vertexOutputBuiltinObjects","vertexOutput","varInfo","structFields","outputName","nameForBuiltin","vertexContext","elem","vertexUserArgs","entry","vertexArgs","idForBuiltin","vertexCode","fragmentContext","fragmentBuiltinArgs","fragmentInputs","fragmentArgs","fragmentCode","vertexProgram","fragmentProgram","ComputeProgramBuilder","computeRoot","workgroupSize","builtinArgs","workgroupSizeDeclaration","shaderCode","BufferReader","BufferWriter","createBufferImpl","initialOrBuffer","TgpuBufferImpl","isBuffer","isUsableAsUniform","isUsableAsStorage","isUsableAsVertex","_group","isGPUBuffer","writer","usages","usage","flags","device","dataOrBuffer","gpuBuffer","mapped","size","sourceBuffer","commandEncoder","hostBuffer","stagingBuffer","isBufferUsage","bindGroupLayout","TgpuBindGroupLayoutImpl","isBindGroupLayout","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","unwrapper","visibility","binding","access","v","TgpuBindGroupImpl","NotUniformError","TgpuRootImpl","view","source","descriptor","gpuSampler","compute","_e","_f","_g","_h","_i","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","program","shaderModule","computePipeline","ComputePipelineExecutor","pipeline","externalLayoutCount","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","__objRest","passEncoder","programs","workgroups","init","adapter","initFromDevice","createBuffer","write","data","read","lengthVec2","lengthVec3","lengthVec4","VectorOps","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec4i","vec4u","s","len","std","inGPUMode","vector","radians","tgpu","src_default"],"mappings":"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","sourcesContent":["/**\n * Caches results of the function passed in as\n * the argument to the constructor.\n *\n * If the key can be garbage collected, it will be.\n */\nexport class WeakMemo<TKey extends object, TValue, TArgs extends unknown[]> {\n private readonly _map = new WeakMap<TKey, TValue>();\n\n constructor(private readonly _make: (key: TKey, ...args: TArgs) => TValue) {}\n\n getOrMake(key: TKey, ...args: TArgs): TValue {\n if (this._map.has(key)) {\n return this._map.get(key) as TValue;\n }\n\n const value = this._make(key, ...args);\n this._map.set(key, value);\n return value;\n }\n}\n","import type { TgpuNamable } from './namable';\n\nexport type Getter = <T>(plum: TgpuPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends TgpuPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface TgpuPlum<TValue = unknown> extends TgpuNamable {\n readonly __brand: 'TgpuPlum';\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 TgpuExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the root.`,\n);\n\nexport interface TgpuExternalPlum {\n readonly [TgpuExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | TgpuExternalPlum,\n): value is TgpuExternalPlum {\n return (value as TgpuExternalPlum)[TgpuExternalPlumTrait] === true;\n}\n\nexport function isPlum<T>(value: TgpuPlum<T> | unknown): value is TgpuPlum<T> {\n return (value as TgpuPlum).__brand === 'TgpuPlum';\n}\n","import type { TgpuSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type TgpuPlum,\n isExternalPlum,\n} from './tgpuPlumTypes';\n\nexport type PlumListener<T> = (newValue: T) => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<TgpuPlum, number>;\n active?: PlumActiveState<T> | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState<T> = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<PlumListener<T>>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<TgpuPlum, 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: TgpuPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: TgpuPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n } as PlumState<T>;\n\n this._stateMap.set(plum, state as PlumState);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: TgpuPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener(state.value);\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: TgpuPlum<T>) {\n const dependencies = new Map<TgpuPlum, number>();\n\n const getter = (<T>(dep: TgpuPlum<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: TgpuPlum<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 TgpuPlum>(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: TgpuPlum<T> & TgpuSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe<T>(plum: TgpuPlum<T>, listener: PlumListener<T>): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","import type { Parsed } from 'typed-binary';\n\nimport type { TgpuArray } from '../../data/array';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport type { PlumListener } from '../../plumStore';\nimport type { TgpuSettable } from '../../settableTrait';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport type {\n ExtractPlumValue,\n TgpuPlum,\n Unsubscribe,\n} from '../../tgpuPlumTypes';\nimport type { TgpuSampler } from '../../tgpuSampler';\nimport type {\n TgpuAnyTexture,\n TgpuAnyTextureView,\n TgpuTextureExternal,\n} from '../../tgpuTexture';\nimport type {\n AnyTgpuData,\n BoundTgpuCode,\n TgpuCode,\n TgpuData,\n} from '../../types';\nimport type { Unwrapper } from '../../unwrapper';\nimport type { TgpuBuffer } from '../buffer/buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport type SetPlumAction<T> = T | ((prev: T) => T);\n\nexport interface TgpuRoot extends Unwrapper {\n /**\n * The GPU device associated with this root.\n */\n readonly device: GPUDevice;\n\n /**\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n ): TgpuBuffer<TData>;\n\n /**\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n ): TgpuBuffer<TData>;\n\n unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;\n unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;\n unwrap(resource: TgpuBindGroup): GPUBindGroup;\n\n destroy(): void;\n}\n\nexport interface ExperimentalTgpuRoot extends TgpuRoot {\n readonly jitTranspiler?: JitTranspiler | undefined;\n /**\n * The current command encoder. This property will\n * hold the same value until `flush()` is called.\n */\n readonly commandEncoder: GPUCommandEncoder;\n\n readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum>;\n\n setPlum<TPlum extends TgpuPlum & TgpuSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ): void;\n\n onPlumChange<TValue>(\n plum: TgpuPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe;\n\n setSource(\n texture: TgpuTextureExternal,\n source: HTMLVideoElement | VideoFrame,\n ): void;\n\n isDirty(texture: TgpuTextureExternal): boolean;\n markClean(texture: TgpuTextureExternal): void;\n\n textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture;\n viewFor(view: TgpuAnyTextureView): GPUTextureView;\n externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture;\n samplerFor(sampler: TgpuSampler): GPUSampler;\n\n /**\n * Causes all commands enqueued by pipelines to be\n * submitted to the GPU.\n */\n flush(): void;\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;\n makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;\n}\n\nexport interface RenderPipelineOptions {\n vertex: {\n code: TgpuCode | BoundTgpuCode;\n output: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyTgpuData;\n };\n };\n fragment: {\n code: TgpuCode | BoundTgpuCode;\n target: Iterable<GPUColorTargetState | null>;\n };\n primitive: GPUPrimitiveState;\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport interface ComputePipelineOptions {\n code: TgpuCode | BoundTgpuCode;\n workgroupSize?: readonly [number, number?, number?];\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {\n vertexCount: number;\n instanceCount?: number;\n firstVertex?: number;\n firstInstance?: number;\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface RenderPipelineExecutor {\n execute(options: RenderPipelineExecutorOptions): void;\n}\n\nexport type ComputePipelineExecutorOptions = {\n workgroups?: readonly [number, number?, number?];\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface ComputePipelineExecutor {\n execute(options?: ComputePipelineExecutorOptions): void;\n}\n\nconst typeToVertexFormatMap: Record<string, GPUVertexFormat> = {\n f32: 'float32',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n u32: 'uint32',\n vec2u: 'uint32x2',\n vec3u: 'uint32x3',\n vec4u: 'uint32x4',\n i32: 'sint32',\n vec2i: 'sint32x2',\n vec3i: 'sint32x3',\n vec4i: 'sint32x4',\n};\n\nexport function deriveVertexFormat<\n TData extends TgpuData<AnyTgpuData> | TgpuArray<AnyTgpuData>,\n>(typeSchema: TData): GPUVertexFormat {\n if ('expressionCode' in typeSchema) {\n const code = typeSchema.expressionCode as string;\n const format = typeToVertexFormatMap[code];\n if (!format) {\n throw new Error(`Unsupported vertex format: ${code}`);\n }\n return format;\n }\n if ('elementType' in typeSchema) {\n return deriveVertexFormat(typeSchema.elementType as TData);\n }\n throw new Error('Invalid vertex format schema');\n}\n","import type { TgpuNamable } from './namable';\nimport { identifier } from './tgpuIdentifier';\nimport type {\n ResolutionCtx,\n TgpuRenderResource,\n TgpuSamplerType,\n} from './types';\n\nexport interface TgpuSampler extends TgpuRenderResource, TgpuNamable {\n readonly descriptor: GPUSamplerDescriptor;\n}\n\nexport function sampler(descriptor: GPUSamplerDescriptor): TgpuSampler {\n return new TgpuSamplerImpl(descriptor);\n}\n\nclass TgpuSamplerImpl implements TgpuSampler {\n private _label: string | undefined;\n private _type: TgpuSamplerType;\n\n constructor(public readonly descriptor: GPUSamplerDescriptor) {\n if (descriptor.compare === undefined) this._type = 'sampler';\n else this._type = 'sampler_comparison';\n }\n\n get label() {\n return this._label;\n }\n\n get type() {\n return this._type;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nexport function isSampler(\n resource: TgpuRenderResource,\n): resource is TgpuSampler {\n return resource.type === 'sampler' || resource.type === 'sampler_comparison';\n}\n","import { vec4f, vec4i, vec4u } from './data';\nimport type { TgpuNamable } from './namable';\nimport type {\n SampledTextureParams,\n StorageTextureAccess,\n StorageTextureParams,\n TexelFormat,\n TextureScalarFormat,\n} from './textureTypes';\nimport { identifier } from './tgpuIdentifier';\nimport { isSampler } from './tgpuSampler';\nimport type {\n ResolutionCtx,\n TextureUsage,\n TgpuRenderResource,\n TgpuRenderResourceType,\n} from './types';\n\ntype Optional<T> = {\n [P in keyof T]?: T[P] | undefined;\n};\n\nexport interface TgpuAnyTextureView extends TgpuRenderResource {\n readonly descriptor: GPUTextureViewDescriptor;\n readonly texture: TgpuAnyTexture;\n readonly dataType: TextureScalarFormat | TexelFormat;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface TgpuAnyTexture {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get flags(): GPUTextureUsageFlags;\n}\n\nexport interface TgpuTexture<TAllows extends TextureUsage = never>\n extends TgpuNamable {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get label(): string | undefined;\n get flags(): GPUTextureUsageFlags;\n\n $allowSampled(): TgpuTexture<TAllows | 'sampled'>;\n $allowStorage(): TgpuTexture<TAllows | 'storage'>;\n\n asStorage(\n params: StorageTextureParams,\n ): 'storage' extends TAllows ? TgpuTextureView<TexelFormat, 'storage'> : null;\n asSampled(\n params: SampledTextureParams,\n ): 'sampled' extends TAllows\n ? TgpuTextureView<typeof params.dataType, 'sampled'>\n : null;\n}\n\nexport interface TgpuTextureView<\n TData extends TextureScalarFormat | TexelFormat,\n TUsage extends TextureUsage,\n> extends TgpuRenderResource,\n TgpuNamable {\n readonly texture: TgpuTexture<TUsage>;\n readonly descriptor: Omit<GPUTextureViewDescriptor, 'usage'>;\n readonly type: TgpuRenderResourceType;\n readonly dataType: TData;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface TgpuTextureExternal extends TgpuRenderResource, TgpuNamable {\n readonly descriptor: Optional<GPUExternalTextureDescriptor>;\n get source(): HTMLVideoElement | VideoFrame | undefined;\n}\n\nexport function texture<TUsage extends TextureUsage = never>(\n descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n): TgpuTexture<TUsage> {\n return new TgpuTextureImpl(descriptor);\n}\n\nexport function textureExternal(\n source?: HTMLVideoElement | VideoFrame,\n colorSpace?: PredefinedColorSpace,\n): TgpuTextureExternal {\n return new TgpuTextureExternalImpl(source, colorSpace);\n}\n\nclass TgpuTextureImpl<TAllows extends TextureUsage = never>\n implements TgpuTexture<TAllows>, TgpuAnyTexture\n{\n private _flags: GPUTextureUsageFlags =\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.COPY_SRC |\n GPUTextureUsage.RENDER_ATTACHMENT;\n private _allowedUsages: {\n sampled: Map<\n string,\n TgpuTextureView<TextureScalarFormat, 'sampled'>\n > | null;\n storage: Map<string, TgpuTextureView<TexelFormat, 'storage'>> | null;\n } = {\n sampled: null,\n storage: null,\n };\n private _label: string | undefined;\n\n constructor(\n public readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get flags() {\n return this._flags;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $addFlags(flags: GPUTextureUsageFlags) {\n this._flags |= flags;\n return this;\n }\n\n $allowSampled() {\n const enrichedThis = this as TgpuTexture<TAllows | 'sampled'>;\n if (!this._allowedUsages.sampled) {\n this._allowedUsages.sampled = new Map();\n }\n this.$addFlags(GPUTextureUsage.TEXTURE_BINDING);\n return enrichedThis;\n }\n\n $allowStorage() {\n const enrichedThis = this as TgpuTexture<TAllows | 'storage'>;\n if (!this._allowedUsages.storage) {\n this._allowedUsages.storage = new Map();\n }\n this.$addFlags(GPUTextureUsage.STORAGE_BINDING);\n return enrichedThis;\n }\n\n private getStorageIfAllowed(\n params: StorageTextureParams,\n ): TgpuTextureView<TexelFormat, 'storage'> | null {\n if (!this._allowedUsages.storage) {\n return null;\n }\n const stringified = hashFromShallowObj(params);\n const existing = this._allowedUsages.storage.get(stringified);\n if (existing) {\n return existing;\n }\n const type = texelFormatToTgpuType[this.descriptor.format];\n if (!type) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n const view = new TgpuTextureViewImpl(\n params.type,\n this,\n type,\n params.descriptor,\n params.access,\n ) as unknown as TgpuTextureView<typeof type, 'storage'>;\n this._allowedUsages.storage.set(stringified, view);\n return view;\n }\n\n private getSampledIfAllowed(\n params: SampledTextureParams,\n ): TgpuTextureView<TextureScalarFormat, 'sampled'> | null {\n if (!this._allowedUsages.sampled) {\n return null;\n }\n const stringified = hashFromShallowObj({\n type: params.type,\n dataType: String(params.dataType),\n });\n const existing = this._allowedUsages.sampled.get(stringified);\n if (existing) {\n return existing;\n }\n const view = new TgpuTextureViewImpl(\n params.type,\n this,\n params.dataType,\n params.descriptor,\n ) as unknown as TgpuTextureView<typeof params.dataType, 'sampled'>;\n this._allowedUsages.sampled.set(stringified, view);\n return view;\n }\n\n asStorage(params: StorageTextureParams) {\n const maybeView = this.getStorageIfAllowed(params);\n const maybeType = texelFormatToTgpuType[this.descriptor.format];\n if (!maybeType) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n return maybeView as 'storage' extends TAllows\n ? TgpuTextureView<typeof maybeType, 'storage'>\n : null;\n }\n\n asSampled(params: SampledTextureParams) {\n return this.getSampledIfAllowed(params) as 'sampled' extends TAllows\n ? TgpuTextureView<typeof params.dataType, 'sampled'>\n : null;\n }\n}\n\nclass TgpuTextureViewImpl<\n TData extends TextureScalarFormat | TexelFormat,\n TUsage extends TextureUsage,\n> implements TgpuTextureView<TData, TUsage>, TgpuAnyTextureView\n{\n private _label: string | undefined;\n\n constructor(\n public readonly type: TgpuRenderResourceType,\n public readonly texture: TgpuTexture<TUsage>,\n public readonly dataType: TData,\n public readonly descriptor: GPUTextureViewDescriptor = {},\n public readonly access: StorageTextureAccess | undefined = undefined,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nclass TgpuTextureExternalImpl implements TgpuTextureExternal {\n private _label: string | undefined;\n public readonly type = 'texture_external';\n public readonly descriptor: Optional<GPUExternalTextureDescriptor>;\n\n constructor(\n source: HTMLVideoElement | VideoFrame | undefined,\n colorSpace: PredefinedColorSpace | undefined,\n ) {\n this.descriptor = { source, colorSpace };\n }\n\n get label() {\n return this._label;\n }\n\n get source() {\n return this.descriptor.source;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nexport function isExternalTexture(\n texture: TgpuRenderResource,\n): texture is TgpuTextureExternal {\n return !('texture' in texture) && !isSampler(texture);\n}\n\nexport function isTextureView(\n texture: TgpuRenderResource,\n): texture is TgpuAnyTextureView {\n return 'texture' in texture;\n}\n\nconst texelFormatToTgpuType: Record<string, TexelFormat> = {\n rgba8unorm: vec4f,\n rgba8snorm: vec4f,\n rgba8uint: vec4u,\n rgba8sint: vec4i,\n rgba16uint: vec4u,\n rgba16sint: vec4i,\n rgba16float: vec4f,\n r32uint: vec4u,\n r32sint: vec4i,\n r32float: vec4f,\n rg32uint: vec4u,\n rg32sint: vec4i,\n rg32float: vec4f,\n rgba32uint: vec4u,\n rgba32sint: vec4i,\n rgba32float: vec4f,\n bgra8unorm: vec4f,\n};\n\nfunction hashFromShallowObj(obj: object): string {\n const withKeysSorted = Object.fromEntries(\n Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n return JSON.stringify(withKeysSorted);\n}\n","import type { TgpuBufferVertex } from './core/buffer/bufferUsage';\nimport {\n type ExperimentalTgpuRoot,\n deriveVertexFormat,\n} from './core/root/rootTypes';\nimport type { ResolutionCtxImpl } from './resolutionCtx';\nimport { type TgpuSampler, isSampler } from './tgpuSampler';\nimport {\n type TgpuAnyTextureView,\n type TgpuTextureExternal,\n isExternalTexture,\n isTextureView,\n} from './tgpuTexture';\nimport type { AnyTgpuData, BufferUsage, TgpuBindable, TgpuData } from './types';\n\nconst usageToBindingTypeMap: Record<\n Exclude<BufferUsage, 'vertex'>,\n GPUBufferBindingType\n> = {\n uniform: 'uniform',\n mutable: 'storage',\n readonly: 'read-only-storage',\n};\n\nexport class BindGroupResolver {\n private samplers: TgpuSampler[] = [];\n private textureViews: TgpuAnyTextureView[] = [];\n private externalTextures: TgpuTextureExternal[] = [];\n private buffers: TgpuBindable<AnyTgpuData, BufferUsage>[] = [];\n private vertexBuffers: Map<TgpuBufferVertex<AnyTgpuData>, number> | null =\n null;\n\n private layout: GPUBindGroupLayout | null = null;\n private bindGroup: GPUBindGroup | null = null;\n private vertexLayout: GPUVertexBufferLayout[] | null = null;\n\n constructor(\n private root: ExperimentalTgpuRoot,\n private context: ResolutionCtxImpl,\n public readonly shaderStage: number,\n ) {\n const renderResources = Array.from(context.usedRenderResources);\n for (const resource of renderResources) {\n if (isSampler(resource)) {\n this.samplers.push(resource);\n } else if (isTextureView(resource)) {\n this.textureViews.push(resource);\n } else if (isExternalTexture(resource)) {\n this.externalTextures.push(resource);\n } else {\n throw new Error(`Invalid resource type: ${resource}`);\n }\n }\n this.buffers = Array.from(context.usedBindables);\n }\n\n setVertexBuffers(\n vertexBuffers: {\n index: number;\n buffer: TgpuBufferVertex<AnyTgpuData>;\n }[],\n ) {\n if (this.shaderStage !== GPUShaderStage.VERTEX) {\n throw new Error('Vertex buffers can only be set for vertex shader');\n }\n this.vertexBuffers = new Map(\n vertexBuffers.map(({ index, buffer }) => [buffer, index]),\n );\n }\n\n getBindGroupLayout() {\n if (this.layout) {\n return this.layout;\n }\n\n const entries: GPUBindGroupLayoutEntry[] = [];\n for (const textureView of this.textureViews) {\n if (textureView.access === undefined) {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n visibility: this.shaderStage,\n texture: {},\n });\n } else {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n visibility: this.shaderStage,\n storageTexture: { format: textureView.texture.descriptor.format },\n });\n }\n }\n for (const external of this.externalTextures) {\n entries.push({\n binding: this.context.getIndexFor(external),\n visibility: this.shaderStage,\n externalTexture: {},\n });\n }\n for (const sampler of this.samplers) {\n entries.push({\n binding: this.context.getIndexFor(sampler),\n visibility: this.shaderStage,\n sampler: {},\n });\n }\n for (const buffer of this.buffers) {\n if (buffer.usage === 'vertex') continue;\n entries.push({\n binding: this.context.getIndexFor(buffer),\n visibility: this.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[buffer.usage],\n },\n });\n }\n const layout = this.root.device.createBindGroupLayout({\n entries,\n });\n this.layout = layout;\n return layout;\n }\n\n getBindGroup() {\n this.checkBindGroupInvalidation();\n\n if (this.bindGroup) {\n return this.bindGroup;\n }\n\n const entries: GPUBindGroupEntry[] = [];\n for (const textureView of this.textureViews) {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n resource: this.root.viewFor(textureView),\n });\n }\n for (const external of this.externalTextures) {\n entries.push({\n binding: this.context.getIndexFor(external),\n resource: this.root.externalTextureFor(external),\n });\n }\n for (const sampler of this.samplers) {\n entries.push({\n binding: this.context.getIndexFor(sampler),\n resource: this.root.samplerFor(sampler),\n });\n }\n for (const buffer of this.buffers) {\n if (buffer.usage === 'vertex') continue;\n entries.push({\n binding: this.context.getIndexFor(buffer),\n resource: {\n buffer: buffer.allocatable.buffer,\n },\n });\n }\n const bindGroup = this.root.device.createBindGroup({\n layout: this.getBindGroupLayout(),\n entries,\n });\n\n this.bindGroup = bindGroup;\n return bindGroup;\n }\n\n getBindings() {\n return {\n bindGroupLayout: this.getBindGroupLayout(),\n bindGroup: this.getBindGroup(),\n };\n }\n\n getVertexBufferDescriptors() {\n if (this.vertexBuffers === null) {\n throw new Error('Vertex buffers not set');\n }\n\n if (this.vertexLayout) {\n return this.vertexLayout;\n }\n\n const vertexBufferDescriptors: GPUVertexBufferLayout[] = [];\n for (const [buffer, idx] of this.vertexBuffers.entries()) {\n vertexBufferDescriptors.push({\n ...buffer.vertexLayout,\n attributes: [\n {\n shaderLocation: idx,\n offset: 0,\n format: deriveVertexFormat(\n buffer.allocatable.dataType as TgpuData<AnyTgpuData>,\n ),\n },\n ],\n });\n }\n\n this.vertexLayout = vertexBufferDescriptors;\n return vertexBufferDescriptors;\n }\n\n getVertexBuffers() {\n if (this.vertexBuffers === null) {\n throw new Error('Vertex buffers not set');\n }\n return this.vertexBuffers.entries();\n }\n\n getVertexBufferIndex(buffer: TgpuBufferVertex<AnyTgpuData>) {\n const index = this.vertexBuffers?.get(buffer);\n if (this.vertexBuffers === null || index === undefined) {\n throw new Error('Vertex buffers not set');\n }\n return index;\n }\n\n invalidateBindGroup() {\n this.bindGroup = null;\n }\n\n checkBindGroupInvalidation() {\n for (const texture of this.externalTextures) {\n // check if texture is dirty (changed source) -> if so, invalidate bind group and mark clean\n if (this.root.isDirty(texture)) {\n this.invalidateBindGroup();\n this.root.markClean(texture);\n continue;\n }\n\n // check if any external texture is of type HTMLVideoElement -> if so, invalidate bind group as it expires on bind\n if (texture.source instanceof HTMLVideoElement) {\n this.invalidateBindGroup();\n }\n }\n }\n}\n","import type { vec3u, vec4f } from './data';\n\nimport { type BuiltinName, builtinNameToSymbol } from './builtinIdentifiers';\nimport { code } from './tgpuCode';\nimport type { ResolutionCtx, TgpuResolvable } from './types';\n\nexport interface TgpuBuiltin extends TgpuResolvable {\n readonly name: BuiltinName;\n readonly s: symbol;\n}\n\nclass TgpuBuiltinImpl implements TgpuBuiltin {\n public readonly s: symbol;\n\n constructor(public readonly name: BuiltinName) {\n this.s = builtinNameToSymbol.get(name) as symbol;\n }\n\n get label() {\n return this.name;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(code`${this.s}`);\n }\n}\n\nexport type BuiltinVertexIndex = TgpuBuiltin & number;\nexport type BuiltinInstanceIndex = TgpuBuiltin & number;\nexport type BuiltinPosition = TgpuBuiltin & vec4f;\nexport type BuiltinClipDistances = TgpuBuiltin & number[];\nexport type BuiltinFrontFacing = TgpuBuiltin & boolean;\nexport type BuiltinFragDepth = TgpuBuiltin & number;\nexport type BuiltinSampleIndex = TgpuBuiltin & number;\nexport type BuiltinSampleMask = TgpuBuiltin & vec4f;\nexport type BuiltinFragment = TgpuBuiltin & vec4f;\nexport type BuiltinLocalInvocationId = TgpuBuiltin & vec3u;\nexport type BuiltinLocalInvocationIndex = TgpuBuiltin & number;\nexport type BuiltinGlobalInvocationId = TgpuBuiltin & vec3u;\nexport type BuiltinWorkgroupId = TgpuBuiltin & vec3u;\nexport type BuiltinNumWorkgroups = TgpuBuiltin & vec3u;\n\nexport const builtin = {\n vertexIndex: new TgpuBuiltinImpl('vertex_index') as BuiltinVertexIndex,\n instanceIndex: new TgpuBuiltinImpl('instance_index') as BuiltinInstanceIndex,\n position: new TgpuBuiltinImpl('position') as BuiltinPosition,\n clipDistances: new TgpuBuiltinImpl('clip_distances') as BuiltinClipDistances,\n frontFacing: new TgpuBuiltinImpl('front_facing') as BuiltinFrontFacing,\n fragDepth: new TgpuBuiltinImpl('frag_depth') as BuiltinFragDepth,\n sampleIndex: new TgpuBuiltinImpl('sample_index') as BuiltinSampleIndex,\n sampleMask: new TgpuBuiltinImpl('sample_mask') as BuiltinSampleMask,\n fragment: new TgpuBuiltinImpl('fragment') as BuiltinFragment,\n localInvocationId: new TgpuBuiltinImpl(\n 'local_invocation_id',\n ) as BuiltinLocalInvocationId,\n localInvocationIndex: new TgpuBuiltinImpl(\n 'local_invocation_index',\n ) as BuiltinLocalInvocationIndex,\n globalInvocationId: new TgpuBuiltinImpl(\n 'global_invocation_id',\n ) as BuiltinGlobalInvocationId,\n workgroupId: new TgpuBuiltinImpl('workgroup_id') as BuiltinWorkgroupId,\n numWorkgroups: new TgpuBuiltinImpl('num_workgroups') as BuiltinNumWorkgroups,\n} as const;\n\ntype Builtin = (typeof builtin)[keyof typeof builtin];\n\nexport type OmitBuiltins<S extends object> = {\n [Key in keyof S as S[Key] extends Builtin ? never : Key]: S[Key];\n};\n","import { builtin } from './builtin';\nimport {\n type F32,\n type TgpuArray,\n type U32,\n type Vec3u,\n type Vec4f,\n arrayOf,\n f32,\n u32,\n vec3u,\n vec4f,\n} from './data';\n\nexport type BuiltInPossibleTypes = U32 | F32 | Vec3u | Vec4f | TgpuArray<U32>;\n\nconst builtinToType: Record<symbol, BuiltInPossibleTypes> = {\n [builtin.vertexIndex.s]: u32,\n [builtin.instanceIndex.s]: u32,\n [builtin.position.s]: vec4f,\n [builtin.clipDistances.s]: arrayOf(u32, 8),\n [builtin.frontFacing.s]: f32,\n [builtin.fragDepth.s]: f32,\n [builtin.sampleIndex.s]: u32,\n [builtin.sampleMask.s]: u32,\n [builtin.fragment.s]: vec4f,\n [builtin.localInvocationId.s]: vec3u,\n [builtin.localInvocationIndex.s]: u32,\n [builtin.globalInvocationId.s]: vec3u,\n [builtin.workgroupId.s]: vec3u,\n [builtin.numWorkgroups.s]: vec3u,\n};\n\nexport function typeForBuiltin(key: symbol): BuiltInPossibleTypes {\n const dataType = builtinToType[key];\n if (!dataType) {\n throw new Error(`The symbol ${String(key)} in not a valid 'builtin'`);\n }\n\n return dataType;\n}\n","import type { TgpuResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: TgpuResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<TgpuResolvable, string>();\n\n nameFor(item: TgpuResolvable) {\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<TgpuResolvable, string>();\n\n nameFor(item: TgpuResolvable): 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 { bool } from '../data';\nimport {\n type ResolutionCtx,\n type Resource,\n UnknownData,\n type Wgsl,\n isResolvable,\n isWgsl,\n} from '../types';\nimport type * as smol from './nodes';\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n indent(): string;\n dedent(): string;\n getById(id: string): Resource;\n // getDataType(node: smol.AnyNode): AnyTgpuData;\n};\n\nfunction resolveRes(ctx: GenerationCtx, res: Resource): string {\n if (isWgsl(res.value)) {\n return ctx.resolve(res.value);\n }\n\n return String(res.value);\n}\n\nfunction assertExhaustive(value: unknown): never {\n throw new Error(\n `'${JSON.stringify(value)}' was not handled by the WGSL generator.`,\n );\n}\n\nfunction generateBoolean(ctx: GenerationCtx, value: boolean): Resource {\n return value\n ? { value: 'true', dataType: bool }\n : { value: 'false', dataType: bool };\n}\n\nfunction generateBlock(ctx: GenerationCtx, value: smol.Block): string {\n return `${ctx.indent()}{\n${value.block.map((statement) => generateStatement(ctx, statement)).join('\\n')}\n${ctx.dedent()}}`;\n}\n\nfunction generateIdentifier(ctx: GenerationCtx, id: string): Resource {\n return ctx.getById(id);\n}\n\nfunction generateExpression(\n ctx: GenerationCtx,\n expression: smol.Expression,\n): Resource {\n if (typeof expression === 'string') {\n return generateIdentifier(ctx, expression);\n }\n\n if (typeof expression === 'boolean') {\n return generateBoolean(ctx, expression);\n }\n\n if ('x2' in expression) {\n // Logical/Binary/Assignment Expression\n\n const [lhs, op, rhs] = expression.x2;\n const lhsExpr = resolveRes(ctx, generateExpression(ctx, lhs));\n const rhsExpr = resolveRes(ctx, generateExpression(ctx, rhs));\n return {\n value: `${lhsExpr} ${op} ${rhsExpr}`,\n // TODO: Infer data type from expression type and arguments.\n dataType: UnknownData,\n };\n }\n\n if ('.' in expression) {\n // Member Access\n\n const [targetId, property] = expression['.'];\n const target = generateExpression(ctx, targetId);\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n if (isResolvable(target.value) || typeof target.value === 'object') {\n // NOTE: Temporary solution, assuming that access to `.value` of resolvables should always resolve to just the target.\n if (propertyStr === 'value') {\n return {\n value: resolveRes(ctx, target),\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n return {\n // biome-ignore lint/suspicious/noExplicitAny: <sorry TypeScript>\n value: (target.value as any)[propertyStr],\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n const targetStr = resolveRes(ctx, target);\n\n return {\n value: `${targetStr}.${propertyStr}`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if ('[]' in expression) {\n // Index Access\n\n const [target, property] = expression['[]'];\n const targetStr = resolveRes(ctx, generateExpression(ctx, target));\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n return {\n value: `${targetStr}[${propertyStr}]`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if ('num' in expression) {\n // Numeric Literal\n\n // TODO: Infer numeric data type from literal\n return { value: expression.num, dataType: UnknownData };\n }\n\n if ('call' in expression) {\n // Function Call\n\n const id = generateExpression(ctx, expression.call);\n const idValue = id.value;\n\n const argResources = expression.args.map((arg) =>\n generateExpression(ctx, arg),\n );\n const argValues = argResources.map((res) => resolveRes(ctx, res));\n\n if (isResolvable(idValue) || typeof idValue === 'function') {\n // Assuming that `id` is callable\n // TODO: Pass in resources, not just values.\n const result = (idValue as unknown as (...args: unknown[]) => unknown)(\n ...argValues,\n ) as Wgsl;\n // TODO: Make function calls return resources instead of just values.\n return { value: result, dataType: UnknownData };\n }\n\n return {\n value: `${String(idValue)}(${argValues.join(', ')})`,\n dataType: UnknownData,\n };\n }\n\n assertExhaustive(expression);\n}\n\nfunction generateStatement(\n ctx: GenerationCtx,\n statement: smol.Statement,\n): string {\n if (typeof statement === 'string') {\n return `${ctx.pre}${resolveRes(ctx, generateIdentifier(ctx, statement))};`;\n }\n\n if (typeof statement === 'boolean') {\n return `${ctx.pre}${resolveRes(ctx, generateBoolean(ctx, statement))};`;\n }\n\n if ('return' in statement) {\n return statement.return === null\n ? `${ctx.pre}return;`\n : `${ctx.pre}return ${resolveRes(ctx, generateExpression(ctx, statement.return))};`;\n }\n\n if ('if' in statement) {\n const condition = resolveRes(ctx, generateExpression(ctx, statement.if));\n\n ctx.indent(); // {\n const consequent = generateStatement(ctx, statement.do);\n ctx.dedent(); // }\n\n ctx.indent(); // {\n const alternate = statement.else\n ? generateStatement(ctx, statement.else)\n : undefined;\n ctx.dedent(); // }\n\n if (!alternate) {\n return `\\\n${ctx.pre}if (${condition})\n${consequent}`;\n }\n\n return `\\\n${ctx.pre}if (${condition})\n${consequent}\n${ctx.pre}else\n${alternate}`;\n }\n\n if ('let' in statement || 'const' in statement) {\n const id = resolveRes(\n ctx,\n generateIdentifier(\n ctx,\n 'let' in statement ? statement.let : statement.const,\n ),\n );\n const eq = statement.eq ? generateExpression(ctx, statement.eq) : undefined;\n\n if (!eq) {\n throw new Error('Cannot create variable without an initial value.');\n }\n\n return `${ctx.pre}var ${id} = ${resolveRes(ctx, eq)};`;\n }\n\n if ('block' in statement) {\n // TODO: Push block scope layer onto the stack\n return generateBlock(ctx, statement);\n }\n\n return `${ctx.pre}${resolveRes(ctx, generateExpression(ctx, statement))};`;\n}\n\nexport function generateFunction(ctx: GenerationCtx, body: smol.Block): string {\n return generateBlock(ctx, body);\n}\n","import type { TgpuFnShellBase } from './core/function/fnCore';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { onGPU } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { type Block, generateFunction } from './smol';\nimport { code } from './tgpuCode';\nimport { isTextureView } from './tgpuTexture';\nimport type {\n AnyTgpuData,\n BufferUsage,\n Eventual,\n ResolutionCtx,\n Resource,\n SlotValuePair,\n TgpuBindable,\n TgpuIdentifier,\n TgpuRenderResource,\n TgpuResolvable,\n TgpuSlot,\n Wgsl,\n} from './types';\nimport {\n UnknownData,\n isDepthTextureType,\n isExternalTextureType,\n isResolvable,\n isSamplerType,\n isSlot,\n} from './types';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n readonly jitTranspiler?: JitTranspiler | undefined;\n};\n\ntype SlotToValueMap = Map<TgpuSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<Exclude<BufferUsage, 'vertex'>, string> = {\n uniform: 'uniform',\n mutable: 'storage, read_write',\n readonly: 'storage, read',\n};\n\nclass SharedResolutionState {\n private _nextFreeBindingIdx = 0;\n private _nextFreeVertexBindingIdx = 0;\n private readonly _usedBindables = new Set<TgpuBindable>();\n private readonly _usedRenderResources = new Set<TgpuRenderResource>();\n private readonly _resourceToIndexMap = new WeakMap<\n TgpuRenderResource | TgpuBindable,\n number\n >();\n private readonly _vertexBufferToIndexMap = new WeakMap<\n TgpuBindable,\n number\n >();\n private readonly _usedBuiltins = new Set<symbol>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n public readonly jitTranspiler: JitTranspiler | undefined,\n ) {}\n\n get usedBindables(): Iterable<TgpuBindable> {\n return this._usedBindables;\n }\n\n get usedRenderResources(): Iterable<TgpuRenderResource> {\n return this._usedRenderResources;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n get usedBuiltins(): Iterable<symbol> {\n return this._usedBuiltins;\n }\n\n reserveBindingEntry(bindable: TgpuBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(bindable, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n registerVertexEntry(bindable: TgpuBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeVertexBindingIdx++;\n this._vertexBufferToIndexMap.set(bindable, nextIdx);\n }\n\n reserveRenderResourceEntry(resource: TgpuRenderResource) {\n this._usedRenderResources.add(resource);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(resource, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n getBindingIndex(resource: TgpuRenderResource | TgpuBindable) {\n return this._resourceToIndexMap.get(resource);\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n\n addBuiltin(builtin: symbol) {\n this._usedBuiltins.add(builtin);\n }\n}\n\ntype ItemLayer = {\n type: 'item';\n usedSlots: Set<TgpuSlot<unknown>>;\n};\n\ntype SlotBindingLayer = {\n type: 'slotBinding';\n bindingMap: WeakMap<TgpuSlot<unknown>, unknown>;\n};\n\ntype FunctionScopeLayer = {\n type: 'functionScope';\n args: Resource[];\n externalMap: Record<string, unknown>;\n returnType: AnyTgpuData | undefined;\n};\n\ntype BlockScopeLayer = {\n type: 'blockScope';\n declarations: Map<string, AnyTgpuData | UnknownData>;\n};\n\nclass ItemStateStack {\n private _stack: (\n | ItemLayer\n | SlotBindingLayer\n | FunctionScopeLayer\n | BlockScopeLayer\n )[] = [];\n private _itemDepth = 0;\n\n get itemDepth(): number {\n return this._itemDepth;\n }\n\n get topItem(): ItemLayer {\n const state = this._stack[this._stack.length - 1];\n if (!state || state.type !== 'item') {\n throw new Error('Internal error, expected item layer to be on top.');\n }\n return state;\n }\n\n pushItem() {\n this._itemDepth++;\n this._stack.push({\n type: 'item',\n usedSlots: new Set(),\n });\n }\n\n pushSlotBindings(pairs: SlotValuePair<unknown>[]) {\n this._stack.push({\n type: 'slotBinding',\n bindingMap: new WeakMap(pairs),\n });\n }\n\n pushFunctionScope(\n args: Resource[],\n returnType: AnyTgpuData | undefined,\n externalMap: Record<string, unknown>,\n ) {\n this._stack.push({\n type: 'functionScope',\n args,\n returnType,\n externalMap,\n });\n }\n\n pop() {\n const layer = this._stack.pop();\n if (layer?.type === 'item') {\n this._itemDepth--;\n }\n }\n\n readSlot<T>(slot: TgpuSlot<T>): T | undefined {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n if (layer?.type === 'item') {\n // Binding not available yet, so this layer is dependent on the slot's value.\n layer.usedSlots.add(slot);\n } else if (layer?.type === 'slotBinding') {\n const boundValue = layer.bindingMap.get(slot);\n\n if (boundValue !== undefined) {\n return boundValue as T;\n }\n } else if (\n layer?.type === 'functionScope' ||\n layer?.type === 'blockScope'\n ) {\n // Skip\n } else {\n throw new Error('Unknown layer type.');\n }\n }\n\n return slot.defaultValue;\n }\n\n getResourceById(id: string): Resource | undefined {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n\n if (layer?.type === 'functionScope') {\n const arg = layer.args.find((a) => a.value === id);\n if (arg !== undefined) {\n return arg;\n }\n\n const external = layer.externalMap[id];\n if (external !== undefined) {\n // TODO: Extract the type of the external value.\n return { value: external, dataType: UnknownData };\n }\n } else if (layer?.type === 'blockScope') {\n const declarationType = layer.declarations.get(id);\n if (declarationType !== undefined) {\n return { value: id, dataType: declarationType };\n }\n } else {\n // Skip\n }\n }\n\n return undefined;\n }\n}\n\nconst INDENT = [\n '', // 0\n ' ', // 1\n ' ', // 2\n ' ', // 3\n ' ', // 4\n ' ', // 5\n ' ', // 6\n ' ', // 7\n ' ', // 8\n];\n\nconst N = INDENT.length - 1;\n\nexport class IndentController {\n private identLevel = 0;\n\n get pre(): string {\n return (\n INDENT[this.identLevel] ??\n (INDENT[N] as string).repeat(this.identLevel / N) +\n INDENT[this.identLevel % N]\n );\n }\n\n indent(): string {\n const str = this.pre;\n this.identLevel++;\n return str;\n }\n\n dedent(): string {\n this.identLevel--;\n return this.pre;\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\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 TgpuResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private readonly _shared: SharedResolutionState;\n private readonly _indentController = new IndentController();\n\n private _itemStateStack = new ItemStateStack();\n\n constructor(opts: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(\n opts.names,\n opts.bindingGroup ?? 0,\n opts.jitTranspiler,\n );\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n get usedRenderResources() {\n return this._shared.usedRenderResources;\n }\n\n get usedBuiltins() {\n return this._shared.usedBuiltins;\n }\n\n get pre(): string {\n return this._indentController.pre;\n }\n\n indent(): string {\n return this._indentController.indent();\n }\n\n dedent(): string {\n return this._indentController.dedent();\n }\n\n getById(id: string): Resource {\n // TODO: Provide access to external values\n // TODO: Provide data type information\n return (\n this._itemStateStack.getResourceById(id) ?? {\n value: id,\n dataType: UnknownData,\n }\n );\n }\n\n transpileFn(fn: string): {\n argNames: string[];\n body: Block;\n externalNames: string[];\n } {\n if (!this._shared.jitTranspiler) {\n throw new Error(\n 'Tried to execute a tgpu.fn function without providing a JIT transpiler, or transpiling at build time.',\n );\n }\n\n return this._shared.jitTranspiler.transpileFn(fn);\n }\n\n fnToWgsl(\n // biome-ignore lint/suspicious/noExplicitAny: <no need for generic magic>\n shell: TgpuFnShellBase<any, AnyTgpuData>,\n argNames: string[],\n body: Block,\n externalMap: Record<string, unknown>,\n ): { head: Wgsl; body: Wgsl } {\n const args: { value: string; dataType: AnyTgpuData }[] = argNames.map(\n (name, idx) => ({\n value: name,\n dataType: shell.argTypes[idx],\n }),\n );\n\n this._itemStateStack.pushFunctionScope(args, shell.returnType, externalMap);\n const str = generateFunction(this, body);\n this._itemStateStack.pop();\n\n const argList = args\n .map((arg) => `${arg.value}: ${this.resolve(arg.dataType)}`)\n .join(', ');\n\n return {\n head:\n shell.returnType !== undefined\n ? `(${argList}) -> ${this.resolve(shell.returnType)}`\n : `(${argList})`,\n body: str,\n };\n }\n\n addDeclaration(declaration: TgpuResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void {\n if (bindable.usage === 'vertex') {\n this._shared.registerVertexEntry(bindable);\n return;\n }\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n addRenderResource(\n resource: TgpuRenderResource,\n identifier: TgpuIdentifier,\n ): void {\n const { group, idx } = this._shared.reserveRenderResourceEntry(resource);\n\n if (\n isSamplerType(resource.type) ||\n isExternalTextureType(resource.type) ||\n isDepthTextureType(resource.type)\n ) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type};`,\n );\n return;\n }\n\n if (isTextureView(resource)) {\n if (resource.access !== undefined) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.texture.descriptor.format}, ${resource.access}>;`,\n );\n return;\n }\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.dataType}>;`,\n );\n return;\n }\n\n throw new Error(`Unsupported resource type: ${resource.type}`);\n }\n\n addBuiltin(builtin: symbol): void {\n this._shared.addBuiltin(builtin);\n }\n\n nameFor(item: TgpuResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: TgpuSlot<T>): T {\n const value = this._itemStateStack.readSlot(slot);\n\n if (value === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return value;\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 /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved.\n */\n _getOrInstantiate(item: TgpuResolvable): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n this._itemStateStack.pushItem();\n\n try {\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) =>\n this._itemStateStack.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(this);\n\n // We know which slots the item used while resolving\n const slotToValueMap = new Map<TgpuSlot<unknown>, unknown>();\n for (const usedSlot of this._itemStateStack.topItem.usedSlots) {\n slotToValueMap.set(usedSlot, this._itemStateStack.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(item);\n }\n\n throw new ResolutionError(err, [item]);\n } finally {\n this._itemStateStack.pop();\n }\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n let pushedLayer = false;\n if (slotValueOverrides.length > 0) {\n pushedLayer = true;\n this._itemStateStack.pushSlotBindings(slotValueOverrides);\n }\n\n try {\n if (this._itemStateStack.itemDepth === 0) {\n const result = onGPU(() => this._getOrInstantiate(item));\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n\n return this._getOrInstantiate(item);\n } finally {\n if (pushedLayer) {\n this._itemStateStack.pop();\n }\n }\n }\n\n getIndexFor(item: TgpuBindable | TgpuRenderResource) {\n const index = this._shared.getBindingIndex(item);\n if (index === undefined) {\n throw new Error('No index found for item');\n }\n return index;\n }\n}\n","import type { AnySchema } from 'typed-binary';\nimport { BindGroupResolver } from './bindGroupResolver';\nimport { typeForBuiltin } from './builtinDataTypes';\nimport {\n builtinSymbolToName,\n idForBuiltin,\n nameForBuiltin,\n} from './builtinIdentifiers';\nimport type { TgpuBufferVertex } from './core/buffer/bufferUsage';\nimport type { ExperimentalTgpuRoot } from './core/root/rootTypes';\nimport type { SimpleTgpuData, TgpuArray } from './data';\nimport { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport { code } from './tgpuCode';\nimport type {\n AnyTgpuData,\n BoundTgpuCode,\n TgpuCode,\n TgpuResolvable,\n Wgsl,\n} from './types';\n\nexport type Program = {\n readonly bindGroupResolver: BindGroupResolver;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nexport default class ProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private rootNode: TgpuResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.rootNode);\n\n return {\n bindGroupResolver: new BindGroupResolver(\n this.root,\n ctx,\n options.shaderStage,\n ),\n code: codeString,\n };\n }\n}\n\nfunction getUsedBuiltinsNamed(\n rec: Record<symbol, string>,\n): { name: string; builtinSymbol: symbol }[] {\n const res = Object.getOwnPropertySymbols(rec).map((builtinSymbol) => {\n const builtin = builtinSymbolToName.get(builtinSymbol);\n if (builtin === undefined) {\n throw new Error('Symbol is not a member of `builtin`');\n }\n const name = rec[builtinSymbol] as string;\n return { name, builtinSymbol };\n });\n\n return res;\n}\n\nexport class RenderProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private vertexRoot: TgpuCode | BoundTgpuCode,\n private fragmentRoot: TgpuCode | BoundTgpuCode,\n private vertexOutputFormat: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyTgpuData;\n },\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): {\n vertexProgram: Program;\n fragmentProgram: Program;\n } {\n const symbolOutputs = Object.getOwnPropertySymbols(\n this.vertexOutputFormat,\n ).map((symbol) => {\n const name = this.vertexOutputFormat[symbol];\n if (typeof name !== 'string') {\n throw new Error('Output names must be strings.');\n }\n return { symbol, name };\n });\n\n const vertexOutputBuiltinObjects = getUsedBuiltinsNamed(\n Object.fromEntries(\n symbolOutputs.map(({ symbol, name }) => [symbol, name]),\n ),\n );\n\n const vertexOutput = Object.keys(this.vertexOutputFormat).map(\n (name, index) => {\n const varInfo = this.vertexOutputFormat[name];\n if (!varInfo) {\n throw new Error('Output names must be strings.');\n }\n return { name, varInfo, index };\n },\n );\n\n const structFields = [\n ...vertexOutputBuiltinObjects.map((builtin) => {\n const outputName = this.vertexOutputFormat[builtin.builtinSymbol] ?? '';\n\n return code`\n @builtin(${nameForBuiltin(builtin.builtinSymbol)}) ${outputName}: ${typeForBuiltin(builtin.builtinSymbol)},\n `;\n }),\n ...vertexOutput.map(\n ({ name, varInfo, index }) =>\n code`\n @location(${index}) ${name}: ${varInfo},\n `,\n ),\n ];\n\n const vertexContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n vertexContext.resolve(this.vertexRoot);\n const vertexBuffers = Array.from(vertexContext.usedBindables).filter(\n (bindable): bindable is TgpuBufferVertex<AnyTgpuData> =>\n bindable.usage === 'vertex',\n );\n const entries = vertexBuffers.map((elem, idx) => {\n return {\n idx: idx,\n entry: {\n bindable: elem,\n underlyingType: elem.allocatable.dataType as\n | SimpleTgpuData<AnySchema>\n | TgpuArray<AnyTgpuData>,\n },\n };\n });\n\n const vertexUserArgs = entries.map(\n (entry) => code`\n @location(${entry.idx}) ${entry.entry.bindable} : ${\n 'expressionCode' in entry.entry.underlyingType\n ? entry.entry.underlyingType.expressionCode\n : entry.entry.underlyingType.elementType\n },\n `,\n );\n const vertexBuiltins = Array.from(vertexContext.usedBuiltins);\n const vertexBuiltinsArgs = vertexBuiltins.map(\n (builtin) =>\n code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `,\n );\n const vertexArgs = [...vertexBuiltinsArgs, ...vertexUserArgs];\n\n const vertexCode = code`\n struct VertexOutput {\n ${structFields}\n };\n\n @vertex\n fn main(${vertexArgs}) -> VertexOutput {\n ${this.vertexRoot}\n var output: VertexOutput;\n ${vertexOutputBuiltinObjects.map(\n (entry) =>\n code`\n output.${entry.name} = ${entry.name};\n `,\n )}\n ${vertexOutput.map(\n ({ name }) =>\n code`\n output.${name} = ${name};\n `,\n )}\n return output;\n }\n `;\n const fragmentContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n fragmentContext.resolve(this.fragmentRoot);\n\n const fragmentUsedBuiltins = Array.from(fragmentContext.usedBuiltins);\n const fragmentBuiltinArgs = fragmentUsedBuiltins.map((builtin) => {\n return code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `;\n });\n\n const fragmentInputs = vertexOutput.map(\n ({ name, varInfo }, idx) => code`\n @location(${idx}) ${name}: ${varInfo},\n `,\n );\n const fragmentArgs = [...fragmentBuiltinArgs, ...fragmentInputs];\n const fragmentCode = code`\n @fragment\n fn main(${fragmentArgs}) -> @location(0) vec4f {\n ${this.fragmentRoot}\n }\n `;\n\n const vertexProgram = new ProgramBuilder(this.root, vertexCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.VERTEX,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n const fragmentProgram = new ProgramBuilder(this.root, fragmentCode).build({\n bindingGroup: options.bindingGroup + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n vertexProgram.bindGroupResolver.setVertexBuffers(\n entries.map((entry) => {\n return {\n index: entry.idx,\n buffer: entry.entry.bindable,\n };\n }),\n );\n\n return { vertexProgram, fragmentProgram };\n }\n}\n\nexport class ComputeProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private computeRoot: Wgsl,\n private workgroupSize: readonly [\n number,\n (number | null)?,\n (number | null)?,\n ],\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): Program {\n const context = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n context.resolve(this.computeRoot);\n\n const usedBuiltins = Array.from(context.usedBuiltins);\n const builtinArgs = usedBuiltins.map(\n (builtin) => code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `,\n );\n\n const workgroupSizeDeclaration = `@workgroup_size(${this.workgroupSize[0]}, ${this.workgroupSize[1] ?? 1}, ${this.workgroupSize[2] ?? 1})`;\n\n const shaderCode = code`\n @compute ${workgroupSizeDeclaration}\n fn main(${builtinArgs}) {\n ${this.computeRoot}\n }\n `;\n\n const program = new ProgramBuilder(this.root, shaderCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.COMPUTE,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n return program;\n }\n}\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuNamable } from '../../namable';\nimport { type TgpuPlum, type Unsubscribe, isPlum } from '../../tgpuPlumTypes';\nimport { type AnyTgpuData, isGPUBuffer } from '../../types';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Uniform {\n usableAsUniform: true;\n}\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport interface Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Storage = { usableAsStorage: true } as Storage;\nexport const Vertex = { usableAsVertex: true } as Vertex;\n\ntype UnionToIntersection<U> =\n // biome-ignore lint/suspicious/noExplicitAny: <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\ntype LiteralToUsageType<T extends 'uniform' | 'storage' | 'vertex'> =\n T extends 'uniform'\n ? Uniform\n : T extends 'storage'\n ? Storage\n : T extends 'vertex'\n ? Vertex\n : never;\n\nexport interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuNamable {\n readonly resourceType: 'buffer';\n readonly dataType: TData;\n readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n readonly label: string | undefined;\n\n readonly buffer: GPUBuffer;\n readonly device: GPUDevice;\n readonly destroyed: boolean;\n\n $usage<T extends ('uniform' | 'storage' | 'vertex')[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this;\n\n write(data: Parsed<TData> | TgpuBuffer<TData>): void;\n read(): Promise<Parsed<TData>>;\n destroy(): void;\n}\n\nexport function createBufferImpl<TData extends AnyTgpuData>(\n group: ExperimentalTgpuRoot | undefined,\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);\n}\n\nexport function isBuffer<T extends TgpuBuffer<AnyTgpuData>>(\n value: T | unknown,\n): value is T {\n return (value as TgpuBuffer<AnyTgpuData>).resourceType === 'buffer';\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Storage {\n return !!(buffer as unknown as Storage).usableAsStorage;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Vertex {\n return !!(buffer as unknown as Vertex).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public readonly resourceType = 'buffer';\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n private _destroyed = false;\n private _subscription: Unsubscribe | null = null;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n public usableAsUniform = false;\n public usableAsStorage = false;\n public usableAsVertex = false;\n\n constructor(\n private readonly _group: ExperimentalTgpuRoot | undefined,\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 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\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\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n\n if (isPlum(this.initial)) {\n const group = this._group;\n\n if (!group) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n const plum = this.initial;\n\n this.dataType.write(writer, group.readPlum(plum));\n\n this._subscription = group.onPlumChange(plum, () => {\n this.write(group.readPlum(plum));\n });\n } else {\n this.dataType.write(writer, this.initial);\n }\n\n this._buffer.unmap();\n }\n }\n\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer has not been assigned a device. Use .$device(device) to assign a device',\n );\n }\n return this._device;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $usage<T extends ('uniform' | 'storage' | 'vertex')[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>> {\n for (const usage of usages) {\n this.flags |= usage === 'uniform' ? GPUBufferUsage.UNIFORM : 0;\n this.flags |= usage === 'storage' ? GPUBufferUsage.STORAGE : 0;\n this.flags |= usage === 'vertex' ? GPUBufferUsage.VERTEX : 0;\n this.usableAsUniform = this.usableAsUniform || usage === 'uniform';\n this.usableAsStorage = this.usableAsStorage || usage === 'storage';\n this.usableAsVertex = this.usableAsVertex || usage === 'vertex';\n }\n return this as this & UnionToIntersection<LiteralToUsageType<T[number]>>;\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 write(dataOrBuffer: Parsed<TData> | TgpuBuffer<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n if (isBuffer(dataOrBuffer)) {\n throw new Error('Cannot copy to a mapped buffer.');\n }\n this.dataType.write(new BufferWriter(mapped), dataOrBuffer);\n return;\n }\n\n const size = this.dataType.size;\n if (isBuffer(dataOrBuffer)) {\n const sourceBuffer = dataOrBuffer.buffer;\n\n if (this._group) {\n const encoder = this._group.commandEncoder;\n encoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n } else {\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n device.queue.submit([commandEncoder.finish()]);\n }\n } else {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const hostBuffer = new ArrayBuffer(size);\n this.dataType.write(new BufferWriter(hostBuffer), dataOrBuffer);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n }\n\n async read(): Promise<Parsed<TData>> {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = this.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 = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: this.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 this.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, this.dataType.size);\n\n const res = this.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n if (this._subscription) {\n this._subscription();\n }\n this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { Unwrap } from 'typed-binary';\nimport { isArraySchema } from '../../data';\nimport { inGPUMode } from '../../gpuMode';\nimport { identifier } from '../../tgpuIdentifier';\nimport type {\n AnyTgpuData,\n BufferUsage,\n ResolutionCtx,\n TgpuBindable,\n} from '../../types';\nimport {\n type Storage,\n type TgpuBuffer,\n type Uniform,\n type Vertex,\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUniform<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'uniform'> {\n readonly resourceType: 'buffer-usage';\n readonly value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferReadonly<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'readonly'> {\n readonly resourceType: 'buffer-usage';\n readonly value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferMutable<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'mutable'> {\n readonly resourceType: 'buffer-usage';\n value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferVertex<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'vertex'> {\n readonly resourceType: 'buffer-usage';\n vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'>;\n}\n\nexport interface TgpuBufferUsage<\n TData extends AnyTgpuData,\n TUsage extends BufferUsage = BufferUsage,\n> extends TgpuBindable<TData, TUsage> {\n readonly resourceType: 'buffer-usage';\n value: Unwrap<TData>;\n}\n\nexport function isBufferUsage<\n T extends\n | TgpuBufferUniform<AnyTgpuData>\n | TgpuBufferReadonly<AnyTgpuData>\n | TgpuBufferMutable<AnyTgpuData>\n | TgpuBufferVertex<AnyTgpuData>,\n>(value: T | unknown): value is T {\n return !!value && (value as T).resourceType === 'buffer-usage';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferUsageImpl<TData extends AnyTgpuData, TUsage extends BufferUsage>\n implements TgpuBufferUsage<TData, TUsage>\n{\n public readonly resourceType = 'buffer-usage' as const;\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 $name(label: string) {\n this.buffer.$name(label);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this.label);\n ctx.addBinding(this, ident);\n return ctx.resolve(ident);\n }\n\n toString(): string {\n return `${this.usage}:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Unwrap<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n return this as Unwrap<TData>;\n }\n}\n\nclass TgpuBufferVertexImpl<TData extends AnyTgpuData>\n implements TgpuBufferVertex<TData>\n{\n public readonly resourceType = 'buffer-usage' as const;\n public readonly usage = 'vertex';\n public readonly vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'>;\n\n constructor(\n public readonly allocatable: TgpuBuffer<TData>,\n stepMode: 'vertex' | 'instance',\n ) {\n const layout = getVertexLayoutIfValid(allocatable.dataType, stepMode);\n if (!layout) {\n throw new Error('Cannot create vertex buffer with complex data types.');\n }\n this.vertexLayout = layout;\n }\n\n get label() {\n return this.allocatable.label;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this.label);\n ctx.addBinding(this, ident);\n return ctx.resolve(ident);\n }\n\n toString(): string {\n return `vertex:${this.label ?? '<unnamed>'}`;\n }\n}\n\nconst mutableUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'mutable'>\n>();\n\nexport function asMutable<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Storage,\n): TgpuBufferMutable<TData> {\n if (!isUsableAsStorage(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asMutable, as it is not allowed to be used as storage. To allow it, call .$usage('storage') when creating the buffer.`,\n );\n }\n\n let usage = mutableUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'mutable');\n mutableUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferMutable<TData>;\n}\n\nconst readonlyUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'readonly'>\n>();\n\nexport function asReadonly<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Storage,\n): TgpuBufferReadonly<TData> {\n if (!isUsableAsStorage(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asReadonly, as it is not allowed to be used as storage. To allow it, call .$usage('storage') when creating the buffer.`,\n );\n }\n\n let usage = readonlyUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'readonly');\n readonlyUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferReadonly<TData>;\n}\n\nconst uniformUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'uniform'>\n>();\n\nexport function asUniform<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Uniform,\n): TgpuBufferUniform<TData> {\n if (!isUsableAsUniform(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asUniform, as it is not allowed to be used as a uniform. To allow it, call .$usage('uniform') when creating the buffer.`,\n );\n }\n\n let usage = uniformUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'uniform');\n uniformUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferUniform<TData>;\n}\n\nconst vertexUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n {\n vertex: TgpuBufferVertexImpl<AnyTgpuData>;\n instance: TgpuBufferVertexImpl<AnyTgpuData>;\n }\n>();\n\nexport function asVertex<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Vertex,\n stepMode: 'vertex' | 'instance',\n): TgpuBufferVertex<TData> {\n if (!isUsableAsVertex(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asVertex, as it is not allowed to be used as a vertex buffer. To allow it, call .$usage('vertex') when creating the buffer.`,\n );\n }\n\n let usage = vertexUsageMap.get(buffer);\n if (!usage) {\n usage = {\n vertex: new TgpuBufferVertexImpl(buffer, 'vertex'),\n instance: new TgpuBufferVertexImpl(buffer, 'instance'),\n };\n vertexUsageMap.set(buffer, usage);\n }\n return usage[stepMode] as unknown as TgpuBufferVertex<TData>;\n}\n\nfunction getVertexLayoutIfValid(\n type: AnyTgpuData,\n stepMode: 'vertex' | 'instance',\n): Omit<GPUVertexBufferLayout, 'attributes'> | null {\n // check if the type is a primitive (f32, i32, u32, or a vector)\n if ('expressionCode' in type) {\n return {\n arrayStride: type.size,\n stepMode: stepMode,\n };\n }\n // if the data type is an array, check if the element type is valid\n // as arrayOf(arrayOf(f32, x), y) would still be valid - we do it recursively\n if (isArraySchema(type)) {\n return getVertexLayoutIfValid(type.elementType, stepMode);\n }\n return null;\n}\n","import {\n type Storage,\n type TgpuBuffer,\n type Uniform,\n isBuffer,\n isUsableAsStorage,\n isUsableAsUniform,\n} from './core/buffer/buffer';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n type TgpuBufferUsage,\n isBufferUsage,\n} from './core/buffer/bufferUsage';\nimport { NotUniformError } from './errors';\nimport type { TgpuNamable } from './namable';\nimport type { TgpuSampler } from './tgpuSampler';\nimport type { AnyTgpuData, OmitProps, TgpuShaderStage } from './types';\nimport type { Unwrapper } from './unwrapper';\n\n// ----------\n// Public API\n// ----------\n\nexport type TgpuLayoutEntryBase = {\n /**\n * Limits this resource's visibility to specific shader stages.\n *\n * By default, each resource is visible to all shader stage types, but\n * depending on the underlying implementation, this may have performance implications.\n *\n * @default ['compute'] for mutable resources\n * @default ['compute','vertex','fragment'] for everything else\n */\n visibility?: TgpuShaderStage[];\n};\n\nexport type TgpuLayoutUniform = TgpuLayoutEntryBase & {\n uniform: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);\n};\n\nexport type TgpuLayoutStorage = TgpuLayoutEntryBase & {\n storage: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);\n /** @default 'readonly' */\n access?: 'mutable' | 'readonly';\n};\n\nexport type TgpuLayoutSampler = TgpuLayoutEntryBase & {\n sampler: GPUSamplerBindingType;\n};\nexport type TgpuLayoutTexture<\n TSampleType extends GPUTextureSampleType = GPUTextureSampleType,\n> = TgpuLayoutEntryBase & {\n /**\n * - 'float' - f32\n * - 'unfilterable-float' - f32, cannot be used with filtering samplers\n * - 'depth' - f32\n * - 'sint' - i32\n * - 'uint' - u32\n */\n texture: TSampleType;\n /**\n * @default '2d'\n */\n viewDimension?: GPUTextureViewDimension;\n /**\n * @default false\n */\n multisampled?: boolean;\n};\nexport type TgpuLayoutStorageTexture<\n TFormat extends GPUTextureFormat = GPUTextureFormat,\n> = TgpuLayoutEntryBase & {\n storageTexture: TFormat;\n /** @default 'writeonly' */\n access?: 'readonly' | 'writeonly' | 'mutable';\n /** @default '2d' */\n viewDimension?: GPUTextureViewDimension;\n};\nexport type TgpuLayoutExternalTexture = TgpuLayoutEntryBase & {\n externalTexture: Record<string, never>;\n};\n\nexport type TgpuLayoutEntry =\n | TgpuLayoutUniform\n | TgpuLayoutStorage\n | TgpuLayoutSampler\n | TgpuLayoutTexture\n | TgpuLayoutStorageTexture\n | TgpuLayoutExternalTexture;\n\ntype UnwrapRuntimeConstructorInner<\n T extends AnyTgpuData | ((_: number) => AnyTgpuData),\n> = T extends AnyTgpuData\n ? T\n : T extends (_: number) => infer Return\n ? Return\n : never;\n\nexport type UnwrapRuntimeConstructor<\n T extends AnyTgpuData | ((_: number) => AnyTgpuData),\n> = T extends unknown ? UnwrapRuntimeConstructorInner<T> : never;\n\nexport interface TgpuBindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> extends TgpuNamable {\n readonly resourceType: 'bind-group-layout';\n readonly label: string | undefined;\n readonly entries: Entries;\n // TODO: Expose when implemented\n // readonly bound: {\n // [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n // };\n\n populate(\n entries: {\n [K in keyof OmitProps<Entries, null>]: LayoutEntryToInput<Entries[K]>;\n },\n ): TgpuBindGroup<Entries>;\n\n /**\n * Creates a raw WebGPU resource based on the typed descriptor.\n * NOTE: This creates a new resource every time, better to use `root.unwrap(...)` instead.\n * @param unwrapper Used to unwrap any resources that this resource depends on.\n */\n unwrap(unwrapper: Unwrapper): GPUBindGroupLayout;\n}\n\nexport interface TgpuBindGroupLayoutExperimental<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> extends TgpuBindGroupLayout<Entries> {\n readonly bound: {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n}\n\ntype StorageUsageForEntry<T extends TgpuLayoutStorage> = T extends {\n access?: infer Access;\n} // Is the access defined on the type?\n ? 'mutable' | 'readonly' extends Access // Is the access ambiguous?\n ?\n | TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n : 'readonly' extends Access // Is the access strictly 'readonly'?\n ? TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n : 'mutable' extends Access // Is the access strictly 'mutable'?\n ? TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n :\n | TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n : TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>; // <- access is undefined, so default to 'readonly';\n\nexport type LayoutEntryToInput<T extends TgpuLayoutEntry | null> =\n T extends TgpuLayoutUniform\n ?\n | TgpuBufferUsage<UnwrapRuntimeConstructor<T['uniform']>, 'uniform'>\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & Uniform)\n | GPUBuffer\n : T extends TgpuLayoutStorage\n ?\n | StorageUsageForEntry<T>\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & Storage)\n | GPUBuffer\n : T extends TgpuLayoutSampler\n ? GPUSampler\n : T extends TgpuLayoutTexture\n ? GPUTextureView\n : T extends TgpuLayoutStorageTexture\n ? GPUTextureView\n : T extends TgpuLayoutExternalTexture\n ? GPUExternalTexture\n : never;\n\nexport type BindLayoutEntry<T extends TgpuLayoutEntry | null> =\n T extends TgpuLayoutUniform\n ? TgpuBufferUniform<UnwrapRuntimeConstructor<T['uniform']>>\n : T extends TgpuLayoutStorage\n ? StorageUsageForEntry<T>\n : T extends TgpuLayoutSampler\n ? TgpuSampler\n : never;\n\nexport type TgpuBindGroup<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> = {\n readonly resourceType: 'bind-group';\n readonly layout: TgpuBindGroupLayout<Entries>;\n unwrap(unwrapper: Unwrapper): GPUBindGroup;\n};\n\nexport function bindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayout<Entries> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function bindGroupLayoutExperimental<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayoutExperimental<Entries> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function isBindGroupLayout<T extends TgpuBindGroupLayout>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group-layout';\n}\n\nexport function isBindGroup<T extends TgpuBindGroup>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group';\n}\n\n/**\n * @category Errors\n */\nexport class MissingBindingError extends Error {\n constructor(groupLabel: string | undefined, key: string) {\n super(\n `Bind group '${groupLabel ?? '<unnamed>'}' is missing a required binding '${key}'`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingBindingError.prototype);\n }\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst DEFAULT_MUTABLE_VISIBILITY: TgpuShaderStage[] = ['compute'];\nconst DEFAULT_READONLY_VISIBILITY: TgpuShaderStage[] = [\n 'compute',\n 'vertex',\n 'fragment',\n];\n\nclass TgpuBindGroupLayoutImpl<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n> implements TgpuBindGroupLayoutExperimental<Entries>\n{\n private _label: string | undefined;\n\n public readonly resourceType = 'bind-group-layout' as const;\n\n // TODO: Fill bound values.\n public readonly bound = {} as {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n\n constructor(public readonly entries: Entries) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined): this {\n this._label = label;\n return this;\n }\n\n unwrap(unwrapper: Unwrapper) {\n const unwrapped = unwrapper.device.createBindGroupLayout({\n label: this.label ?? '',\n entries: Object.values(this.entries)\n .map((entry, idx) => {\n if (entry === null) {\n return null;\n }\n\n let visibility = entry.visibility;\n\n const binding: GPUBindGroupLayoutEntry = {\n binding: idx,\n visibility: 0,\n };\n\n if ('uniform' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.buffer = {\n type: 'uniform' as const,\n };\n } else if ('storage' in entry) {\n visibility =\n visibility ??\n (entry.access === 'mutable'\n ? DEFAULT_MUTABLE_VISIBILITY\n : DEFAULT_READONLY_VISIBILITY);\n\n binding.buffer = {\n type:\n entry.access === 'mutable'\n ? ('storage' as const)\n : ('read-only-storage' as const),\n };\n } else if ('sampler' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.sampler = {\n type: entry.sampler,\n };\n } else if ('texture' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.texture = {\n sampleType: entry.texture,\n viewDimension: entry.viewDimension ?? '2d',\n multisampled: entry.multisampled ?? false,\n };\n } else if ('storageTexture' in entry) {\n const access = entry.access ?? 'writeonly';\n\n visibility =\n visibility ??\n (access === 'readonly'\n ? DEFAULT_READONLY_VISIBILITY\n : DEFAULT_MUTABLE_VISIBILITY);\n\n binding.storageTexture = {\n format: entry.storageTexture,\n access: {\n mutable: 'read-write' as const,\n readonly: 'read-only' as const,\n writeonly: 'write-only' as const,\n }[access],\n viewDimension: entry.viewDimension ?? '2d',\n };\n } else if ('externalTexture' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n binding.externalTexture = {};\n }\n\n if (visibility?.includes('compute')) {\n binding.visibility |= GPUShaderStage.COMPUTE;\n }\n if (visibility?.includes('vertex')) {\n binding.visibility |= GPUShaderStage.VERTEX;\n }\n if (visibility?.includes('fragment')) {\n binding.visibility |= GPUShaderStage.FRAGMENT;\n }\n\n return binding;\n })\n .filter((v): v is Exclude<typeof v, null> => v !== null),\n });\n\n return unwrapped;\n }\n\n populate(\n entries: { [K in keyof Entries]: LayoutEntryToInput<Entries[K]> },\n ): TgpuBindGroup<Entries> {\n return new TgpuBindGroupImpl(this, entries);\n }\n}\n\nclass TgpuBindGroupImpl<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> implements TgpuBindGroup<Entries>\n{\n public readonly resourceType = 'bind-group' as const;\n\n constructor(\n public readonly layout: TgpuBindGroupLayout<Entries>,\n public readonly entries: {\n [K in keyof Entries]: LayoutEntryToInput<Entries[K]>;\n },\n ) {\n // Checking if all entries are present.\n for (const key of Object.keys(layout.entries)) {\n if (layout.entries[key] !== null && !(key in entries)) {\n throw new MissingBindingError(layout.label, key);\n }\n }\n }\n\n public unwrap(unwrapper: Unwrapper): GPUBindGroup {\n const unwrapped = unwrapper.device.createBindGroup({\n label: this.layout.label ?? '',\n layout: unwrapper.unwrap(this.layout),\n entries: Object.entries(this.layout.entries)\n .map(([key, entry], idx) => {\n if (entry === null) {\n return null;\n }\n\n const value = this.entries[key];\n\n if (value === undefined) {\n throw new Error(\n `'${key}' is a resource required to populate bind group layout '${this.layout.label ?? '<unnamed>'}'.`,\n );\n }\n\n if ('uniform' in entry) {\n let resource: GPUBufferBinding;\n\n if (isBuffer(value)) {\n if (!isUsableAsUniform(value)) {\n throw new NotUniformError(value);\n }\n resource = { buffer: unwrapper.unwrap(value) };\n } else if (isBufferUsage(value)) {\n if (!isUsableAsUniform(value.allocatable)) {\n throw new NotUniformError(value.allocatable);\n }\n resource = { buffer: unwrapper.unwrap(value.allocatable) };\n } else {\n resource = { buffer: value as GPUBuffer };\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('storage' in entry) {\n let resource: GPUBufferBinding;\n\n if (isBuffer(value)) {\n if (!isUsableAsStorage(value)) {\n throw new NotUniformError(value);\n }\n resource = { buffer: unwrapper.unwrap(value) };\n } else if (isBufferUsage(value)) {\n if (!isUsableAsStorage(value.allocatable)) {\n throw new NotUniformError(value.allocatable);\n }\n resource = { buffer: unwrapper.unwrap(value.allocatable) };\n } else {\n resource = { buffer: value as GPUBuffer };\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if (\n 'texture' in entry ||\n 'storageTexture' in entry ||\n 'externalTexture' in entry ||\n 'sampler' in entry\n ) {\n return {\n binding: idx,\n resource: value as\n | GPUTextureView\n | GPUExternalTexture\n | GPUSampler,\n };\n }\n\n throw new Error(\n `Malformed bind group entry: ${value} (${JSON.stringify(value)})`,\n );\n })\n .filter((v): v is Exclude<typeof v, null> => v !== null),\n });\n\n return unwrapped;\n }\n}\n","import type { Parsed } from 'typed-binary';\nimport { onGPU } from '../../gpuMode';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport { WeakMemo } from '../../memo';\nimport { type PlumListener, PlumStore } from '../../plumStore';\nimport {\n ComputeProgramBuilder,\n type Program,\n RenderProgramBuilder,\n} from '../../programBuilder';\nimport type { TgpuSettable } from '../../settableTrait';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport { isBindGroup, isBindGroupLayout } from '../../tgpuBindGroupLayout';\nimport type {\n ExtractPlumValue,\n TgpuPlum,\n Unsubscribe,\n} from '../../tgpuPlumTypes';\nimport type { TgpuSampler } from '../../tgpuSampler';\nimport type {\n TgpuAnyTexture,\n TgpuAnyTextureView,\n TgpuTextureExternal,\n} from '../../tgpuTexture';\nimport type { AnyTgpuData } from '../../types';\nimport { type TgpuBuffer, createBufferImpl, isBuffer } from '../buffer/buffer';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n ExperimentalTgpuRoot,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n SetPlumAction,\n} from './rootTypes';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a root can interact via GPU buffers.\n */\nclass TgpuRootImpl implements ExperimentalTgpuRoot {\n private _buffers: TgpuBuffer<AnyTgpuData>[] = [];\n private _samplers = new WeakMap<TgpuSampler, GPUSampler>();\n private _textures = new WeakMap<TgpuAnyTexture, GPUTexture>();\n private _textureViews = new WeakMap<TgpuAnyTextureView, GPUTextureView>();\n private _externalTexturesStatus = new WeakMap<\n TgpuTextureExternal,\n 'dirty' | 'clean'\n >();\n\n private _unwrappedBindGroupLayouts = new WeakMemo(\n (key: TgpuBindGroupLayout) => key.unwrap(this),\n );\n private _unwrappedBindGroups = new WeakMemo((key: TgpuBindGroup) =>\n key.unwrap(this),\n );\n\n private _pipelineExecutors: PipelineExecutor[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n private readonly _plumStore = new PlumStore();\n\n constructor(\n public readonly device: GPUDevice,\n public readonly jitTranspiler: JitTranspiler | undefined,\n ) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n ): TgpuBuffer<TData> {\n const buffer = createBufferImpl(this, typeSchema, initialOrBuffer).$device(\n this.device,\n );\n\n this._buffers.push(buffer);\n\n return buffer;\n }\n\n destroy() {\n for (const buffer of this._buffers) {\n buffer.destroy();\n }\n }\n\n unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;\n unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;\n unwrap(resource: TgpuBindGroup): GPUBindGroup;\n unwrap(\n resource: TgpuBuffer<AnyTgpuData> | TgpuBindGroupLayout | TgpuBindGroup,\n ): GPUBuffer | GPUBindGroupLayout | GPUBindGroup {\n if (isBuffer(resource)) {\n return resource.buffer;\n }\n\n if (isBindGroupLayout(resource)) {\n return this._unwrappedBindGroupLayouts.getOrMake(resource);\n }\n\n if (isBindGroup(resource)) {\n return this._unwrappedBindGroups.getOrMake(resource);\n }\n\n throw new Error(`Unknown resource type: ${resource}`);\n }\n\n textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture {\n let source: TgpuAnyTexture;\n if ('texture' in view) {\n source = view.texture;\n } else {\n source = view;\n }\n\n let texture = this._textures.get(source);\n\n if (!texture) {\n const descriptor = {\n ...source.descriptor,\n usage: source.flags,\n } as GPUTextureDescriptor;\n texture = this.device.createTexture(descriptor);\n\n if (!texture) {\n throw new Error(`Failed to create texture for ${view}`);\n }\n this._textures.set(source, texture);\n }\n\n return texture;\n }\n\n viewFor(view: TgpuAnyTextureView): GPUTextureView {\n let textureView = this._textureViews.get(view);\n if (!textureView) {\n textureView = this.textureFor(view.texture).createView(view.descriptor);\n this._textureViews.set(view, textureView);\n }\n return textureView;\n }\n\n externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture {\n this._externalTexturesStatus.set(texture, 'clean');\n if (texture.descriptor.source === undefined) {\n throw new Error('External texture source needs to be defined before use');\n }\n return this.device.importExternalTexture(\n texture.descriptor as GPUExternalTextureDescriptor,\n );\n }\n\n samplerFor(sampler: TgpuSampler): GPUSampler {\n let gpuSampler = this._samplers.get(sampler);\n\n if (!gpuSampler) {\n gpuSampler = this.device.createSampler(sampler.descriptor);\n\n if (!gpuSampler) {\n throw new Error(`Failed to create sampler for ${sampler}`);\n }\n this._samplers.set(sampler, gpuSampler);\n }\n\n return gpuSampler;\n }\n\n setSource(\n texture: TgpuTextureExternal,\n source: HTMLVideoElement | VideoFrame,\n ) {\n this._externalTexturesStatus.set(texture, 'dirty');\n texture.descriptor.source = source;\n }\n\n isDirty(texture: TgpuTextureExternal): boolean {\n return this._externalTexturesStatus.get(texture) === 'dirty';\n }\n\n markClean(texture: TgpuTextureExternal) {\n this._externalTexturesStatus.set(texture, 'clean');\n }\n\n readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends TgpuPlum & TgpuSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ) {\n type Value = ExtractPlumValue<TPlum>;\n\n if (typeof value === 'function') {\n const compute = value as (prev: Value) => Value;\n this._plumStore.set(plum, compute(this._plumStore.get(plum)));\n } else {\n this._plumStore.set(plum, value);\n }\n }\n\n onPlumChange<TValue>(\n plum: TgpuPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const { vertexProgram, fragmentProgram } = new RenderProgramBuilder(\n this,\n options.vertex.code,\n options.fragment.code,\n options.vertex.output,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupResolver.getBindGroupLayout(),\n fragmentProgram.bindGroupResolver.getBindGroupLayout(),\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers:\n vertexProgram.bindGroupResolver.getVertexBufferDescriptors() ?? [],\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,\n 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 program = onGPU(() =>\n new ComputeProgramBuilder(\n this,\n options.code,\n options.workgroupSize ?? [1],\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n }),\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.bindGroupResolver.getBindGroupLayout(),\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\ninterface PipelineExecutor {\n execute(\n options: RenderPipelineExecutorOptions | ComputePipelineExecutorOptions,\n ): void;\n}\n\nclass RenderPipelineExecutor implements PipelineExecutor {\n constructor(\n private root: ExperimentalTgpuRoot,\n private pipeline: GPURenderPipeline,\n private vertexProgram: Program,\n private fragmentProgram: Program,\n private externalLayoutCount: number,\n private label?: string,\n ) {}\n\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this.root.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length,\n this.vertexProgram.bindGroupResolver.getBindGroup(),\n );\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + 1,\n this.fragmentProgram.bindGroupResolver.getBindGroup(),\n );\n\n for (const [\n usage,\n index,\n ] of this.vertexProgram.bindGroupResolver.getVertexBuffers()) {\n passEncoder.setVertexBuffer(index, usage.allocatable.buffer);\n }\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor implements PipelineExecutor {\n constructor(\n private root: ExperimentalTgpuRoot,\n private pipeline: GPUComputePipeline,\n private programs: Program[],\n private externalLayoutCount: number,\n private label?: string,\n ) {}\n\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.root.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.bindGroupResolver.getBindGroup(),\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link init}.\n */\nexport type InitOptions = {\n adapter?: GPURequestAdapterOptions | undefined;\n device?: GPUDeviceDescriptor | undefined;\n unstable_jitTranspiler?: JitTranspiler | undefined;\n};\n\n/**\n * Options passed into {@link initFromDevice}.\n */\nexport type InitFromDeviceOptions = {\n device: GPUDevice;\n unstable_jitTranspiler?: JitTranspiler | undefined;\n};\n\n/**\n * Requests a new GPU device and creates a root around it.\n * If a specific device should be used instead, use @see initFromDevice.\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * const root = await tgpu.init();\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 * const root = await tgpu.init({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n */\nexport async function init(\n options?: InitOptions,\n): Promise<ExperimentalTgpuRoot> {\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 TgpuRootImpl(\n await adapter.requestDevice(options?.device),\n options?.unstable_jitTranspiler,\n );\n}\n\n/**\n * Creates a root from the given device, instead of requesting it like @see init.\n *\n * @example\n * ```ts\n * const device: GPUDevice = ...;\n * const root = tgpu.initFromDevice({ device });\n * ```\n */\nexport function initFromDevice(\n options: InitFromDeviceOptions,\n): ExperimentalTgpuRoot {\n return new TgpuRootImpl(options.device, options.unstable_jitTranspiler);\n}\n","import type { Parsed } from 'typed-binary';\nimport { type TgpuBuffer, createBufferImpl } from './core/buffer/buffer';\nimport type { TgpuPlum } from './tgpuPlumTypes';\nimport type { AnyTgpuData } from './types';\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n *\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n *\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return createBufferImpl(undefined, typeSchema, initialOrBuffer);\n}\n","import type { Parsed } from 'typed-binary';\nimport type { TgpuBuffer } from './core/buffer/buffer';\nimport type { AnyTgpuData } from './types';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n data: Parsed<TData>,\n): void {\n buffer.write(data);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n): Promise<Parsed<TData>> {\n return buffer.read();\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';\nimport { inGPUMode } from './gpuMode';\n\nexport const std = {\n add<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} + ${rhs})` as unknown as T;\n }\n return VectorOps.add[lhs.kind](lhs, rhs);\n },\n sub<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} - ${rhs})` as unknown as T;\n }\n return VectorOps.sub[lhs.kind](lhs, rhs);\n },\n mul: <T extends vecBase>(s: number, v: T): T => {\n if (inGPUMode()) {\n return `(${s} * ${v})` as unknown as T;\n }\n return VectorOps.mul[v.kind](s, v);\n },\n dot<T extends vecBase>(lhs: T, rhs: T): number {\n if (inGPUMode()) {\n return `dot(${lhs}, ${rhs})` as unknown as number;\n }\n return VectorOps.dot[lhs.kind](lhs, rhs);\n },\n normalize: <T extends vecBase>(v: T): T => {\n if (inGPUMode()) {\n return `normalize(${v})` as unknown as T;\n }\n return VectorOps.normalize[v.kind](v);\n },\n cross<T extends vec3f | vec3i | vec3u>(a: T, b: T): T {\n if (inGPUMode()) {\n return `cross(${a}, ${b})` as unknown as T;\n }\n return VectorOps.cross[a.kind](a, b);\n },\n fract(a: number): number {\n if (inGPUMode()) {\n return `fract(${a})` as unknown as number;\n }\n return a - Math.floor(a);\n },\n length<T extends vecBase>(vector: T): number {\n if (inGPUMode()) {\n return `length(${vector})` as unknown as number;\n }\n return VectorOps.length[vector.kind](vector);\n },\n sin(radians: number): number {\n if (inGPUMode()) {\n return `sin(${radians})` as unknown as number;\n }\n return Math.sin(radians);\n },\n cos(radians: number): number {\n if (inGPUMode()) {\n return `cos(${radians})` as unknown as number;\n }\n return Math.cos(radians);\n },\n};\n","/**\n * @module typegpu\n */\n\nimport { type InitOptions, init, initFromDevice } from './core/root/init';\nimport type { TgpuRoot } from './core/root/rootTypes';\nimport { createBuffer } from './legacyBufferApi';\nimport { bindGroupLayout } from './tgpuBindGroupLayout';\nimport { read, write } from './tgpuBufferUtils';\n\nexport const tgpu = {\n /** @deprecated Use `'uniform'` string literal instead. */\n Uniform: 'uniform' as const,\n /** @deprecated Use `'storage'` string literal instead. */\n Storage: 'storage' as const,\n /** @deprecated Use `'vertex'` string literal instead. */\n Vertex: 'vertex' as const,\n\n bindGroupLayout,\n\n init: init as (options?: InitOptions) => Promise<TgpuRoot>,\n initFromDevice,\n\n createBuffer,\n read,\n write,\n};\nexport default tgpu;\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n} from './types';\nexport { std } from './std';\nexport {\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './core/buffer/buffer';\n\nexport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n TgpuLayoutSampler,\n TgpuLayoutUniform,\n BindLayoutEntry,\n LayoutEntryToInput,\n TgpuBindGroup,\n} from './tgpuBindGroupLayout';\nexport type {\n TgpuBuffer,\n Uniform,\n Storage,\n Vertex,\n} from './core/buffer/buffer';\nexport type { TgpuRoot } from './core/root/rootTypes';\n"]}