typegpu 0.2.0-alpha.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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 { 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"]}