typegpu 0.2.0-alpha.0 → 0.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/memo.ts","../src/tgpuPlumTypes.ts","../src/plumStore.ts","../src/core/root/rootTypes.ts","../src/tgpuSampler.ts","../src/tgpuTexture.ts","../src/bindGroupResolver.ts","../src/builtin.ts","../src/builtinDataTypes.ts","../src/nameRegistry.ts","../src/smol/wgslGenerator.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/core/buffer/buffer.ts","../src/core/buffer/bufferUsage.ts","../src/tgpuBindGroupLayout.ts","../src/core/root/init.ts","../src/legacyBufferApi.ts","../src/tgpuBufferUtils.ts","../src/data/vectorOps.ts","../src/std.ts","../src/index.ts"],"names":["WeakMemo","_make","__publicField","key","args","value","TgpuExternalPlumTrait","isExternalPlum","isPlum","PlumStore","plum","state","dependencies","listeners","listener","getter","dep","depState","unsub","dirty","prevVersion","externalUnsub","unsubs","typeToVertexFormatMap","deriveVertexFormat","typeSchema","code","format","isSampler","resource","isExternalTexture","texture","isTextureView","usageToBindingTypeMap","BindGroupResolver","root","context","shaderStage","renderResources","vertexBuffers","index","buffer","entries","textureView","external","sampler","layout","bindGroup","vertexBufferDescriptors","idx","__spreadProps","__spreadValues","_a","TgpuBuiltinImpl","name","builtinNameToSymbol","ctx","builtin","builtinToType","u32","vec4f","arrayOf","f32","vec3u","typeForBuiltin","dataType","RandomNameRegistry","item","label","resolveRes","res","isWgsl","assertExhaustive","generateBoolean","bool","generateBlock","statement","generateStatement","generateIdentifier","id","generateExpression","expression","lhs","op","rhs","lhsExpr","rhsExpr","UnknownData","targetId","property","target","propertyStr","isResolvable","targetStr","idValue","argValues","arg","condition","consequent","alternate","eq","generateFunction","body","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","jitTranspiler","bindable","nextIdx","declaration","ItemStateStack","pairs","returnType","externalMap","layer","slot","i","boundValue","a","declarationType","INDENT","N","IndentController","str","ResolutionCtxImpl","opts","fn","shell","argNames","argList","identifier","group","isSamplerType","isExternalTextureType","isDepthTextureType","MissingSlotValueError","eventual","maybeSlot","isSlot","instances","instance","expectedValue","result","slotToValueMap","usedSlot","err","ResolutionError","slotValueOverrides","pushedLayer","onGPU","ProgramBuilder","rootNode","options","codeString","getUsedBuiltinsNamed","rec","builtinSymbol","builtinSymbolToName","RenderProgramBuilder","vertexRoot","fragmentRoot","vertexOutputFormat","_b","_c","_d","symbolOutputs","symbol","vertexOutputBuiltinObjects","vertexOutput","varInfo","structFields","outputName","nameForBuiltin","vertexContext","elem","vertexUserArgs","entry","vertexArgs","idForBuiltin","vertexCode","fragmentContext","fragmentBuiltinArgs","fragmentInputs","fragmentArgs","fragmentCode","vertexProgram","fragmentProgram","ComputeProgramBuilder","computeRoot","workgroupSize","builtinArgs","workgroupSizeDeclaration","shaderCode","BufferReader","BufferWriter","createBufferImpl","initialOrBuffer","TgpuBufferImpl","isBuffer","isUsableAsUniform","isUsableAsStorage","isUsableAsVertex","_group","isGPUBuffer","writer","usages","usage","flags","device","dataOrBuffer","gpuBuffer","mapped","size","sourceBuffer","commandEncoder","hostBuffer","stagingBuffer","isBufferUsage","bindGroupLayout","TgpuBindGroupLayoutImpl","isBindGroupLayout","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","unwrapper","visibility","binding","access","v","TgpuBindGroupImpl","NotUniformError","TgpuRootImpl","view","source","descriptor","gpuSampler","compute","_e","_f","_g","_h","_i","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","program","shaderModule","computePipeline","ComputePipelineExecutor","pipeline","externalLayoutCount","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","__objRest","passEncoder","programs","workgroups","init","adapter","initFromDevice","createBuffer","write","data","read","lengthVec2","lengthVec3","lengthVec4","VectorOps","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec4i","vec4u","s","len","std","inGPUMode","vector","radians","tgpu","src_default"],"mappings":"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","sourcesContent":["/**\n * Caches results of the function passed in as\n * the argument to the constructor.\n *\n * If the key can be garbage collected, it will be.\n */\nexport class WeakMemo<TKey extends object, TValue, TArgs extends unknown[]> {\n private readonly _map = new WeakMap<TKey, TValue>();\n\n constructor(private readonly _make: (key: TKey, ...args: TArgs) => TValue) {}\n\n getOrMake(key: TKey, ...args: TArgs): TValue {\n if (this._map.has(key)) {\n return this._map.get(key) as TValue;\n }\n\n const value = this._make(key, ...args);\n this._map.set(key, value);\n return value;\n }\n}\n","import type { TgpuNamable } from './namable';\n\nexport type Getter = <T>(plum: TgpuPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends TgpuPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface TgpuPlum<TValue = unknown> extends TgpuNamable {\n readonly __brand: 'TgpuPlum';\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const TgpuExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the root.`,\n);\n\nexport interface TgpuExternalPlum {\n readonly [TgpuExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | TgpuExternalPlum,\n): value is TgpuExternalPlum {\n return (value as TgpuExternalPlum)[TgpuExternalPlumTrait] === true;\n}\n\nexport function isPlum<T>(value: TgpuPlum<T> | unknown): value is TgpuPlum<T> {\n return (value as TgpuPlum).__brand === 'TgpuPlum';\n}\n","import type { TgpuSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type TgpuPlum,\n isExternalPlum,\n} from './tgpuPlumTypes';\n\nexport type PlumListener<T> = (newValue: T) => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<TgpuPlum, number>;\n active?: PlumActiveState<T> | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState<T> = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<PlumListener<T>>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<TgpuPlum, PlumState>();\n\n /**\n * Used to inspect the current state of a plum.\n * To be used mostly in unit tests.\n */\n inspect(plum: TgpuPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: TgpuPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n } as PlumState<T>;\n\n this._stateMap.set(plum, state as PlumState);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: TgpuPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener(state.value);\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: TgpuPlum<T>) {\n const dependencies = new Map<TgpuPlum, number>();\n\n const getter = (<T>(dep: TgpuPlum<T>) => {\n // registering dependency.\n if (!dependencies.has(dep)) {\n const depState = this._getState(dep);\n dependencies.set(dep, depState.version);\n }\n\n return this.get(dep);\n }) as Getter;\n\n return { value: plum.compute(getter), dependencies };\n }\n\n private _recompute<T>(plum: TgpuPlum<T>): T {\n const state = this._getState(plum);\n\n if (state.active) {\n // Unsubscribing from old dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n }\n\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state.dependencies = dependencies;\n if (state.active) {\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n state.active.unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n }\n\n if (Object.is(state.value, value)) {\n return state.value;\n }\n\n state.value = value;\n state.version = isExternalPlum(plum) ? plum.version : state.version + 1;\n\n this._notifyListeners(plum);\n\n return state.value;\n }\n\n get<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n const state = this._getState(plum);\n\n if (state.active) {\n // Return memoized value, the dependencies are keeping it up to date.\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n let dirty = false;\n\n if (isExternalPlum(plum)) {\n plum.compute(null as unknown as Getter); // external plums do not use 'get'\n dirty = state.version !== plum.version;\n } else if (state.dependencies.size > 0) {\n dirty = [...state.dependencies.entries()].some(([dep, prevVersion]) => {\n this.get(dep); // allowing dependencies to recompute if necessary.\n const depState = this._getState(dep);\n\n return depState.version !== prevVersion;\n });\n }\n\n if (!dirty) {\n // No need to recompute\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n return this._recompute(plum) as ExtractPlumValue<TPlum>;\n }\n\n set<T>(plum: TgpuPlum<T> & TgpuSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe<T>(plum: TgpuPlum<T>, listener: PlumListener<T>): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","import type { Parsed } from 'typed-binary';\n\nimport type { TgpuArray } from '../../data';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport type { PlumListener } from '../../plumStore';\nimport type { TgpuSettable } from '../../settableTrait';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport type {\n ExtractPlumValue,\n TgpuPlum,\n Unsubscribe,\n} from '../../tgpuPlumTypes';\nimport type { TgpuSampler } from '../../tgpuSampler';\nimport type {\n TgpuAnyTexture,\n TgpuAnyTextureView,\n TgpuTextureExternal,\n} from '../../tgpuTexture';\nimport type {\n AnyTgpuData,\n BoundTgpuCode,\n TgpuCode,\n TgpuData,\n} from '../../types';\nimport type { Unwrapper } from '../../unwrapper';\nimport type { TgpuBuffer } from '../buffer/buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport type SetPlumAction<T> = T | ((prev: T) => T);\n\nexport interface TgpuRoot extends Unwrapper {\n /**\n * The GPU device associated with this root.\n */\n readonly device: GPUDevice;\n\n /**\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n ): TgpuBuffer<TData>;\n\n /**\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n ): TgpuBuffer<TData>;\n\n unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;\n unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;\n unwrap(resource: TgpuBindGroup): GPUBindGroup;\n\n destroy(): void;\n}\n\nexport interface ExperimentalTgpuRoot extends TgpuRoot {\n readonly jitTranspiler?: JitTranspiler | undefined;\n /**\n * The current command encoder. This property will\n * hold the same value until `flush()` is called.\n */\n readonly commandEncoder: GPUCommandEncoder;\n\n readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum>;\n\n setPlum<TPlum extends TgpuPlum & TgpuSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ): void;\n\n onPlumChange<TValue>(\n plum: TgpuPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe;\n\n setSource(\n texture: TgpuTextureExternal,\n source: HTMLVideoElement | VideoFrame,\n ): void;\n\n isDirty(texture: TgpuTextureExternal): boolean;\n markClean(texture: TgpuTextureExternal): void;\n\n textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture;\n viewFor(view: TgpuAnyTextureView): GPUTextureView;\n externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture;\n samplerFor(sampler: TgpuSampler): GPUSampler;\n\n /**\n * Causes all commands enqueued by pipelines to be\n * submitted to the GPU.\n */\n flush(): void;\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;\n makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;\n}\n\nexport interface RenderPipelineOptions {\n vertex: {\n code: TgpuCode | BoundTgpuCode;\n output: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyTgpuData;\n };\n };\n fragment: {\n code: TgpuCode | BoundTgpuCode;\n target: Iterable<GPUColorTargetState | null>;\n };\n primitive: GPUPrimitiveState;\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport interface ComputePipelineOptions {\n code: TgpuCode | BoundTgpuCode;\n workgroupSize?: readonly [number, number?, number?];\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {\n vertexCount: number;\n instanceCount?: number;\n firstVertex?: number;\n firstInstance?: number;\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface RenderPipelineExecutor {\n execute(options: RenderPipelineExecutorOptions): void;\n}\n\nexport type ComputePipelineExecutorOptions = {\n workgroups?: readonly [number, number?, number?];\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface ComputePipelineExecutor {\n execute(options?: ComputePipelineExecutorOptions): void;\n}\n\nconst typeToVertexFormatMap: Record<string, GPUVertexFormat> = {\n f32: 'float32',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n u32: 'uint32',\n vec2u: 'uint32x2',\n vec3u: 'uint32x3',\n vec4u: 'uint32x4',\n i32: 'sint32',\n vec2i: 'sint32x2',\n vec3i: 'sint32x3',\n vec4i: 'sint32x4',\n};\n\nexport function deriveVertexFormat<\n TData extends TgpuData<AnyTgpuData> | TgpuArray<AnyTgpuData>,\n>(typeSchema: TData): GPUVertexFormat {\n if ('expressionCode' in typeSchema) {\n const code = typeSchema.expressionCode as string;\n const format = typeToVertexFormatMap[code];\n if (!format) {\n throw new Error(`Unsupported vertex format: ${code}`);\n }\n return format;\n }\n if ('elementType' in typeSchema) {\n return deriveVertexFormat(typeSchema.elementType as TData);\n }\n throw new Error('Invalid vertex format schema');\n}\n","import type { TgpuNamable } from './namable';\nimport { identifier } from './tgpuIdentifier';\nimport type {\n ResolutionCtx,\n TgpuRenderResource,\n TgpuSamplerType,\n} from './types';\n\nexport interface TgpuSampler extends TgpuRenderResource, TgpuNamable {\n readonly descriptor: GPUSamplerDescriptor;\n}\n\nexport function sampler(descriptor: GPUSamplerDescriptor): TgpuSampler {\n return new TgpuSamplerImpl(descriptor);\n}\n\nclass TgpuSamplerImpl implements TgpuSampler {\n private _label: string | undefined;\n private _type: TgpuSamplerType;\n\n constructor(public readonly descriptor: GPUSamplerDescriptor) {\n if (descriptor.compare === undefined) this._type = 'sampler';\n else this._type = 'sampler_comparison';\n }\n\n get label() {\n return this._label;\n }\n\n get type() {\n return this._type;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nexport function isSampler(\n resource: TgpuRenderResource,\n): resource is TgpuSampler {\n return resource.type === 'sampler' || resource.type === 'sampler_comparison';\n}\n","import { vec4f, vec4i, vec4u } from './data';\nimport type { TgpuNamable } from './namable';\nimport type {\n SampledTextureParams,\n StorageTextureAccess,\n StorageTextureParams,\n TexelFormat,\n TextureScalarFormat,\n} from './textureTypes';\nimport { identifier } from './tgpuIdentifier';\nimport { isSampler } from './tgpuSampler';\nimport type {\n ResolutionCtx,\n TextureUsage,\n TgpuRenderResource,\n TgpuRenderResourceType,\n} from './types';\n\ntype Optional<T> = {\n [P in keyof T]?: T[P] | undefined;\n};\n\nexport interface TgpuAnyTextureView extends TgpuRenderResource {\n readonly descriptor: GPUTextureViewDescriptor;\n readonly texture: TgpuAnyTexture;\n readonly dataType: TextureScalarFormat | TexelFormat;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface TgpuAnyTexture {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get flags(): GPUTextureUsageFlags;\n}\n\nexport interface TgpuTexture<TAllows extends TextureUsage = never>\n extends TgpuNamable {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get label(): string | undefined;\n get flags(): GPUTextureUsageFlags;\n\n $allowSampled(): TgpuTexture<TAllows | 'sampled'>;\n $allowStorage(): TgpuTexture<TAllows | 'storage'>;\n\n asStorage(\n params: StorageTextureParams,\n ): 'storage' extends TAllows ? TgpuTextureView<TexelFormat, 'storage'> : null;\n asSampled(\n params: SampledTextureParams,\n ): 'sampled' extends TAllows\n ? TgpuTextureView<typeof params.dataType, 'sampled'>\n : null;\n}\n\nexport interface TgpuTextureView<\n TData extends TextureScalarFormat | TexelFormat,\n TUsage extends TextureUsage,\n> extends TgpuRenderResource,\n TgpuNamable {\n readonly texture: TgpuTexture<TUsage>;\n readonly descriptor: Omit<GPUTextureViewDescriptor, 'usage'>;\n readonly type: TgpuRenderResourceType;\n readonly dataType: TData;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface TgpuTextureExternal extends TgpuRenderResource, TgpuNamable {\n readonly descriptor: Optional<GPUExternalTextureDescriptor>;\n get source(): HTMLVideoElement | VideoFrame | undefined;\n}\n\nexport function texture<TUsage extends TextureUsage = never>(\n descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n): TgpuTexture<TUsage> {\n return new TgpuTextureImpl(descriptor);\n}\n\nexport function textureExternal(\n source?: HTMLVideoElement | VideoFrame,\n colorSpace?: PredefinedColorSpace,\n): TgpuTextureExternal {\n return new TgpuTextureExternalImpl(source, colorSpace);\n}\n\nclass TgpuTextureImpl<TAllows extends TextureUsage = never>\n implements TgpuTexture<TAllows>, TgpuAnyTexture\n{\n private _flags: GPUTextureUsageFlags =\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.COPY_SRC |\n GPUTextureUsage.RENDER_ATTACHMENT;\n private _allowedUsages: {\n sampled: Map<\n string,\n TgpuTextureView<TextureScalarFormat, 'sampled'>\n > | null;\n storage: Map<string, TgpuTextureView<TexelFormat, 'storage'>> | null;\n } = {\n sampled: null,\n storage: null,\n };\n private _label: string | undefined;\n\n constructor(\n public readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get flags() {\n return this._flags;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $addFlags(flags: GPUTextureUsageFlags) {\n this._flags |= flags;\n return this;\n }\n\n $allowSampled() {\n const enrichedThis = this as TgpuTexture<TAllows | 'sampled'>;\n if (!this._allowedUsages.sampled) {\n this._allowedUsages.sampled = new Map();\n }\n this.$addFlags(GPUTextureUsage.TEXTURE_BINDING);\n return enrichedThis;\n }\n\n $allowStorage() {\n const enrichedThis = this as TgpuTexture<TAllows | 'storage'>;\n if (!this._allowedUsages.storage) {\n this._allowedUsages.storage = new Map();\n }\n this.$addFlags(GPUTextureUsage.STORAGE_BINDING);\n return enrichedThis;\n }\n\n private getStorageIfAllowed(\n params: StorageTextureParams,\n ): TgpuTextureView<TexelFormat, 'storage'> | null {\n if (!this._allowedUsages.storage) {\n return null;\n }\n const stringified = hashFromShallowObj(params);\n const existing = this._allowedUsages.storage.get(stringified);\n if (existing) {\n return existing;\n }\n const type = texelFormatToTgpuType[this.descriptor.format];\n if (!type) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n const view = new TgpuTextureViewImpl(\n params.type,\n this,\n type,\n params.descriptor,\n params.access,\n ) as unknown as TgpuTextureView<typeof type, 'storage'>;\n this._allowedUsages.storage.set(stringified, view);\n return view;\n }\n\n private getSampledIfAllowed(\n params: SampledTextureParams,\n ): TgpuTextureView<TextureScalarFormat, 'sampled'> | null {\n if (!this._allowedUsages.sampled) {\n return null;\n }\n const stringified = hashFromShallowObj({\n type: params.type,\n dataType: String(params.dataType),\n });\n const existing = this._allowedUsages.sampled.get(stringified);\n if (existing) {\n return existing;\n }\n const view = new TgpuTextureViewImpl(\n params.type,\n this,\n params.dataType,\n params.descriptor,\n ) as unknown as TgpuTextureView<typeof params.dataType, 'sampled'>;\n this._allowedUsages.sampled.set(stringified, view);\n return view;\n }\n\n asStorage(params: StorageTextureParams) {\n const maybeView = this.getStorageIfAllowed(params);\n const maybeType = texelFormatToTgpuType[this.descriptor.format];\n if (!maybeType) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n return maybeView as 'storage' extends TAllows\n ? TgpuTextureView<typeof maybeType, 'storage'>\n : null;\n }\n\n asSampled(params: SampledTextureParams) {\n return this.getSampledIfAllowed(params) as 'sampled' extends TAllows\n ? TgpuTextureView<typeof params.dataType, 'sampled'>\n : null;\n }\n}\n\nclass TgpuTextureViewImpl<\n TData extends TextureScalarFormat | TexelFormat,\n TUsage extends TextureUsage,\n> implements TgpuTextureView<TData, TUsage>, TgpuAnyTextureView\n{\n private _label: string | undefined;\n\n constructor(\n public readonly type: TgpuRenderResourceType,\n public readonly texture: TgpuTexture<TUsage>,\n public readonly dataType: TData,\n public readonly descriptor: GPUTextureViewDescriptor = {},\n public readonly access: StorageTextureAccess | undefined = undefined,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nclass TgpuTextureExternalImpl implements TgpuTextureExternal {\n private _label: string | undefined;\n public readonly type = 'texture_external';\n public readonly descriptor: Optional<GPUExternalTextureDescriptor>;\n\n constructor(\n source: HTMLVideoElement | VideoFrame | undefined,\n colorSpace: PredefinedColorSpace | undefined,\n ) {\n this.descriptor = { source, colorSpace };\n }\n\n get label() {\n return this._label;\n }\n\n get source() {\n return this.descriptor.source;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n ctx.addRenderResource(this, ident);\n return ctx.resolve(ident);\n }\n}\n\nexport function isExternalTexture(\n texture: TgpuRenderResource,\n): texture is TgpuTextureExternal {\n return !('texture' in texture) && !isSampler(texture);\n}\n\nexport function isTextureView(\n texture: TgpuRenderResource,\n): texture is TgpuAnyTextureView {\n return 'texture' in texture;\n}\n\nconst texelFormatToTgpuType: Record<string, TexelFormat> = {\n rgba8unorm: vec4f,\n rgba8snorm: vec4f,\n rgba8uint: vec4u,\n rgba8sint: vec4i,\n rgba16uint: vec4u,\n rgba16sint: vec4i,\n rgba16float: vec4f,\n r32uint: vec4u,\n r32sint: vec4i,\n r32float: vec4f,\n rg32uint: vec4u,\n rg32sint: vec4i,\n rg32float: vec4f,\n rgba32uint: vec4u,\n rgba32sint: vec4i,\n rgba32float: vec4f,\n bgra8unorm: vec4f,\n};\n\nfunction hashFromShallowObj(obj: object): string {\n const withKeysSorted = Object.fromEntries(\n Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n return JSON.stringify(withKeysSorted);\n}\n","import type { TgpuBufferVertex } from './core/buffer/bufferUsage';\nimport {\n type ExperimentalTgpuRoot,\n deriveVertexFormat,\n} from './core/root/rootTypes';\nimport type { ResolutionCtxImpl } from './resolutionCtx';\nimport { type TgpuSampler, isSampler } from './tgpuSampler';\nimport {\n type TgpuAnyTextureView,\n type TgpuTextureExternal,\n isExternalTexture,\n isTextureView,\n} from './tgpuTexture';\nimport type { AnyTgpuData, BufferUsage, TgpuBindable, TgpuData } from './types';\n\nconst usageToBindingTypeMap: Record<\n Exclude<BufferUsage, 'vertex'>,\n GPUBufferBindingType\n> = {\n uniform: 'uniform',\n mutable: 'storage',\n readonly: 'read-only-storage',\n};\n\nexport class BindGroupResolver {\n private samplers: TgpuSampler[] = [];\n private textureViews: TgpuAnyTextureView[] = [];\n private externalTextures: TgpuTextureExternal[] = [];\n private buffers: TgpuBindable<AnyTgpuData, BufferUsage>[] = [];\n private vertexBuffers: Map<TgpuBufferVertex<AnyTgpuData>, number> | null =\n null;\n\n private layout: GPUBindGroupLayout | null = null;\n private bindGroup: GPUBindGroup | null = null;\n private vertexLayout: GPUVertexBufferLayout[] | null = null;\n\n constructor(\n private root: ExperimentalTgpuRoot,\n private context: ResolutionCtxImpl,\n public readonly shaderStage: number,\n ) {\n const renderResources = Array.from(context.usedRenderResources);\n for (const resource of renderResources) {\n if (isSampler(resource)) {\n this.samplers.push(resource);\n } else if (isTextureView(resource)) {\n this.textureViews.push(resource);\n } else if (isExternalTexture(resource)) {\n this.externalTextures.push(resource);\n } else {\n throw new Error(`Invalid resource type: ${resource}`);\n }\n }\n this.buffers = Array.from(context.usedBindables);\n }\n\n setVertexBuffers(\n vertexBuffers: {\n index: number;\n buffer: TgpuBufferVertex<AnyTgpuData>;\n }[],\n ) {\n if (this.shaderStage !== GPUShaderStage.VERTEX) {\n throw new Error('Vertex buffers can only be set for vertex shader');\n }\n this.vertexBuffers = new Map(\n vertexBuffers.map(({ index, buffer }) => [buffer, index]),\n );\n }\n\n getBindGroupLayout() {\n if (this.layout) {\n return this.layout;\n }\n\n const entries: GPUBindGroupLayoutEntry[] = [];\n for (const textureView of this.textureViews) {\n if (textureView.access === undefined) {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n visibility: this.shaderStage,\n texture: {},\n });\n } else {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n visibility: this.shaderStage,\n storageTexture: { format: textureView.texture.descriptor.format },\n });\n }\n }\n for (const external of this.externalTextures) {\n entries.push({\n binding: this.context.getIndexFor(external),\n visibility: this.shaderStage,\n externalTexture: {},\n });\n }\n for (const sampler of this.samplers) {\n entries.push({\n binding: this.context.getIndexFor(sampler),\n visibility: this.shaderStage,\n sampler: {},\n });\n }\n for (const buffer of this.buffers) {\n if (buffer.usage === 'vertex') continue;\n entries.push({\n binding: this.context.getIndexFor(buffer),\n visibility: this.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[buffer.usage],\n },\n });\n }\n const layout = this.root.device.createBindGroupLayout({\n entries,\n });\n this.layout = layout;\n return layout;\n }\n\n getBindGroup() {\n this.checkBindGroupInvalidation();\n\n if (this.bindGroup) {\n return this.bindGroup;\n }\n\n const entries: GPUBindGroupEntry[] = [];\n for (const textureView of this.textureViews) {\n entries.push({\n binding: this.context.getIndexFor(textureView),\n resource: this.root.viewFor(textureView),\n });\n }\n for (const external of this.externalTextures) {\n entries.push({\n binding: this.context.getIndexFor(external),\n resource: this.root.externalTextureFor(external),\n });\n }\n for (const sampler of this.samplers) {\n entries.push({\n binding: this.context.getIndexFor(sampler),\n resource: this.root.samplerFor(sampler),\n });\n }\n for (const buffer of this.buffers) {\n if (buffer.usage === 'vertex') continue;\n entries.push({\n binding: this.context.getIndexFor(buffer),\n resource: {\n buffer: buffer.allocatable.buffer,\n },\n });\n }\n const bindGroup = this.root.device.createBindGroup({\n layout: this.getBindGroupLayout(),\n entries,\n });\n\n this.bindGroup = bindGroup;\n return bindGroup;\n }\n\n getBindings() {\n return {\n bindGroupLayout: this.getBindGroupLayout(),\n bindGroup: this.getBindGroup(),\n };\n }\n\n getVertexBufferDescriptors() {\n if (this.vertexBuffers === null) {\n throw new Error('Vertex buffers not set');\n }\n\n if (this.vertexLayout) {\n return this.vertexLayout;\n }\n\n const vertexBufferDescriptors: GPUVertexBufferLayout[] = [];\n for (const [buffer, idx] of this.vertexBuffers.entries()) {\n vertexBufferDescriptors.push({\n ...buffer.vertexLayout,\n attributes: [\n {\n shaderLocation: idx,\n offset: 0,\n format: deriveVertexFormat(\n buffer.allocatable.dataType as TgpuData<AnyTgpuData>,\n ),\n },\n ],\n });\n }\n\n this.vertexLayout = vertexBufferDescriptors;\n return vertexBufferDescriptors;\n }\n\n getVertexBuffers() {\n if (this.vertexBuffers === null) {\n throw new Error('Vertex buffers not set');\n }\n return this.vertexBuffers.entries();\n }\n\n getVertexBufferIndex(buffer: TgpuBufferVertex<AnyTgpuData>) {\n const index = this.vertexBuffers?.get(buffer);\n if (this.vertexBuffers === null || index === undefined) {\n throw new Error('Vertex buffers not set');\n }\n return index;\n }\n\n invalidateBindGroup() {\n this.bindGroup = null;\n }\n\n checkBindGroupInvalidation() {\n for (const texture of this.externalTextures) {\n // check if texture is dirty (changed source) -> if so, invalidate bind group and mark clean\n if (this.root.isDirty(texture)) {\n this.invalidateBindGroup();\n this.root.markClean(texture);\n continue;\n }\n\n // check if any external texture is of type HTMLVideoElement -> if so, invalidate bind group as it expires on bind\n if (texture.source instanceof HTMLVideoElement) {\n this.invalidateBindGroup();\n }\n }\n }\n}\n","import type { vec3u, vec4f } from './data';\n\nimport { type BuiltinName, builtinNameToSymbol } from './builtinIdentifiers';\nimport { code } from './tgpuCode';\nimport type { ResolutionCtx, TgpuResolvable } from './types';\n\nexport interface TgpuBuiltin extends TgpuResolvable {\n readonly name: BuiltinName;\n readonly s: symbol;\n}\n\nclass TgpuBuiltinImpl implements TgpuBuiltin {\n public readonly s: symbol;\n\n constructor(public readonly name: BuiltinName) {\n this.s = builtinNameToSymbol.get(name) as symbol;\n }\n\n get label() {\n return this.name;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(code`${this.s}`);\n }\n}\n\nexport type BuiltinVertexIndex = TgpuBuiltin & number;\nexport type BuiltinInstanceIndex = TgpuBuiltin & number;\nexport type BuiltinPosition = TgpuBuiltin & vec4f;\nexport type BuiltinClipDistances = TgpuBuiltin & number[];\nexport type BuiltinFrontFacing = TgpuBuiltin & boolean;\nexport type BuiltinFragDepth = TgpuBuiltin & number;\nexport type BuiltinSampleIndex = TgpuBuiltin & number;\nexport type BuiltinSampleMask = TgpuBuiltin & vec4f;\nexport type BuiltinFragment = TgpuBuiltin & vec4f;\nexport type BuiltinLocalInvocationId = TgpuBuiltin & vec3u;\nexport type BuiltinLocalInvocationIndex = TgpuBuiltin & number;\nexport type BuiltinGlobalInvocationId = TgpuBuiltin & vec3u;\nexport type BuiltinWorkgroupId = TgpuBuiltin & vec3u;\nexport type BuiltinNumWorkgroups = TgpuBuiltin & vec3u;\n\nexport const builtin = {\n vertexIndex: new TgpuBuiltinImpl('vertex_index') as BuiltinVertexIndex,\n instanceIndex: new TgpuBuiltinImpl('instance_index') as BuiltinInstanceIndex,\n position: new TgpuBuiltinImpl('position') as BuiltinPosition,\n clipDistances: new TgpuBuiltinImpl('clip_distances') as BuiltinClipDistances,\n frontFacing: new TgpuBuiltinImpl('front_facing') as BuiltinFrontFacing,\n fragDepth: new TgpuBuiltinImpl('frag_depth') as BuiltinFragDepth,\n sampleIndex: new TgpuBuiltinImpl('sample_index') as BuiltinSampleIndex,\n sampleMask: new TgpuBuiltinImpl('sample_mask') as BuiltinSampleMask,\n fragment: new TgpuBuiltinImpl('fragment') as BuiltinFragment,\n localInvocationId: new TgpuBuiltinImpl(\n 'local_invocation_id',\n ) as BuiltinLocalInvocationId,\n localInvocationIndex: new TgpuBuiltinImpl(\n 'local_invocation_index',\n ) as BuiltinLocalInvocationIndex,\n globalInvocationId: new TgpuBuiltinImpl(\n 'global_invocation_id',\n ) as BuiltinGlobalInvocationId,\n workgroupId: new TgpuBuiltinImpl('workgroup_id') as BuiltinWorkgroupId,\n numWorkgroups: new TgpuBuiltinImpl('num_workgroups') as BuiltinNumWorkgroups,\n} as const;\n\ntype Builtin = (typeof builtin)[keyof typeof builtin];\n\nexport type OmitBuiltins<S extends object> = {\n [Key in keyof S as S[Key] extends Builtin ? never : Key]: S[Key];\n};\n","import { builtin } from './builtin';\nimport {\n type F32,\n type TgpuArray,\n type U32,\n type Vec3u,\n type Vec4f,\n arrayOf,\n f32,\n u32,\n vec3u,\n vec4f,\n} from './data';\n\nexport type BuiltInPossibleTypes = U32 | F32 | Vec3u | Vec4f | TgpuArray<U32>;\n\nconst builtinToType: Record<symbol, BuiltInPossibleTypes> = {\n [builtin.vertexIndex.s]: u32,\n [builtin.instanceIndex.s]: u32,\n [builtin.position.s]: vec4f,\n [builtin.clipDistances.s]: arrayOf(u32, 8),\n [builtin.frontFacing.s]: f32,\n [builtin.fragDepth.s]: f32,\n [builtin.sampleIndex.s]: u32,\n [builtin.sampleMask.s]: u32,\n [builtin.fragment.s]: vec4f,\n [builtin.localInvocationId.s]: vec3u,\n [builtin.localInvocationIndex.s]: u32,\n [builtin.globalInvocationId.s]: vec3u,\n [builtin.workgroupId.s]: vec3u,\n [builtin.numWorkgroups.s]: vec3u,\n};\n\nexport function typeForBuiltin(key: symbol): BuiltInPossibleTypes {\n const dataType = builtinToType[key];\n if (!dataType) {\n throw new Error(`The symbol ${String(key)} in not a valid 'builtin'`);\n }\n\n return dataType;\n}\n","import type { TgpuResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: TgpuResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<TgpuResolvable, string>();\n\n nameFor(item: TgpuResolvable) {\n let name = this.names.get(item);\n\n if (name === undefined) {\n // creating sanitized name\n let label: string;\n if (item.label) {\n label = item.label.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n name = `${label}_${this.lastUniqueId++}`;\n this.names.set(item, name);\n }\n\n return name;\n }\n}\n\nexport class StrictNameRegistry implements NameRegistry {\n /**\n * Allows to provide a good fallback for instances of the\n * same function that are bound to different slot values.\n */\n private readonly _usedNames = new Set<string>();\n\n private readonly _assignedNames = new WeakMap<TgpuResolvable, string>();\n\n nameFor(item: TgpuResolvable): string {\n const assignedName = this._assignedNames.get(item);\n if (assignedName !== undefined) {\n return assignedName;\n }\n\n if (item.label === undefined) {\n throw new Error('Unnamed item found when using a strict NameRegistry');\n }\n\n let index = 0;\n let unusedName = item.label;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${item.label}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n this._assignedNames.set(item, unusedName);\n return unusedName;\n }\n}\n","import { bool } from '../data';\nimport {\n type ResolutionCtx,\n type Resource,\n UnknownData,\n type Wgsl,\n isResolvable,\n isWgsl,\n} from '../types';\nimport type * as smol from './nodes';\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n indent(): string;\n dedent(): string;\n getById(id: string): Resource;\n // getDataType(node: smol.AnyNode): AnyTgpuData;\n};\n\nfunction resolveRes(ctx: GenerationCtx, res: Resource): string {\n if (isWgsl(res.value)) {\n return ctx.resolve(res.value);\n }\n\n return String(res.value);\n}\n\nfunction assertExhaustive(value: unknown): never {\n throw new Error(\n `'${JSON.stringify(value)}' was not handled by the WGSL generator.`,\n );\n}\n\nfunction generateBoolean(ctx: GenerationCtx, value: boolean): Resource {\n return value\n ? { value: 'true', dataType: bool }\n : { value: 'false', dataType: bool };\n}\n\nfunction generateBlock(ctx: GenerationCtx, value: smol.Block): string {\n return `${ctx.indent()}{\n${value.block.map((statement) => generateStatement(ctx, statement)).join('\\n')}\n${ctx.dedent()}}`;\n}\n\nfunction generateIdentifier(ctx: GenerationCtx, id: string): Resource {\n return ctx.getById(id);\n}\n\nfunction generateExpression(\n ctx: GenerationCtx,\n expression: smol.Expression,\n): Resource {\n if (typeof expression === 'string') {\n return generateIdentifier(ctx, expression);\n }\n\n if (typeof expression === 'boolean') {\n return generateBoolean(ctx, expression);\n }\n\n if ('x2' in expression) {\n // Logical/Binary/Assignment Expression\n\n const [lhs, op, rhs] = expression.x2;\n const lhsExpr = resolveRes(ctx, generateExpression(ctx, lhs));\n const rhsExpr = resolveRes(ctx, generateExpression(ctx, rhs));\n return {\n value: `${lhsExpr} ${op} ${rhsExpr}`,\n // TODO: Infer data type from expression type and arguments.\n dataType: UnknownData,\n };\n }\n\n if ('.' in expression) {\n // Member Access\n\n const [targetId, property] = expression['.'];\n const target = generateExpression(ctx, targetId);\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n if (isResolvable(target.value) || typeof target.value === 'object') {\n // NOTE: Temporary solution, assuming that access to `.value` of resolvables should always resolve to just the target.\n if (propertyStr === 'value') {\n return {\n value: resolveRes(ctx, target),\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n return {\n // biome-ignore lint/suspicious/noExplicitAny: <sorry TypeScript>\n value: (target.value as any)[propertyStr],\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n const targetStr = resolveRes(ctx, target);\n\n return {\n value: `${targetStr}.${propertyStr}`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if ('[]' in expression) {\n // Index Access\n\n const [target, property] = expression['[]'];\n const targetStr = resolveRes(ctx, generateExpression(ctx, target));\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n return {\n value: `${targetStr}[${propertyStr}]`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if ('num' in expression) {\n // Numeric Literal\n\n // TODO: Infer numeric data type from literal\n return { value: expression.num, dataType: UnknownData };\n }\n\n if ('call' in expression) {\n // Function Call\n\n const id = generateExpression(ctx, expression.call);\n const idValue = id.value;\n\n const argResources = expression.args.map((arg) =>\n generateExpression(ctx, arg),\n );\n const argValues = argResources.map((res) => resolveRes(ctx, res));\n\n if (isResolvable(idValue) || typeof idValue === 'function') {\n // Assuming that `id` is callable\n // TODO: Pass in resources, not just values.\n const result = (idValue as unknown as (...args: unknown[]) => unknown)(\n ...argValues,\n ) as Wgsl;\n // TODO: Make function calls return resources instead of just values.\n return { value: result, dataType: UnknownData };\n }\n\n return {\n value: `${String(idValue)}(${argValues.join(', ')})`,\n dataType: UnknownData,\n };\n }\n\n assertExhaustive(expression);\n}\n\nfunction generateStatement(\n ctx: GenerationCtx,\n statement: smol.Statement,\n): string {\n if (typeof statement === 'string') {\n return `${ctx.pre}${resolveRes(ctx, generateIdentifier(ctx, statement))};`;\n }\n\n if (typeof statement === 'boolean') {\n return `${ctx.pre}${resolveRes(ctx, generateBoolean(ctx, statement))};`;\n }\n\n if ('return' in statement) {\n return statement.return === null\n ? `${ctx.pre}return;`\n : `${ctx.pre}return ${resolveRes(ctx, generateExpression(ctx, statement.return))};`;\n }\n\n if ('if' in statement) {\n const condition = resolveRes(ctx, generateExpression(ctx, statement.if));\n\n ctx.indent(); // {\n const consequent = generateStatement(ctx, statement.do);\n ctx.dedent(); // }\n\n ctx.indent(); // {\n const alternate = statement.else\n ? generateStatement(ctx, statement.else)\n : undefined;\n ctx.dedent(); // }\n\n if (!alternate) {\n return `\\\n${ctx.pre}if (${condition})\n${consequent}`;\n }\n\n return `\\\n${ctx.pre}if (${condition})\n${consequent}\n${ctx.pre}else\n${alternate}`;\n }\n\n if ('let' in statement || 'const' in statement) {\n const id = resolveRes(\n ctx,\n generateIdentifier(\n ctx,\n 'let' in statement ? statement.let : statement.const,\n ),\n );\n const eq = statement.eq ? generateExpression(ctx, statement.eq) : undefined;\n\n if (!eq) {\n throw new Error('Cannot create variable without an initial value.');\n }\n\n return `${ctx.pre}var ${id} = ${resolveRes(ctx, eq)};`;\n }\n\n if ('block' in statement) {\n // TODO: Push block scope layer onto the stack\n return generateBlock(ctx, statement);\n }\n\n return `${ctx.pre}${resolveRes(ctx, generateExpression(ctx, statement))};`;\n}\n\nexport function generateFunction(ctx: GenerationCtx, body: smol.Block): string {\n return generateBlock(ctx, body);\n}\n","import type { TgpuFnShellBase } from './core/function/fnCore';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { onGPU } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { type Block, generateFunction } from './smol';\nimport { code } from './tgpuCode';\nimport { isTextureView } from './tgpuTexture';\nimport type {\n AnyTgpuData,\n BufferUsage,\n Eventual,\n ResolutionCtx,\n Resource,\n SlotValuePair,\n TgpuBindable,\n TgpuIdentifier,\n TgpuRenderResource,\n TgpuResolvable,\n TgpuSlot,\n Wgsl,\n} from './types';\nimport {\n UnknownData,\n isDepthTextureType,\n isExternalTextureType,\n isResolvable,\n isSamplerType,\n isSlot,\n} from './types';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n readonly jitTranspiler?: JitTranspiler | undefined;\n};\n\ntype SlotToValueMap = Map<TgpuSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<Exclude<BufferUsage, 'vertex'>, string> = {\n uniform: 'uniform',\n mutable: 'storage, read_write',\n readonly: 'storage, read',\n};\n\nclass SharedResolutionState {\n private _nextFreeBindingIdx = 0;\n private _nextFreeVertexBindingIdx = 0;\n private readonly _usedBindables = new Set<TgpuBindable>();\n private readonly _usedRenderResources = new Set<TgpuRenderResource>();\n private readonly _resourceToIndexMap = new WeakMap<\n TgpuRenderResource | TgpuBindable,\n number\n >();\n private readonly _vertexBufferToIndexMap = new WeakMap<\n TgpuBindable,\n number\n >();\n private readonly _usedBuiltins = new Set<symbol>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n public readonly jitTranspiler: JitTranspiler | undefined,\n ) {}\n\n get usedBindables(): Iterable<TgpuBindable> {\n return this._usedBindables;\n }\n\n get usedRenderResources(): Iterable<TgpuRenderResource> {\n return this._usedRenderResources;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n get usedBuiltins(): Iterable<symbol> {\n return this._usedBuiltins;\n }\n\n reserveBindingEntry(bindable: TgpuBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(bindable, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n registerVertexEntry(bindable: TgpuBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeVertexBindingIdx++;\n this._vertexBufferToIndexMap.set(bindable, nextIdx);\n }\n\n reserveRenderResourceEntry(resource: TgpuRenderResource) {\n this._usedRenderResources.add(resource);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(resource, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n getBindingIndex(resource: TgpuRenderResource | TgpuBindable) {\n return this._resourceToIndexMap.get(resource);\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n\n addBuiltin(builtin: symbol) {\n this._usedBuiltins.add(builtin);\n }\n}\n\ntype ItemLayer = {\n type: 'item';\n usedSlots: Set<TgpuSlot<unknown>>;\n};\n\ntype SlotBindingLayer = {\n type: 'slotBinding';\n bindingMap: WeakMap<TgpuSlot<unknown>, unknown>;\n};\n\ntype FunctionScopeLayer = {\n type: 'functionScope';\n args: Resource[];\n externalMap: Record<string, unknown>;\n returnType: AnyTgpuData | undefined;\n};\n\ntype BlockScopeLayer = {\n type: 'blockScope';\n declarations: Map<string, AnyTgpuData | UnknownData>;\n};\n\nclass ItemStateStack {\n private _stack: (\n | ItemLayer\n | SlotBindingLayer\n | FunctionScopeLayer\n | BlockScopeLayer\n )[] = [];\n private _itemDepth = 0;\n\n get itemDepth(): number {\n return this._itemDepth;\n }\n\n get topItem(): ItemLayer {\n const state = this._stack[this._stack.length - 1];\n if (!state || state.type !== 'item') {\n throw new Error('Internal error, expected item layer to be on top.');\n }\n return state;\n }\n\n pushItem() {\n this._itemDepth++;\n this._stack.push({\n type: 'item',\n usedSlots: new Set(),\n });\n }\n\n pushSlotBindings(pairs: SlotValuePair<unknown>[]) {\n this._stack.push({\n type: 'slotBinding',\n bindingMap: new WeakMap(pairs),\n });\n }\n\n pushFunctionScope(\n args: Resource[],\n returnType: AnyTgpuData | undefined,\n externalMap: Record<string, unknown>,\n ) {\n this._stack.push({\n type: 'functionScope',\n args,\n returnType,\n externalMap,\n });\n }\n\n pop() {\n const layer = this._stack.pop();\n if (layer?.type === 'item') {\n this._itemDepth--;\n }\n }\n\n readSlot<T>(slot: TgpuSlot<T>): T | undefined {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n if (layer?.type === 'item') {\n // Binding not available yet, so this layer is dependent on the slot's value.\n layer.usedSlots.add(slot);\n } else if (layer?.type === 'slotBinding') {\n const boundValue = layer.bindingMap.get(slot);\n\n if (boundValue !== undefined) {\n return boundValue as T;\n }\n } else if (\n layer?.type === 'functionScope' ||\n layer?.type === 'blockScope'\n ) {\n // Skip\n } else {\n throw new Error('Unknown layer type.');\n }\n }\n\n return slot.defaultValue;\n }\n\n getResourceById(id: string): Resource | undefined {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n\n if (layer?.type === 'functionScope') {\n const arg = layer.args.find((a) => a.value === id);\n if (arg !== undefined) {\n return arg;\n }\n\n const external = layer.externalMap[id];\n if (external !== undefined) {\n // TODO: Extract the type of the external value.\n return { value: external, dataType: UnknownData };\n }\n } else if (layer?.type === 'blockScope') {\n const declarationType = layer.declarations.get(id);\n if (declarationType !== undefined) {\n return { value: id, dataType: declarationType };\n }\n } else {\n // Skip\n }\n }\n\n return undefined;\n }\n}\n\nconst INDENT = [\n '', // 0\n ' ', // 1\n ' ', // 2\n ' ', // 3\n ' ', // 4\n ' ', // 5\n ' ', // 6\n ' ', // 7\n ' ', // 8\n];\n\nconst N = INDENT.length - 1;\n\nexport class IndentController {\n private identLevel = 0;\n\n get pre(): string {\n return (\n INDENT[this.identLevel] ??\n (INDENT[N] as string).repeat(this.identLevel / N) +\n INDENT[this.identLevel % N]\n );\n }\n\n indent(): string {\n const str = this.pre;\n this.identLevel++;\n return str;\n }\n\n dedent(): string {\n this.identLevel--;\n return this.pre;\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\n private readonly _memoizedResolves = new WeakMap<\n // WeakMap because if the resolvable does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n TgpuResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private readonly _shared: SharedResolutionState;\n private readonly _indentController = new IndentController();\n\n private _itemStateStack = new ItemStateStack();\n\n constructor(opts: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(\n opts.names,\n opts.bindingGroup ?? 0,\n opts.jitTranspiler,\n );\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n get usedRenderResources() {\n return this._shared.usedRenderResources;\n }\n\n get usedBuiltins() {\n return this._shared.usedBuiltins;\n }\n\n get pre(): string {\n return this._indentController.pre;\n }\n\n indent(): string {\n return this._indentController.indent();\n }\n\n dedent(): string {\n return this._indentController.dedent();\n }\n\n getById(id: string): Resource {\n // TODO: Provide access to external values\n // TODO: Provide data type information\n return (\n this._itemStateStack.getResourceById(id) ?? {\n value: id,\n dataType: UnknownData,\n }\n );\n }\n\n transpileFn(fn: string): {\n argNames: string[];\n body: Block;\n externalNames: string[];\n } {\n if (!this._shared.jitTranspiler) {\n throw new Error(\n 'Tried to execute a tgpu.fn function without providing a JIT transpiler, or transpiling at build time.',\n );\n }\n\n return this._shared.jitTranspiler.transpileFn(fn);\n }\n\n fnToWgsl(\n // biome-ignore lint/suspicious/noExplicitAny: <no need for generic magic>\n shell: TgpuFnShellBase<any, AnyTgpuData>,\n argNames: string[],\n body: Block,\n externalMap: Record<string, unknown>,\n ): { head: Wgsl; body: Wgsl } {\n const args: { value: string; dataType: AnyTgpuData }[] = argNames.map(\n (name, idx) => ({\n value: name,\n dataType: shell.argTypes[idx],\n }),\n );\n\n this._itemStateStack.pushFunctionScope(args, shell.returnType, externalMap);\n const str = generateFunction(this, body);\n this._itemStateStack.pop();\n\n const argList = args\n .map((arg) => `${arg.value}: ${this.resolve(arg.dataType)}`)\n .join(', ');\n\n return {\n head:\n shell.returnType !== undefined\n ? `(${argList}) -> ${this.resolve(shell.returnType)}`\n : `(${argList})`,\n body: str,\n };\n }\n\n addDeclaration(declaration: TgpuResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void {\n if (bindable.usage === 'vertex') {\n this._shared.registerVertexEntry(bindable);\n return;\n }\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n addRenderResource(\n resource: TgpuRenderResource,\n identifier: TgpuIdentifier,\n ): void {\n const { group, idx } = this._shared.reserveRenderResourceEntry(resource);\n\n if (\n isSamplerType(resource.type) ||\n isExternalTextureType(resource.type) ||\n isDepthTextureType(resource.type)\n ) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type};`,\n );\n return;\n }\n\n if (isTextureView(resource)) {\n if (resource.access !== undefined) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.texture.descriptor.format}, ${resource.access}>;`,\n );\n return;\n }\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.dataType}>;`,\n );\n return;\n }\n\n throw new Error(`Unsupported resource type: ${resource.type}`);\n }\n\n addBuiltin(builtin: symbol): void {\n this._shared.addBuiltin(builtin);\n }\n\n nameFor(item: TgpuResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: TgpuSlot<T>): T {\n const value = this._itemStateStack.readSlot(slot);\n\n if (value === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return value;\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeSlot = eventual;\n\n // Unwrapping all layers of slots.\n while (isSlot(maybeSlot)) {\n maybeSlot = this.readSlot(maybeSlot);\n }\n\n return maybeSlot;\n }\n\n /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved.\n */\n _getOrInstantiate(item: TgpuResolvable): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n this._itemStateStack.pushItem();\n\n try {\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) =>\n this._itemStateStack.readSlot(slot) === expectedValue,\n )\n ) {\n return instance.result;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n const result = item.resolve(this);\n\n // We know which slots the item used while resolving\n const slotToValueMap = new Map<TgpuSlot<unknown>, unknown>();\n for (const usedSlot of this._itemStateStack.topItem.usedSlots) {\n slotToValueMap.set(usedSlot, this._itemStateStack.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(item);\n }\n\n throw new ResolutionError(err, [item]);\n } finally {\n this._itemStateStack.pop();\n }\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n let pushedLayer = false;\n if (slotValueOverrides.length > 0) {\n pushedLayer = true;\n this._itemStateStack.pushSlotBindings(slotValueOverrides);\n }\n\n try {\n if (this._itemStateStack.itemDepth === 0) {\n const result = onGPU(() => this._getOrInstantiate(item));\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n\n return this._getOrInstantiate(item);\n } finally {\n if (pushedLayer) {\n this._itemStateStack.pop();\n }\n }\n }\n\n getIndexFor(item: TgpuBindable | TgpuRenderResource) {\n const index = this._shared.getBindingIndex(item);\n if (index === undefined) {\n throw new Error('No index found for item');\n }\n return index;\n }\n}\n","import type { AnySchema } from 'typed-binary';\nimport { BindGroupResolver } from './bindGroupResolver';\nimport { typeForBuiltin } from './builtinDataTypes';\nimport {\n builtinSymbolToName,\n idForBuiltin,\n nameForBuiltin,\n} from './builtinIdentifiers';\nimport type { TgpuBufferVertex } from './core/buffer/bufferUsage';\nimport type { ExperimentalTgpuRoot } from './core/root/rootTypes';\nimport type { SimpleTgpuData, TgpuArray } from './data';\nimport { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport { code } from './tgpuCode';\nimport type {\n AnyTgpuData,\n BoundTgpuCode,\n TgpuCode,\n TgpuResolvable,\n Wgsl,\n} from './types';\n\nexport type Program = {\n readonly bindGroupResolver: BindGroupResolver;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nexport default class ProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private rootNode: TgpuResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.rootNode);\n\n return {\n bindGroupResolver: new BindGroupResolver(\n this.root,\n ctx,\n options.shaderStage,\n ),\n code: codeString,\n };\n }\n}\n\nfunction getUsedBuiltinsNamed(\n rec: Record<symbol, string>,\n): { name: string; builtinSymbol: symbol }[] {\n const res = Object.getOwnPropertySymbols(rec).map((builtinSymbol) => {\n const builtin = builtinSymbolToName.get(builtinSymbol);\n if (builtin === undefined) {\n throw new Error('Symbol is not a member of `builtin`');\n }\n const name = rec[builtinSymbol] as string;\n return { name, builtinSymbol };\n });\n\n return res;\n}\n\nexport class RenderProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private vertexRoot: TgpuCode | BoundTgpuCode,\n private fragmentRoot: TgpuCode | BoundTgpuCode,\n private vertexOutputFormat: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyTgpuData;\n },\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): {\n vertexProgram: Program;\n fragmentProgram: Program;\n } {\n const symbolOutputs = Object.getOwnPropertySymbols(\n this.vertexOutputFormat,\n ).map((symbol) => {\n const name = this.vertexOutputFormat[symbol];\n if (typeof name !== 'string') {\n throw new Error('Output names must be strings.');\n }\n return { symbol, name };\n });\n\n const vertexOutputBuiltinObjects = getUsedBuiltinsNamed(\n Object.fromEntries(\n symbolOutputs.map(({ symbol, name }) => [symbol, name]),\n ),\n );\n\n const vertexOutput = Object.keys(this.vertexOutputFormat).map(\n (name, index) => {\n const varInfo = this.vertexOutputFormat[name];\n if (!varInfo) {\n throw new Error('Output names must be strings.');\n }\n return { name, varInfo, index };\n },\n );\n\n const structFields = [\n ...vertexOutputBuiltinObjects.map((builtin) => {\n const outputName = this.vertexOutputFormat[builtin.builtinSymbol] ?? '';\n\n return code`\n @builtin(${nameForBuiltin(builtin.builtinSymbol)}) ${outputName}: ${typeForBuiltin(builtin.builtinSymbol)},\n `;\n }),\n ...vertexOutput.map(\n ({ name, varInfo, index }) =>\n code`\n @location(${index}) ${name}: ${varInfo},\n `,\n ),\n ];\n\n const vertexContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n vertexContext.resolve(this.vertexRoot);\n const vertexBuffers = Array.from(vertexContext.usedBindables).filter(\n (bindable): bindable is TgpuBufferVertex<AnyTgpuData> =>\n bindable.usage === 'vertex',\n );\n const entries = vertexBuffers.map((elem, idx) => {\n return {\n idx: idx,\n entry: {\n bindable: elem,\n underlyingType: elem.allocatable.dataType as\n | SimpleTgpuData<AnySchema>\n | TgpuArray<AnyTgpuData>,\n },\n };\n });\n\n const vertexUserArgs = entries.map(\n (entry) => code`\n @location(${entry.idx}) ${entry.entry.bindable} : ${\n 'expressionCode' in entry.entry.underlyingType\n ? entry.entry.underlyingType.expressionCode\n : entry.entry.underlyingType.elementType\n },\n `,\n );\n const vertexBuiltins = Array.from(vertexContext.usedBuiltins);\n const vertexBuiltinsArgs = vertexBuiltins.map(\n (builtin) =>\n code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `,\n );\n const vertexArgs = [...vertexBuiltinsArgs, ...vertexUserArgs];\n\n const vertexCode = code`\n struct VertexOutput {\n ${structFields}\n };\n\n @vertex\n fn main(${vertexArgs}) -> VertexOutput {\n ${this.vertexRoot}\n var output: VertexOutput;\n ${vertexOutputBuiltinObjects.map(\n (entry) =>\n code`\n output.${entry.name} = ${entry.name};\n `,\n )}\n ${vertexOutput.map(\n ({ name }) =>\n code`\n output.${name} = ${name};\n `,\n )}\n return output;\n }\n `;\n const fragmentContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n fragmentContext.resolve(this.fragmentRoot);\n\n const fragmentUsedBuiltins = Array.from(fragmentContext.usedBuiltins);\n const fragmentBuiltinArgs = fragmentUsedBuiltins.map((builtin) => {\n return code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `;\n });\n\n const fragmentInputs = vertexOutput.map(\n ({ name, varInfo }, idx) => code`\n @location(${idx}) ${name}: ${varInfo},\n `,\n );\n const fragmentArgs = [...fragmentBuiltinArgs, ...fragmentInputs];\n const fragmentCode = code`\n @fragment\n fn main(${fragmentArgs}) -> @location(0) vec4f {\n ${this.fragmentRoot}\n }\n `;\n\n const vertexProgram = new ProgramBuilder(this.root, vertexCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.VERTEX,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n const fragmentProgram = new ProgramBuilder(this.root, fragmentCode).build({\n bindingGroup: options.bindingGroup + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n vertexProgram.bindGroupResolver.setVertexBuffers(\n entries.map((entry) => {\n return {\n index: entry.idx,\n buffer: entry.entry.bindable,\n };\n }),\n );\n\n return { vertexProgram, fragmentProgram };\n }\n}\n\nexport class ComputeProgramBuilder {\n constructor(\n private root: ExperimentalTgpuRoot,\n private computeRoot: Wgsl,\n private workgroupSize: readonly [\n number,\n (number | null)?,\n (number | null)?,\n ],\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): Program {\n const context = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n jitTranspiler: this.root.jitTranspiler,\n });\n context.resolve(this.computeRoot);\n\n const usedBuiltins = Array.from(context.usedBuiltins);\n const builtinArgs = usedBuiltins.map(\n (builtin) => code`\n @builtin(${nameForBuiltin(builtin)}) ${idForBuiltin(builtin)}: ${typeForBuiltin(builtin)},\n `,\n );\n\n const workgroupSizeDeclaration = `@workgroup_size(${this.workgroupSize[0]}, ${this.workgroupSize[1] ?? 1}, ${this.workgroupSize[2] ?? 1})`;\n\n const shaderCode = code`\n @compute ${workgroupSizeDeclaration}\n fn main(${builtinArgs}) {\n ${this.computeRoot}\n }\n `;\n\n const program = new ProgramBuilder(this.root, shaderCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.COMPUTE,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n return program;\n }\n}\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuNamable } from '../../namable';\nimport { type TgpuPlum, type Unsubscribe, isPlum } from '../../tgpuPlumTypes';\nimport { type AnyTgpuData, isGPUBuffer } from '../../types';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Uniform {\n usableAsUniform: true;\n}\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport interface Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Storage = { usableAsStorage: true } as Storage;\nexport const Vertex = { usableAsVertex: true } as Vertex;\n\ntype UnionToIntersection<U> =\n // biome-ignore lint/suspicious/noExplicitAny: <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\ntype LiteralToUsageType<T extends 'uniform' | 'storage' | 'vertex'> =\n T extends 'uniform'\n ? Uniform\n : T extends 'storage'\n ? Storage\n : T extends 'vertex'\n ? Vertex\n : never;\n\nexport interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuNamable {\n readonly resourceType: 'buffer';\n readonly dataType: TData;\n readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n readonly label: string | undefined;\n\n readonly buffer: GPUBuffer;\n readonly device: GPUDevice;\n readonly destroyed: boolean;\n\n $usage<T extends ('uniform' | 'storage' | 'vertex')[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this;\n\n write(data: Parsed<TData> | TgpuBuffer<TData>): void;\n read(): Promise<Parsed<TData>>;\n destroy(): void;\n}\n\nexport function createBufferImpl<TData extends AnyTgpuData>(\n group: ExperimentalTgpuRoot | undefined,\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);\n}\n\nexport function isBuffer<T extends TgpuBuffer<AnyTgpuData>>(\n value: T | unknown,\n): value is T {\n return (value as TgpuBuffer<AnyTgpuData>).resourceType === 'buffer';\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Storage {\n return !!(buffer as unknown as Storage).usableAsStorage;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Vertex {\n return !!(buffer as unknown as Vertex).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public readonly resourceType = 'buffer';\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n private _destroyed = false;\n private _subscription: Unsubscribe | null = null;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n public usableAsUniform = false;\n public usableAsStorage = false;\n public usableAsVertex = false;\n\n constructor(\n private readonly _group: ExperimentalTgpuRoot | undefined,\n public readonly dataType: TData,\n public readonly initialOrBuffer?:\n | Parsed<TData>\n | TgpuPlum<Parsed<TData>>\n | GPUBuffer\n | undefined,\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._buffer = initialOrBuffer;\n } else {\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n if (!this._device) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\n }\n\n if (!this._buffer) {\n this._buffer = this._device.createBuffer({\n size: this.dataType.size,\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n });\n\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n\n if (isPlum(this.initial)) {\n const group = this._group;\n\n if (!group) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n const plum = this.initial;\n\n this.dataType.write(writer, group.readPlum(plum));\n\n this._subscription = group.onPlumChange(plum, () => {\n this.write(group.readPlum(plum));\n });\n } else {\n this.dataType.write(writer, this.initial);\n }\n\n this._buffer.unmap();\n }\n }\n\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer has not been assigned a device. Use .$device(device) to assign a device',\n );\n }\n return this._device;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $usage<T extends ('uniform' | 'storage' | 'vertex')[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>> {\n for (const usage of usages) {\n this.flags |= usage === 'uniform' ? GPUBufferUsage.UNIFORM : 0;\n this.flags |= usage === 'storage' ? GPUBufferUsage.STORAGE : 0;\n this.flags |= usage === 'vertex' ? GPUBufferUsage.VERTEX : 0;\n this.usableAsUniform = this.usableAsUniform || usage === 'uniform';\n this.usableAsStorage = this.usableAsStorage || usage === 'storage';\n this.usableAsVertex = this.usableAsVertex || usage === 'vertex';\n }\n return this as this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n $device(device: GPUDevice) {\n this._device = device;\n return this;\n }\n\n write(dataOrBuffer: Parsed<TData> | TgpuBuffer<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n if (isBuffer(dataOrBuffer)) {\n throw new Error('Cannot copy to a mapped buffer.');\n }\n this.dataType.write(new BufferWriter(mapped), dataOrBuffer);\n return;\n }\n\n const size = this.dataType.size;\n if (isBuffer(dataOrBuffer)) {\n const sourceBuffer = dataOrBuffer.buffer;\n\n if (this._group) {\n const encoder = this._group.commandEncoder;\n encoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n } else {\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n device.queue.submit([commandEncoder.finish()]);\n }\n } else {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const hostBuffer = new ArrayBuffer(size);\n this.dataType.write(new BufferWriter(hostBuffer), dataOrBuffer);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n }\n\n async read(): Promise<Parsed<TData>> {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n return res;\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: this.dataType.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer,\n 0,\n stagingBuffer,\n 0,\n this.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, this.dataType.size);\n\n const res = this.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n if (this._subscription) {\n this._subscription();\n }\n this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { Unwrap } from 'typed-binary';\nimport { isArraySchema } from '../../data';\nimport { inGPUMode } from '../../gpuMode';\nimport { identifier } from '../../tgpuIdentifier';\nimport type {\n AnyTgpuData,\n BufferUsage,\n ResolutionCtx,\n TgpuBindable,\n} from '../../types';\nimport {\n type Storage,\n type TgpuBuffer,\n type Uniform,\n type Vertex,\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUniform<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'uniform'> {\n readonly resourceType: 'buffer-usage';\n readonly value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferReadonly<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'readonly'> {\n readonly resourceType: 'buffer-usage';\n readonly value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferMutable<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'mutable'> {\n readonly resourceType: 'buffer-usage';\n value: Unwrap<TData>;\n}\n\nexport interface TgpuBufferVertex<TData extends AnyTgpuData>\n extends TgpuBindable<TData, 'vertex'> {\n readonly resourceType: 'buffer-usage';\n vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'>;\n}\n\nexport interface TgpuBufferUsage<\n TData extends AnyTgpuData,\n TUsage extends BufferUsage = BufferUsage,\n> extends TgpuBindable<TData, TUsage> {\n readonly resourceType: 'buffer-usage';\n value: Unwrap<TData>;\n}\n\nexport function isBufferUsage<\n T extends\n | TgpuBufferUniform<AnyTgpuData>\n | TgpuBufferReadonly<AnyTgpuData>\n | TgpuBufferMutable<AnyTgpuData>\n | TgpuBufferVertex<AnyTgpuData>,\n>(value: T | unknown): value is T {\n return !!value && (value as T).resourceType === 'buffer-usage';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferUsageImpl<TData extends AnyTgpuData, TUsage extends BufferUsage>\n implements TgpuBufferUsage<TData, TUsage>\n{\n public readonly resourceType = 'buffer-usage' as const;\n\n constructor(\n public readonly buffer: TgpuBuffer<TData>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this.buffer.label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n $name(label: string) {\n this.buffer.$name(label);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this.label);\n ctx.addBinding(this, ident);\n return ctx.resolve(ident);\n }\n\n toString(): string {\n return `${this.usage}:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Unwrap<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n return this as Unwrap<TData>;\n }\n}\n\nclass TgpuBufferVertexImpl<TData extends AnyTgpuData>\n implements TgpuBufferVertex<TData>\n{\n public readonly resourceType = 'buffer-usage' as const;\n public readonly usage = 'vertex';\n public readonly vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'>;\n\n constructor(\n public readonly allocatable: TgpuBuffer<TData>,\n stepMode: 'vertex' | 'instance',\n ) {\n const layout = getVertexLayoutIfValid(allocatable.dataType, stepMode);\n if (!layout) {\n throw new Error('Cannot create vertex buffer with complex data types.');\n }\n this.vertexLayout = layout;\n }\n\n get label() {\n return this.allocatable.label;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this.label);\n ctx.addBinding(this, ident);\n return ctx.resolve(ident);\n }\n\n toString(): string {\n return `vertex:${this.label ?? '<unnamed>'}`;\n }\n}\n\nconst mutableUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'mutable'>\n>();\n\nexport function asMutable<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Storage,\n): TgpuBufferMutable<TData> {\n if (!isUsableAsStorage(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asMutable, as it is not allowed to be used as storage. To allow it, call .$usage('storage') when creating the buffer.`,\n );\n }\n\n let usage = mutableUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'mutable');\n mutableUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferMutable<TData>;\n}\n\nconst readonlyUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'readonly'>\n>();\n\nexport function asReadonly<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Storage,\n): TgpuBufferReadonly<TData> {\n if (!isUsableAsStorage(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asReadonly, as it is not allowed to be used as storage. To allow it, call .$usage('storage') when creating the buffer.`,\n );\n }\n\n let usage = readonlyUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'readonly');\n readonlyUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferReadonly<TData>;\n}\n\nconst uniformUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n TgpuBufferUsageImpl<AnyTgpuData, 'uniform'>\n>();\n\nexport function asUniform<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Uniform,\n): TgpuBufferUniform<TData> {\n if (!isUsableAsUniform(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asUniform, as it is not allowed to be used as a uniform. To allow it, call .$usage('uniform') when creating the buffer.`,\n );\n }\n\n let usage = uniformUsageMap.get(buffer);\n if (!usage) {\n usage = new TgpuBufferUsageImpl(buffer, 'uniform');\n uniformUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferUniform<TData>;\n}\n\nconst vertexUsageMap = new WeakMap<\n TgpuBuffer<AnyTgpuData>,\n {\n vertex: TgpuBufferVertexImpl<AnyTgpuData>;\n instance: TgpuBufferVertexImpl<AnyTgpuData>;\n }\n>();\n\nexport function asVertex<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Vertex,\n stepMode: 'vertex' | 'instance',\n): TgpuBufferVertex<TData> {\n if (!isUsableAsVertex(buffer)) {\n throw new Error(\n `Cannot pass ${buffer} to asVertex, as it is not allowed to be used as a vertex buffer. To allow it, call .$usage('vertex') when creating the buffer.`,\n );\n }\n\n let usage = vertexUsageMap.get(buffer);\n if (!usage) {\n usage = {\n vertex: new TgpuBufferVertexImpl(buffer, 'vertex'),\n instance: new TgpuBufferVertexImpl(buffer, 'instance'),\n };\n vertexUsageMap.set(buffer, usage);\n }\n return usage[stepMode] as unknown as TgpuBufferVertex<TData>;\n}\n\nfunction getVertexLayoutIfValid(\n type: AnyTgpuData,\n stepMode: 'vertex' | 'instance',\n): Omit<GPUVertexBufferLayout, 'attributes'> | null {\n // check if the type is a primitive (f32, i32, u32, or a vector)\n if ('expressionCode' in type) {\n return {\n arrayStride: type.size,\n stepMode: stepMode,\n };\n }\n // if the data type is an array, check if the element type is valid\n // as arrayOf(arrayOf(f32, x), y) would still be valid - we do it recursively\n if (isArraySchema(type)) {\n return getVertexLayoutIfValid(type.elementType, stepMode);\n }\n return null;\n}\n","import {\n type Storage,\n type TgpuBuffer,\n type Uniform,\n isBuffer,\n isUsableAsStorage,\n isUsableAsUniform,\n} from './core/buffer/buffer';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n type TgpuBufferUsage,\n isBufferUsage,\n} from './core/buffer/bufferUsage';\nimport { NotUniformError } from './errors';\nimport type { TgpuNamable } from './namable';\nimport type { TgpuSampler } from './tgpuSampler';\nimport type { AnyTgpuData, OmitProps, TgpuShaderStage } from './types';\nimport type { Unwrapper } from './unwrapper';\n\n// ----------\n// Public API\n// ----------\n\nexport type TgpuLayoutEntryBase = {\n /**\n * Limits this resource's visibility to specific shader stages.\n *\n * By default, each resource is visible to all shader stage types, but\n * depending on the underlying implementation, this may have performance implications.\n *\n * @default ['compute'] for mutable resources\n * @default ['compute','vertex','fragment'] for everything else\n */\n visibility?: TgpuShaderStage[];\n};\n\nexport type TgpuLayoutUniform = TgpuLayoutEntryBase & {\n uniform: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);\n};\n\nexport type TgpuLayoutStorage = TgpuLayoutEntryBase & {\n storage: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);\n /** @default 'readonly' */\n access?: 'mutable' | 'readonly';\n};\n\nexport type TgpuLayoutSampler = TgpuLayoutEntryBase & {\n sampler: GPUSamplerBindingType;\n};\nexport type TgpuLayoutTexture<\n TSampleType extends GPUTextureSampleType = GPUTextureSampleType,\n> = TgpuLayoutEntryBase & {\n /**\n * - 'float' - f32\n * - 'unfilterable-float' - f32, cannot be used with filtering samplers\n * - 'depth' - f32\n * - 'sint' - i32\n * - 'uint' - u32\n */\n texture: TSampleType;\n /**\n * @default '2d'\n */\n viewDimension?: GPUTextureViewDimension;\n /**\n * @default false\n */\n multisampled?: boolean;\n};\nexport type TgpuLayoutStorageTexture<\n TFormat extends GPUTextureFormat = GPUTextureFormat,\n> = TgpuLayoutEntryBase & {\n storageTexture: TFormat;\n /** @default 'writeonly' */\n access?: 'readonly' | 'writeonly' | 'mutable';\n /** @default '2d' */\n viewDimension?: GPUTextureViewDimension;\n};\nexport type TgpuLayoutExternalTexture = TgpuLayoutEntryBase & {\n externalTexture: Record<string, never>;\n};\n\nexport type TgpuLayoutEntry =\n | TgpuLayoutUniform\n | TgpuLayoutStorage\n | TgpuLayoutSampler\n | TgpuLayoutTexture\n | TgpuLayoutStorageTexture\n | TgpuLayoutExternalTexture;\n\ntype UnwrapRuntimeConstructorInner<\n T extends AnyTgpuData | ((_: number) => AnyTgpuData),\n> = T extends AnyTgpuData\n ? T\n : T extends (_: number) => infer Return\n ? Return\n : never;\n\nexport type UnwrapRuntimeConstructor<\n T extends AnyTgpuData | ((_: number) => AnyTgpuData),\n> = T extends unknown ? UnwrapRuntimeConstructorInner<T> : never;\n\nexport interface TgpuBindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> extends TgpuNamable {\n readonly resourceType: 'bind-group-layout';\n readonly label: string | undefined;\n readonly entries: Entries;\n // TODO: Expose when implemented\n // readonly bound: {\n // [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n // };\n\n populate(\n entries: {\n [K in keyof OmitProps<Entries, null>]: LayoutEntryToInput<Entries[K]>;\n },\n ): TgpuBindGroup<Entries>;\n\n /**\n * Creates a raw WebGPU resource based on the typed descriptor.\n * NOTE: This creates a new resource every time, better to use `root.unwrap(...)` instead.\n * @param unwrapper Used to unwrap any resources that this resource depends on.\n */\n unwrap(unwrapper: Unwrapper): GPUBindGroupLayout;\n}\n\nexport interface TgpuBindGroupLayoutExperimental<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> extends TgpuBindGroupLayout<Entries> {\n readonly bound: {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n}\n\ntype StorageUsageForEntry<T extends TgpuLayoutStorage> = T extends {\n access?: infer Access;\n} // Is the access defined on the type?\n ? 'mutable' | 'readonly' extends Access // Is the access ambiguous?\n ?\n | TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n : 'readonly' extends Access // Is the access strictly 'readonly'?\n ? TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n : 'mutable' extends Access // Is the access strictly 'mutable'?\n ? TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n :\n | TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>\n | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>>\n : TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>; // <- access is undefined, so default to 'readonly';\n\nexport type LayoutEntryToInput<T extends TgpuLayoutEntry | null> =\n T extends TgpuLayoutUniform\n ?\n | TgpuBufferUsage<UnwrapRuntimeConstructor<T['uniform']>, 'uniform'>\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & Uniform)\n | GPUBuffer\n : T extends TgpuLayoutStorage\n ?\n | StorageUsageForEntry<T>\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & Storage)\n | GPUBuffer\n : T extends TgpuLayoutSampler\n ? GPUSampler\n : T extends TgpuLayoutTexture\n ? GPUTextureView\n : T extends TgpuLayoutStorageTexture\n ? GPUTextureView\n : T extends TgpuLayoutExternalTexture\n ? GPUExternalTexture\n : never;\n\nexport type BindLayoutEntry<T extends TgpuLayoutEntry | null> =\n T extends TgpuLayoutUniform\n ? TgpuBufferUniform<UnwrapRuntimeConstructor<T['uniform']>>\n : T extends TgpuLayoutStorage\n ? StorageUsageForEntry<T>\n : T extends TgpuLayoutSampler\n ? TgpuSampler\n : never;\n\nexport type TgpuBindGroup<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> = {\n readonly resourceType: 'bind-group';\n readonly layout: TgpuBindGroupLayout<Entries>;\n unwrap(unwrapper: Unwrapper): GPUBindGroup;\n};\n\nexport function bindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayout<Entries> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function bindGroupLayoutExperimental<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayoutExperimental<Entries> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function isBindGroupLayout<T extends TgpuBindGroupLayout>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group-layout';\n}\n\nexport function isBindGroup<T extends TgpuBindGroup>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group';\n}\n\n/**\n * @category Errors\n */\nexport class MissingBindingError extends Error {\n constructor(groupLabel: string | undefined, key: string) {\n super(\n `Bind group '${groupLabel ?? '<unnamed>'}' is missing a required binding '${key}'`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingBindingError.prototype);\n }\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst DEFAULT_MUTABLE_VISIBILITY: TgpuShaderStage[] = ['compute'];\nconst DEFAULT_READONLY_VISIBILITY: TgpuShaderStage[] = [\n 'compute',\n 'vertex',\n 'fragment',\n];\n\nclass TgpuBindGroupLayoutImpl<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n> implements TgpuBindGroupLayoutExperimental<Entries>\n{\n private _label: string | undefined;\n\n public readonly resourceType = 'bind-group-layout' as const;\n\n // TODO: Fill bound values.\n public readonly bound = {} as {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n\n constructor(public readonly entries: Entries) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined): this {\n this._label = label;\n return this;\n }\n\n unwrap(unwrapper: Unwrapper) {\n const unwrapped = unwrapper.device.createBindGroupLayout({\n label: this.label ?? '',\n entries: Object.values(this.entries)\n .map((entry, idx) => {\n if (entry === null) {\n return null;\n }\n\n let visibility = entry.visibility;\n\n const binding: GPUBindGroupLayoutEntry = {\n binding: idx,\n visibility: 0,\n };\n\n if ('uniform' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.buffer = {\n type: 'uniform' as const,\n };\n } else if ('storage' in entry) {\n visibility =\n visibility ??\n (entry.access === 'mutable'\n ? DEFAULT_MUTABLE_VISIBILITY\n : DEFAULT_READONLY_VISIBILITY);\n\n binding.buffer = {\n type:\n entry.access === 'mutable'\n ? ('storage' as const)\n : ('read-only-storage' as const),\n };\n } else if ('sampler' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.sampler = {\n type: entry.sampler,\n };\n } else if ('texture' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n\n binding.texture = {\n sampleType: entry.texture,\n viewDimension: entry.viewDimension ?? '2d',\n multisampled: entry.multisampled ?? false,\n };\n } else if ('storageTexture' in entry) {\n const access = entry.access ?? 'writeonly';\n\n visibility =\n visibility ??\n (access === 'readonly'\n ? DEFAULT_READONLY_VISIBILITY\n : DEFAULT_MUTABLE_VISIBILITY);\n\n binding.storageTexture = {\n format: entry.storageTexture,\n access: {\n mutable: 'read-write' as const,\n readonly: 'read-only' as const,\n writeonly: 'write-only' as const,\n }[access],\n viewDimension: entry.viewDimension ?? '2d',\n };\n } else if ('externalTexture' in entry) {\n visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;\n binding.externalTexture = {};\n }\n\n if (visibility?.includes('compute')) {\n binding.visibility |= GPUShaderStage.COMPUTE;\n }\n if (visibility?.includes('vertex')) {\n binding.visibility |= GPUShaderStage.VERTEX;\n }\n if (visibility?.includes('fragment')) {\n binding.visibility |= GPUShaderStage.FRAGMENT;\n }\n\n return binding;\n })\n .filter((v): v is Exclude<typeof v, null> => v !== null),\n });\n\n return unwrapped;\n }\n\n populate(\n entries: { [K in keyof Entries]: LayoutEntryToInput<Entries[K]> },\n ): TgpuBindGroup<Entries> {\n return new TgpuBindGroupImpl(this, entries);\n }\n}\n\nclass TgpuBindGroupImpl<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n> implements TgpuBindGroup<Entries>\n{\n public readonly resourceType = 'bind-group' as const;\n\n constructor(\n public readonly layout: TgpuBindGroupLayout<Entries>,\n public readonly entries: {\n [K in keyof Entries]: LayoutEntryToInput<Entries[K]>;\n },\n ) {\n // Checking if all entries are present.\n for (const key of Object.keys(layout.entries)) {\n if (layout.entries[key] !== null && !(key in entries)) {\n throw new MissingBindingError(layout.label, key);\n }\n }\n }\n\n public unwrap(unwrapper: Unwrapper): GPUBindGroup {\n const unwrapped = unwrapper.device.createBindGroup({\n label: this.layout.label ?? '',\n layout: unwrapper.unwrap(this.layout),\n entries: Object.entries(this.layout.entries)\n .map(([key, entry], idx) => {\n if (entry === null) {\n return null;\n }\n\n const value = this.entries[key];\n\n if (value === undefined) {\n throw new Error(\n `'${key}' is a resource required to populate bind group layout '${this.layout.label ?? '<unnamed>'}'.`,\n );\n }\n\n if ('uniform' in entry) {\n let resource: GPUBufferBinding;\n\n if (isBuffer(value)) {\n if (!isUsableAsUniform(value)) {\n throw new NotUniformError(value);\n }\n resource = { buffer: unwrapper.unwrap(value) };\n } else if (isBufferUsage(value)) {\n if (!isUsableAsUniform(value.allocatable)) {\n throw new NotUniformError(value.allocatable);\n }\n resource = { buffer: unwrapper.unwrap(value.allocatable) };\n } else {\n resource = { buffer: value as GPUBuffer };\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('storage' in entry) {\n let resource: GPUBufferBinding;\n\n if (isBuffer(value)) {\n if (!isUsableAsStorage(value)) {\n throw new NotUniformError(value);\n }\n resource = { buffer: unwrapper.unwrap(value) };\n } else if (isBufferUsage(value)) {\n if (!isUsableAsStorage(value.allocatable)) {\n throw new NotUniformError(value.allocatable);\n }\n resource = { buffer: unwrapper.unwrap(value.allocatable) };\n } else {\n resource = { buffer: value as GPUBuffer };\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if (\n 'texture' in entry ||\n 'storageTexture' in entry ||\n 'externalTexture' in entry ||\n 'sampler' in entry\n ) {\n return {\n binding: idx,\n resource: value as\n | GPUTextureView\n | GPUExternalTexture\n | GPUSampler,\n };\n }\n\n throw new Error(\n `Malformed bind group entry: ${value} (${JSON.stringify(value)})`,\n );\n })\n .filter((v): v is Exclude<typeof v, null> => v !== null),\n });\n\n return unwrapped;\n }\n}\n","import type { Parsed } from 'typed-binary';\nimport { onGPU } from '../../gpuMode';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport { WeakMemo } from '../../memo';\nimport { type PlumListener, PlumStore } from '../../plumStore';\nimport {\n ComputeProgramBuilder,\n type Program,\n RenderProgramBuilder,\n} from '../../programBuilder';\nimport type { TgpuSettable } from '../../settableTrait';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport { isBindGroup, isBindGroupLayout } from '../../tgpuBindGroupLayout';\nimport type {\n ExtractPlumValue,\n TgpuPlum,\n Unsubscribe,\n} from '../../tgpuPlumTypes';\nimport type { TgpuSampler } from '../../tgpuSampler';\nimport type {\n TgpuAnyTexture,\n TgpuAnyTextureView,\n TgpuTextureExternal,\n} from '../../tgpuTexture';\nimport type { AnyTgpuData } from '../../types';\nimport { type TgpuBuffer, createBufferImpl, isBuffer } from '../buffer/buffer';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n ExperimentalTgpuRoot,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n SetPlumAction,\n} from './rootTypes';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a root can interact via GPU buffers.\n */\nclass TgpuRootImpl implements ExperimentalTgpuRoot {\n private _buffers: TgpuBuffer<AnyTgpuData>[] = [];\n private _samplers = new WeakMap<TgpuSampler, GPUSampler>();\n private _textures = new WeakMap<TgpuAnyTexture, GPUTexture>();\n private _textureViews = new WeakMap<TgpuAnyTextureView, GPUTextureView>();\n private _externalTexturesStatus = new WeakMap<\n TgpuTextureExternal,\n 'dirty' | 'clean'\n >();\n\n private _unwrappedBindGroupLayouts = new WeakMemo(\n (key: TgpuBindGroupLayout) => key.unwrap(this),\n );\n private _unwrappedBindGroups = new WeakMemo((key: TgpuBindGroup) =>\n key.unwrap(this),\n );\n\n private _pipelineExecutors: PipelineExecutor[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n private readonly _plumStore = new PlumStore();\n\n constructor(\n public readonly device: GPUDevice,\n public readonly jitTranspiler: JitTranspiler | undefined,\n ) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n ): TgpuBuffer<TData> {\n const buffer = createBufferImpl(this, typeSchema, initialOrBuffer).$device(\n this.device,\n );\n\n this._buffers.push(buffer);\n\n return buffer;\n }\n\n destroy() {\n for (const buffer of this._buffers) {\n buffer.destroy();\n }\n }\n\n unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;\n unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;\n unwrap(resource: TgpuBindGroup): GPUBindGroup;\n unwrap(\n resource: TgpuBuffer<AnyTgpuData> | TgpuBindGroupLayout | TgpuBindGroup,\n ): GPUBuffer | GPUBindGroupLayout | GPUBindGroup {\n if (isBuffer(resource)) {\n return resource.buffer;\n }\n\n if (isBindGroupLayout(resource)) {\n return this._unwrappedBindGroupLayouts.getOrMake(resource);\n }\n\n if (isBindGroup(resource)) {\n return this._unwrappedBindGroups.getOrMake(resource);\n }\n\n throw new Error(`Unknown resource type: ${resource}`);\n }\n\n textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture {\n let source: TgpuAnyTexture;\n if ('texture' in view) {\n source = view.texture;\n } else {\n source = view;\n }\n\n let texture = this._textures.get(source);\n\n if (!texture) {\n const descriptor = {\n ...source.descriptor,\n usage: source.flags,\n } as GPUTextureDescriptor;\n texture = this.device.createTexture(descriptor);\n\n if (!texture) {\n throw new Error(`Failed to create texture for ${view}`);\n }\n this._textures.set(source, texture);\n }\n\n return texture;\n }\n\n viewFor(view: TgpuAnyTextureView): GPUTextureView {\n let textureView = this._textureViews.get(view);\n if (!textureView) {\n textureView = this.textureFor(view.texture).createView(view.descriptor);\n this._textureViews.set(view, textureView);\n }\n return textureView;\n }\n\n externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture {\n this._externalTexturesStatus.set(texture, 'clean');\n if (texture.descriptor.source === undefined) {\n throw new Error('External texture source needs to be defined before use');\n }\n return this.device.importExternalTexture(\n texture.descriptor as GPUExternalTextureDescriptor,\n );\n }\n\n samplerFor(sampler: TgpuSampler): GPUSampler {\n let gpuSampler = this._samplers.get(sampler);\n\n if (!gpuSampler) {\n gpuSampler = this.device.createSampler(sampler.descriptor);\n\n if (!gpuSampler) {\n throw new Error(`Failed to create sampler for ${sampler}`);\n }\n this._samplers.set(sampler, gpuSampler);\n }\n\n return gpuSampler;\n }\n\n setSource(\n texture: TgpuTextureExternal,\n source: HTMLVideoElement | VideoFrame,\n ) {\n this._externalTexturesStatus.set(texture, 'dirty');\n texture.descriptor.source = source;\n }\n\n isDirty(texture: TgpuTextureExternal): boolean {\n return this._externalTexturesStatus.get(texture) === 'dirty';\n }\n\n markClean(texture: TgpuTextureExternal) {\n this._externalTexturesStatus.set(texture, 'clean');\n }\n\n readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends TgpuPlum & TgpuSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ) {\n type Value = ExtractPlumValue<TPlum>;\n\n if (typeof value === 'function') {\n const compute = value as (prev: Value) => Value;\n this._plumStore.set(plum, compute(this._plumStore.get(plum)));\n } else {\n this._plumStore.set(plum, value);\n }\n }\n\n onPlumChange<TValue>(\n plum: TgpuPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const { vertexProgram, fragmentProgram } = new RenderProgramBuilder(\n this,\n options.vertex.code,\n options.fragment.code,\n options.vertex.output,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupResolver.getBindGroupLayout(),\n fragmentProgram.bindGroupResolver.getBindGroupLayout(),\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers:\n vertexProgram.bindGroupResolver.getVertexBufferDescriptors() ?? [],\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment?.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n vertexProgram,\n fragmentProgram,\n options.externalLayouts?.length ?? 0,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const program = onGPU(() =>\n new ComputeProgramBuilder(\n this,\n options.code,\n options.workgroupSize ?? [1],\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n }),\n );\n\n const shaderModule = this.device.createShaderModule({\n code: program.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n program.bindGroupResolver.getBindGroupLayout(),\n ],\n });\n\n const computePipeline = this.device.createComputePipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n },\n });\n\n const executor = new ComputePipelineExecutor(\n this,\n computePipeline,\n [program],\n options.externalLayouts?.length ?? 0,\n );\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n flush() {\n if (!this._commandEncoder) {\n return;\n }\n\n this.device.queue.submit([this._commandEncoder.finish()]);\n this._commandEncoder = null;\n }\n}\n\ninterface PipelineExecutor {\n execute(\n options: RenderPipelineExecutorOptions | ComputePipelineExecutorOptions,\n ): void;\n}\n\nclass RenderPipelineExecutor implements PipelineExecutor {\n constructor(\n private root: ExperimentalTgpuRoot,\n private pipeline: GPURenderPipeline,\n private vertexProgram: Program,\n private fragmentProgram: Program,\n private externalLayoutCount: number,\n private label?: string,\n ) {}\n\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this.root.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length,\n this.vertexProgram.bindGroupResolver.getBindGroup(),\n );\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + 1,\n this.fragmentProgram.bindGroupResolver.getBindGroup(),\n );\n\n for (const [\n usage,\n index,\n ] of this.vertexProgram.bindGroupResolver.getVertexBuffers()) {\n passEncoder.setVertexBuffer(index, usage.allocatable.buffer);\n }\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor implements PipelineExecutor {\n constructor(\n private root: ExperimentalTgpuRoot,\n private pipeline: GPUComputePipeline,\n private programs: Program[],\n private externalLayoutCount: number,\n private label?: string,\n ) {}\n\n execute(options?: ComputePipelineExecutorOptions) {\n const { workgroups = [1, 1], externalBindGroups } = options ?? {};\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this.root.commandEncoder.beginComputePass({\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n this.programs.forEach((program, i) =>\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroupResolver.getBindGroup(),\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link init}.\n */\nexport type InitOptions = {\n adapter?: GPURequestAdapterOptions | undefined;\n device?: GPUDeviceDescriptor | undefined;\n unstable_jitTranspiler?: JitTranspiler | undefined;\n};\n\n/**\n * Options passed into {@link initFromDevice}.\n */\nexport type InitFromDeviceOptions = {\n device: GPUDevice;\n unstable_jitTranspiler?: JitTranspiler | undefined;\n};\n\n/**\n * Requests a new GPU device and creates a root around it.\n * If a specific device should be used instead, use @see initFromDevice.\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * const root = await tgpu.init();\n * ```\n *\n * @example\n * If there are specific options that should be used when requesting a device, you can pass those in.\n * ```ts\n * const adapterOptions: GPURequestAdapterOptions = ...;\n * const deviceDescriptor: GPUDeviceDescriptor = ...;\n * const root = await tgpu.init({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n */\nexport async function init(\n options?: InitOptions,\n): Promise<ExperimentalTgpuRoot> {\n if (!navigator.gpu) {\n throw new Error('WebGPU is not supported by this browser.');\n }\n\n const adapter = await navigator.gpu.requestAdapter(options?.adapter);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new TgpuRootImpl(\n await adapter.requestDevice(options?.device),\n options?.unstable_jitTranspiler,\n );\n}\n\n/**\n * Creates a root from the given device, instead of requesting it like @see init.\n *\n * @example\n * ```ts\n * const device: GPUDevice = ...;\n * const root = tgpu.initFromDevice({ device });\n * ```\n */\nexport function initFromDevice(\n options: InitFromDeviceOptions,\n): ExperimentalTgpuRoot {\n return new TgpuRootImpl(options.device, options.unstable_jitTranspiler);\n}\n","import type { Parsed } from 'typed-binary';\nimport { type TgpuBuffer, createBufferImpl } from './core/buffer/buffer';\nimport type { TgpuPlum } from './tgpuPlumTypes';\nimport type { AnyTgpuData } from './types';\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n *\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n *\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\n/**\n * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return createBufferImpl(undefined, typeSchema, initialOrBuffer);\n}\n","import type { Parsed } from 'typed-binary';\nimport type { TgpuBuffer } from './core/buffer/buffer';\nimport type { AnyTgpuData } from './types';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n data: Parsed<TData>,\n): void {\n buffer.write(data);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n): Promise<Parsed<TData>> {\n return buffer.read();\n}\n","import {\n type VecKind,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n type vecBase,\n} from './vector';\n\nconst lengthVec2 = (v: vec2f | vec2i | vec2u) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: vec3f | vec3i | vec3u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: vec4f | vec4i | vec4u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nexport const VectorOps = {\n length: {\n vec2f: lengthVec2,\n vec2i: lengthVec2,\n vec2u: lengthVec2,\n vec3f: lengthVec3,\n vec3i: lengthVec3,\n vec3u: lengthVec3,\n vec4f: lengthVec4,\n vec4i: lengthVec4,\n vec4u: lengthVec4,\n } as Record<VecKind, (v: vecBase) => number>,\n\n add: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x + b.x, a.y + b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x + b.x, a.y + b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x + b.x, a.y + b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x + b.x, a.y + b.y, a.z + b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n sub: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x - b.x, a.y - b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x - b.x, a.y - b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x - b.x, a.y - b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x - b.x, a.y - b.y, a.z - b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n mul: {\n vec2f: (s: number, v: vec2f) => vec2f(s * v.x, s * v.y),\n vec2i: (s: number, v: vec2i) => vec2i(s * v.x, s * v.y),\n vec2u: (s: number, v: vec2u) => vec2u(s * v.x, s * v.y),\n\n vec3f: (s: number, v: vec3f) => vec3f(s * v.x, s * v.y, s * v.z),\n vec3i: (s: number, v: vec3i) => vec3i(s * v.x, s * v.y, s * v.z),\n vec3u: (s: number, v: vec3u) => vec3u(s * v.x, s * v.y, s * v.z),\n\n vec4f: (s: number, v: vec4f) => vec4f(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4i: (s: number, v: vec4i) => vec4i(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4u: (s: number, v: vec4u) => vec4u(s * v.x, s * v.y, s * v.z, s * v.w),\n } as Record<VecKind, <T extends vecBase>(s: number, v: T) => T>,\n\n dot: {\n vec2f: (lhs: vec2f, rhs: vec2f) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2i: (lhs: vec2i, rhs: vec2i) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2u: (lhs: vec2u, rhs: vec2u) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec3f: (lhs: vec3f, rhs: vec3f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3i: (lhs: vec3i, rhs: vec3i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3u: (lhs: vec3u, rhs: vec3u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec4f: (lhs: vec4f, rhs: vec4f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4i: (lhs: vec4i, rhs: vec4i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4u: (lhs: vec4u, rhs: vec4u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: vec2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2i: (v: vec2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: vec2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: vec3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: vec3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: vec3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: vec4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: vec4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: vec4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vecBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: vec3f, b: vec3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3i: (a: vec3i, b: vec3i) => {\n return vec3i(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3u: (a: vec3u, b: vec3u) => {\n return vec3u(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3i' | 'vec3u',\n <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T\n >,\n};\n","import type { vec3f, vec3i, vec3u, vecBase } from './data';\nimport { VectorOps } from './data/vectorOps';\nimport { inGPUMode } from './gpuMode';\n\nexport const std = {\n add<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} + ${rhs})` as unknown as T;\n }\n return VectorOps.add[lhs.kind](lhs, rhs);\n },\n sub<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} - ${rhs})` as unknown as T;\n }\n return VectorOps.sub[lhs.kind](lhs, rhs);\n },\n mul: <T extends vecBase>(s: number, v: T): T => {\n if (inGPUMode()) {\n return `(${s} * ${v})` as unknown as T;\n }\n return VectorOps.mul[v.kind](s, v);\n },\n dot<T extends vecBase>(lhs: T, rhs: T): number {\n if (inGPUMode()) {\n return `dot(${lhs}, ${rhs})` as unknown as number;\n }\n return VectorOps.dot[lhs.kind](lhs, rhs);\n },\n normalize: <T extends vecBase>(v: T): T => {\n if (inGPUMode()) {\n return `normalize(${v})` as unknown as T;\n }\n return VectorOps.normalize[v.kind](v);\n },\n cross<T extends vec3f | vec3i | vec3u>(a: T, b: T): T {\n if (inGPUMode()) {\n return `cross(${a}, ${b})` as unknown as T;\n }\n return VectorOps.cross[a.kind](a, b);\n },\n fract(a: number): number {\n if (inGPUMode()) {\n return `fract(${a})` as unknown as number;\n }\n return a - Math.floor(a);\n },\n length<T extends vecBase>(vector: T): number {\n if (inGPUMode()) {\n return `length(${vector})` as unknown as number;\n }\n return VectorOps.length[vector.kind](vector);\n },\n sin(radians: number): number {\n if (inGPUMode()) {\n return `sin(${radians})` as unknown as number;\n }\n return Math.sin(radians);\n },\n cos(radians: number): number {\n if (inGPUMode()) {\n return `cos(${radians})` as unknown as number;\n }\n return Math.cos(radians);\n },\n};\n","/**\n * @module typegpu\n */\n\nimport { init, initFromDevice } from './core/root/init';\nimport { createBuffer } from './legacyBufferApi';\nimport { bindGroupLayout } from './tgpuBindGroupLayout';\nimport { read, write } from './tgpuBufferUtils';\n\nexport const tgpu = {\n /** @deprecated Use `'uniform'` string literal instead. */\n Uniform: 'uniform' as const,\n /** @deprecated Use `'storage'` string literal instead. */\n Storage: 'storage' as const,\n /** @deprecated Use `'vertex'` string literal instead. */\n Vertex: 'vertex' as const,\n\n bindGroupLayout,\n\n init,\n initFromDevice,\n\n createBuffer,\n read,\n write,\n};\nexport default tgpu;\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n} from './types';\nexport { std } from './std';\nexport {\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './core/buffer/buffer';\n\nexport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n TgpuLayoutSampler,\n TgpuLayoutUniform,\n BindLayoutEntry,\n LayoutEntryToInput,\n TgpuBindGroup,\n} from './tgpuBindGroupLayout';\nexport type {\n TgpuBuffer,\n Uniform,\n Storage,\n Vertex,\n} from './core/buffer/buffer';\n"]}
1
+ {"version":3,"sources":["../src/nameRegistry.ts","../src/shared/utilityTypes.ts","../src/core/resolve/resolveData.ts","../src/errors.ts","../src/shared/generators.ts","../src/types.ts","../src/smol/wgslGenerator.ts","../src/core/buffer/buffer.ts","../src/data/alignIO.ts","../src/data/dataIO.ts","../src/extension.ts","../src/core/buffer/bufferUsage.ts","../src/core/sampler/sampler.ts","../src/core/texture/externalTexture.ts","../src/core/texture/textureFormats.ts","../src/core/texture/texture.ts","../src/core/texture/usageExtension.ts","../src/tgpuBindGroupLayout.ts","../src/resolutionCtx.ts","../src/namable.ts","../src/core/function/externals.ts","../src/core/resolve/tgpuResolve.ts","../src/memo.ts","../src/core/pipeline/computePipeline.ts","../src/core/vertexLayout/connectAttributesToShader.ts","../src/core/vertexLayout/vertexLayout.ts","../src/core/pipeline/connectAttachmentToShader.ts","../src/core/pipeline/connectTargetsToShader.ts","../src/core/pipeline/renderPipeline.ts","../src/core/root/init.ts","../src/index.ts"],"names":["RandomNameRegistry","__publicField","primer","label","StrictNameRegistry","index","unusedName","assertExhaustive","x","location","identityTypes","isIdentityType","data","resolveStructProperty","ctx","key","property","getAttributesString","resolveStruct","struct","id","prop","resolveArray","array","element","resolveData","prefix","invariant","condition","message","ResolutionError","_ResolutionError","cause","trace","entries","ancestor","newTrace","MissingSlotValueError","_MissingSlotValueError","slot","NotUniformError","_NotUniformError","value","_a","MissingBindGroupError","_MissingBindGroupError","layoutLabel","naturalsExcept","excluded","next","UnknownData","isResolvable","isWgsl","isGPUBuffer","isSlot","resolveRes","res","isWgslData","generateBoolean","bool","generateBlock","statement","generateStatement","generateIdentifier","generateExpression","expression","lhs","op","rhs","lhsExpr","rhsExpr","targetId","target","propertyStr","targetStr","idValue","argValues","arg","consequent","alternate","eq","generateFunction","body","BufferReader","BufferWriter","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","sint8Write","output","sint8Read","input","dataWriters","_schema","_","i","schema","alignment","alignmentOf","writeData","beginning","sizeOf","_b","customAlignmentOf","buffer","view","littleEndian","packed","writer","dataReaders","vec2f","vec3f","vec4f","vec2i","vec3i","vec4i","vec2u","vec3u","vec4u","mat2x2f","skipOneAfter","mat3x3f","mat4x4f","result","readData","elements","elementType","g","b","a","reader","createBufferImpl","group","typeSchema","initialOrBuffer","TgpuBufferImpl","isBuffer","isUsableAsUniform","isUsableAsVertex","_group","dataType","usages","usage","flags","device","dataOrBuffer","gpuBuffer","mapped","size","sourceBuffer","commandEncoder","hostBuffer","stagingBuffer","isUsableAsStorage","NotStorageError","_NotStorageError","usageToVarTemplateMap","TgpuLaidOutBufferImpl","_membership","inGPUMode","isSampler","resource","isComparisonSampler","TgpuLaidOutSamplerImpl","TgpuLaidOutComparisonSamplerImpl","TgpuExternalTextureImpl","texelFormatToChannelType","f32","u32","i32","texelFormatToDataType","channelKindToFormat","channelFormatToSchema","INTERNAL_createTexture","props","branch","TgpuTextureImpl","isTexture","isStorageTextureView","isSampledTextureView","accessMap","_branch","_c","_d","_e","hasStorage","hasSampled","hasRender","params","access","format","type","TgpuFixedStorageTextureImpl","TgpuFixedSampledTextureImpl","dimensionToCodeMap","_texture","binding","TgpuLaidOutStorageTextureImpl","_format","dimension","_props","__spreadValues","multisampled","TgpuLaidOutSampledTextureImpl","sampleType","_multisampled","isUsableAsSampled","isUsableAsRender","NotSampledError","_NotSampledError","bindGroupLayout","TgpuBindGroupLayoutImpl","isBindGroupLayout","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","idx","entry","membership","unwrapper","visibility","v","TgpuBindGroupImpl","layout","CATCHALL_BIND_GROUP_IDX_MARKER","ItemStateStack","state","pairs","args","returnType","externalMap","layer","boundValue","external","declarationType","INDENT","N","IndentController","str","ResolutionCtxImpl","opts","fn","options","argList","declaration","memoMap","placeholderKey","layoutEntry","eventual","maybeSlot","item","instances","instance","expectedValue","slotToValueMap","usedSlot","err","slotValueOverrides","pushedLayer","onGPU","resolve","code","bindGroupLayouts","takenIndices","automaticIds","layoutEntries","createCatchallGroup","catchallIdx","catchallLayout","catchall","placeholder","isNamable","applyExternals","existing","newExternals","replaceExternalsInWgsl","wgsl","acc","externalName","resolvedExternal","extraDependencies","names","jitTranspiler","dependencies","stringCode","resolvableCode","resolutionObj","stringCodeResolved","resolvable","WeakMemo","_make","INTERNAL_createComputePipeline","slotBindings","entryFn","TgpuComputePipelineImpl","ComputePipelineCore","isComputePipeline","_TgpuComputePipelineImpl","_core","_priors","bindGroup","y","z","memo","pass","_slotBindings","_entryFn","l","isAttribute","connectAttributesToShader","shaderInputLayout","attributes","usedVertexLayouts","isData","getCustomLocation","bufferDefinitions","layoutToAttribListMap","nextShaderLocation","member","isBuiltin","matchingAttribute","attribList","isVertexLayout","isAttachment","connectAttachmentToShader","shaderOutputLayout","attachment","matching","isColorTargetState","connectTargetsToShader","targets","matchingTarget","INTERNAL_createRenderPipeline","TgpuRenderPipelineImpl","RenderPipelineCore","_TgpuRenderPipelineImpl","definition","__spreadProps","vertexCount","instanceCount","firstVertex","firstInstance","fragmentFn","colorAttachments","vertexLayout","connectedAttribs","vertexFn","primitiveState","module","WithBindingImpl","_WithBindingImpl","_getRoot","WithComputeImpl","attribs","WithVertexImpl","_root","_options","_mismatch","WithFragmentImpl","_WithFragmentImpl","TgpuRootImpl","nameRegistry","_ownDevice","texture","disposable","init","adapterOpt","deviceOpt","adapter","initFromDevice","tgpu","src_default"],"mappings":"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","sourcesContent":["export interface NameRegistry {\n /**\n * Creates a valid WGSL identifier, each guaranteed to be unique\n * in the lifetime of a single resolution process.\n * @param primer Used in the generation process, makes the identifier more recognizable.\n */\n makeUnique(primer?: string): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n\n makeUnique(primer?: string | undefined): string {\n let label: string;\n if (primer) {\n // sanitizing\n label = primer.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n\n return `${label}_${this.lastUniqueId++}`;\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 makeUnique(primer?: string | undefined): string {\n if (primer === undefined) {\n throw new Error('Unnamed item found when using a strict name registry');\n }\n\n let index = 0;\n let unusedName = primer;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${primer}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n return unusedName;\n }\n}\n","export type Default<T, TDefault> = unknown extends T\n ? TDefault\n : T extends undefined\n ? TDefault\n : T;\n\nexport type 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\nexport type Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\n/**\n * Removes properties from record type that extend `Prop`\n */\nexport type OmitProps<T extends Record<string, unknown>, Prop> = Pick<\n T,\n {\n [Key in keyof T]: T[Key] extends Prop ? never : Key;\n }[keyof T]\n>;\n\n/**\n * The opposite of Readonly<T>\n */\nexport type Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\nexport function assertExhaustive(x: never, location: string): never {\n throw new Error(`Failed to handle ${x} at ${location}`);\n}\n","import { getAttributesString } from '../../data/attributes';\nimport type {\n AnyWgslData,\n BaseWgslData,\n Bool,\n F16,\n F32,\n I32,\n Mat2x2f,\n Mat3x3f,\n Mat4x4f,\n U32,\n Vec2f,\n Vec2i,\n Vec2u,\n Vec3f,\n Vec3i,\n Vec3u,\n Vec4f,\n Vec4i,\n Vec4u,\n WgslArray,\n WgslStruct,\n} from '../../data/wgslTypes';\nimport { assertExhaustive } from '../../shared/utilityTypes';\nimport type { ResolutionCtx } from '../../types';\n\n/**\n * Schemas for which their `type` property directly\n * translates to the resulting WGSL code.\n */\nconst identityTypes = [\n 'bool',\n 'f32',\n 'f16',\n 'i32',\n 'u32',\n 'vec2f',\n 'vec3f',\n 'vec4f',\n 'vec2i',\n 'vec3i',\n 'vec4i',\n 'vec2u',\n 'vec3u',\n 'vec4u',\n 'mat2x2f',\n 'mat3x3f',\n 'mat4x4f',\n];\n\ntype IdentityType =\n | Bool\n | F32\n | F16\n | I32\n | U32\n | Vec2f\n | Vec3f\n | Vec4f\n | Vec2i\n | Vec3i\n | Vec4i\n | Vec2u\n | Vec3u\n | Vec4u\n | Mat2x2f\n | Mat3x3f\n | Mat4x4f;\n\nfunction isIdentityType(data: AnyWgslData): data is IdentityType {\n return identityTypes.includes(data.type);\n}\n\nfunction resolveStructProperty(\n ctx: ResolutionCtx,\n [key, property]: [string, BaseWgslData],\n) {\n return ` ${getAttributesString(property)}${key}: ${ctx.resolve(property as AnyWgslData)},\\n`;\n}\n\nfunction resolveStruct(ctx: ResolutionCtx, struct: WgslStruct) {\n const id = ctx.names.makeUnique(struct.label);\n\n ctx.addDeclaration(`\nstruct ${id} {\n${Object.entries(struct.propTypes)\n .map((prop) => resolveStructProperty(ctx, prop))\n .join('')}\\\n}\\n`);\n\n return id;\n}\n\nfunction resolveArray(ctx: ResolutionCtx, array: WgslArray) {\n const element = ctx.resolve(array.elementType as AnyWgslData);\n\n return array.elementCount === 0\n ? `array<${element}>`\n : `array<${element}, ${array.elementCount}>`;\n}\n\nexport function resolveData(ctx: ResolutionCtx, data: AnyWgslData): string {\n if (isIdentityType(data)) {\n return data.type;\n }\n\n if (data.type === 'struct') {\n return resolveStruct(ctx, data);\n }\n\n if (data.type === 'array') {\n return resolveArray(ctx, data);\n }\n\n if (data.type === 'atomic') {\n return `atomic<${resolveData(ctx, data.inner)}>`;\n }\n\n if (data.type === 'decorated') {\n return ctx.resolve(data.inner as AnyWgslData);\n }\n\n assertExhaustive(data, 'resolveData');\n}\n","import type { TgpuBuffer } from './core/buffer/buffer';\nimport type { AnyData } from './data/dataTypes';\nimport type { AnyWgslData } from './data/wgslTypes';\nimport type { TgpuResolvable, TgpuSlot } from './types';\n\nconst prefix = 'Invariant failed';\n\n/**\n * Inspired by: https://github.com/alexreardon/tiny-invariant/blob/master/src/tiny-invariant.ts\n */\nexport function invariant(\n condition: unknown,\n message?: string | (() => string),\n): asserts condition {\n if (condition) {\n // Condition passed\n return;\n }\n\n // In production we strip the message but still throw\n if (process.env.NODE_ENV === 'production') {\n throw new Error(prefix);\n }\n\n // When not in production we allow the message to pass through\n // *This block will be removed in production builds*\n\n const provided = typeof message === 'function' ? message() : message;\n\n // Options:\n // 1. message provided: `${prefix}: ${provided}`\n // 2. message not provided: prefix\n const value = provided ? `${prefix}: ${provided}` : prefix;\n throw new Error(value);\n}\n\n/**\n * An error that happens during resolution of WGSL code.\n * Contains a trace of all ancestor resolvables in\n * which this error originated.\n *\n * @category Errors\n */\nexport class ResolutionError extends Error {\n constructor(\n public readonly cause: unknown,\n public readonly trace: (TgpuResolvable | AnyWgslData)[],\n ) {\n let entries = trace.map((ancestor) => `- ${ancestor}`);\n\n // Showing only the root and leaf nodes.\n if (entries.length > 20) {\n entries = [...entries.slice(0, 11), '...', ...entries.slice(-10)];\n }\n\n super(`Resolution of the following tree failed: \\n${entries.join('\\n')}`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ResolutionError.prototype);\n }\n\n appendToTrace(ancestor: TgpuResolvable | AnyWgslData): ResolutionError {\n const newTrace = [ancestor, ...this.trace];\n\n return new ResolutionError(this.cause, newTrace);\n }\n}\n\n/**\n * @category Errors\n */\nexport class MissingSlotValueError extends Error {\n constructor(public readonly slot: TgpuSlot<unknown>) {\n super(`Missing value for '${slot}'`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingSlotValueError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class NotUniformError extends Error {\n constructor(value: TgpuBuffer<AnyData>) {\n super(\n `Buffer '${value.label ?? '<unnamed>'}' is not bindable as a uniform. Use .$usage('uniform') to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotUniformError.prototype);\n }\n}\n\nexport class MissingLinksError extends Error {\n constructor(fnLabel: string | undefined, externalNames: string[]) {\n super(\n `The function '${fnLabel ?? '<unnamed>'}' is missing links to the following external values: ${externalNames}.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingLinksError.prototype);\n }\n}\n\nexport class MissingBindGroupError extends Error {\n constructor(layoutLabel: string | undefined) {\n super(\n `Bind group was not provided for '${layoutLabel ?? '<unnamed>'}' layout.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingBindGroupError.prototype);\n }\n}\n","/**\n * Yields values in the sequence 0,1,2..∞ except for the ones in the `excluded` set.\n */\nexport function* naturalsExcept(\n excluded: Set<number>,\n): Generator<number, number, unknown> {\n let next = 0;\n\n while (true) {\n if (!excluded.has(next)) {\n yield next;\n }\n\n next++;\n }\n}\n","import type { Block } from 'tinyest';\nimport type { AnyWgslData } from './data/wgslTypes';\nimport type { TgpuNamable } from './namable';\nimport type { NameRegistry } from './nameRegistry';\nimport type { Infer } from './shared/repr';\nimport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n} from './tgpuBindGroupLayout';\n\nexport type Wgsl = string | number | boolean | TgpuResolvable | AnyWgslData;\n\nexport const UnknownData = Symbol('Unknown data type');\nexport type UnknownData = typeof UnknownData;\n\nexport type Resource = {\n value: unknown;\n dataType: AnyWgslData | UnknownData;\n};\n\nexport type TgpuShaderStage = 'compute' | 'vertex' | 'fragment';\n\nexport interface FnToWgslOptions {\n args: Resource[];\n returnType: AnyWgslData;\n body: Block;\n externalMap: Record<string, unknown>;\n}\n\n/**\n * Passed into each resolvable item. All items in a tree share a resolution ctx,\n * but there can be layers added and removed from the item stack when going down\n * and up the tree.\n */\nexport interface ResolutionCtx {\n readonly names: NameRegistry;\n\n addDeclaration(declaration: string): void;\n\n /**\n * Reserves a bind group number, and returns a placeholder that will be replaced\n * with a concrete number at the end of the resolution process.\n */\n allocateLayoutEntry(layout: TgpuBindGroupLayout): string;\n\n /**\n * Reserves a spot in the catch-all bind group, without the indirection of a bind-group.\n * This means the resource is 'fixed', and cannot be swapped between code execution.\n */\n allocateFixedEntry(\n layoutEntry: TgpuLayoutEntry,\n resource: object,\n ): {\n group: string;\n binding: number;\n };\n\n /**\n * Unwraps all layers of slot indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n\n resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;\n\n transpileFn(fn: string): {\n argNames: string[];\n body: Block;\n externalNames: string[];\n };\n fnToWgsl(options: FnToWgslOptions): {\n head: Wgsl;\n body: Wgsl;\n };\n}\n\nexport interface TgpuResolvable {\n readonly label?: string | undefined;\n resolve(ctx: ResolutionCtx): string;\n}\n\nexport function isResolvable(value: unknown): value is TgpuResolvable {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'resolve' in value\n );\n}\n\nexport function isWgsl(value: unknown): value is Wgsl {\n return (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isResolvable(value)\n );\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | TgpuSlot<T>;\n\nexport type EventualGetter = <T>(value: Eventual<T>) => T;\n\nexport type InlineResolve = (get: EventualGetter) => Wgsl;\n\nexport interface TgpuResolvableSlot<T extends Wgsl>\n extends TgpuResolvable,\n TgpuSlot<T> {}\n\nexport type SlotValuePair<T> = [TgpuSlot<T>, T];\n\nexport type BindableBufferUsage = 'uniform' | 'readonly' | 'mutable';\nexport type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';\n\nexport function isGPUBuffer(value: unknown): value is GPUBuffer {\n return (\n !!value &&\n typeof value === 'object' &&\n 'getMappedRange' in value &&\n 'mapAsync' in value\n );\n}\n\n// -----------------\n// TypeGPU Resources\n// -----------------\n\n// Slot\n\nexport interface TgpuSlot<T> extends TgpuNamable {\n readonly __brand: 'TgpuSlot';\n\n readonly defaultValue: T | undefined;\n\n readonly label?: string | undefined;\n /**\n * Used to determine if code generated using either value `a` or `b` in place\n * of the slot will be equivalent. Defaults to `Object.is`.\n */\n areEqual(a: T, b: T): boolean;\n\n readonly value: Infer<T>;\n}\n\nexport function isSlot<T>(value: unknown | TgpuSlot<T>): value is TgpuSlot<T> {\n return (value as TgpuSlot<T>).__brand === 'TgpuSlot';\n}\n","import type * as smol from 'tinyest';\nimport { bool } from '../data';\nimport { isWgslData } from '../data/wgslTypes';\nimport {\n type ResolutionCtx,\n type Resource,\n UnknownData,\n type Wgsl,\n isResolvable,\n isWgsl,\n} from '../types';\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) || isWgslData(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 { BufferReader, BufferWriter } from 'typed-binary';\nimport { readData, writeData } from '../../data/dataIO';\nimport type { AnyData } from '../../data/dataTypes';\nimport { sizeOf } from '../../data/sizeOf';\nimport type { Storage } from '../../extension';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport type { UnionToIntersection } from '../../shared/utilityTypes';\nimport { 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 Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Vertex = { usableAsVertex: true } as Vertex;\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 AnyData> extends TgpuNamable {\n readonly resourceType: 'buffer';\n readonly dataType: TData;\n readonly initial?: Infer<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: Infer<TData> | TgpuBuffer<TData>): void;\n read(): Promise<Infer<TData>>;\n destroy(): void;\n}\n\nexport function createBufferImpl<TData extends AnyData>(\n group: ExperimentalTgpuRoot | undefined,\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);\n}\n\nexport function isBuffer<T extends TgpuBuffer<AnyData>>(\n value: T | unknown,\n): value is T {\n return (value as TgpuBuffer<AnyData>).resourceType === 'buffer';\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyData>>(\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 AnyData> 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\n private _label: string | undefined;\n readonly initial: Infer<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?: Infer<TData> | GPUBuffer | 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: sizeOf(this.dataType),\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n label: this.label ?? '<unnamed>',\n });\n\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n writeData(writer, this.dataType, this.initial);\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 if (this._buffer) {\n this._buffer.label = label;\n }\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: Infer<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 writeData(new BufferWriter(mapped), this.dataType, dataOrBuffer);\n return;\n }\n\n const size = sizeOf(this.dataType);\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 writeData(new BufferWriter(hostBuffer), this.dataType, dataOrBuffer);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n }\n\n async read(): Promise<Infer<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 return readData(new BufferReader(mapped), this.dataType);\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = readData(new BufferReader(mapped), this.dataType);\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: sizeOf(this.dataType),\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 sizeOf(this.dataType),\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, sizeOf(this.dataType));\n\n const res = readData(\n new BufferReader(stagingBuffer.getMappedRange()),\n this.dataType,\n );\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 this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { IMeasurer, ISerialInput, ISerialOutput } from 'typed-binary';\n\n/**\n * @param io the IO to align\n * @param baseAlignment must be power of 2\n */\nfunction alignIO(\n io: ISerialInput | ISerialOutput | IMeasurer,\n baseAlignment: number,\n) {\n const currentPos = 'size' in io ? io.size : io.currentByteOffset;\n\n const bitMask = baseAlignment - 1;\n const offset = currentPos & bitMask;\n\n if ('skipBytes' in io) {\n io.skipBytes((baseAlignment - offset) & bitMask);\n } else {\n io.add((baseAlignment - offset) & bitMask);\n }\n}\n\nexport default alignIO;\n","import type { ISerialInput, ISerialOutput } from 'typed-binary';\nimport type { Infer, InferRecord } from '../shared/repr';\nimport alignIO from './alignIO';\nimport { alignmentOf, customAlignmentOf } from './alignmentOf';\nimport type {\n AnyData,\n LooseArray,\n LooseDecorated,\n LooseStruct,\n} from './dataTypes';\nimport { mat2x2f, mat3x3f, mat4x4f } from './matrix';\nimport { sizeOf } from './sizeOf';\nimport {\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n} from './vector';\nimport type * as wgsl from './wgslTypes';\n\ntype CompleteDataWriters = {\n [TType in AnyData['type']]: (\n output: ISerialOutput,\n schema: Extract<AnyData, { readonly type: TType }>,\n value: Infer<Extract<AnyData, { readonly type: TType }>>,\n ) => void;\n};\n\ntype CompleteDataReaders = {\n [TType in AnyData['type']]: (\n input: ISerialInput,\n schema: Extract<AnyData, { readonly type: TType }>,\n ) => Infer<Extract<AnyData, { readonly type: TType }>>;\n};\n\nfunction sint8Write(output: ISerialOutput, value: number) {\n if (value >= 0) {\n output.writeByte(value & 127);\n } else {\n output.writeByte((value & 127) | 128);\n }\n}\n\nfunction sint8Read(input: ISerialInput): number {\n const value = input.readByte();\n if (value & 128) {\n // has sign bit\n return (value & 127) - 128;\n }\n\n return value & 127;\n}\n\nconst dataWriters = {\n bool(output, _schema: wgsl.Bool, value: boolean) {\n output.writeBool(value);\n },\n\n f32(output, _schema: wgsl.F32, value: number) {\n output.writeFloat32(value);\n },\n\n f16(output, _schema: wgsl.F16, value: number) {\n output.writeFloat16(value);\n },\n\n i32(output, _schema: wgsl.I32, value: number) {\n output.writeInt32(value);\n },\n\n u32(output, _schema: wgsl.U32, value: number) {\n output.writeUint32(value);\n },\n\n vec2f(output, _, value: wgsl.v2f) {\n output.writeFloat32(value.x);\n output.writeFloat32(value.y);\n },\n\n vec2i(output, _, value: wgsl.v2i) {\n output.writeInt32(value.x);\n output.writeInt32(value.y);\n },\n\n vec2u(output, _, value: wgsl.v2u) {\n output.writeUint32(value.x);\n output.writeUint32(value.y);\n },\n\n vec3f(output, _, value: wgsl.v3f) {\n output.writeFloat32(value.x);\n output.writeFloat32(value.y);\n output.writeFloat32(value.z);\n },\n\n vec3i(output, _, value: wgsl.v3i) {\n output.writeInt32(value.x);\n output.writeInt32(value.y);\n output.writeInt32(value.z);\n },\n\n vec3u(output, _, value: wgsl.v3u) {\n output.writeUint32(value.x);\n output.writeUint32(value.y);\n output.writeUint32(value.z);\n },\n\n vec4f(output, _, value: wgsl.v4f) {\n output.writeFloat32(value.x);\n output.writeFloat32(value.y);\n output.writeFloat32(value.z);\n output.writeFloat32(value.w);\n },\n\n vec4i(output, _, value: wgsl.v4i) {\n output.writeInt32(value.x);\n output.writeInt32(value.y);\n output.writeInt32(value.z);\n output.writeInt32(value.w);\n },\n\n vec4u(output, _, value: wgsl.v4u) {\n output.writeUint32(value.x);\n output.writeUint32(value.y);\n output.writeUint32(value.z);\n output.writeUint32(value.w);\n },\n\n mat2x2f(output, _, value: wgsl.m2x2f) {\n for (let i = 0; i < value.length; ++i) {\n output.writeFloat32(value[i] as number);\n }\n },\n\n mat3x3f(output, _, value: wgsl.m3x3f) {\n for (let i = 0; i < value.length; ++i) {\n output.writeFloat32(value[i] as number);\n }\n },\n\n mat4x4f(output, _, value: wgsl.m4x4f) {\n for (let i = 0; i < value.length; ++i) {\n output.writeFloat32(value[i] as number);\n }\n },\n\n struct(\n output,\n schema: wgsl.WgslStruct,\n value: InferRecord<Record<string, wgsl.BaseWgslData>>,\n ) {\n const alignment = alignmentOf(schema);\n alignIO(output, alignment);\n\n for (const [key, property] of Object.entries(schema.propTypes)) {\n alignIO(output, alignmentOf(property));\n writeData(output, property, value[key] as wgsl.BaseWgslData);\n }\n\n alignIO(output, alignment);\n },\n\n array(output, schema: wgsl.WgslArray, value: Infer<wgsl.BaseWgslData>[]) {\n if (schema.elementCount === 0) {\n throw new Error('Cannot write using a runtime-sized schema.');\n }\n\n const alignment = alignmentOf(schema);\n alignIO(output, alignment);\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(schema.elementCount, value.length); i++) {\n alignIO(output, alignment);\n writeData(output, schema.elementType, value[i]);\n }\n output.seekTo(beginning + sizeOf(schema));\n },\n\n atomic(output, schema: wgsl.Atomic, value: number) {\n dataWriters[schema.inner.type]?.(output, schema, value);\n },\n\n decorated(output, schema: wgsl.Decorated, value: unknown) {\n const alignment = customAlignmentOf(schema);\n alignIO(output, alignment);\n\n const beginning = output.currentByteOffset;\n dataWriters[(schema.inner as AnyData)?.type]?.(output, schema.inner, value);\n output.seekTo(beginning + sizeOf(schema));\n },\n\n // Loose Types\n\n uint8x2(output, _, value: wgsl.v2u) {\n output.writeByte(value.x);\n output.writeByte(value.y);\n },\n uint8x4(output, _, value: wgsl.v4u) {\n output.writeByte(value.x);\n output.writeByte(value.y);\n output.writeByte(value.z);\n output.writeByte(value.w);\n },\n sint8x2(output, _, value: wgsl.v2i) {\n sint8Write(output, value.x);\n sint8Write(output, value.y);\n },\n sint8x4(output, _, value: wgsl.v4i) {\n sint8Write(output, value.x);\n sint8Write(output, value.y);\n sint8Write(output, value.z);\n sint8Write(output, value.w);\n },\n unorm8x2(output, _, value: wgsl.v2f) {\n output.writeByte(Math.floor(value.x * 255));\n output.writeByte(Math.floor(value.y * 255));\n },\n unorm8x4(output, _, value: wgsl.v4f) {\n output.writeByte(Math.floor(value.x * 255));\n output.writeByte(Math.floor(value.y * 255));\n output.writeByte(Math.floor(value.z * 255));\n output.writeByte(Math.floor(value.w * 255));\n },\n snorm8x2(output, _, value: wgsl.v2f) {\n output.writeByte(Math.floor(value.x * 127 + 128));\n output.writeByte(Math.floor(value.y * 127 + 128));\n },\n snorm8x4(output, _, value: wgsl.v4f) {\n output.writeByte(Math.floor(value.x * 127 + 128));\n output.writeByte(Math.floor(value.y * 127 + 128));\n output.writeByte(Math.floor(value.z * 127 + 128));\n output.writeByte(Math.floor(value.w * 127 + 128));\n },\n uint16x2(output, _, value: wgsl.v2u) {\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setUint16(0, value.x, littleEndian);\n view.setUint16(2, value.y, littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n uint16x4(output, _, value: wgsl.v4u) {\n const buffer = new ArrayBuffer(8);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setUint16(0, value.x, littleEndian);\n view.setUint16(2, value.y, littleEndian);\n view.setUint16(4, value.z, littleEndian);\n view.setUint16(6, value.w, littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n sint16x2(output, _, value: wgsl.v2i) {\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setInt16(0, value.x, littleEndian);\n view.setInt16(2, value.y, littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n sint16x4(output, _, value: wgsl.v4i) {\n const buffer = new ArrayBuffer(8);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setInt16(0, value.x, littleEndian);\n view.setInt16(2, value.y, littleEndian);\n view.setInt16(4, value.z, littleEndian);\n view.setInt16(6, value.w, littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n unorm16x2(output, _, value: wgsl.v2f) {\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setUint16(0, Math.floor(value.x * 65535), littleEndian);\n view.setUint16(2, Math.floor(value.y * 65535), littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n unorm16x4(output, _, value: wgsl.v4f) {\n const buffer = new ArrayBuffer(8);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setUint16(0, Math.floor(value.x * 65535), littleEndian);\n view.setUint16(2, Math.floor(value.y * 65535), littleEndian);\n view.setUint16(4, Math.floor(value.z * 65535), littleEndian);\n view.setUint16(6, Math.floor(value.w * 65535), littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n snorm16x2(output, _, value: wgsl.v2f) {\n const buffer = new ArrayBuffer(4);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setUint16(0, Math.floor(value.x * 32767 + 32768), littleEndian);\n view.setUint16(2, Math.floor(value.y * 32767 + 32768), littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n snorm16x4(output, _, value: wgsl.v4f) {\n const buffer = new ArrayBuffer(8);\n const view = new DataView(buffer);\n const littleEndian = output.endianness === 'little';\n view.setUint16(0, Math.floor(value.x * 32767 + 32768), littleEndian);\n view.setUint16(2, Math.floor(value.y * 32767 + 32768), littleEndian);\n view.setUint16(4, Math.floor(value.z * 32767 + 32768), littleEndian);\n view.setUint16(6, Math.floor(value.w * 32767 + 32768), littleEndian);\n output.writeSlice(new Uint8Array(buffer));\n },\n float16x2(output, _, value: wgsl.v2f) {\n output.writeFloat16(value.x);\n output.writeFloat16(value.y);\n },\n float16x4(output, _, value: wgsl.v4f) {\n output.writeFloat16(value.x);\n output.writeFloat16(value.y);\n output.writeFloat16(value.z);\n output.writeFloat16(value.w);\n },\n float32(output, _, value: number) {\n output.writeFloat32(value);\n },\n float32x2(output, _, value: wgsl.v2f) {\n output.writeFloat32(value.x);\n output.writeFloat32(value.y);\n },\n float32x3(output, _, value: wgsl.v3f) {\n output.writeFloat32(value.x);\n output.writeFloat32(value.y);\n output.writeFloat32(value.z);\n },\n float32x4(output, _, value: wgsl.v4f) {\n output.writeFloat32(value.x);\n output.writeFloat32(value.y);\n output.writeFloat32(value.z);\n output.writeFloat32(value.w);\n },\n uint32(output, _, value: number) {\n output.writeUint32(value);\n },\n uint32x2(output, _, value: wgsl.v2u) {\n output.writeUint32(value.x);\n output.writeUint32(value.y);\n },\n uint32x3(output, _, value: wgsl.v3u) {\n output.writeUint32(value.x);\n output.writeUint32(value.y);\n output.writeUint32(value.z);\n },\n uint32x4(output, _, value: wgsl.v4u) {\n output.writeUint32(value.x);\n output.writeUint32(value.y);\n output.writeUint32(value.z);\n output.writeUint32(value.w);\n },\n sint32(output, _, value: number) {\n output.writeInt32(value);\n },\n sint32x2(output, _, value: wgsl.v2i) {\n output.writeInt32(value.x);\n output.writeInt32(value.y);\n },\n sint32x3(output, _, value: wgsl.v3i) {\n output.writeInt32(value.x);\n output.writeInt32(value.y);\n output.writeInt32(value.z);\n },\n sint32x4(output, _, value: wgsl.v4i) {\n output.writeInt32(value.x);\n output.writeInt32(value.y);\n output.writeInt32(value.z);\n output.writeInt32(value.w);\n },\n 'unorm10-10-10-2'(output, _, value: wgsl.v4f) {\n let packed = 0;\n packed |= ((value.x * 1023) & 1023) << 22; // r (10 bits)\n packed |= ((value.x * 1023) & 1023) << 12; // g (10 bits)\n packed |= ((value.y * 1023) & 1023) << 2; // b (10 bits)\n packed |= (value.z * 3) & 3; // a (2 bits)\n output.writeUint32(packed);\n },\n\n 'loose-array'(output, schema: LooseArray, value: unknown[]) {\n const alignment = alignmentOf(schema);\n\n alignIO(output, alignment);\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(schema.elementCount, value.length); i++) {\n alignIO(output, alignment);\n dataWriters[(schema.elementType as AnyData)?.type]?.(\n output,\n schema.elementType,\n value[i],\n );\n }\n\n output.seekTo(beginning + sizeOf(schema));\n },\n\n 'loose-struct'(output, schema: LooseStruct, value) {\n for (const [key, property] of Object.entries(schema.propTypes)) {\n dataWriters[property.type]?.(output, property, value[key]);\n }\n },\n\n 'loose-decorated'(output, schema: LooseDecorated, value: unknown) {\n const alignment = customAlignmentOf(schema);\n alignIO(output, alignment);\n\n const beginning = output.currentByteOffset;\n const writer = dataWriters[(schema.inner as AnyData)?.type];\n writer?.(output, schema.inner, value);\n output.seekTo(beginning + sizeOf(schema));\n return value;\n },\n} satisfies CompleteDataWriters as Record<\n string,\n (output: ISerialOutput, schema: unknown, value: unknown) => void\n>;\n\nexport function writeData<TData extends wgsl.BaseWgslData>(\n output: ISerialOutput,\n schema: TData,\n value: Infer<TData>,\n): void {\n const writer = dataWriters[schema.type];\n if (!writer) {\n throw new Error(`Cannot write data of type '${schema.type}'.`);\n }\n\n writer(output, schema, value);\n}\n\nconst dataReaders = {\n bool(input: ISerialInput) {\n return input.readBool();\n },\n\n f32(input: ISerialInput) {\n return input.readFloat32();\n },\n\n f16(input: ISerialInput) {\n return input.readFloat16();\n },\n\n i32(input: ISerialInput) {\n return input.readInt32();\n },\n\n u32(input: ISerialInput) {\n return input.readUint32();\n },\n\n vec2f(input) {\n return vec2f(input.readFloat32(), input.readFloat32());\n },\n\n vec3f(input: ISerialInput) {\n return vec3f(input.readFloat32(), input.readFloat32(), input.readFloat32());\n },\n\n vec4f(input: ISerialInput) {\n return vec4f(\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n );\n },\n\n vec2i(input) {\n return vec2i(input.readInt32(), input.readInt32());\n },\n\n vec3i(input: ISerialInput) {\n return vec3i(input.readInt32(), input.readInt32(), input.readInt32());\n },\n\n vec4i(input: ISerialInput) {\n return vec4i(\n input.readInt32(),\n input.readInt32(),\n input.readInt32(),\n input.readInt32(),\n );\n },\n\n vec2u(input) {\n return vec2u(input.readUint32(), input.readUint32());\n },\n\n vec3u(input: ISerialInput) {\n return vec3u(input.readUint32(), input.readUint32(), input.readUint32());\n },\n\n vec4u(input: ISerialInput) {\n return vec4u(\n input.readUint32(),\n input.readUint32(),\n input.readUint32(),\n input.readUint32(),\n );\n },\n\n mat2x2f(input: ISerialInput) {\n return mat2x2f(\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n );\n },\n\n mat3x3f(input: ISerialInput) {\n const skipOneAfter = () => {\n const value = input.readFloat32();\n input.readFloat32(); // skipping;\n return value;\n };\n\n return mat3x3f(\n input.readFloat32(),\n input.readFloat32(),\n skipOneAfter(),\n //\n input.readFloat32(),\n input.readFloat32(),\n skipOneAfter(),\n //\n input.readFloat32(),\n input.readFloat32(),\n skipOneAfter(),\n );\n },\n\n mat4x4f(input: ISerialInput) {\n return mat4x4f(\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n //\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n //\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n //\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n );\n },\n\n struct(input: ISerialInput, schema: wgsl.WgslStruct) {\n const alignment = alignmentOf(schema);\n alignIO(input, alignment);\n const result = {} as Record<string, unknown>;\n\n for (const [key, property] of Object.entries(schema.propTypes)) {\n alignIO(input, alignmentOf(property));\n result[key] = readData(input, property);\n }\n\n alignIO(input, alignment);\n return result as InferRecord<Record<string, wgsl.BaseWgslData>>;\n },\n\n array(input, schema) {\n if (schema.elementCount === 0) {\n throw new Error('Cannot read using a runtime-sized schema.');\n }\n\n const alignment = alignmentOf(schema);\n const elements: unknown[] = [];\n\n for (let i = 0; i < schema.elementCount; i++) {\n alignIO(input, alignment);\n const elementType = schema.elementType as wgsl.AnyWgslData;\n const value = readData(input, elementType);\n elements.push(value);\n }\n\n alignIO(input, alignment);\n return elements as never[];\n },\n\n atomic(input, schema: wgsl.Atomic): number {\n return readData(input, schema.inner);\n },\n\n decorated(input, schema: wgsl.Decorated) {\n const alignment = customAlignmentOf(schema);\n alignIO(input, alignment);\n\n const beginning = input.currentByteOffset;\n const value = readData(input, schema.inner);\n input.seekTo(beginning + sizeOf(schema));\n return value as never;\n },\n\n // Loose Types\n\n uint8x2: (i) => vec2u(i.readByte(), i.readByte()),\n uint8x4: (i) => vec4u(i.readByte(), i.readByte(), i.readByte(), i.readByte()),\n sint8x2: (i) => {\n return vec2i(sint8Read(i), sint8Read(i));\n },\n sint8x4: (i) => vec4i(sint8Read(i), sint8Read(i), sint8Read(i), sint8Read(i)),\n unorm8x2: (i) => vec2f(i.readByte() / 255, i.readByte() / 255),\n unorm8x4: (i) =>\n vec4f(\n i.readByte() / 255,\n i.readByte() / 255,\n i.readByte() / 255,\n i.readByte() / 255,\n ),\n snorm8x2: (i) =>\n vec2f((i.readByte() - 128) / 127, (i.readByte() - 128) / 127),\n snorm8x4: (i) =>\n vec4f(\n (i.readByte() - 128) / 127,\n (i.readByte() - 128) / 127,\n (i.readByte() - 128) / 127,\n (i.readByte() - 128) / 127,\n ),\n uint16x2(i) {\n const buffer = new ArrayBuffer(4);\n i.readSlice(new Uint8Array(buffer), 0, 4);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec2u(\n view.getUint16(0, littleEndian),\n view.getUint16(2, littleEndian),\n );\n },\n uint16x4(i) {\n const buffer = new ArrayBuffer(8);\n i.readSlice(new Uint8Array(buffer), 0, 8);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec4u(\n view.getUint16(0, littleEndian),\n view.getUint16(2, littleEndian),\n view.getUint16(4, littleEndian),\n view.getUint16(6, littleEndian),\n );\n },\n sint16x2(i) {\n const buffer = new ArrayBuffer(4);\n i.readSlice(new Uint8Array(buffer), 0, 4);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec2i(\n view.getInt16(0, littleEndian),\n view.getInt16(2, littleEndian),\n );\n },\n sint16x4(i) {\n const buffer = new ArrayBuffer(8);\n i.readSlice(new Uint8Array(buffer), 0, 8);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec4i(\n view.getInt16(0, littleEndian),\n view.getInt16(2, littleEndian),\n view.getInt16(4, littleEndian),\n view.getInt16(6, littleEndian),\n );\n },\n unorm16x2(i) {\n const buffer = new ArrayBuffer(4);\n i.readSlice(new Uint8Array(buffer), 0, 4);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec2f(\n view.getUint16(0, littleEndian) / 65535,\n view.getUint16(2, littleEndian) / 65535,\n );\n },\n unorm16x4(i) {\n const buffer = new ArrayBuffer(8);\n i.readSlice(new Uint8Array(buffer), 0, 8);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec4f(\n view.getUint16(0, littleEndian) / 65535,\n view.getUint16(2, littleEndian) / 65535,\n view.getUint16(4, littleEndian) / 65535,\n view.getUint16(6, littleEndian) / 65535,\n );\n },\n snorm16x2(i) {\n const buffer = new ArrayBuffer(4);\n i.readSlice(new Uint8Array(buffer), 0, 4);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec2f(\n (view.getUint16(0, littleEndian) - 32768) / 32767,\n (view.getUint16(2, littleEndian) - 32768) / 32767,\n );\n },\n snorm16x4(i) {\n const buffer = new ArrayBuffer(8);\n i.readSlice(new Uint8Array(buffer), 0, 8);\n const view = new DataView(buffer);\n const littleEndian = i.endianness === 'little';\n\n return vec4f(\n (view.getUint16(0, littleEndian) - 32768) / 32767,\n (view.getUint16(2, littleEndian) - 32768) / 32767,\n (view.getUint16(4, littleEndian) - 32768) / 32767,\n (view.getUint16(6, littleEndian) - 32768) / 32767,\n );\n },\n float16x2: (i) => vec2f(i.readFloat16(), i.readFloat16()),\n float16x4: (i) =>\n vec4f(i.readFloat16(), i.readFloat16(), i.readFloat16(), i.readFloat16()),\n float32: (i) => i.readFloat32(),\n float32x2: (i) => vec2f(i.readFloat32(), i.readFloat32()),\n float32x3: (i) => vec3f(i.readFloat32(), i.readFloat32(), i.readFloat32()),\n float32x4: (i) =>\n vec4f(i.readFloat32(), i.readFloat32(), i.readFloat32(), i.readFloat32()),\n uint32: (i) => i.readUint32(),\n uint32x2: (i) => vec2u(i.readUint32(), i.readUint32()),\n uint32x3: (i) => vec3u(i.readUint32(), i.readUint32(), i.readUint32()),\n uint32x4: (i) =>\n vec4u(i.readUint32(), i.readUint32(), i.readUint32(), i.readUint32()),\n sint32: (i) => i.readInt32(),\n sint32x2: (i) => vec2i(i.readInt32(), i.readInt32()),\n sint32x3: (i) => vec3i(i.readInt32(), i.readInt32(), i.readInt32()),\n sint32x4: (i) =>\n vec4i(i.readInt32(), i.readInt32(), i.readInt32(), i.readInt32()),\n 'unorm10-10-10-2'(i) {\n const packed = i.readUint32();\n const r = (packed >> 22) / 1023;\n const g = ((packed >> 12) & 1023) / 1023;\n const b = ((packed >> 2) & 1023) / 1023;\n const a = (packed & 3) / 3;\n return vec4f(r, g, b, a);\n },\n\n 'loose-struct'(input, schema: LooseStruct) {\n const result = {} as Record<string, unknown>;\n\n for (const [key, property] of Object.entries(schema.propTypes)) {\n result[key] = readData(input, property);\n }\n\n return result as InferRecord<Record<string, wgsl.BaseWgslData>>;\n },\n\n 'loose-array'(input, schema: LooseArray) {\n const alignment = alignmentOf(schema);\n const elements: unknown[] = [];\n\n for (let i = 0; i < schema.elementCount; i++) {\n alignIO(input, alignment);\n elements.push(readData(input, schema.elementType));\n }\n\n alignIO(input, alignment);\n return elements;\n },\n\n 'loose-decorated'(input, schema: LooseDecorated) {\n alignIO(input, customAlignmentOf(schema));\n\n const beginning = input.currentByteOffset;\n const value = readData(input, schema.inner);\n input.seekTo(beginning + sizeOf(schema));\n return value;\n },\n} satisfies CompleteDataReaders as Record<\n string,\n (input: ISerialInput, schema: unknown) => unknown\n>;\n\nexport function readData<TData extends wgsl.BaseWgslData>(\n input: ISerialInput,\n schema: TData,\n): Infer<TData> {\n const reader = dataReaders[schema.type];\n if (!reader) {\n throw new Error(`Cannot read data of type '${schema.type}'.`);\n }\n\n return reader(input, schema) as Infer<TData>;\n}\n","export interface NotAllowed<TMsg> {\n reason: TMsg;\n}\n\nexport type ExtensionGuard<TFlag, TMsg, TAllowed> = boolean extends TFlag\n ? NotAllowed<TMsg>\n : TAllowed;\n\n// #region Shared usage extensions\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport const Storage = { usableAsStorage: true } as Storage;\n\nexport function isUsableAsStorage<T>(value: T): value is T & Storage {\n return !!(value as unknown as Storage)?.usableAsStorage;\n}\n\n/**\n * @category Errors\n */\nexport class NotStorageError extends Error {\n constructor(value: { readonly label?: string | undefined }) {\n super(\n `Resource '${value.label ?? '<unnamed>'}' cannot be bound as 'storage'. Use .$usage('storage') to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotStorageError.prototype);\n }\n}\n\n// #endregion\n","import type { AnyWgslData, BaseWgslData } from '../../data/wgslTypes';\nimport { type Storage, isUsableAsStorage } from '../../extension';\nimport { inGPUMode } from '../../gpuMode';\nimport type { Infer } from '../../shared/repr';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type {\n BindableBufferUsage,\n ResolutionCtx,\n TgpuResolvable,\n} from '../../types';\nimport { type TgpuBuffer, type Uniform, isUsableAsUniform } from './buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUsage<\n TData extends BaseWgslData,\n TUsage extends BindableBufferUsage = BindableBufferUsage,\n> extends TgpuResolvable {\n readonly resourceType: 'buffer-usage';\n readonly usage: TUsage;\n readonly '~repr': Infer<TData>;\n value: Infer<TData>;\n}\n\nexport interface TgpuBufferUniform<TData extends BaseWgslData>\n extends TgpuBufferUsage<TData, 'uniform'> {\n readonly value: Infer<TData>;\n}\n\nexport interface TgpuBufferReadonly<TData extends BaseWgslData>\n extends TgpuBufferUsage<TData, 'readonly'> {\n readonly value: Infer<TData>;\n}\n\nexport interface TgpuBufferMutable<TData extends BaseWgslData>\n extends TgpuBufferUsage<TData, 'mutable'> {}\n\nexport function isBufferUsage<\n T extends\n | TgpuBufferUniform<BaseWgslData>\n | TgpuBufferReadonly<BaseWgslData>\n | TgpuBufferMutable<BaseWgslData>,\n>(value: T | unknown): value is T {\n return (value as T)?.resourceType === 'buffer-usage';\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst usageToVarTemplateMap: Record<BindableBufferUsage, string> = {\n uniform: 'uniform',\n mutable: 'storage, read_write',\n readonly: 'storage, read',\n};\n\nclass TgpuFixedBufferImpl<\n TData extends AnyWgslData,\n TUsage extends BindableBufferUsage,\n> implements TgpuBufferUsage<TData, TUsage>\n{\n /** Type-token, not available at runtime */\n public readonly '~repr'!: Infer<TData>;\n public readonly resourceType = 'buffer-usage' as const;\n\n constructor(\n public readonly usage: TUsage,\n public readonly buffer: TgpuBuffer<TData>,\n ) {}\n\n get label() {\n return this.buffer.label;\n }\n\n $name(label: string) {\n this.buffer.$name(label);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const { group, binding } = ctx.allocateFixedEntry(\n this.usage === 'uniform'\n ? { uniform: this.buffer.dataType }\n : { storage: this.buffer.dataType, access: this.usage },\n this.buffer,\n );\n const usage = usageToVarTemplateMap[this.usage];\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${binding}) var<${usage}> ${id}: ${ctx.resolve(this.buffer.dataType)};`,\n );\n\n return id;\n }\n\n toString(): string {\n return `${this.usage}:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Infer<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n return this as Infer<TData>;\n }\n}\n\nexport class TgpuLaidOutBufferImpl<\n TData extends BaseWgslData,\n TUsage extends BindableBufferUsage,\n> implements TgpuBufferUsage<TData, TUsage>\n{\n /** Type-token, not available at runtime */\n public readonly '~repr'!: Infer<TData>;\n public readonly resourceType = 'buffer-usage' as const;\n\n constructor(\n public readonly usage: TUsage,\n public readonly dataType: TData,\n private readonly _membership: LayoutMembership,\n ) {}\n\n get label() {\n return this._membership.key;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const group = ctx.allocateLayoutEntry(this._membership.layout);\n const usage = usageToVarTemplateMap[this.usage];\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${this._membership.idx}) var<${usage}> ${id}: ${ctx.resolve(this.dataType as AnyWgslData)};`,\n );\n\n return id;\n }\n\n toString(): string {\n return `${this.usage}:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Infer<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n return this as Infer<TData>;\n }\n}\n\nconst mutableUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'mutable'>\n>();\n\nexport function asMutable<TData extends AnyWgslData>(\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 TgpuFixedBufferImpl('mutable', buffer);\n mutableUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferMutable<TData>;\n}\n\nconst readonlyUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'readonly'>\n>();\n\nexport function asReadonly<TData extends AnyWgslData>(\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 TgpuFixedBufferImpl('readonly', buffer);\n readonlyUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferReadonly<TData>;\n}\n\nconst uniformUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'uniform'>\n>();\n\nexport function asUniform<TData extends AnyWgslData>(\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 TgpuFixedBufferImpl('uniform', buffer);\n uniformUsageMap.set(buffer, usage);\n }\n return usage as unknown as TgpuBufferUniform<TData>;\n}\n","// ----------\n// Public API\n// ----------\n\nimport type { TgpuNamable } from '../../namable';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type { ResolutionCtx } from '../../types';\n\nexport interface SamplerProps {\n addressModeU?: GPUAddressMode;\n addressModeV?: GPUAddressMode;\n /**\n * Specifies the address modes for the texture width, height, and depth\n * coordinates, respectively.\n */\n addressModeW?: GPUAddressMode;\n /**\n * Specifies the sampling behavior when the sample footprint is smaller than or equal to one\n * texel.\n */\n magFilter?: GPUFilterMode;\n /**\n * Specifies the sampling behavior when the sample footprint is larger than one texel.\n */\n minFilter?: GPUFilterMode;\n /**\n * Specifies behavior for sampling between mipmap levels.\n */\n mipmapFilter?: GPUMipmapFilterMode;\n lodMinClamp?: number;\n /**\n * Specifies the minimum and maximum levels of detail, respectively, used internally when\n * sampling a texture.\n */\n lodMaxClamp?: number;\n /**\n * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is\n * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.\n * Anisotropic filtering improves the image quality of textures sampled at oblique viewing\n * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of\n * anisotropy supported when filtering.\n *\n * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range\n * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}\n * will be clamped to the maximum value that the platform supports.\n * The precise filtering behavior is implementation-dependent.\n */\n maxAnisotropy?: number;\n}\n\nexport interface ComparisonSamplerProps {\n compare: GPUCompareFunction;\n addressModeU?: GPUAddressMode;\n addressModeV?: GPUAddressMode;\n /**\n * Specifies the address modes for the texture width, height, and depth\n * coordinates, respectively.\n */\n addressModeW?: GPUAddressMode;\n /**\n * Specifies the sampling behavior when the sample footprint is smaller than or equal to one\n * texel.\n */\n magFilter?: GPUFilterMode;\n /**\n * Specifies the sampling behavior when the sample footprint is larger than one texel.\n */\n minFilter?: GPUFilterMode;\n /**\n * Specifies behavior for sampling between mipmap levels.\n */\n mipmapFilter?: GPUMipmapFilterMode;\n lodMinClamp?: number;\n /**\n * Specifies the minimum and maximum levels of detail, respectively, used internally when\n * sampling a texture.\n */\n lodMaxClamp?: number;\n /**\n * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is\n * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.\n * Anisotropic filtering improves the image quality of textures sampled at oblique viewing\n * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of\n * anisotropy supported when filtering.\n *\n * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range\n * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}\n * will be clamped to the maximum value that the platform supports.\n * The precise filtering behavior is implementation-dependent.\n */\n maxAnisotropy?: number;\n}\n\nexport interface TgpuSampler {\n readonly resourceType: 'sampler';\n}\n\nexport interface TgpuComparisonSampler {\n readonly resourceType: 'sampler-comparison';\n}\n\nexport interface TgpuFixedSampler extends TgpuSampler, TgpuNamable {}\n\nexport interface TgpuFixedComparisonSampler\n extends TgpuComparisonSampler,\n TgpuNamable {}\n\nexport function sampler(props: SamplerProps): TgpuSampler {\n return new TgpuFixedSamplerImpl(props);\n}\n\nexport function comparisonSampler(\n props: ComparisonSamplerProps,\n): TgpuComparisonSampler {\n return new TgpuFixedComparisonSamplerImpl(props);\n}\n\nexport function isSampler(resource: unknown): resource is TgpuSampler {\n return (resource as TgpuSampler)?.resourceType === 'sampler';\n}\n\nexport function isComparisonSampler(\n resource: unknown,\n): resource is TgpuComparisonSampler {\n return (\n (resource as TgpuComparisonSampler)?.resourceType === 'sampler-comparison'\n );\n}\n\n// --------------\n// Implementation\n// --------------\n\nexport class TgpuLaidOutSamplerImpl implements TgpuSampler {\n public readonly resourceType = 'sampler';\n\n constructor(private readonly _membership: LayoutMembership) {}\n\n get label(): string | undefined {\n return this._membership.key;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const group = ctx.allocateLayoutEntry(this._membership.layout);\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${this._membership.idx}) var ${id}: sampler;`,\n );\n\n return id;\n }\n}\n\nexport class TgpuLaidOutComparisonSamplerImpl implements TgpuComparisonSampler {\n public readonly resourceType = 'sampler-comparison';\n\n constructor(private readonly _membership: LayoutMembership) {}\n\n get label(): string | undefined {\n return this._membership.key;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const group = ctx.allocateLayoutEntry(this._membership.layout);\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${this._membership.idx}) var ${id}: sampler_comparison;`,\n );\n\n return id;\n }\n}\n\nclass TgpuFixedSamplerImpl implements TgpuFixedSampler {\n public readonly resourceType = 'sampler';\n\n private _label: string | undefined;\n private _filtering: boolean;\n\n constructor(private readonly _props: SamplerProps) {\n // Based on https://www.w3.org/TR/webgpu/#sampler-creation\n this._filtering =\n _props.minFilter === 'linear' ||\n _props.magFilter === 'linear' ||\n _props.mipmapFilter === 'linear';\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this._label);\n\n const { group, binding } = ctx.allocateFixedEntry(\n {\n sampler: this._filtering ? 'filtering' : 'non-filtering',\n },\n this,\n );\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${binding}) var ${id}: sampler;`,\n );\n\n return id;\n }\n}\n\nclass TgpuFixedComparisonSamplerImpl implements TgpuFixedComparisonSampler {\n public readonly resourceType = 'sampler-comparison';\n\n private _label: string | undefined;\n\n constructor(private readonly _props: ComparisonSamplerProps) {}\n\n get label(): string | undefined {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const { group, binding } = ctx.allocateFixedEntry(\n { sampler: 'comparison' },\n this,\n );\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${binding}) var ${id}: sampler_comparison;`,\n );\n\n return id;\n }\n}\n","import type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type { ResolutionCtx } from '../../types';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuExternalTexture {\n readonly resourceType: 'external-texture';\n}\n\nexport function isExternalTexture<T extends TgpuExternalTexture>(\n value: unknown | T,\n): value is T {\n return (value as T)?.resourceType === 'external-texture';\n}\n\n// --------------\n// Implementation\n// --------------\n\nexport class TgpuExternalTextureImpl implements TgpuExternalTexture {\n public readonly resourceType = 'external-texture';\n\n constructor(private readonly _membership: LayoutMembership) {}\n\n get label(): string | undefined {\n return this._membership.key;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const group = ctx.allocateLayoutEntry(this._membership.layout);\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${this._membership.idx}) var ${id}: texture_external;`,\n );\n\n return id;\n }\n}\n","import { f32, i32, u32 } from '../../data/numeric';\nimport { vec4f, vec4i, vec4u } from '../../data/vector';\nimport type { F32, I32, U32, Vec4f, Vec4i, Vec4u } from '../../data/wgslTypes';\nimport type { Default } from '../../shared/utilityTypes';\nimport type { TextureProps } from './textureProps';\n\nexport const texelFormatToChannelType = {\n r8unorm: f32 as F32,\n r8snorm: f32 as F32,\n r8uint: u32 as U32,\n r8sint: i32 as I32,\n r16uint: u32 as U32,\n r16sint: i32 as I32,\n r16float: f32 as F32,\n rg8unorm: f32 as F32,\n rg8snorm: f32 as F32,\n rg8uint: u32 as U32,\n rg8sint: i32 as I32,\n r32uint: u32 as U32,\n r32sint: i32 as I32,\n r32float: f32 as F32,\n rg16uint: u32 as U32,\n rg16sint: i32 as I32,\n rg16float: f32 as F32,\n rgba8unorm: f32 as F32,\n 'rgba8unorm-srgb': f32 as F32,\n rgba8snorm: f32 as F32,\n rgba8uint: u32 as U32,\n rgba8sint: i32 as I32,\n bgra8unorm: f32 as F32,\n 'bgra8unorm-srgb': f32 as F32,\n rgb9e5ufloat: f32 as F32,\n rgb10a2uint: u32 as U32,\n rgb10a2unorm: f32 as F32,\n rg11b10ufloat: f32 as F32,\n rg32uint: u32 as U32,\n rg32sint: i32 as I32,\n rg32float: f32 as F32,\n rgba16uint: u32 as U32,\n rgba16sint: i32 as I32,\n rgba16float: f32 as F32,\n rgba32uint: u32 as U32,\n rgba32sint: i32 as I32,\n rgba32float: f32 as F32,\n stencil8: f32 as F32, // NOTE: Honestly have no idea if this is right\n depth16unorm: f32 as F32,\n depth24plus: f32 as F32, // NOTE: Honestly have no idea if this is right\n 'depth24plus-stencil8': f32 as F32, // NOTE: Honestly have no idea if this is right\n depth32float: f32 as F32,\n 'depth32float-stencil8': f32 as F32,\n 'bc1-rgba-unorm': f32 as F32,\n 'bc1-rgba-unorm-srgb': f32 as F32,\n 'bc2-rgba-unorm': f32 as F32,\n 'bc2-rgba-unorm-srgb': f32 as F32,\n 'bc3-rgba-unorm': f32 as F32,\n 'bc3-rgba-unorm-srgb': f32 as F32,\n 'bc4-r-unorm': f32 as F32,\n 'bc4-r-snorm': f32 as F32,\n 'bc5-rg-unorm': f32 as F32,\n 'bc5-rg-snorm': f32 as F32,\n 'bc6h-rgb-ufloat': f32 as F32,\n 'bc6h-rgb-float': f32 as F32,\n 'bc7-rgba-unorm': f32 as F32,\n 'bc7-rgba-unorm-srgb': f32 as F32,\n 'etc2-rgb8unorm': f32 as F32,\n 'etc2-rgb8unorm-srgb': f32 as F32,\n 'etc2-rgb8a1unorm': f32 as F32,\n 'etc2-rgb8a1unorm-srgb': f32 as F32,\n 'etc2-rgba8unorm': f32 as F32,\n 'etc2-rgba8unorm-srgb': f32 as F32,\n 'eac-r11unorm': f32 as F32,\n 'eac-r11snorm': f32 as F32,\n 'eac-rg11unorm': f32 as F32,\n 'eac-rg11snorm': f32 as F32,\n 'astc-4x4-unorm': f32 as F32,\n 'astc-4x4-unorm-srgb': f32 as F32,\n 'astc-5x4-unorm': f32 as F32,\n 'astc-5x4-unorm-srgb': f32 as F32,\n 'astc-5x5-unorm': f32 as F32,\n 'astc-5x5-unorm-srgb': f32 as F32,\n 'astc-6x5-unorm': f32 as F32,\n 'astc-6x5-unorm-srgb': f32 as F32,\n 'astc-6x6-unorm': f32 as F32,\n 'astc-6x6-unorm-srgb': f32 as F32,\n 'astc-8x5-unorm': f32 as F32,\n 'astc-8x5-unorm-srgb': f32 as F32,\n 'astc-8x6-unorm': f32 as F32,\n 'astc-8x6-unorm-srgb': f32 as F32,\n 'astc-8x8-unorm': f32 as F32,\n 'astc-8x8-unorm-srgb': f32 as F32,\n 'astc-10x5-unorm': f32 as F32,\n 'astc-10x5-unorm-srgb': f32 as F32,\n 'astc-10x6-unorm': f32 as F32,\n 'astc-10x6-unorm-srgb': f32 as F32,\n 'astc-10x8-unorm': f32 as F32,\n 'astc-10x8-unorm-srgb': f32 as F32,\n 'astc-10x10-unorm': f32 as F32,\n 'astc-10x10-unorm-srgb': f32 as F32,\n 'astc-12x10-unorm': f32 as F32,\n 'astc-12x10-unorm-srgb': f32 as F32,\n 'astc-12x12-unorm': f32 as F32,\n 'astc-12x12-unorm-srgb': f32 as F32,\n} satisfies Record<GPUTextureFormat, U32 | I32 | F32>;\n\nexport type TexelFormatToChannelType = typeof texelFormatToChannelType;\n\n/**\n * https://www.w3.org/TR/WGSL/#storage-texel-formats\n */\nexport type StorageTextureTexelFormat =\n | 'rgba8unorm'\n | 'rgba8snorm'\n | 'rgba8uint'\n | 'rgba8sint'\n | 'rgba16uint'\n | 'rgba16sint'\n | 'rgba16float'\n | 'r32uint'\n | 'r32sint'\n | 'r32float'\n | 'rg32uint'\n | 'rg32sint'\n | 'rg32float'\n | 'rgba32uint'\n | 'rgba32sint'\n | 'rgba32float'\n | 'bgra8unorm';\n\nexport const texelFormatToDataType = {\n rgba8unorm: vec4f as Vec4f,\n rgba8snorm: vec4f as Vec4f,\n rgba8uint: vec4u as Vec4u,\n rgba8sint: vec4i as Vec4i,\n rgba16uint: vec4u as Vec4u,\n rgba16sint: vec4i as Vec4i,\n rgba16float: vec4f as Vec4f,\n r32uint: vec4u as Vec4u,\n r32sint: vec4i as Vec4i,\n r32float: vec4f as Vec4f,\n rg32uint: vec4u as Vec4u,\n rg32sint: vec4i as Vec4i,\n rg32float: vec4f as Vec4f,\n rgba32uint: vec4u as Vec4u,\n rgba32sint: vec4i as Vec4i,\n rgba32float: vec4f as Vec4f,\n bgra8unorm: vec4f as Vec4f,\n} as const;\n\nexport const channelKindToFormat = {\n f32: 'float',\n u32: 'uint',\n i32: 'sint',\n} as const;\n\nexport const channelFormatToSchema = {\n float: f32,\n 'unfilterable-float': f32,\n uint: u32,\n sint: i32,\n depth: f32, // I guess?\n};\n\nexport type TexelFormatToDataType = typeof texelFormatToDataType;\nexport type TexelFormatToDataTypeOrNever<T> =\n T extends keyof TexelFormatToDataType ? TexelFormatToDataType[T] : never;\n\n/**\n * Represents what formats a storage view can choose from based on its owner texture's props.\n */\nexport type StorageFormatOptions<TProps extends TextureProps> = Extract<\n TProps['format'] | Default<TProps['viewFormats'], []>[number],\n StorageTextureTexelFormat\n>;\n\n/**\n * Represents what formats a sampled view can choose from based on its owner texture's props.\n */\nexport type SampledFormatOptions<TProps extends TextureProps> =\n | TProps['format']\n | Default<TProps['viewFormats'], []>[number];\n","import type { F32, I32, U32, Vec4f, Vec4i, Vec4u } from '../../data/wgslTypes';\nimport { invariant } from '../../errors';\nimport type { ExtensionGuard } from '../../extension';\nimport type { TgpuNamable } from '../../namable';\nimport type { Default } from '../../shared/utilityTypes';\nimport type { UnionToIntersection } from '../../shared/utilityTypes';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type { ResolutionCtx, TgpuResolvable } from '../../types';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\nimport {\n type SampledFormatOptions,\n type StorageFormatOptions,\n type StorageTextureTexelFormat,\n type TexelFormatToChannelType,\n type TexelFormatToDataType,\n type TexelFormatToDataTypeOrNever,\n channelFormatToSchema,\n channelKindToFormat,\n texelFormatToChannelType,\n texelFormatToDataType,\n} from './textureFormats';\nimport type { TextureProps } from './textureProps';\nimport type { AllowedUsages, LiteralToExtensionMap } from './usageExtension';\n\n// ----------\n// Public API\n// ----------\n\nexport type ChannelData = U32 | I32 | F32;\nexport type TexelData = Vec4u | Vec4i | Vec4f;\n\n/**\n * @param TProps all properties that distinguish this texture apart from other textures on the type level.\n */\nexport interface TgpuTexture<TProps extends TextureProps = TextureProps>\n extends TgpuNamable {\n readonly resourceType: 'texture';\n readonly props: TProps; // <- storing to be able to differentiate structurally between different textures.\n readonly label: string | undefined;\n\n // Extensions\n readonly usableAsStorage: boolean;\n readonly usableAsSampled: boolean;\n readonly usableAsRender: boolean;\n\n $usage<T extends AllowedUsages<TProps>[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToExtensionMap[T[number]]>;\n\n asReadonly<\n TDimension extends StorageTextureDimension,\n TFormat extends StorageFormatOptions<TProps>,\n >(\n params?: TextureViewParams<TDimension, TFormat>,\n ): ExtensionGuard<\n // flag\n this['usableAsStorage'],\n // error msg\n \"missing .$usage('storage')\",\n // if allowed\n TgpuReadonlyTexture<\n StorageTextureDimension extends TDimension\n ? Default<TProps['dimension'], '2d'>\n : TDimension,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >\n >;\n\n asWriteonly<\n TDimension extends StorageTextureDimension,\n TFormat extends StorageFormatOptions<TProps>,\n >(\n params?: TextureViewParams<TDimension, TFormat>,\n ): ExtensionGuard<\n // flag\n this['usableAsStorage'],\n // error msg\n \"missing .$usage('storage')\",\n // if allowed\n TgpuWriteonlyTexture<\n StorageTextureDimension extends TDimension\n ? Default<TProps['dimension'], '2d'>\n : TDimension,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >\n >;\n\n asMutable<\n TDimension extends StorageTextureDimension,\n TFormat extends StorageFormatOptions<TProps>,\n >(\n params?: TextureViewParams<TDimension, TFormat>,\n ): ExtensionGuard<\n // flag\n this['usableAsStorage'],\n // error msg\n \"missing .$usage('storage')\",\n // if allowed\n TgpuMutableTexture<\n StorageTextureDimension extends TDimension\n ? Default<TProps['dimension'], '2d'>\n : TDimension,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >\n >;\n\n asSampled<\n TDimension extends GPUTextureViewDimension,\n TFormat extends SampledFormatOptions<TProps>,\n >(\n params?: TextureViewParams<TDimension, TFormat>,\n ): ExtensionGuard<\n // flag\n this['usableAsSampled'],\n // error msg\n \"missing .$usage('sampled')\",\n // if allowed\n TgpuSampledTexture<\n GPUTextureViewDimension extends TDimension\n ? Default<TProps['dimension'], '2d'>\n : TDimension,\n TexelFormatToChannelType[SampledFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat]\n >\n >;\n\n destroy(): void;\n}\n\nexport interface INTERNAL_TgpuTexture {\n unwrap(): GPUTexture;\n}\n\nexport type StorageTextureAccess = 'readonly' | 'writeonly' | 'mutable';\n\n/**\n * Based on @see GPUTextureViewDimension\n * https://www.w3.org/TR/WGSL/#texture-depth\n */\nexport type StorageTextureDimension =\n | '1d'\n | '2d'\n | '2d-array'\n // | 'cube' <- not supported by storage textures\n // | 'cube-array' <- not supported by storage textures\n | '3d';\n\nexport type TextureViewParams<\n TDimension extends GPUTextureViewDimension | undefined,\n TFormat extends GPUTextureFormat | undefined,\n> = {\n format?: TFormat;\n dimension?: TDimension;\n aspect?: GPUTextureAspect;\n baseMipLevel?: number;\n mipLevelCount?: number;\n baseArrayLayout?: number;\n arrayLayerCount?: number;\n};\n\nexport interface TgpuStorageTexture<\n TDimension extends StorageTextureDimension = StorageTextureDimension,\n TData extends TexelData = TexelData,\n> {\n readonly resourceType: 'texture-storage-view';\n readonly dimension: TDimension;\n readonly texelDataType: TData;\n readonly access: StorageTextureAccess;\n}\n\nexport interface INTERNAL_TgpuStorageTexture {\n unwrap(): GPUTextureView;\n}\n\n/**\n * A texture accessed as \"readonly\" storage on the GPU.\n */\nexport interface TgpuReadonlyTexture<\n TDimension extends StorageTextureDimension = StorageTextureDimension,\n TData extends TexelData = TexelData,\n> extends TgpuStorageTexture<TDimension, TData>,\n TgpuResolvable {\n readonly access: 'readonly';\n}\n\n/**\n * A texture accessed as \"writeonly\" storage on the GPU.\n */\nexport interface TgpuWriteonlyTexture<\n TDimension extends StorageTextureDimension = StorageTextureDimension,\n TData extends TexelData = TexelData,\n> extends TgpuStorageTexture<TDimension, TData>,\n TgpuResolvable {\n readonly access: 'writeonly';\n}\n\n/**\n * A texture accessed as \"mutable\" (or read_write) storage on the GPU.\n */\nexport interface TgpuMutableTexture<\n TDimension extends StorageTextureDimension = StorageTextureDimension,\n TData extends TexelData = TexelData,\n> extends TgpuStorageTexture<TDimension, TData>,\n TgpuResolvable {\n readonly access: 'mutable';\n}\n\n/**\n * A texture accessed as sampled on the GPU.\n */\nexport interface TgpuSampledTexture<\n TDimension extends GPUTextureViewDimension = GPUTextureViewDimension,\n TData extends ChannelData = ChannelData,\n> extends TgpuResolvable {\n readonly resourceType: 'texture-sampled-view';\n readonly dimension: TDimension;\n readonly channelDataType: TData;\n}\n\nexport interface INTERNAL_TgpuSampledTexture {\n unwrap(): GPUTextureView;\n}\n\nexport function INTERNAL_createTexture(\n props: TextureProps,\n branch: ExperimentalTgpuRoot,\n): TgpuTexture<TextureProps> {\n return new TgpuTextureImpl(\n props,\n branch,\n ) as unknown as TgpuTexture<TextureProps>;\n}\n\nexport function isTexture<T extends TgpuTexture>(\n value: unknown | T,\n): value is T {\n return (value as T)?.resourceType === 'texture';\n}\n\nexport function isStorageTextureView<\n T extends TgpuReadonlyTexture | TgpuWriteonlyTexture | TgpuMutableTexture,\n>(value: unknown | T): value is T {\n return (value as T)?.resourceType === 'texture-storage-view';\n}\n\nexport function isSampledTextureView<T extends TgpuSampledTexture>(\n value: unknown | T,\n): value is T {\n return (value as T)?.resourceType === 'texture-sampled-view';\n}\n\nexport type TgpuAnyTextureView =\n | TgpuReadonlyTexture\n | TgpuWriteonlyTexture\n | TgpuMutableTexture\n | TgpuSampledTexture;\n\n// --------------\n// Implementation\n// --------------\n\nconst accessMap = {\n mutable: 'read_write',\n readonly: 'read',\n writeonly: 'write',\n} as const;\n\nclass TgpuTextureImpl implements TgpuTexture, INTERNAL_TgpuTexture {\n public readonly resourceType = 'texture';\n public usableAsSampled = false;\n public usableAsStorage = false;\n public usableAsRender = false;\n\n private _destroyed = false;\n private _label: string | undefined;\n private _flags = GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC;\n private _texture: GPUTexture | null = null;\n\n constructor(\n public readonly props: TextureProps,\n private readonly _branch: ExperimentalTgpuRoot,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n /**\n * NOTE: Internal use only, use this and you'll get fired. Use `root.unwrap` instead.\n */\n unwrap(): GPUTexture {\n if (this._destroyed) {\n throw new Error('This texture has been destroyed');\n }\n\n if (!this._texture) {\n this._texture = this._branch.device.createTexture({\n label: this._label ?? '<unnamed>',\n format: this.props.format,\n size: this.props.size,\n usage: this._flags,\n dimension: this.props.dimension ?? '2d',\n viewFormats: this.props.viewFormats ?? [],\n mipLevelCount: this.props.mipLevelCount ?? 1,\n sampleCount: this.props.sampleCount ?? 1,\n });\n }\n\n return this._texture;\n }\n\n $usage<T extends ('sampled' | 'storage' | 'render')[]>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToExtensionMap[T[number]]> {\n const hasStorage = usages.includes('storage');\n const hasSampled = usages.includes('sampled');\n const hasRender = usages.includes('render');\n this._flags |= hasSampled ? GPUTextureUsage.TEXTURE_BINDING : 0;\n this._flags |= hasStorage ? GPUTextureUsage.STORAGE_BINDING : 0;\n this._flags |= hasRender ? GPUTextureUsage.RENDER_ATTACHMENT : 0;\n this.usableAsStorage ||= hasStorage;\n this.usableAsSampled ||= hasSampled;\n this.usableAsRender ||= hasRender;\n\n return this as this & UnionToIntersection<LiteralToExtensionMap[T[number]]>;\n }\n\n private _asStorage(\n params:\n | TextureViewParams<StorageTextureDimension, StorageTextureTexelFormat>\n | undefined,\n access: StorageTextureAccess,\n ): TgpuFixedStorageTextureImpl {\n if (!this.usableAsStorage) {\n throw new Error('Unusable as storage');\n }\n\n const format = params?.format ?? this.props.format;\n const type = texelFormatToDataType[format as keyof TexelFormatToDataType];\n invariant(!!type, `Unsupported storage texture format: ${format}`);\n\n return new TgpuFixedStorageTextureImpl(params ?? {}, access, this);\n }\n\n asReadonly(\n params?: TextureViewParams<\n StorageTextureDimension,\n StorageTextureTexelFormat\n >,\n ) {\n // biome-ignore lint/suspicious/noExplicitAny: <too much type wrangling>\n return this._asStorage(params, 'readonly') as any;\n }\n\n asWriteonly(\n params?: TextureViewParams<\n StorageTextureDimension,\n StorageTextureTexelFormat\n >,\n ) {\n // biome-ignore lint/suspicious/noExplicitAny: <too much type wrangling>\n return this._asStorage(params, 'writeonly') as any;\n }\n\n asMutable(\n params?: TextureViewParams<\n StorageTextureDimension,\n StorageTextureTexelFormat\n >,\n ) {\n // biome-ignore lint/suspicious/noExplicitAny: <too much type wrangling>\n return this._asStorage(params, 'mutable') as any;\n }\n\n asSampled(\n params?: TextureViewParams<GPUTextureViewDimension, GPUTextureFormat>,\n // biome-ignore lint/suspicious/noExplicitAny: <too much type wrangling>\n ): any {\n if (!this.usableAsSampled) {\n throw new Error('Unusable as sampled');\n }\n\n const format = params?.format ?? this.props.format;\n const type = texelFormatToDataType[format as keyof TexelFormatToDataType];\n\n if (!type) {\n throw new Error(`Unsupported storage texture format: ${format}`);\n }\n\n return new TgpuFixedSampledTextureImpl(params, this);\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this._texture?.destroy();\n }\n}\n\nconst dimensionToCodeMap = {\n '1d': '1d',\n '2d': '2d',\n '2d-array': '2d_array',\n cube: 'cube',\n 'cube-array': 'cube_array',\n '3d': '3d',\n} satisfies Record<GPUTextureViewDimension, string>;\n\nclass TgpuFixedStorageTextureImpl\n implements TgpuStorageTexture, INTERNAL_TgpuStorageTexture, TgpuNamable\n{\n public readonly resourceType = 'texture-storage-view';\n public readonly texelDataType: TexelData;\n public readonly dimension: StorageTextureDimension;\n\n private _view: GPUTextureView | undefined;\n private readonly _format: StorageTextureTexelFormat;\n\n constructor(\n props:\n | TextureViewParams<StorageTextureDimension, StorageTextureTexelFormat>\n | undefined,\n public readonly access: StorageTextureAccess,\n private readonly _texture: TgpuTexture<TextureProps> & INTERNAL_TgpuTexture,\n ) {\n this.dimension = props?.dimension ?? _texture.props.dimension ?? '2d';\n this._format =\n props?.format ?? (_texture.props.format as StorageTextureTexelFormat);\n this.texelDataType = texelFormatToDataType[this._format];\n }\n\n get label(): string | undefined {\n return this._texture.label;\n }\n\n $name(label: string): this {\n this._texture.$name(label);\n return this;\n }\n\n unwrap(): GPUTextureView {\n if (!this._view) {\n this._view = this._texture.unwrap().createView({\n label: `${this.label ?? '<unnamed>'} - View`,\n format: this._format,\n dimension: this.dimension,\n });\n }\n\n return this._view;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const { group, binding } = ctx.allocateFixedEntry(\n {\n storageTexture: this._format,\n access: this.access,\n viewDimension: this.dimension,\n },\n this,\n );\n const type = `texture_storage_${dimensionToCodeMap[this.dimension]}`;\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${binding}) var ${id}: ${type}<${this._format}, ${\n accessMap[this.access]\n }>;`,\n );\n\n return id;\n }\n}\n\nexport class TgpuLaidOutStorageTextureImpl implements TgpuStorageTexture {\n public readonly resourceType = 'texture-storage-view';\n public readonly texelDataType: TexelData;\n\n constructor(\n private readonly _format: StorageTextureTexelFormat,\n public readonly dimension: StorageTextureDimension,\n public readonly access: StorageTextureAccess,\n private readonly _membership: LayoutMembership,\n ) {\n this.texelDataType = texelFormatToDataType[this._format];\n }\n\n get label(): string | undefined {\n return this._membership.key;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const group = ctx.allocateLayoutEntry(this._membership.layout);\n const type = `texture_storage_${dimensionToCodeMap[this.dimension]}`;\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${this._membership.idx}) var ${id}: ${type}<${this._format}, ${accessMap[this.access]}>;`,\n );\n\n return id;\n }\n}\n\nclass TgpuFixedSampledTextureImpl\n implements TgpuSampledTexture, INTERNAL_TgpuSampledTexture, TgpuNamable\n{\n public readonly resourceType = 'texture-sampled-view';\n public readonly channelDataType: ChannelData;\n public readonly dimension: GPUTextureViewDimension;\n\n private _format: GPUTextureFormat;\n private _view: GPUTextureView | undefined;\n\n constructor(\n private readonly _props:\n | TextureViewParams<GPUTextureViewDimension, GPUTextureFormat>\n | undefined,\n private readonly _texture: TgpuTexture<TextureProps> & INTERNAL_TgpuTexture,\n ) {\n this.dimension = _props?.dimension ?? _texture.props.dimension ?? '2d';\n this._format =\n _props?.format ?? (_texture.props.format as GPUTextureFormat);\n this.channelDataType = texelFormatToChannelType[this._format];\n }\n\n get label(): string | undefined {\n return this._texture.label;\n }\n\n $name(label: string): this {\n this._texture.$name(label);\n return this;\n }\n\n unwrap(): GPUTextureView {\n if (!this._view) {\n this._view = this._texture.unwrap().createView({\n label: `${this.label ?? '<unnamed>'} - View`,\n ...this._props,\n });\n }\n\n return this._view;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n\n const multisampled = (this._texture.props.sampleCount ?? 1) > 1;\n const { group, binding } = ctx.allocateFixedEntry(\n {\n texture: channelKindToFormat[this.channelDataType.type],\n viewDimension: this.dimension,\n multisampled,\n },\n this,\n );\n\n const type = multisampled\n ? 'texture_multisampled_2d'\n : `texture_${dimensionToCodeMap[this.dimension]}`;\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${binding}) var ${id}: ${type}<${ctx.resolve(this.channelDataType)}>;`,\n );\n\n return id;\n }\n}\n\nexport class TgpuLaidOutSampledTextureImpl implements TgpuSampledTexture {\n public readonly resourceType = 'texture-sampled-view';\n public readonly channelDataType: ChannelData;\n\n constructor(\n sampleType: GPUTextureSampleType,\n public readonly dimension: GPUTextureViewDimension,\n private readonly _multisampled: boolean,\n private readonly _membership: LayoutMembership,\n ) {\n this.channelDataType = channelFormatToSchema[sampleType];\n }\n\n get label(): string | undefined {\n return this._membership.key;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const id = ctx.names.makeUnique(this.label);\n const group = ctx.allocateLayoutEntry(this._membership.layout);\n\n const type = this._multisampled\n ? 'texture_multisampled_2d'\n : `texture_${dimensionToCodeMap[this.dimension]}`;\n\n ctx.addDeclaration(\n `@group(${group}) @binding(${this._membership.idx}) var ${id}: ${type}<${ctx.resolve(this.channelDataType)}>;`,\n );\n\n return id;\n }\n}\n","import type { Storage } from '../../extension';\nimport type { StorageTextureTexelFormat } from './textureFormats';\nimport type { TextureProps } from './textureProps';\n\nexport interface Sampled {\n usableAsSampled: true;\n}\n\nexport interface Render {\n usableAsRender: true;\n}\n\nexport type LiteralToExtensionMap = {\n storage: Storage; // <- shared between buffers and textures\n sampled: Sampled;\n render: Render;\n};\n\nexport type TextureExtensionLiteral = keyof LiteralToExtensionMap;\n\nexport type AllowedUsages<TProps extends TextureProps> =\n | 'sampled'\n | 'render'\n | (TProps['format'] extends StorageTextureTexelFormat ? 'storage' : never);\n\nexport function isUsableAsSampled<T>(value: T): value is T & Sampled {\n return !!(value as unknown as Sampled)?.usableAsSampled;\n}\n\nexport function isUsableAsRender<T>(value: T): value is T & Render {\n return !!(value as unknown as Render)?.usableAsRender;\n}\n\n/**\n * @category Errors\n */\nexport class NotSampledError extends Error {\n constructor(value: { readonly label?: string | undefined }) {\n super(\n `Resource '${value.label ?? '<unnamed>'}' cannot be bound as 'sampled'. Use .$usage('sampled') to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotSampledError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class NotRenderError extends Error {\n constructor(value: { readonly label?: string | undefined }) {\n super(\n `Resource '${value.label ?? '<unnamed>'}' cannot be bound as 'render'. Use .$usage('render') to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotRenderError.prototype);\n }\n}\n","import {\n type TgpuBuffer,\n type Uniform,\n isBuffer,\n isUsableAsUniform,\n} from './core/buffer/buffer';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n TgpuLaidOutBufferImpl,\n} from './core/buffer/bufferUsage';\nimport {\n TgpuLaidOutComparisonSamplerImpl,\n TgpuLaidOutSamplerImpl,\n type TgpuSampler,\n} from './core/sampler/sampler';\nimport { TgpuExternalTextureImpl } from './core/texture/externalTexture';\nimport {\n type StorageTextureDimension,\n TgpuLaidOutSampledTextureImpl,\n TgpuLaidOutStorageTextureImpl,\n type TgpuMutableTexture,\n type TgpuReadonlyTexture,\n type TgpuSampledTexture,\n type TgpuTexture,\n isTexture,\n} from './core/texture/texture';\nimport type { StorageTextureTexelFormat } from './core/texture/textureFormats';\nimport {\n NotSampledError,\n isUsableAsSampled,\n} from './core/texture/usageExtension';\nimport type { AnyData } from './data';\nimport type { Exotic } from './data/exotic';\nimport type { AnyWgslData, BaseWgslData } from './data/wgslTypes';\nimport { NotUniformError } from './errors';\nimport { NotStorageError, type Storage, isUsableAsStorage } from './extension';\nimport type { TgpuNamable } from './namable';\nimport type { OmitProps, Prettify } from './shared/utilityTypes';\nimport type { TgpuShaderStage } from './types';\nimport type { Unwrapper } from './unwrapper';\n\n// ----------\n// Public API\n// ----------\n\nexport type LayoutMembership = {\n layout: TgpuBindGroupLayout;\n key: string;\n idx: number;\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: AnyWgslData;\n};\n\nexport type TgpuLayoutStorage = TgpuLayoutEntryBase & {\n storage: AnyWgslData | ((arrayLength: number) => AnyWgslData);\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 StorageTextureTexelFormat = StorageTextureTexelFormat,\n> = TgpuLayoutEntryBase & {\n storageTexture: TFormat;\n /** @default 'writeonly' */\n access?: 'readonly' | 'writeonly' | 'mutable';\n /** @default '2d' */\n viewDimension?: StorageTextureDimension;\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 BaseWgslData | ((_: number) => BaseWgslData),\n> = T extends BaseWgslData\n ? T\n : T extends (_: number) => infer Return\n ? Return\n : never;\n\nexport type UnwrapRuntimeConstructor<\n T extends AnyData | ((_: number) => AnyData),\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 readonly bound: {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n\n /**\n * An explicit numeric index assigned to this bind group layout. If undefined, a unique\n * index is assigned automatically during resolution. This can be changed with the\n * `.$idx()` method.\n */\n readonly index: number | undefined;\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 /**\n * Associates this bind group layout with an explicit numeric index. When a call to this\n * method is omitted, a unique numeric index is assigned to it automatically.\n *\n * Used when generating WGSL code: `@group(${index}) @binding(...) ...;`\n */\n $idx(index?: number): this;\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 ? (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & Uniform) | GPUBuffer\n : T extends TgpuLayoutStorage\n ?\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & Storage)\n | GPUBuffer\n : T extends TgpuLayoutSampler\n ? GPUSampler\n : T extends TgpuLayoutTexture\n ? // TODO: Allow sampled usages here\n GPUTextureView | TgpuTexture\n : T extends TgpuLayoutStorageTexture\n ? // TODO: Allow storage usages here\n GPUTextureView | TgpuTexture\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\ntype ExoticEntry<T> = T extends Record<string | number | symbol, unknown>\n ? {\n [Key in keyof T]: T[Key] extends BaseWgslData\n ? Exotic<T[Key]>\n : T[Key] extends (...args: infer TArgs) => infer TReturn\n ? (...args: TArgs) => Exotic<TReturn>\n : T[Key];\n }\n : T;\n\ntype ExoticEntries<T extends Record<string, TgpuLayoutEntry | null>> = {\n [BindingKey in keyof T]: ExoticEntry<T[BindingKey]>;\n};\n\nexport function bindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayout<Prettify<ExoticEntries<Entries>>> {\n return new TgpuBindGroupLayoutImpl(entries as ExoticEntries<Entries>);\n}\n\nexport function bindGroupLayoutExperimental<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(\n entries: Entries,\n): TgpuBindGroupLayoutExperimental<Prettify<ExoticEntries<Entries>>> {\n return new TgpuBindGroupLayoutImpl(entries as ExoticEntries<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 private _index: number | undefined;\n\n public readonly resourceType = 'bind-group-layout' as const;\n\n public readonly bound = {} as {\n [K in keyof Entries]: BindLayoutEntry<Entries[K]>;\n };\n\n constructor(public readonly entries: Entries) {\n let idx = 0;\n\n for (const [key, entry] of Object.entries(entries)) {\n if (entry === null) {\n idx++;\n continue;\n }\n\n const membership = { idx, key, layout: this };\n\n if ('uniform' in entry) {\n // biome-ignore lint/suspicious/noExplicitAny: <no need for type magic>\n (this.bound[key] as any) = new TgpuLaidOutBufferImpl(\n 'uniform',\n entry.uniform,\n membership,\n );\n }\n\n if ('storage' in entry) {\n const dataType =\n 'type' in entry.storage ? entry.storage : entry.storage(0);\n\n // biome-ignore lint/suspicious/noExplicitAny: <no need for type magic>\n (this.bound[key] as any) = new TgpuLaidOutBufferImpl(\n entry.access ?? 'readonly',\n dataType,\n membership,\n );\n }\n\n if ('texture' in entry) {\n // biome-ignore lint/suspicious/noExplicitAny: <no need for type magic>\n (this.bound[key] as any) = new TgpuLaidOutSampledTextureImpl(\n entry.texture,\n entry.viewDimension ?? '2d',\n entry.multisampled ?? false,\n membership,\n );\n }\n\n if ('storageTexture' in entry) {\n // biome-ignore lint/suspicious/noExplicitAny: <no need for type magic>\n (this.bound[key] as any) = new TgpuLaidOutStorageTextureImpl(\n entry.storageTexture,\n entry.viewDimension ?? '2d',\n entry.access ?? 'writeonly',\n membership,\n );\n }\n\n if ('externalTexture' in entry) {\n // biome-ignore lint/suspicious/noExplicitAny: <no need for type magic>\n (this.bound[key] as any) = new TgpuExternalTextureImpl(membership);\n }\n\n if ('sampler' in entry) {\n if (entry.sampler === 'comparison') {\n // biome-ignore lint/suspicious/noExplicitAny: <no need for type magic>\n (this.bound[key] as any) = new TgpuLaidOutComparisonSamplerImpl(\n membership,\n );\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: <no need for type magic>\n (this.bound[key] as any) = new TgpuLaidOutSamplerImpl(membership);\n }\n }\n\n idx++;\n }\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get index(): number | undefined {\n return this._index;\n }\n\n $name(label?: string | undefined): this {\n this._label = label;\n return this;\n }\n\n $idx(index?: number): this {\n this._index = index;\n return this;\n }\n\n unwrap(unwrapper: Unwrapper) {\n const unwrapped = unwrapper.device.createBindGroupLayout({\n label: this.label ?? '<unnamed>',\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 ?? '<unnamed>',\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 {\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 {\n resource = { buffer: value as GPUBuffer };\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('texture' in entry) {\n let resource: GPUTextureView;\n\n if (isTexture(value)) {\n if (!isUsableAsSampled(value)) {\n throw new NotSampledError(value);\n }\n\n resource = unwrapper.unwrap(\n value.asSampled() as TgpuSampledTexture,\n );\n } else {\n resource = value as GPUTextureView;\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('storageTexture' in entry) {\n let resource: GPUTextureView;\n\n if (isTexture(value)) {\n if (!isUsableAsStorage(value)) {\n throw new NotStorageError(value);\n }\n\n if (entry.access === 'readonly') {\n resource = unwrapper.unwrap(\n value.asReadonly() as TgpuReadonlyTexture,\n );\n } else if (entry.access === 'mutable') {\n resource = unwrapper.unwrap(\n value.asMutable() as TgpuMutableTexture,\n );\n } else {\n resource = unwrapper.unwrap(\n value.asReadonly() as TgpuReadonlyTexture,\n );\n }\n } else {\n resource = value as GPUTextureView;\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('externalTexture' in entry || 'sampler' in entry) {\n return {\n binding: idx,\n resource: value as GPUExternalTexture | 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 { Block } from 'tinyest';\nimport { resolveData } from './core/resolve/resolveData';\nimport { type AnyWgslData, isWgslData } from './data/wgslTypes';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { onGPU } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { naturalsExcept } from './shared/generators';\nimport { generateFunction } from './smol';\nimport {\n type TgpuBindGroup,\n type TgpuBindGroupLayout,\n type TgpuLayoutEntry,\n bindGroupLayout,\n} from './tgpuBindGroupLayout';\nimport type {\n Eventual,\n FnToWgslOptions,\n ResolutionCtx,\n Resource,\n SlotValuePair,\n TgpuResolvable,\n TgpuSlot,\n Wgsl,\n} from './types';\nimport { UnknownData, isSlot } from './types';\n\n/**\n * Inserted into bind group entry definitions that belong\n * to the automatically generated catch-all bind group.\n *\n * A non-occupied group index can only be determined after\n * every resource has been resolved, so this acts as a placeholder\n * to be replaced with an actual numeric index at the very end\n * of the resolution process.\n */\nconst CATCHALL_BIND_GROUP_IDX_MARKER = '#CATCHALL#';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly jitTranspiler?: JitTranspiler | undefined;\n};\n\ntype SlotToValueMap = Map<TgpuSlot<unknown>, unknown>;\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: AnyWgslData | undefined;\n};\n\ntype BlockScopeLayer = {\n type: 'blockScope';\n declarations: Map<string, AnyWgslData | 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: AnyWgslData | 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\n // Since functions cannot access resources from the calling scope, we\n // return early here.\n return undefined;\n }\n\n 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\ninterface FixedBindingConfig {\n layoutEntry: TgpuLayoutEntry;\n resource: object;\n}\n\nclass 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 | AnyWgslData,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private readonly _indentController = new IndentController();\n private readonly _jitTranspiler: JitTranspiler | undefined;\n private readonly _itemStateStack = new ItemStateStack();\n private readonly _declarations: string[] = [];\n\n // -- Bindings\n /**\n * A map from registered bind group layouts to random strings put in\n * place of their group index. The whole tree has to be traversed to\n * collect every use of a typed bind group layout, since they can be\n * explicitly imposed group indices, and they cannot collide.\n */\n public readonly bindGroupLayoutsToPlaceholderMap = new Map<\n TgpuBindGroupLayout,\n string\n >();\n private _nextFreeLayoutPlaceholderIdx = 0;\n public readonly fixedBindings: FixedBindingConfig[] = [];\n // --\n\n public readonly names: NameRegistry;\n\n constructor(opts: ResolutionCtxImplOptions) {\n this.names = opts.names;\n this._jitTranspiler = opts.jitTranspiler;\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._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._jitTranspiler.transpileFn(fn);\n }\n\n fnToWgsl(options: FnToWgslOptions): { head: Wgsl; body: Wgsl } {\n this._itemStateStack.pushFunctionScope(\n options.args,\n options.returnType,\n options.externalMap,\n );\n const str = generateFunction(this, options.body);\n this._itemStateStack.pop();\n\n const argList = options.args\n .map(\n (arg) => `${arg.value}: ${this.resolve(arg.dataType as AnyWgslData)}`,\n )\n .join(', ');\n\n return {\n head:\n options.returnType !== undefined\n ? `(${argList}) -> ${this.resolve(options.returnType)}`\n : `(${argList})`,\n body: str,\n };\n }\n\n addDeclaration(declaration: string): void {\n this._declarations.push(declaration);\n }\n\n allocateLayoutEntry(layout: TgpuBindGroupLayout): string {\n const memoMap = this.bindGroupLayoutsToPlaceholderMap;\n let placeholderKey = memoMap.get(layout);\n\n if (!placeholderKey) {\n placeholderKey = `#BIND_GROUP_LAYOUT_${this._nextFreeLayoutPlaceholderIdx++}#`;\n memoMap.set(layout, placeholderKey);\n }\n\n return placeholderKey;\n }\n\n allocateFixedEntry(\n layoutEntry: TgpuLayoutEntry,\n resource: object,\n ): { group: string; binding: number } {\n const binding = this.fixedBindings.length;\n this.fixedBindings.push({ layoutEntry, resource });\n\n return {\n group: CATCHALL_BIND_GROUP_IDX_MARKER,\n binding,\n };\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 | AnyWgslData): 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 = isWgslData(item)\n ? resolveData(this, item)\n : 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 (\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean'\n ) {\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._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\nexport interface ResolutionResult {\n code: string;\n bindGroupLayouts: TgpuBindGroupLayout[];\n catchall: [number, TgpuBindGroup] | null;\n}\n\nexport function resolve(\n item: Wgsl,\n options: ResolutionCtxImplOptions,\n): ResolutionResult {\n const ctx = new ResolutionCtxImpl(options);\n let code = ctx.resolve(item);\n\n const memoMap = ctx.bindGroupLayoutsToPlaceholderMap;\n const bindGroupLayouts: TgpuBindGroupLayout[] = [];\n const takenIndices = new Set<number>(\n [...memoMap.keys()]\n .map((layout) => layout.index)\n .filter((v): v is number => v !== undefined),\n );\n\n const automaticIds = naturalsExcept(takenIndices);\n\n const layoutEntries = ctx.fixedBindings.map(\n (binding, idx) =>\n [String(idx), binding.layoutEntry] as [string, TgpuLayoutEntry],\n );\n\n const createCatchallGroup = () => {\n const catchallIdx = automaticIds.next().value;\n const catchallLayout = bindGroupLayout(Object.fromEntries(layoutEntries));\n bindGroupLayouts[catchallIdx] = catchallLayout;\n code = code.replaceAll(CATCHALL_BIND_GROUP_IDX_MARKER, String(catchallIdx));\n\n return [\n catchallIdx,\n catchallLayout.populate(\n Object.fromEntries(\n ctx.fixedBindings.map(\n (binding, idx) =>\n // biome-ignore lint/suspicious/noExplicitAny: <it's fine>\n [String(idx), binding.resource] as [string, any],\n ),\n ),\n ),\n ] as [number, TgpuBindGroup];\n };\n\n // Retrieving the catch-all binding index first, because it's inherently\n // the least swapped bind group (fixed and cannot be swapped).\n const catchall = layoutEntries.length > 0 ? createCatchallGroup() : null;\n\n for (const [layout, placeholder] of memoMap.entries()) {\n const idx = layout.index ?? automaticIds.next().value;\n bindGroupLayouts[idx] = layout;\n code = code.replaceAll(placeholder, String(idx));\n }\n\n return {\n code,\n bindGroupLayouts,\n catchall,\n };\n}\n","/**\n * Can be assigned a name. Not to be confused with\n * being able to HAVE a name.\n */\nexport interface TgpuNamable {\n $name(label?: string | undefined): this;\n}\n\nexport function isNamable(value: unknown): value is TgpuNamable {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n '$name' in value\n );\n}\n","import { isWgslData } from '../../data/wgslTypes';\nimport { isNamable } from '../../namable';\nimport { type ResolutionCtx, isResolvable } from '../../types';\n\nexport type ExternalMap = Record<string, unknown>;\n\nexport function applyExternals(\n existing: ExternalMap,\n newExternals: ExternalMap,\n) {\n for (const [key, value] of Object.entries(newExternals)) {\n existing[key] = value;\n\n // Giving name to external value, if it does not already have one.\n if (\n isNamable(value) &&\n (!('label' in value) || value.label === undefined)\n ) {\n value.$name(key);\n }\n }\n}\n\nexport function replaceExternalsInWgsl(\n ctx: ResolutionCtx,\n externalMap: ExternalMap,\n wgsl: string,\n) {\n return Object.entries(externalMap).reduce((acc, [externalName, external]) => {\n const resolvedExternal =\n isResolvable(external) || isWgslData(external)\n ? ctx.resolve(external)\n : String(external);\n\n return acc.replaceAll(\n new RegExp(`(?<![\\\\w_])${externalName}(?![\\\\w_])`, 'g'),\n resolvedExternal,\n );\n }, wgsl);\n}\n","import type { AnyWgslData } from '../../data/wgslTypes';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport { RandomNameRegistry, StrictNameRegistry } from '../../nameRegistry';\nimport { resolve as resolveImpl } from '../../resolutionCtx';\nimport type { TgpuResolvable } from '../../types';\nimport { applyExternals, replaceExternalsInWgsl } from '../function/externals';\n\nexport interface TgpuResolveOptions {\n input:\n | string\n | TgpuResolvable\n | AnyWgslData\n | (string | TgpuResolvable | AnyWgslData)[];\n extraDependencies?:\n | Record<string, TgpuResolvable | AnyWgslData | string | number>\n | undefined;\n /**\n * @default 'random'\n */\n names?: 'strict' | 'random' | undefined;\n jitTranspiler?: JitTranspiler | undefined;\n}\n\nexport function resolve(options: TgpuResolveOptions): string {\n const { input, extraDependencies, names, jitTranspiler } = options;\n\n const dependencies = {} as Record<string, TgpuResolvable>;\n applyExternals(dependencies, extraDependencies ?? {});\n\n const stringCode = (Array.isArray(input) ? input : [input]).filter(\n (item) => typeof item === 'string',\n ) as string[];\n const resolvableCode = (Array.isArray(input) ? input : [input]).filter(\n (item) => typeof item !== 'string',\n ) as TgpuResolvable[];\n\n const resolutionObj: TgpuResolvable = {\n resolve(ctx) {\n const stringCodeResolved = stringCode.join('\\n\\n');\n for (const resolvable of resolvableCode) {\n ctx.resolve(resolvable);\n }\n return replaceExternalsInWgsl(ctx, dependencies, stringCodeResolved);\n },\n };\n\n const { code } = resolveImpl(resolutionObj, {\n names:\n names === 'strict' ? new StrictNameRegistry() : new RandomNameRegistry(),\n jitTranspiler: jitTranspiler,\n });\n\n return code;\n}\n","/**\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 { MissingBindGroupError } from '../../errors';\nimport type { TgpuNamable } from '../../namable';\nimport { resolve } from '../../resolutionCtx';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport type { TgpuSlot } from '../../types';\nimport type { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuComputePipeline extends TgpuNamable {\n readonly resourceType: 'compute-pipeline';\n readonly label: string | undefined;\n\n with(\n bindGroupLayout: TgpuBindGroupLayout,\n bindGroup: TgpuBindGroup,\n ): TgpuComputePipeline;\n\n dispatchWorkgroups(\n x: number,\n y?: number | undefined,\n z?: number | undefined,\n ): void;\n}\n\nexport interface INTERNAL_TgpuComputePipeline {\n readonly rawPipeline: GPUComputePipeline;\n}\n\nexport function INTERNAL_createComputePipeline(\n branch: ExperimentalTgpuRoot,\n slotBindings: [TgpuSlot<unknown>, unknown][],\n entryFn: TgpuComputeFn,\n) {\n return new TgpuComputePipelineImpl(\n new ComputePipelineCore(branch, slotBindings, entryFn),\n {},\n );\n}\n\nexport function isComputePipeline(\n value: unknown,\n): value is TgpuComputePipeline {\n return (value as TgpuComputePipeline)?.resourceType === 'compute-pipeline';\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype TgpuComputePipelinePriors = {\n readonly bindGroupLayoutMap?: Map<TgpuBindGroupLayout, TgpuBindGroup>;\n};\n\ntype Memo = {\n pipeline: GPUComputePipeline;\n bindGroupLayouts: TgpuBindGroupLayout[];\n catchall: [number, TgpuBindGroup] | null;\n};\n\nclass TgpuComputePipelineImpl\n implements TgpuComputePipeline, INTERNAL_TgpuComputePipeline\n{\n public readonly resourceType = 'compute-pipeline';\n\n constructor(\n private readonly _core: ComputePipelineCore,\n private readonly _priors: TgpuComputePipelinePriors,\n ) {}\n\n get label(): string | undefined {\n return this._core.label;\n }\n\n get rawPipeline(): GPUComputePipeline {\n return this._core.unwrap().pipeline;\n }\n\n with(\n bindGroupLayout: TgpuBindGroupLayout,\n bindGroup: TgpuBindGroup,\n ): TgpuComputePipeline {\n return new TgpuComputePipelineImpl(this._core, {\n bindGroupLayoutMap: new Map([\n ...(this._priors.bindGroupLayoutMap ?? []),\n [bindGroupLayout, bindGroup],\n ]),\n });\n }\n\n dispatchWorkgroups(\n x: number,\n y?: number | undefined,\n z?: number | undefined,\n ): void {\n const memo = this._core.unwrap();\n\n const pass = this._core.branch.commandEncoder.beginComputePass({\n label: this._core.label ?? '<unnamed>',\n });\n\n pass.setPipeline(memo.pipeline);\n\n memo.bindGroupLayouts.forEach((layout, idx) => {\n if (memo.catchall && idx === memo.catchall[0]) {\n // Catch-all\n pass.setBindGroup(idx, this._core.branch.unwrap(memo.catchall[1]));\n } else {\n const bindGroup = this._priors.bindGroupLayoutMap?.get(layout);\n if (bindGroup === undefined) {\n throw new MissingBindGroupError(layout.label);\n }\n pass.setBindGroup(idx, this._core.branch.unwrap(bindGroup));\n }\n });\n\n pass.dispatchWorkgroups(x, y, z);\n pass.end();\n }\n\n $name(label?: string | undefined): this {\n this._core.label = label;\n return this;\n }\n}\n\nclass ComputePipelineCore {\n public label: string | undefined;\n private _memo: Memo | undefined;\n\n constructor(\n public readonly branch: ExperimentalTgpuRoot,\n private readonly _slotBindings: [TgpuSlot<unknown>, unknown][],\n private readonly _entryFn: TgpuComputeFn,\n ) {}\n\n public unwrap(): Memo {\n if (this._memo === undefined) {\n const device = this.branch.device;\n\n // Resolving code\n const { code, bindGroupLayouts, catchall } = resolve(\n {\n resolve: (ctx) => {\n ctx.resolve(this._entryFn, this._slotBindings);\n return '';\n },\n },\n {\n names: this.branch.nameRegistry,\n jitTranspiler: this.branch.jitTranspiler,\n },\n );\n\n if (catchall !== null) {\n bindGroupLayouts[catchall[0]]?.$name(\n `${this.label ?? '<unnamed>'} - Automatic Bind Group & Layout`,\n );\n }\n\n this._memo = {\n pipeline: device.createComputePipeline({\n label: this.label ?? '<unnamed>',\n layout: device.createPipelineLayout({\n label: `${this.label ?? '<unnamed>'} - Pipeline Layout`,\n bindGroupLayouts: bindGroupLayouts.map((l) =>\n this.branch.unwrap(l),\n ),\n }),\n compute: {\n module: device.createShaderModule({\n label: `${this.label ?? '<unnamed>'} - Shader`,\n code,\n }),\n },\n }),\n bindGroupLayouts,\n catchall,\n };\n }\n\n return this._memo;\n }\n}\n","import { isBuiltin } from '../../data/attributes';\nimport { getCustomLocation } from '../../data/dataTypes';\nimport { isData } from '../../data/dataTypes';\nimport type {\n AnyVertexAttribs,\n TgpuVertexAttrib,\n} from '../../shared/vertexFormat';\nimport type { IOData, IOLayout } from '../function/fnTypes';\nimport type {\n INTERNAL_TgpuVertexAttrib,\n TgpuVertexLayout,\n} from './vertexLayout';\n\nexport interface ConnectAttributesToShaderResult {\n usedVertexLayouts: TgpuVertexLayout[];\n bufferDefinitions: GPUVertexBufferLayout[];\n}\n\nfunction isAttribute<T extends TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib>(\n value: unknown | T,\n): value is T {\n return typeof (value as T)?.format === 'string';\n}\n\nexport function connectAttributesToShader(\n shaderInputLayout: IOLayout,\n attributes: AnyVertexAttribs,\n): ConnectAttributesToShaderResult {\n const usedVertexLayouts: TgpuVertexLayout[] = [];\n\n if (isData(shaderInputLayout)) {\n // Expecting a single attribute, no record.\n if (!isAttribute(attributes)) {\n throw new Error(\n 'Shader expected a single attribute, not a record of attributes to be passed in.',\n );\n }\n\n usedVertexLayouts.push(attributes._layout);\n\n return {\n usedVertexLayouts,\n bufferDefinitions: [\n {\n arrayStride: attributes._layout.stride,\n stepMode: attributes._layout.stepMode,\n attributes: [\n {\n format: attributes.format,\n offset: attributes.offset,\n shaderLocation: getCustomLocation(shaderInputLayout) ?? 0,\n },\n ],\n },\n ],\n };\n }\n\n const bufferDefinitions: GPUVertexBufferLayout[] = [];\n const layoutToAttribListMap = new WeakMap<\n TgpuVertexLayout,\n GPUVertexAttribute[]\n >();\n let nextShaderLocation = 0;\n\n for (const [key, member] of Object.entries(\n shaderInputLayout as Record<string, IOData>,\n )) {\n if (isBuiltin(member)) {\n continue;\n }\n\n const matchingAttribute = (attributes as Record<string, TgpuVertexAttrib>)[\n key\n ] as (TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib) | undefined;\n\n if (!matchingAttribute) {\n throw new Error(\n `An attribute by the name of '${key}' was not provided to the shader.`,\n );\n }\n\n const layout = matchingAttribute._layout;\n let attribList = layoutToAttribListMap.get(layout);\n if (!attribList) {\n // First time seeing this layout\n usedVertexLayouts.push(layout);\n\n attribList = [];\n bufferDefinitions.push({\n arrayStride: layout.stride,\n stepMode: layout.stepMode,\n attributes: attribList,\n });\n layoutToAttribListMap.set(layout, attribList);\n }\n\n nextShaderLocation = getCustomLocation(member) ?? nextShaderLocation;\n\n attribList.push({\n format: matchingAttribute.format,\n offset: matchingAttribute.offset,\n shaderLocation: nextShaderLocation++,\n });\n }\n\n return { usedVertexLayouts, bufferDefinitions };\n}\n","import { alignmentOf, customAlignmentOf } from '../../data/alignmentOf';\nimport { isLooseDecorated, isLooseStruct } from '../../data/dataTypes';\nimport type { LooseArray } from '../../data/dataTypes';\nimport { sizeOf } from '../../data/sizeOf';\nimport { isDecorated, isWgslStruct } from '../../data/wgslTypes';\nimport type { BaseWgslData, WgslArray } from '../../data/wgslTypes';\nimport { roundUp } from '../../mathUtils';\nimport type { TgpuNamable } from '../../namable';\nimport {\n type TgpuVertexAttrib,\n type VertexFormat,\n kindToDefaultFormatMap,\n vertexFormats,\n} from '../../shared/vertexFormat';\nimport type { ExoticIO } from '../function/fnTypes';\nimport type {\n ArrayToContainedAttribs,\n DataToContainedAttribs,\n} from './vertexAttribute';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuVertexLayout<\n TData extends WgslArray | LooseArray = WgslArray | LooseArray,\n> extends TgpuNamable {\n readonly resourceType: 'vertex-layout';\n readonly label?: string | undefined;\n readonly stride: number;\n readonly stepMode: 'vertex' | 'instance';\n readonly attrib: ArrayToContainedAttribs<TData>;\n schemaForCount(n: number): TData;\n}\n\nexport interface INTERNAL_TgpuVertexAttrib {\n readonly _layout: TgpuVertexLayout;\n}\n\nexport function vertexLayout<TData extends WgslArray | LooseArray>(\n schemaForCount: (count: number) => TData,\n stepMode: 'vertex' | 'instance' = 'vertex',\n): TgpuVertexLayout<ExoticIO<TData>> {\n return new TgpuVertexLayoutImpl(\n schemaForCount as (count: number) => ExoticIO<TData>,\n stepMode,\n );\n}\n\nexport function isVertexLayout<T extends TgpuVertexLayout>(\n value: unknown | T,\n): value is T {\n return (value as T)?.resourceType === 'vertex-layout';\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction dataToContainedAttribs<\n TLayoutData extends WgslArray | LooseArray,\n TData extends BaseWgslData,\n>(\n layout: TgpuVertexLayout<TLayoutData>,\n data: TData,\n offset: number,\n): DataToContainedAttribs<TData> {\n if (isDecorated(data) || isLooseDecorated(data)) {\n return dataToContainedAttribs(\n layout,\n data.inner,\n roundUp(offset, customAlignmentOf(data)),\n );\n }\n\n if (isWgslStruct(data)) {\n let memberOffset = offset;\n\n return Object.fromEntries(\n Object.entries(data.propTypes).map(([key, value]) => {\n memberOffset = roundUp(memberOffset, alignmentOf(value));\n const attrib = [\n key,\n dataToContainedAttribs(layout, value, memberOffset),\n ];\n memberOffset += sizeOf(value);\n return attrib;\n }),\n ) as DataToContainedAttribs<TData>;\n }\n\n if (isLooseStruct(data)) {\n let memberOffset = offset;\n\n return Object.fromEntries(\n Object.entries(data.propTypes).map(([key, value]) => {\n memberOffset = roundUp(memberOffset, customAlignmentOf(value));\n const attrib = [\n key,\n dataToContainedAttribs(layout, value, memberOffset),\n ];\n memberOffset += sizeOf(value);\n return attrib;\n }),\n ) as DataToContainedAttribs<TData>;\n }\n\n if ('type' in data && typeof data.type === 'string') {\n if (vertexFormats.includes(data.type as VertexFormat)) {\n return {\n _layout: layout, // hidden property, used to determine which buffers to apply when executing the pipeline\n format: data.type as VertexFormat,\n offset,\n // biome-ignore lint/suspicious/noExplicitAny: <too many type shenanigans>\n } satisfies TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib as any;\n }\n\n const format = (kindToDefaultFormatMap as Record<string, VertexFormat>)[\n data.type\n ];\n\n if (format) {\n return {\n _layout: layout, // hidden property, used to determine which buffers to apply when executing the pipeline\n format,\n offset,\n // biome-ignore lint/suspicious/noExplicitAny: <too many type shenanigans>\n } satisfies TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib as any;\n }\n }\n\n throw new Error(`Unsupported data used in vertex layout: ${String(data)}`);\n}\n\nclass TgpuVertexLayoutImpl<TData extends WgslArray | LooseArray>\n implements TgpuVertexLayout<TData>\n{\n public readonly resourceType = 'vertex-layout';\n public readonly stride: number;\n public readonly attrib: ArrayToContainedAttribs<TData>;\n\n private _label: string | undefined;\n\n constructor(\n public readonly schemaForCount: (count: number) => TData,\n public readonly stepMode: 'vertex' | 'instance',\n ) {\n // `0` signals that the data-type is runtime-sized, and should not be used to create buffers.\n const arraySchema = schemaForCount(0);\n\n this.stride = roundUp(\n sizeOf(arraySchema.elementType),\n alignmentOf(arraySchema),\n );\n this.attrib = dataToContainedAttribs(this, arraySchema.elementType, 0);\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n $name(label?: string | undefined): this {\n this._label = label;\n return this;\n }\n}\n","import { isData } from '../../data/dataTypes';\nimport type { Vec4f } from '../../data/wgslTypes';\nimport type { IOLayout } from '../function/fnTypes';\nimport type {\n AnyFragmentColorAttachment,\n ColorAttachment,\n} from './renderPipeline';\n\nfunction isAttachment(\n value: unknown | ColorAttachment,\n): value is ColorAttachment {\n return typeof (value as ColorAttachment)?.loadOp === 'string';\n}\n\nexport function connectAttachmentToShader(\n shaderOutputLayout: IOLayout<Vec4f>,\n attachment: AnyFragmentColorAttachment,\n): ColorAttachment[] {\n if (isData(shaderOutputLayout)) {\n if (!isAttachment(attachment)) {\n throw new Error('Expected a single color attachment, not a record.');\n }\n\n return [attachment];\n }\n\n const result: ColorAttachment[] = [];\n for (const key of Object.keys(shaderOutputLayout)) {\n const matching = (attachment as Record<string, ColorAttachment>)[key];\n\n if (!matching) {\n throw new Error(\n `A color attachment by the name of '${key}' was not provided to the shader.`,\n );\n }\n\n result.push(matching);\n }\n\n return result;\n}\n","import { isData } from '../../data/dataTypes';\nimport type { Vec4f } from '../../data/wgslTypes';\nimport type { IOLayout } from '../function/fnTypes';\nimport type { AnyFragmentTargets } from './renderPipeline';\n\nfunction isColorTargetState(\n value: unknown | GPUColorTargetState,\n): value is GPUColorTargetState {\n return typeof (value as GPUColorTargetState)?.format === 'string';\n}\n\nexport function connectTargetsToShader(\n shaderOutputLayout: IOLayout<Vec4f>,\n targets: AnyFragmentTargets,\n): GPUColorTargetState[] {\n if (isData(shaderOutputLayout)) {\n if (!isColorTargetState(targets)) {\n throw new Error(\n 'Expected a single color target configuration, not a record.',\n );\n }\n\n return [targets];\n }\n\n const result: GPUColorTargetState[] = [];\n for (const key of Object.keys(shaderOutputLayout)) {\n const matchingTarget = (targets as Record<string, GPUColorTargetState>)[\n key\n ];\n\n if (!matchingTarget) {\n throw new Error(\n `A color target by the name of '${key}' was not provided to the shader.`,\n );\n }\n\n result.push(matchingTarget);\n }\n\n return result;\n}\n","import type { TgpuBuffer, Vertex } from '../../core/buffer/buffer';\nimport type { AnyWgslData, WgslArray } from '../../data/wgslTypes';\nimport { MissingBindGroupError } from '../../errors';\nimport type { TgpuNamable } from '../../namable';\nimport { resolve } from '../../resolutionCtx';\nimport type { AnyVertexAttribs } from '../../shared/vertexFormat';\nimport {\n type TgpuBindGroup,\n type TgpuBindGroupLayout,\n isBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport type { TgpuSlot } from '../../types';\nimport type { IOData, IOLayout } from '../function/fnTypes';\nimport type { TgpuFragmentFn } from '../function/tgpuFragmentFn';\nimport type { TgpuVertexFn } from '../function/tgpuVertexFn';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\nimport { type TgpuTexture, isTexture } from '../texture/texture';\nimport type { Render } from '../texture/usageExtension';\nimport { connectAttributesToShader } from '../vertexLayout/connectAttributesToShader';\nimport {\n type TgpuVertexLayout,\n isVertexLayout,\n} from '../vertexLayout/vertexLayout';\nimport { connectAttachmentToShader } from './connectAttachmentToShader';\nimport { connectTargetsToShader } from './connectTargetsToShader';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuRenderPipeline<Output extends IOLayout = IOLayout>\n extends TgpuNamable {\n readonly resourceType: 'render-pipeline';\n readonly label: string | undefined;\n\n with<TData extends WgslArray>(\n vertexLayout: TgpuVertexLayout<TData>,\n buffer: TgpuBuffer<TData> & Vertex,\n ): TgpuRenderPipeline;\n with(\n bindGroupLayout: TgpuBindGroupLayout,\n bindGroup: TgpuBindGroup,\n ): TgpuRenderPipeline;\n\n withColorAttachment(\n attachment: FragmentOutToColorAttachment<Output>,\n ): TgpuRenderPipeline;\n\n draw(\n vertexCount: number,\n instanceCount?: number,\n firstVertex?: number,\n firstInstance?: number,\n ): void;\n}\n\nexport type FragmentOutToTargets<T extends IOLayout> = T extends IOData\n ? GPUColorTargetState\n : T extends Record<string, unknown>\n ? { [Key in keyof T]: GPUColorTargetState }\n : never;\n\nexport type FragmentOutToColorAttachment<T extends IOLayout> = T extends IOData\n ? ColorAttachment\n : T extends Record<string, unknown>\n ? { [Key in keyof T]: ColorAttachment }\n : never;\n\nexport type AnyFragmentTargets =\n | GPUColorTargetState\n | Record<string, GPUColorTargetState>;\n\nexport interface ColorAttachment {\n /**\n * A {@link GPUTextureView} describing the texture subresource that will be output to for this\n * color attachment.\n */\n view: (TgpuTexture & Render) | GPUTextureView;\n /**\n * Indicates the depth slice index of {@link GPUTextureViewDimension#\"3d\"} {@link GPURenderPassColorAttachment#view}\n * that will be output to for this color attachment.\n */\n depthSlice?: GPUIntegerCoordinate;\n /**\n * A {@link GPUTextureView} describing the texture subresource that will receive the resolved\n * output for this color attachment if {@link GPURenderPassColorAttachment#view} is\n * multisampled.\n */\n resolveTarget?: GPUTextureView;\n /**\n * Indicates the value to clear {@link GPURenderPassColorAttachment#view} to prior to executing the\n * render pass. If not map/exist|provided, defaults to `{r: 0, g: 0, b: 0, a: 0}`. Ignored\n * if {@link GPURenderPassColorAttachment#loadOp} is not {@link GPULoadOp#\"clear\"}.\n * The components of {@link GPURenderPassColorAttachment#clearValue} are all double values.\n * They are converted to a texel value of texture format matching the render attachment.\n * If conversion fails, a validation error is generated.\n */\n clearValue?: GPUColor;\n /**\n * Indicates the load operation to perform on {@link GPURenderPassColorAttachment#view} prior to\n * executing the render pass.\n * Note: It is recommended to prefer clearing; see {@link GPULoadOp#\"clear\"} for details.\n */\n loadOp: GPULoadOp;\n /**\n * The store operation to perform on {@link GPURenderPassColorAttachment#view}\n * after executing the render pass.\n */\n storeOp: GPUStoreOp;\n}\n\nexport type AnyFragmentColorAttachment =\n | ColorAttachment\n | Record<string, ColorAttachment>;\n\nexport type RenderPipelineCoreOptions = {\n branch: ExperimentalTgpuRoot;\n slotBindings: [TgpuSlot<unknown>, unknown][];\n vertexAttribs: AnyVertexAttribs;\n vertexFn: TgpuVertexFn;\n fragmentFn: TgpuFragmentFn;\n primitiveState: GPUPrimitiveState | undefined;\n targets: AnyFragmentTargets;\n};\n\nexport function INTERNAL_createRenderPipeline(\n options: RenderPipelineCoreOptions,\n) {\n return new TgpuRenderPipelineImpl(new RenderPipelineCore(options), {});\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype TgpuRenderPipelinePriors = {\n readonly vertexLayoutMap?:\n | Map<TgpuVertexLayout, TgpuBuffer<AnyWgslData> & Vertex>\n | undefined;\n readonly bindGroupLayoutMap?:\n | Map<TgpuBindGroupLayout, TgpuBindGroup>\n | undefined;\n readonly colorAttachment?: AnyFragmentColorAttachment | undefined;\n};\n\ntype Memo = {\n pipeline: GPURenderPipeline;\n bindGroupLayouts: TgpuBindGroupLayout[];\n catchall: [number, TgpuBindGroup] | null;\n};\n\nclass TgpuRenderPipelineImpl implements TgpuRenderPipeline {\n public readonly resourceType = 'render-pipeline';\n\n constructor(\n private readonly _core: RenderPipelineCore,\n private readonly _priors: TgpuRenderPipelinePriors,\n ) {}\n\n get label() {\n return this._core.label;\n }\n\n $name(label?: string | undefined): this {\n this._core.label = label;\n return this;\n }\n\n with<TData extends WgslArray<AnyWgslData>>(\n vertexLayout: TgpuVertexLayout<TData>,\n buffer: TgpuBuffer<TData> & Vertex,\n ): TgpuRenderPipeline;\n with(\n bindGroupLayout: TgpuBindGroupLayout,\n bindGroup: TgpuBindGroup,\n ): TgpuRenderPipeline;\n with(\n definition: TgpuVertexLayout | TgpuBindGroupLayout,\n resource: (TgpuBuffer<AnyWgslData> & Vertex) | TgpuBindGroup,\n ): TgpuRenderPipeline {\n if (isBindGroupLayout(definition)) {\n return new TgpuRenderPipelineImpl(this._core, {\n ...this._priors,\n bindGroupLayoutMap: new Map([\n ...(this._priors.bindGroupLayoutMap ?? []),\n [definition, resource as TgpuBindGroup],\n ]),\n });\n }\n\n if (isVertexLayout(definition)) {\n return new TgpuRenderPipelineImpl(this._core, {\n ...this._priors,\n vertexLayoutMap: new Map([\n ...(this._priors.vertexLayoutMap ?? []),\n [definition, resource as TgpuBuffer<AnyWgslData> & Vertex],\n ]),\n });\n }\n\n throw new Error('Unsupported value passed into .with()');\n }\n\n withColorAttachment(\n attachment: AnyFragmentColorAttachment,\n ): TgpuRenderPipeline {\n return new TgpuRenderPipelineImpl(this._core, {\n ...this._priors,\n colorAttachment: attachment,\n });\n }\n\n draw(\n vertexCount: number,\n instanceCount?: number,\n firstVertex?: number,\n firstInstance?: number,\n ): void {\n const memo = this._core.unwrap();\n const { branch, fragmentFn } = this._core.options;\n\n const colorAttachments = connectAttachmentToShader(\n fragmentFn.shell.returnType,\n this._priors.colorAttachment ?? {},\n ).map((attachment) => {\n if (isTexture(attachment.view)) {\n return {\n ...attachment,\n view: branch.unwrap(attachment.view).createView(),\n };\n }\n\n return attachment;\n }) as GPURenderPassColorAttachment[];\n\n const pass = branch.commandEncoder.beginRenderPass({\n label: this._core.label ?? '<unnamed>',\n colorAttachments,\n });\n\n pass.setPipeline(memo.pipeline);\n\n memo.bindGroupLayouts.forEach((layout, idx) => {\n if (memo.catchall && idx === memo.catchall[0]) {\n // Catch-all\n pass.setBindGroup(idx, branch.unwrap(memo.catchall[1]));\n } else {\n const bindGroup = this._priors.bindGroupLayoutMap?.get(layout);\n if (bindGroup === undefined) {\n throw new MissingBindGroupError(layout.label);\n }\n pass.setBindGroup(idx, branch.unwrap(bindGroup));\n }\n });\n\n this._core.usedVertexLayouts.forEach((vertexLayout, idx) => {\n const buffer = this._priors.vertexLayoutMap?.get(vertexLayout);\n if (!buffer) {\n throw new Error(\n `Missing vertex buffer for layout '${vertexLayout.label ?? '<unnamed>'}'. Please provide it using pipeline.with(layout, buffer).(...)`,\n );\n }\n pass.setVertexBuffer(idx, branch.unwrap(buffer));\n });\n\n pass.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n pass.end();\n }\n}\n\nclass RenderPipelineCore {\n public label: string | undefined;\n public readonly usedVertexLayouts: TgpuVertexLayout[];\n\n private _memo: Memo | undefined;\n private readonly _vertexBufferLayouts: GPUVertexBufferLayout[];\n private readonly _targets: GPUColorTargetState[];\n\n constructor(public readonly options: RenderPipelineCoreOptions) {\n const connectedAttribs = connectAttributesToShader(\n options.vertexFn.shell.argTypes[0],\n options.vertexAttribs,\n );\n\n this._vertexBufferLayouts = connectedAttribs.bufferDefinitions;\n this.usedVertexLayouts = connectedAttribs.usedVertexLayouts;\n\n this._targets = connectTargetsToShader(\n options.fragmentFn.shell.returnType,\n options.targets,\n );\n }\n\n public unwrap(): Memo {\n if (this._memo === undefined) {\n const { branch, vertexFn, fragmentFn, slotBindings, primitiveState } =\n this.options;\n\n // Resolving code\n const { code, bindGroupLayouts, catchall } = resolve(\n {\n resolve: (ctx) => {\n ctx.resolve(vertexFn, slotBindings);\n ctx.resolve(fragmentFn, slotBindings);\n return '';\n },\n },\n {\n names: branch.nameRegistry,\n jitTranspiler: branch.jitTranspiler,\n },\n );\n\n if (catchall !== null) {\n bindGroupLayouts[catchall[0]]?.$name(\n `${this.label ?? '<unnamed>'} - Automatic Bind Group & Layout`,\n );\n }\n\n const device = branch.device;\n\n const module = device.createShaderModule({\n label: `${this.label ?? '<unnamed>'} - Shader`,\n code,\n });\n\n this._memo = {\n pipeline: device.createRenderPipeline({\n label: this.label ?? '<unnamed>',\n layout: device.createPipelineLayout({\n label: `${this.label ?? '<unnamed>'} - Pipeline Layout`,\n bindGroupLayouts: bindGroupLayouts.map((l) => branch.unwrap(l)),\n }),\n vertex: {\n module,\n buffers: this._vertexBufferLayouts,\n },\n fragment: {\n module,\n targets: this._targets,\n },\n primitive: primitiveState ?? {},\n }),\n bindGroupLayouts,\n catchall,\n };\n }\n\n return this._memo;\n }\n}\n","import type { OmitBuiltins } from '../../builtin';\nimport type { AnyData } from '../../data/dataTypes';\nimport { invariant } from '../../errors';\nimport type { JitTranspiler } from '../../jitTranspiler';\nimport { WeakMemo } from '../../memo';\nimport {\n type NameRegistry,\n RandomNameRegistry,\n StrictNameRegistry,\n} from '../../nameRegistry';\nimport type { Infer } from '../../shared/repr';\nimport type { AnyVertexAttribs } from '../../shared/vertexFormat';\nimport type {\n TgpuBindGroup,\n TgpuBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport { isBindGroup, isBindGroupLayout } from '../../tgpuBindGroupLayout';\nimport type { TgpuSlot } from '../../types';\nimport { type TgpuBuffer, createBufferImpl, isBuffer } from '../buffer/buffer';\nimport type { IOLayout } from '../function/fnTypes';\nimport type { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { TgpuFragmentFn } from '../function/tgpuFragmentFn';\nimport type { TgpuVertexFn } from '../function/tgpuVertexFn';\nimport {\n type INTERNAL_TgpuComputePipeline,\n INTERNAL_createComputePipeline,\n type TgpuComputePipeline,\n isComputePipeline,\n} from '../pipeline/computePipeline';\nimport {\n type AnyFragmentTargets,\n INTERNAL_createRenderPipeline,\n type RenderPipelineCoreOptions,\n type TgpuRenderPipeline,\n} from '../pipeline/renderPipeline';\nimport {\n type INTERNAL_TgpuSampledTexture,\n type INTERNAL_TgpuStorageTexture,\n type INTERNAL_TgpuTexture,\n INTERNAL_createTexture,\n type TgpuMutableTexture,\n type TgpuReadonlyTexture,\n type TgpuSampledTexture,\n type TgpuTexture,\n type TgpuWriteonlyTexture,\n isSampledTextureView,\n isStorageTextureView,\n isTexture,\n} from '../texture/texture';\nimport type { LayoutToAllowedAttribs } from '../vertexLayout/vertexAttribute';\nimport type {\n CreateTextureOptions,\n CreateTextureResult,\n ExperimentalTgpuRoot,\n TgpuRoot,\n WithBinding,\n WithCompute,\n WithFragment,\n WithVertex,\n} from './rootTypes';\n\nclass WithBindingImpl implements WithBinding {\n constructor(\n private readonly _getRoot: () => ExperimentalTgpuRoot,\n private readonly _slotBindings: [TgpuSlot<unknown>, unknown][],\n ) {}\n\n with<T>(slot: TgpuSlot<T>, value: T): WithBinding {\n return new WithBindingImpl(this._getRoot, [\n ...this._slotBindings,\n [slot, value],\n ]);\n }\n\n withCompute(entryFn: TgpuComputeFn): WithCompute {\n return new WithComputeImpl(this._getRoot(), this._slotBindings, entryFn);\n }\n\n withVertex<VertexIn extends IOLayout>(\n vertexFn: TgpuVertexFn,\n attribs: LayoutToAllowedAttribs<OmitBuiltins<VertexIn>>,\n ): WithVertex {\n return new WithVertexImpl({\n branch: this._getRoot(),\n primitiveState: undefined,\n slotBindings: this._slotBindings,\n vertexFn,\n vertexAttribs: attribs as AnyVertexAttribs,\n });\n }\n}\n\nclass WithComputeImpl implements WithCompute {\n constructor(\n private readonly _root: ExperimentalTgpuRoot,\n private readonly _slotBindings: [TgpuSlot<unknown>, unknown][],\n private readonly _entryFn: TgpuComputeFn,\n ) {}\n\n createPipeline(): TgpuComputePipeline {\n return INTERNAL_createComputePipeline(\n this._root,\n this._slotBindings,\n this._entryFn,\n );\n }\n}\n\nclass WithVertexImpl implements WithVertex {\n constructor(\n private readonly _options: Omit<\n RenderPipelineCoreOptions,\n 'fragmentFn' | 'targets'\n >,\n ) {}\n\n withFragment(\n fragmentFn: TgpuFragmentFn | 'n/a',\n targets: AnyFragmentTargets | 'n/a',\n _mismatch?: unknown,\n ): WithFragment {\n invariant(typeof fragmentFn !== 'string', 'Just type mismatch validation');\n invariant(typeof targets !== 'string', 'Just type mismatch validation');\n\n return new WithFragmentImpl({\n ...this._options,\n fragmentFn,\n targets,\n });\n }\n}\n\nclass WithFragmentImpl implements WithFragment {\n constructor(private readonly _options: RenderPipelineCoreOptions) {}\n\n withPrimitive(primitiveState: GPUPrimitiveState): WithFragment {\n return new WithFragmentImpl({ ...this._options, primitiveState });\n }\n\n createPipeline(): TgpuRenderPipeline {\n return INTERNAL_createRenderPipeline(this._options);\n }\n}\n\ninterface Disposable {\n destroy(): void;\n}\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 extends WithBindingImpl implements ExperimentalTgpuRoot {\n private _disposables: Disposable[] = [];\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 _commandEncoder: GPUCommandEncoder | null = null;\n\n constructor(\n public readonly device: GPUDevice,\n public readonly nameRegistry: NameRegistry,\n public readonly jitTranspiler: JitTranspiler | undefined,\n private readonly _ownDevice: boolean,\n ) {\n super(() => this, []);\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 AnyData>(\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n ): TgpuBuffer<TData> {\n const buffer = createBufferImpl(this, typeSchema, initialOrBuffer).$device(\n this.device,\n );\n\n this._disposables.push(buffer);\n\n return buffer;\n }\n\n createTexture<\n TWidth extends number,\n THeight extends number,\n TDepth extends number,\n TSize extends\n | readonly [TWidth]\n | readonly [TWidth, THeight]\n | readonly [TWidth, THeight, TDepth],\n TFormat extends GPUTextureFormat,\n TMipLevelCount extends number,\n TSampleCount extends number,\n TViewFormat extends GPUTextureFormat,\n TDimension extends GPUTextureDimension,\n >(\n props: CreateTextureOptions<\n TSize,\n TFormat,\n TMipLevelCount,\n TSampleCount,\n TViewFormat,\n TDimension\n >,\n ): TgpuTexture<\n CreateTextureResult<\n TSize,\n TFormat,\n TMipLevelCount,\n TSampleCount,\n TViewFormat,\n TDimension\n >\n > {\n const texture = INTERNAL_createTexture(props, this);\n this._disposables.push(texture);\n // biome-ignore lint/suspicious/noExplicitAny: <too much type wrangling>\n return texture as any;\n }\n\n destroy() {\n for (const disposable of this._disposables) {\n disposable.destroy();\n }\n\n if (this._ownDevice) {\n this.device.destroy();\n }\n }\n\n unwrap(resource: TgpuComputePipeline): GPUComputePipeline;\n unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;\n unwrap(resource: TgpuBindGroup): GPUBindGroup;\n unwrap(resource: TgpuBuffer<AnyData>): GPUBuffer;\n unwrap(resource: TgpuTexture): GPUTexture;\n unwrap(\n resource:\n | TgpuReadonlyTexture\n | TgpuWriteonlyTexture\n | TgpuMutableTexture\n | TgpuSampledTexture,\n ): GPUTextureView;\n unwrap(\n resource:\n | TgpuComputePipeline\n | TgpuBindGroupLayout\n | TgpuBindGroup\n | TgpuBuffer<AnyData>\n | TgpuTexture\n | TgpuReadonlyTexture\n | TgpuWriteonlyTexture\n | TgpuMutableTexture\n | TgpuSampledTexture,\n ):\n | GPUComputePipeline\n | GPUBindGroupLayout\n | GPUBindGroup\n | GPUBuffer\n | GPUTexture\n | GPUTextureView {\n if (isComputePipeline(resource)) {\n return (resource as unknown as INTERNAL_TgpuComputePipeline).rawPipeline;\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 if (isBuffer(resource)) {\n return resource.buffer;\n }\n\n if (isTexture(resource)) {\n return (resource as unknown as INTERNAL_TgpuTexture).unwrap();\n }\n\n if (isStorageTextureView(resource)) {\n return (resource as unknown as INTERNAL_TgpuStorageTexture).unwrap();\n }\n\n if (isSampledTextureView(resource)) {\n return (resource as unknown as INTERNAL_TgpuSampledTexture).unwrap();\n }\n\n throw new Error(`Unknown resource type: ${resource}`);\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\n/**\n * Options passed into {@link init}.\n */\nexport type InitOptions = {\n adapter?: GPURequestAdapterOptions | undefined;\n device?: GPUDeviceDescriptor | undefined;\n /** @default 'random' */\n unstable_names?: 'random' | 'strict' | undefined;\n unstable_jitTranspiler?: JitTranspiler | undefined;\n};\n\n/**\n * Options passed into {@link initFromDevice}.\n */\nexport type InitFromDeviceOptions = {\n device: GPUDevice;\n /** @default 'random' */\n unstable_names?: 'random' | 'strict' | undefined;\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(options?: InitOptions): Promise<TgpuRoot> {\n const {\n adapter: adapterOpt,\n device: deviceOpt,\n unstable_names: names = 'random',\n unstable_jitTranspiler: jitTranspiler,\n } = options ?? {};\n\n if (!navigator.gpu) {\n throw new Error('WebGPU is not supported by this browser.');\n }\n\n const adapter = await navigator.gpu.requestAdapter(adapterOpt);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new TgpuRootImpl(\n await adapter.requestDevice(deviceOpt),\n names === 'random' ? new RandomNameRegistry() : new StrictNameRegistry(),\n jitTranspiler,\n true,\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(options: InitFromDeviceOptions): TgpuRoot {\n const {\n device,\n unstable_names: names = 'random',\n unstable_jitTranspiler: jitTranspiler,\n } = options ?? {};\n\n return new TgpuRootImpl(\n device,\n names === 'random' ? new RandomNameRegistry() : new StrictNameRegistry(),\n jitTranspiler,\n false,\n );\n}\n","/**\n * @module typegpu\n */\n\nimport { resolve } from './core/resolve/tgpuResolve';\nimport { init, initFromDevice } from './core/root/init';\nimport { bindGroupLayout } from './tgpuBindGroupLayout';\n\nexport const tgpu = {\n /** @hidden @deprecated Use `'uniform'` string literal instead. */\n Uniform: 'uniform' as const,\n /** @hidden @deprecated Use `'storage'` string literal instead. */\n Storage: 'storage' as const,\n /** @hidden @deprecated Use `'vertex'` string literal instead. */\n Vertex: 'vertex' as const,\n\n bindGroupLayout,\n\n init,\n initFromDevice,\n\n resolve,\n};\nexport default tgpu;\n\nexport {\n NotUniformError,\n ResolutionError,\n} from './errors';\nexport { TgpuRoot } from './core/root/rootTypes';\nexport {\n isBuffer,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './core/buffer/buffer';\nexport {\n isSampler,\n isComparisonSampler,\n} from './core/sampler/sampler';\nexport {\n isSampledTextureView,\n isStorageTextureView,\n isTexture,\n} from './core/texture/texture';\nexport {\n isUsableAsRender,\n isUsableAsSampled,\n} from './core/texture/usageExtension';\nexport { isUsableAsStorage } from './extension';\n\nexport type { Storage } from './extension';\nexport type {\n TgpuBuffer,\n Uniform,\n Vertex,\n TgpuBufferUniform,\n TgpuBufferReadonly,\n TgpuBufferMutable,\n} from './core/buffer/public';\nexport type {\n TgpuTexture,\n TgpuReadonlyTexture,\n TgpuWriteonlyTexture,\n TgpuMutableTexture,\n TgpuSampledTexture,\n TgpuAnyTextureView,\n} from './core/texture/texture';\nexport type { TextureProps } from './core/texture/textureProps';\nexport type { Render, Sampled } from './core/texture/usageExtension';\nexport type { InitOptions, InitFromDeviceOptions } from './core/root/init';\nexport type { TgpuSampler } from './core/sampler/sampler';\nexport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n TgpuLayoutSampler,\n TgpuLayoutTexture,\n TgpuLayoutStorage,\n TgpuLayoutStorageTexture,\n TgpuLayoutExternalTexture,\n TgpuLayoutUniform,\n BindLayoutEntry,\n LayoutEntryToInput,\n TgpuBindGroup,\n} from './tgpuBindGroupLayout';\n"]}