typegpu 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nameRegistry.ts","../src/shared/utilityTypes.ts","../src/core/resolve/resolveData.ts","../src/core/slot/slotTypes.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/resolve/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","isSlot","value","isDerived","isAccessor","naturalsExcept","excluded","next","UnknownData","isResolvable","isWgsl","isGPUBuffer","parenthesizedOps","resolveRes","res","isWgslData","generateBoolean","bool","generateBlock","statement","generateStatement","generateIdentifier","generateExpression","expression","lhs","op","rhs","lhsExpr","rhsExpr","arg","argExpr","targetId","target","propertyStr","targetStr","callee","args","idValue","argValues","cond","cons","alt","condition","consequent","alternate","rawId","rawValue","eq","generateFunction","body","BufferReader","BufferWriter","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","dataWriters","output","_schema","_","i","schema","alignment","alignmentOf","writeData","beginning","sizeOf","_a","_b","customAlignmentOf","packed","writer","dataReaders","input","vec2f","vec3f","vec4f","vec2h","vec3h","vec4h","vec2i","vec3i","vec4i","vec2u","vec3u","vec4u","mat2x2f","skipOneAfter","mat3x3f","mat4x4f","result","readData","elements","elementType","g","b","a","r","reader","INTERNAL_createBuffer","group","typeSchema","initialOrBuffer","TgpuBufferImpl","isBuffer","isUsableAsUniform","buffer","isUsableAsVertex","_group","dataType","_disallowedUsages","device","usages","usage","flags","gpuBuffer","mapped","size","hostBuffer","srcBuffer","stagingBuffer","commandEncoder","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","access","params","storageParams","format","type","invariant","TgpuFixedStorageTextureImpl","TgpuFixedSampledTextureImpl","dimensionToCodeMap","_texture","binding","TgpuLaidOutStorageTextureImpl","_format","dimension","_props","__spreadValues","multisampled","TgpuLaidOutSampledTextureImpl","sampleType","_multisampled","isUsableAsSampled","NotSampledError","_NotSampledError","bindGroupLayout","entries","TgpuBindGroupLayoutImpl","isBindGroupLayout","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","idx","entry","membership","unwrapper","visibility","v","TgpuBindGroupImpl","layout","NotUniformError","CATCHALL_BIND_GROUP_IDX_MARKER","ItemStateStack","state","pairs","returnType","externalMap","layer","slot","boundValue","external","declarationType","INDENT","N","IndentController","str","ResolutionCtxImpl","opts","fn","options","argList","declaration","memoMap","placeholderKey","layoutEntry","MissingSlotValueError","callback","eventual","maybeEventual","derived","instances","instance","expectedValue","slotToValueMap","usedSlot","err","ResolutionError","item","eventualItem","provideCtx","isWgslArray","isWgslStruct","type_","resolve","code","bindGroupLayouts","takenIndices","automaticIds","layoutEntries","createCatchallGroup","catchallIdx","catchallLayout","catchall","placeholder","isNamable","applyExternals","existing","newExternals","replaceExternalsInWgsl","wgsl","acc","externalName","resolvedExternal","externals","template","names","jitTranspiler","dependencies","resolutionObj","WeakMemo","_make","INTERNAL_createComputePipeline","slotBindings","entryFn","TgpuComputePipelineImpl","ComputePipelineCore","isComputePipeline","_TgpuComputePipelineImpl","_core","_priors","bindGroup","y","z","memo","pass","MissingBindGroupError","_slotBindings","_entryFn","l","isAttribute","connectAttributesToShader","shaderInputLayout","attributes","usedVertexLayouts","isData","getCustomLocation","bufferDefinitions","layoutToAttribListMap","nextShaderLocation","member","isBuiltin","matchingAttribute","attribList","isVertexLayout","isColorAttachment","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 Vec2h,\n Vec2i,\n Vec2u,\n Vec3f,\n Vec3h,\n Vec3i,\n Vec3u,\n Vec4f,\n Vec4h,\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 'vec2h',\n 'vec3h',\n 'vec4h',\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 | Vec2h\n | Vec3h\n | Vec4h\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\n/**\n * Resolves a single property of a struct.\n * @param ctx - The resolution context.\n * @param key - The key of the property.\n * @param property - The property itself.\n *\n * @returns The resolved property string.\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\n/**\n * Resolves a struct and adds its declaration to the resolution context.\n * @param ctx - The resolution context.\n * @param struct - The struct to resolve.\n *\n * @returns The resolved struct name.\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\n/**\n * Resolves an array.\n * @param ctx - The resolution context.\n * @param array - The array to resolve.\n *\n * @returns The resolved array name along with its element type and count (if not runtime-sized).\n *\n * @example\n * ```ts\n * resolveArray(ctx, d.arrayOf(d.u32, 0)); // 'array<u32>' (not a real pattern, a function is preferred)\n * resolveArray(ctx, d.arrayOf(d.u32, 5)); // 'array<u32, 5>'\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\n/**\n * Resolves a WGSL data-type schema to a string.\n * @param ctx - The resolution context.\n * @param data - The data-type to resolve.\n *\n * @returns The resolved data-type string.\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 { AnyWgslData } from '../../data';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport type { TgpuFn } from '../function/tgpuFn';\nimport type { TgpuResolvable } from './../../types';\nimport type { TgpuBufferUsage } from './../buffer/bufferUsage';\n\nexport interface TgpuSlot<T> extends TgpuNamable {\n readonly resourceType: 'slot';\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 interface TgpuDerived<T> {\n readonly resourceType: 'derived';\n readonly value: Infer<T>;\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): TgpuDerived<T>;\n\n /**\n * @internal\n */\n '~compute'(): T;\n}\n\nexport interface TgpuAccessor<T extends AnyWgslData>\n extends TgpuResolvable,\n TgpuNamable {\n readonly resourceType: 'accessor';\n\n readonly schema: T;\n readonly defaultValue:\n | TgpuFn<[], T>\n | TgpuBufferUsage<T>\n | Infer<T>\n | undefined;\n readonly slot: TgpuSlot<TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>>;\n\n readonly label?: string | undefined;\n readonly value: Infer<T>;\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | TgpuSlot<T> | TgpuDerived<T>;\n\nexport type SlotValuePair<T> = [TgpuSlot<T>, T];\n\nexport function isSlot<T>(value: unknown | TgpuSlot<T>): value is TgpuSlot<T> {\n return (value as TgpuSlot<T>)?.resourceType === 'slot';\n}\n\nexport function isDerived<T extends TgpuDerived<unknown>>(\n value: T | unknown,\n): value is T {\n return (value as T)?.resourceType === 'derived';\n}\n\nexport function isAccessor<T extends AnyWgslData>(\n value: unknown | TgpuAccessor<T>,\n): value is TgpuAccessor<T> {\n return (value as TgpuAccessor<T>)?.resourceType === 'accessor';\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 {\n type Eventual,\n type SlotValuePair,\n isDerived,\n isSlot,\n} from './core/slot/slotTypes';\nimport type { AnyWgslData, BaseWgslData } from './data/wgslTypes';\nimport type { NameRegistry } from './nameRegistry';\nimport type { Infer } from './shared/repr';\nimport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n} from './tgpuBindGroupLayout';\n\nexport type Wgsl = Eventual<\n string | number | boolean | TgpuResolvable | AnyWgslData\n>;\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 withSlots<T>(pairs: SlotValuePair<unknown>[], callback: () => T): T;\n\n /**\n * Unwraps all layers of slot/derived indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n\n resolve(item: Wgsl): string;\n resolveValue<T extends BaseWgslData>(value: Infer<T>, schema: T): 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 toString(): 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 isSlot(value) ||\n isDerived(value)\n );\n}\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","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 isWgsl,\n} from '../types';\n\nconst parenthesizedOps = [\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n '<<',\n '>>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '|',\n '^',\n '&',\n '&&',\n '||',\n];\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n indent(): string;\n dedent(): string;\n getById(id: string): Resource;\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.b.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 ('x' in expression) {\n // Logical/Binary/Assignment Expression\n\n const [lhs, op, rhs] = expression.x;\n const lhsExpr = resolveRes(ctx, generateExpression(ctx, lhs));\n const rhsExpr = resolveRes(ctx, generateExpression(ctx, rhs));\n return {\n value: parenthesizedOps.includes(op)\n ? `(${lhsExpr} ${op} ${rhsExpr})`\n : `${lhsExpr} ${op} ${rhsExpr}`,\n // TODO: Infer data type from expression type and arguments.\n dataType: UnknownData,\n };\n }\n\n if ('u' in expression) {\n // Unary Expression\n\n const [op, arg] = expression.u;\n const argExpr = resolveRes(ctx, generateExpression(ctx, arg));\n return {\n value: `${op}${argExpr}`,\n // TODO: Infer data type from expression type and arguments.\n dataType: UnknownData,\n };\n }\n\n if ('a' in expression) {\n // Member Access\n\n const [targetId, property] = expression.a;\n const target = generateExpression(ctx, targetId);\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n if (typeof target.value === 'string') {\n return {\n value: `${target.value}.${propertyStr}`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if (isWgsl(target.value)) {\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 if (typeof target.value === 'object') {\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 throw new Error(`Cannot access member ${propertyStr} of ${target.value}`);\n }\n\n if ('i' in expression) {\n // Index Access\n\n const [target, property] = expression.i;\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 ('n' in expression) {\n // Numeric Literal\n\n // TODO: Infer numeric data type from literal\n return { value: expression.n, dataType: UnknownData };\n }\n\n if ('f' in expression) {\n // Function Call\n\n const [callee, args] = expression.f;\n const id = generateExpression(ctx, callee);\n const idValue = id.value;\n\n const argResources = args.map((arg) => generateExpression(ctx, arg));\n const argValues = argResources.map((res) => resolveRes(ctx, res));\n\n if (typeof idValue === 'string') {\n return {\n value: `${idValue}(${argValues.join(', ')})`,\n dataType: UnknownData,\n };\n }\n\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 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 ('r' in statement) {\n return statement.r === null\n ? `${ctx.pre}return;`\n : `${ctx.pre}return ${resolveRes(ctx, generateExpression(ctx, statement.r))};`;\n }\n\n if ('q' in statement) {\n const [cond, cons, alt] = statement.q;\n const condition = resolveRes(ctx, generateExpression(ctx, cond));\n\n ctx.indent(); // {\n const consequent = generateStatement(ctx, cons);\n ctx.dedent(); // }\n\n ctx.indent(); // {\n const alternate = alt ? generateStatement(ctx, alt) : 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 ('l' in statement || 'c' in statement) {\n const [rawId, rawValue] = 'l' in statement ? statement.l : statement.c;\n const id = resolveRes(ctx, generateIdentifier(ctx, rawId));\n const eq = rawValue ? generateExpression(ctx, rawValue) : 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 ('b' 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 { isWgslData } from '../../data';\nimport { readData, writeData } from '../../data/dataIO';\nimport type { AnyData } from '../../data/dataTypes';\nimport { sizeOf } from '../../data/sizeOf';\nimport type { WgslTypeLiteral } from '../../data/wgslTypes';\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 destroyed: boolean;\n\n $usage<T extends RestrictVertexUsages<TData>>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n\n write(data: Infer<TData>): void;\n copyFrom(srcBuffer: TgpuBuffer<TData>): void;\n read(): Promise<Infer<TData>>;\n destroy(): void;\n}\n\nexport function INTERNAL_createBuffer<TData extends AnyData>(\n group: ExperimentalTgpuRoot,\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n): TgpuBuffer<TData> {\n if (!isWgslData(typeSchema)) {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer, [\n 'storage',\n 'uniform',\n ]);\n }\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\ntype RestrictVertexUsages<TData extends AnyData> = TData extends {\n readonly type: WgslTypeLiteral;\n}\n ? ('uniform' | 'storage' | 'vertex')[]\n : 'vertex'[];\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 _buffer: GPUBuffer | null = null;\n private _ownBuffer: boolean;\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,\n public readonly dataType: TData,\n public readonly initialOrBuffer?: Infer<TData> | GPUBuffer | undefined,\n private readonly _disallowedUsages?: ('uniform' | 'storage' | 'vertex')[],\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._ownBuffer = false;\n this._buffer = initialOrBuffer;\n } else {\n this._ownBuffer = true;\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n const device = this._group.device;\n\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\n }\n\n if (!this._buffer) {\n this._buffer = 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 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 RestrictVertexUsages<TData>>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>> {\n for (const usage of usages) {\n if (this._disallowedUsages?.includes(usage)) {\n throw new Error(\n `Buffer of type ${this.dataType} cannot be used as ${usage}`,\n );\n }\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 $addFlags(flags: GPUBufferUsageFlags) {\n if (!this._ownBuffer) {\n throw new Error(\n 'Cannot add flags to a buffer that is not managed by TypeGPU.',\n );\n }\n\n if (flags & GPUBufferUsage.MAP_READ) {\n this.flags = GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;\n return this;\n }\n\n if (flags & GPUBufferUsage.MAP_WRITE) {\n this.flags = GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;\n return this;\n }\n\n this.flags |= flags;\n return this;\n }\n\n write(data: Infer<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this._group.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n writeData(new BufferWriter(mapped), this.dataType, data);\n return;\n }\n\n const size = sizeOf(this.dataType);\n\n // Flushing any commands yet to be encoded.\n this._group.flush();\n\n const hostBuffer = new ArrayBuffer(size);\n writeData(new BufferWriter(hostBuffer), this.dataType, data);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n copyFrom(srcBuffer: TgpuBuffer<TData>): void {\n if (this.buffer.mapState === 'mapped') {\n throw new Error('Cannot copy to a mapped buffer.');\n }\n\n const size = sizeOf(this.dataType);\n const encoder = this._group.commandEncoder;\n encoder.copyBufferToBuffer(srcBuffer.buffer, 0, this.buffer, 0, size);\n }\n\n async read(): Promise<Infer<TData>> {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n\n const gpuBuffer = this.buffer;\n const device = this._group.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 if (this._ownBuffer) {\n this._buffer?.destroy();\n }\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 { AnyData, Disarray, LooseDecorated, Unstruct } from './dataTypes';\nimport { mat2x2f, mat3x3f, mat4x4f } from './matrix';\nimport { sizeOf } from './sizeOf';\nimport {\n vec2f,\n vec2h,\n vec2i,\n vec2u,\n vec3f,\n vec3h,\n vec3i,\n vec3u,\n vec4f,\n vec4h,\n vec4i,\n vec4u,\n} from './vector';\nimport type * as wgsl from './wgslTypes';\n\ntype DataWriter<TSchema extends wgsl.BaseWgslData> = (\n output: ISerialOutput,\n schema: TSchema,\n value: Infer<TSchema>,\n) => void;\n\ntype DataReader<TSchema extends wgsl.BaseWgslData> = (\n input: ISerialInput,\n schema: TSchema,\n) => Infer<TSchema>;\n\ntype CompleteDataWriters = {\n [TType in AnyData['type']]: DataWriter<\n Extract<AnyData, { readonly type: TType }>\n >;\n};\n\ntype CompleteDataReaders = {\n [TType in AnyData['type']]: DataReader<\n Extract<AnyData, { readonly type: TType }>\n >;\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 vec2h(output, _, value: wgsl.v2h) {\n output.writeFloat16(value.x);\n output.writeFloat16(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 vec3h(output, _, value: wgsl.v3h) {\n output.writeFloat16(value.x);\n output.writeFloat16(value.y);\n output.writeFloat16(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 vec4h(output, _, value: wgsl.v4h) {\n output.writeFloat16(value.x);\n output.writeFloat16(value.y);\n output.writeFloat16(value.z);\n output.writeFloat16(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 uint8(output, _, value: number) {\n output.writeUint8(value);\n },\n uint8x2(output, _, value: wgsl.v2u) {\n output.writeUint8(value.x);\n output.writeUint8(value.y);\n },\n uint8x4(output, _, value: wgsl.v4u) {\n output.writeUint8(value.x);\n output.writeUint8(value.y);\n output.writeUint8(value.z);\n output.writeUint8(value.w);\n },\n sint8(output, _, value: number) {\n output.writeInt8(value);\n },\n sint8x2(output, _, value: wgsl.v2i) {\n output.writeInt8(value.x);\n output.writeInt8(value.y);\n },\n sint8x4(output, _, value: wgsl.v4i) {\n output.writeInt8(value.x);\n output.writeInt8(value.y);\n output.writeInt8(value.z);\n output.writeInt8(value.w);\n },\n unorm8(output, _, value: number) {\n output.writeUint8(value * 255);\n },\n unorm8x2(output, _, value: wgsl.v2f) {\n output.writeUint8(value.x * 255);\n output.writeUint8(value.y * 255);\n },\n unorm8x4(output, _, value: wgsl.v4f) {\n output.writeUint8(value.x * 255);\n output.writeUint8(value.y * 255);\n output.writeUint8(value.z * 255);\n output.writeUint8(value.w * 255);\n },\n snorm8(output, _, value: number) {\n output.writeUint8(value * 127 + 128);\n },\n snorm8x2(output, _, value: wgsl.v2f) {\n output.writeUint8(value.x * 127 + 128);\n output.writeUint8(value.y * 127 + 128);\n },\n snorm8x4(output, _, value: wgsl.v4f) {\n output.writeUint8(value.x * 127 + 128);\n output.writeUint8(value.y * 127 + 128);\n output.writeUint8(value.z * 127 + 128);\n output.writeUint8(value.w * 127 + 128);\n },\n uint16(output, _, value: number) {\n output.writeUint16(value);\n },\n uint16x2(output, _, value: wgsl.v2u) {\n output.writeUint16(value.x);\n output.writeUint16(value.y);\n },\n uint16x4(output, _, value: wgsl.v4u) {\n output.writeUint16(value.x);\n output.writeUint16(value.y);\n output.writeUint16(value.z);\n output.writeUint16(value.w);\n },\n sint16(output, _, value: number) {\n output.writeInt16(value);\n },\n sint16x2(output, _, value: wgsl.v2i) {\n output.writeInt16(value.x);\n output.writeInt16(value.y);\n },\n sint16x4(output, _, value: wgsl.v4i) {\n output.writeInt16(value.x);\n output.writeInt16(value.y);\n output.writeInt16(value.z);\n output.writeInt16(value.w);\n },\n unorm16(output, _, value: number) {\n output.writeUint16(value * 65535);\n },\n unorm16x2(output, _, value: wgsl.v2f) {\n output.writeUint16(value.x * 65535);\n output.writeUint16(value.y * 65535);\n },\n unorm16x4(output, _, value: wgsl.v4f) {\n output.writeUint16(value.x * 65535);\n output.writeUint16(value.y * 65535);\n output.writeUint16(value.z * 65535);\n output.writeUint16(value.w * 65535);\n },\n snorm16(output, _, value: number) {\n output.writeUint16(value * 32767 + 32768);\n },\n snorm16x2(output, _, value: wgsl.v2f) {\n output.writeUint16(value.x * 32767 + 32768);\n output.writeUint16(value.y * 32767 + 32768);\n },\n snorm16x4(output, _, value: wgsl.v4f) {\n output.writeUint16(value.x * 32767 + 32768);\n output.writeUint16(value.y * 32767 + 32768);\n output.writeUint16(value.z * 32767 + 32768);\n output.writeUint16(value.w * 32767 + 32768);\n },\n float16(output, _, value: number) {\n output.writeFloat16(value);\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 'unorm8x4-bgra'(output, _, value: wgsl.v4f) {\n output.writeUint8(value.z * 255);\n output.writeUint8(value.y * 255);\n output.writeUint8(value.x * 255);\n output.writeUint8(value.w * 255);\n },\n\n disarray(output, schema: Disarray, 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 unstruct(output, schema: Unstruct, 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): boolean {\n return input.readBool();\n },\n\n f32(input: ISerialInput): number {\n return input.readFloat32();\n },\n\n f16(input: ISerialInput): number {\n return input.readFloat16();\n },\n\n i32(input: ISerialInput): number {\n return input.readInt32();\n },\n\n u32(input: ISerialInput): number {\n return input.readUint32();\n },\n\n vec2f(input: ISerialInput): wgsl.v2f {\n return vec2f(input.readFloat32(), input.readFloat32());\n },\n\n vec3f(input: ISerialInput): wgsl.v3f {\n return vec3f(input.readFloat32(), input.readFloat32(), input.readFloat32());\n },\n\n vec4f(input: ISerialInput): wgsl.v4f {\n return vec4f(\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n );\n },\n\n vec2h(input): wgsl.v2h {\n return vec2h(input.readFloat16(), input.readFloat16());\n },\n\n vec3h(input: ISerialInput): wgsl.v3h {\n return vec3h(input.readFloat16(), input.readFloat16(), input.readFloat16());\n },\n\n vec4h(input: ISerialInput): wgsl.v4h {\n return vec4h(\n input.readFloat16(),\n input.readFloat16(),\n input.readFloat16(),\n input.readFloat16(),\n );\n },\n\n vec2i(input): wgsl.v2i {\n return vec2i(input.readInt32(), input.readInt32());\n },\n\n vec3i(input: ISerialInput): wgsl.v3i {\n return vec3i(input.readInt32(), input.readInt32(), input.readInt32());\n },\n\n vec4i(input: ISerialInput): wgsl.v4i {\n return vec4i(\n input.readInt32(),\n input.readInt32(),\n input.readInt32(),\n input.readInt32(),\n );\n },\n\n vec2u(input): wgsl.v2u {\n return vec2u(input.readUint32(), input.readUint32());\n },\n\n vec3u(input: ISerialInput): wgsl.v3u {\n return vec3u(input.readUint32(), input.readUint32(), input.readUint32());\n },\n\n vec4u(input: ISerialInput): wgsl.v4u {\n return vec4u(\n input.readUint32(),\n input.readUint32(),\n input.readUint32(),\n input.readUint32(),\n );\n },\n\n mat2x2f(input: ISerialInput): wgsl.m2x2f {\n return mat2x2f(\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n );\n },\n\n mat3x3f(input: ISerialInput): wgsl.m3x3f {\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): wgsl.m4x4f {\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 uint8: (i) => i.readUint8(),\n uint8x2: (i) => vec2u(i.readUint8(), i.readUint8()),\n uint8x4: (i) =>\n vec4u(i.readUint8(), i.readUint8(), i.readUint8(), i.readUint8()),\n sint8: (i) => i.readInt8(),\n sint8x2: (i) => {\n return vec2i(i.readInt8(), i.readInt8());\n },\n sint8x4: (i) => vec4i(i.readInt8(), i.readInt8(), i.readInt8(), i.readInt8()),\n unorm8: (i) => i.readUint8() / 255,\n unorm8x2: (i) => vec2f(i.readUint8() / 255, i.readUint8() / 255),\n unorm8x4: (i) =>\n vec4f(\n i.readUint8() / 255,\n i.readUint8() / 255,\n i.readUint8() / 255,\n i.readUint8() / 255,\n ),\n snorm8: (i) => (i.readUint8() - 128) / 127,\n snorm8x2: (i) =>\n vec2f((i.readUint8() - 128) / 127, (i.readUint8() - 128) / 127),\n snorm8x4: (i) =>\n vec4f(\n (i.readUint8() - 128) / 127,\n (i.readUint8() - 128) / 127,\n (i.readUint8() - 128) / 127,\n (i.readUint8() - 128) / 127,\n ),\n uint16: (i) => i.readUint16(),\n uint16x2: (i) => vec2u(i.readUint16(), i.readUint16()),\n uint16x4: (i) =>\n vec4u(i.readUint16(), i.readUint16(), i.readUint16(), i.readUint16()),\n sint16: (i) => i.readInt16(),\n sint16x2: (i) => vec2i(i.readInt16(), i.readInt16()),\n sint16x4: (i) =>\n vec4i(i.readInt16(), i.readInt16(), i.readInt16(), i.readInt16()),\n unorm16: (i) => i.readUint16() / 65535,\n unorm16x2: (i) => vec2f(i.readUint16() / 65535, i.readUint16() / 65535),\n unorm16x4: (i) =>\n vec4f(\n i.readUint16() / 65535,\n i.readUint16() / 65535,\n i.readUint16() / 65535,\n i.readUint16() / 65535,\n ),\n snorm16: (i) => (i.readUint16() - 32768) / 32767,\n snorm16x2: (i): wgsl.v2f =>\n vec2f(dataReaders.snorm16(i), dataReaders.snorm16(i)),\n snorm16x4: (i): wgsl.v4f =>\n vec4f(\n dataReaders.snorm16(i),\n dataReaders.snorm16(i),\n dataReaders.snorm16(i),\n dataReaders.snorm16(i),\n ),\n float16(i) {\n return i.readFloat16();\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 'unorm8x4-bgra'(i) {\n const b = i.readByte() / 255;\n const g = i.readByte() / 255;\n const r = i.readByte() / 255;\n const a = i.readByte() / 255;\n return vec4f(r, g, b, a);\n },\n\n unstruct(input, schema: Unstruct) {\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 disarray(input, schema: Disarray) {\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;\n\nexport function readData<TData extends wgsl.BaseWgslData>(\n input: ISerialInput,\n schema: TData,\n): Infer<TData> {\n const reader = (dataReaders as Record<string, unknown>)[\n schema.type\n ] as DataReader<TData>;\n if (!reader) {\n throw new Error(`Cannot read data of type '${schema.type}'.`);\n }\n\n return reader(input, schema);\n}\n","export interface NotAllowed<TMsg> {\n reason: TMsg;\n}\n\nexport type ExtensionGuard<TFlag, TMsg, TAllowed> = boolean extends TFlag\n ? NotAllowed<TMsg> | TAllowed\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, TgpuResolvable } 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 extends TgpuResolvable {\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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\ntype TexelFormatToStringChannels = {\n [Key in keyof TexelFormatToChannelType]: TexelFormatToChannelType[Key]['type'];\n};\ntype KeysWithValue<T extends Record<string, unknown>, TValue> = keyof {\n [Key in keyof T as T[Key] extends TValue ? Key : never]: Key;\n};\nexport type ChannelTypeToLegalFormats = {\n [Key in TexelFormatToChannelType[keyof TexelFormatToChannelType]['type']]: KeysWithValue<\n TexelFormatToStringChannels,\n Key\n >;\n};\n\nexport type SampleTypeToStringChannelType = {\n float: 'f32';\n 'unfilterable-float': 'f32';\n depth: 'f32';\n sint: 'i32';\n uint: 'u32';\n};\n\nexport type ViewDimensionToDimension = {\n '1d': '1d';\n '2d': '2d';\n '2d-array': '2d';\n '3d': '3d';\n cube: '2d';\n 'cube-array': '2d';\n};\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 as F32,\n 'unfilterable-float': f32 as F32,\n uint: u32 as U32,\n sint: i32 as I32,\n depth: f32 as F32, // I guess?\n};\nexport type ChannelFormatToSchema = typeof channelFormatToSchema;\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 { 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\ntype ResolveStorageDimension<\n TDimension extends GPUTextureViewDimension,\n TProps extends TextureProps,\n> = StorageTextureDimension extends TDimension\n ? Default<TProps['dimension'], '2d'>\n : TDimension extends StorageTextureDimension\n ? TDimension\n : '2d';\n\ntype ViewUsages<\n TProps extends TextureProps,\n TTexture extends TgpuTexture<TProps>,\n> = boolean extends TTexture['usableAsSampled']\n ? boolean extends TTexture['usableAsStorage']\n ? never\n : 'readonly' | 'writeonly' | 'mutable'\n : boolean extends TTexture['usableAsStorage']\n ? 'sampled'\n : 'readonly' | 'writeonly' | 'mutable' | 'sampled';\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 createView<\n TUsage extends ViewUsages<TProps, this>,\n TDimension extends 'sampled' extends TUsage\n ? GPUTextureViewDimension\n : StorageTextureDimension,\n TFormat extends 'sampled' extends TUsage\n ? SampledFormatOptions<TProps>\n : StorageFormatOptions<TProps>,\n >(\n access: TUsage,\n params?: TextureViewParams<TDimension, TFormat>,\n ): {\n mutable: TgpuMutableTexture<\n ResolveStorageDimension<TDimension, TProps>,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >;\n readonly: TgpuReadonlyTexture<\n ResolveStorageDimension<TDimension, TProps>,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >;\n writeonly: TgpuWriteonlyTexture<\n ResolveStorageDimension<TDimension, TProps>,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >;\n sampled: 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 }[TUsage];\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 createView(\n access: 'mutable' | 'readonly' | 'writeonly' | 'sampled',\n params?: TextureViewParams<GPUTextureViewDimension, GPUTextureFormat>,\n ) {\n if (access === 'sampled') {\n return this._asSampled(params);\n }\n\n const storageParams = params as TextureViewParams<\n StorageTextureDimension,\n StorageTextureTexelFormat\n >;\n\n switch (access) {\n case 'mutable':\n return this._asMutable(storageParams);\n case 'readonly':\n return this._asReadonly(storageParams);\n case 'writeonly':\n return this._asWriteonly(storageParams);\n }\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 private _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 private _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 private _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 private _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 & 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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 & 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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 type TgpuWriteonlyTexture,\n isTexture,\n} from './core/texture/texture';\nimport type {\n SampleTypeToStringChannelType,\n ViewDimensionToDimension,\n} from './core/texture/textureFormats';\nimport type {\n ChannelFormatToSchema,\n ChannelTypeToLegalFormats,\n StorageTextureTexelFormat,\n TexelFormatToDataType,\n} from './core/texture/textureFormats';\nimport type { TextureProps } from './core/texture/textureProps';\nimport {\n NotSampledError,\n type Sampled,\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 { Default, 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 (_: number) => BaseWgslData ? ReturnType<T> : T;\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 /**\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 /**\n * @deprecated Use the `root.createBindGroup` API instead, accessible through `await tgpu.init()`\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\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\ntype GetUsageForStorageTexture<\n T extends TgpuLayoutStorageTexture,\n TAccess extends 'readonly' | 'writeonly' | 'mutable',\n> = {\n mutable: TgpuMutableTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n TexelFormatToDataType[T['storageTexture']]\n >;\n readonly: TgpuReadonlyTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n TexelFormatToDataType[T['storageTexture']]\n >;\n writeonly: TgpuWriteonlyTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n TexelFormatToDataType[T['storageTexture']]\n >;\n}[TAccess];\n\ntype StorageTextureUsageForEntry<T extends TgpuLayoutStorageTexture> =\n T extends unknown\n ? GetUsageForStorageTexture<T, Default<T['access'], 'writeonly'>>\n : never;\n\ntype GetDimension<T extends GPUTextureViewDimension | undefined> =\n T extends keyof ViewDimensionToDimension\n ? ViewDimensionToDimension[T]\n : undefined;\n\ntype GetTextureRestriction<T extends TgpuLayoutTexture> = Default<\n GetDimension<T['viewDimension']>,\n '2d'\n> extends infer Dimension\n ? Dimension extends '2d'\n ? {\n format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];\n dimension?: Dimension;\n }\n : {\n format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];\n dimension: Dimension;\n }\n : never;\n\ntype GetStorageTextureRestriction<T extends TgpuLayoutStorageTexture> = Default<\n GetDimension<T['viewDimension']>,\n '2d'\n> extends infer Dimension\n ? Dimension extends '2d'\n ? {\n format: T['storageTexture'];\n dimension?: Dimension;\n }\n : {\n format: T['storageTexture'];\n dimension: Dimension;\n }\n : never;\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 ?\n | GPUTextureView\n | (Sampled &\n TgpuTexture<\n Prettify<TextureProps & GetTextureRestriction<T>>\n >)\n : T extends TgpuLayoutStorageTexture\n ?\n | GPUTextureView\n | (Storage &\n TgpuTexture<\n Prettify<TextureProps & GetStorageTextureRestriction<T>>\n >)\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 : T extends TgpuLayoutTexture\n ? TgpuSampledTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n ChannelFormatToSchema[T['texture']]\n >\n : T extends TgpuLayoutStorageTexture\n ? StorageTextureUsageForEntry<T>\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 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 TgpuBindGroupLayout<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\nexport class 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 as TgpuTexture & Sampled).createView('sampled'),\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 as TgpuTexture & Storage).createView('readonly'),\n );\n } else if (entry.access === 'mutable') {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & Storage).createView('mutable'),\n );\n } else {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & Storage).createView('writeonly'),\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 {\n type Eventual,\n type SlotValuePair,\n type TgpuDerived,\n type TgpuSlot,\n isDerived,\n isSlot,\n} from './core/slot/slotTypes';\nimport {\n type AnyWgslData,\n type BaseWgslData,\n isWgslArray,\n isWgslData,\n isWgslStruct,\n} from './data/wgslTypes';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { provideCtx } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { naturalsExcept } from './shared/generators';\nimport type { Infer } from './shared/repr';\nimport { generateFunction } from './smol';\nimport {\n type TgpuBindGroup,\n TgpuBindGroupImpl,\n type TgpuBindGroupLayout,\n type TgpuLayoutEntry,\n bindGroupLayout,\n} from './tgpuBindGroupLayout';\nimport type {\n FnToWgslOptions,\n ResolutionCtx,\n Resource,\n TgpuResolvable,\n Wgsl,\n} from './types';\nimport { UnknownData, isWgsl } 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 private readonly _memoizedDerived = new WeakMap<\n // WeakMap because if the \"derived\" does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n TgpuDerived<unknown>,\n { slotToValueMap: SlotToValueMap; result: unknown }[]\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 withSlots<T>(pairs: SlotValuePair<unknown>[], callback: () => T): T {\n this._itemStateStack.pushSlotBindings(pairs);\n\n try {\n return callback();\n } finally {\n this._itemStateStack.pop();\n }\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeEventual = eventual;\n\n // Unwrapping all layers of slots.\n while (true) {\n if (isSlot(maybeEventual)) {\n maybeEventual = this.readSlot(maybeEventual);\n } else if (isDerived(maybeEventual)) {\n maybeEventual = this._getOrCompute(maybeEventual);\n } else {\n break;\n }\n }\n\n return maybeEventual;\n }\n\n _getOrCompute<T>(derived: TgpuDerived<T>): T {\n // All memoized versions of `derived`\n const instances = this._memoizedDerived.get(derived) ?? [];\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(([slot, expectedValue]) =>\n slot.areEqual(this._itemStateStack.readSlot(slot), expectedValue),\n )\n ) {\n return instance.result as T;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n const result = derived['~compute']();\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._memoizedDerived.set(derived, instances);\n\n return result;\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(derived);\n }\n\n throw new ResolutionError(err, [derived]);\n } finally {\n this._itemStateStack.pop();\n }\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(([slot, expectedValue]) =>\n slot.areEqual(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(eventualItem: Wgsl): string {\n const item = this.unwrap(eventualItem);\n\n if (\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean'\n ) {\n return String(item);\n }\n\n if (this._itemStateStack.itemDepth === 0) {\n const result = provideCtx(this, () => this._getOrInstantiate(item));\n return `${[...this._declarations].join('\\n\\n')}${result}`;\n }\n\n return this._getOrInstantiate(item);\n }\n\n resolveValue<T extends BaseWgslData>(value: Infer<T>, schema: T): string {\n if (isWgsl(value)) {\n return this.resolve(value);\n }\n\n if (isWgslArray(schema)) {\n return `array(${(value as Infer<typeof schema>).map((element) => this.resolveValue(element, schema.elementType))})`;\n }\n\n if (isWgslStruct(schema)) {\n return `${this.resolve(schema)}(${Object.entries(schema.propTypes).map(([key, type_]) => this.resolveValue((value as Infer<typeof schema>)[key], type_))})`;\n }\n\n throw new Error(\n `Value ${value} of schema ${schema} is not resolvable to WGSL`,\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 new TgpuBindGroupImpl(\n catchallLayout,\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, type Wgsl, isResolvable } from '../../types';\nimport { isSlot } from '../slot/slotTypes';\n\n/**\n * A key-value mapping where keys represent identifiers within shader code,\n * and values can be any type that can be resolved to a code string.\n */\nexport type ExternalMap = Record<string, unknown>;\n\n/**\n * Merges two external maps into one. If a key is present in both maps, the value from the new map is used.\n * If the external value is a namable object, it is given a name if it does not already have one.\n * @param existing - The existing external map.\n * @param newExternals - The new external map.\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\n/**\n * Replaces all occurrences of external names in WGSL code with their resolved values.\n * It adds all necessary definitions to the resolution context.\n * @param ctx - The resolution context.\n * @param externalMap - The external map.\n * @param wgsl - The WGSL code.\n *\n * @returns The WGSL code with all external names replaced with their resolved values.\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) || isSlot(external)\n ? ctx.resolve(external as Wgsl)\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 './externals';\n\nexport interface TgpuResolveOptions {\n /**\n * Map of external names to their resolvable values.\n */\n externals: Record<string, TgpuResolvable | AnyWgslData | boolean | number>;\n /**\n * The code template to use for the resolution. All external names will be replaced with their resolved values.\n * @default ''\n */\n template?: string | undefined;\n /**\n * The naming strategy used for generating identifiers for resolved externals and their dependencies.\n * @default 'random'\n */\n names?: 'strict' | 'random' | undefined;\n /**\n * Optional JIT transpiler for resolving TGSL functions.\n * @experimental\n */\n unstable_jitTranspiler?: JitTranspiler | undefined;\n}\n\n/**\n * Resolves a template with external values. Each external will get resolved to a code string and replaced in the template.\n * Any dependencies of the externals will also be resolved and included in the output.\n * @param options - The options for the resolution.\n *\n * @returns The resolved code.\n *\n * @example\n * ```ts\n * const Gradient = d.struct({\n * from: d.vec3f,\n * to: d.vec3f,\n * });\n *\n * const resolved = tgpu.resolve({\n * template: `\n * fn getGradientAngle(gradient: Gradient) -> f32 {\n * return atan(gradient.to.y - gradient.from.y, gradient.to.x - gradient.from.x);\n * }\n * `,\n * externals: {\n * Gradient,\n * },\n * });\n *\n * console.log(resolved);\n * // struct Gradient_0 {\n * // from: vec3f,\n * // to: vec3f,\n * // }\n * // fn getGradientAngle(gradient: Gradient_0) -> f32 {\n * // return atan(gradient.to.y - gradient.from.y, gradient.to.x - gradient.from.x);\n * // }\n * ```\n */\nexport function resolve(options: TgpuResolveOptions): string {\n const {\n externals,\n template,\n names,\n unstable_jitTranspiler: jitTranspiler,\n } = options;\n\n const dependencies = {} as Record<string, TgpuResolvable>;\n applyExternals(dependencies, externals ?? {});\n\n const resolutionObj: TgpuResolvable = {\n resolve(ctx) {\n return replaceExternalsInWgsl(ctx, dependencies, template ?? '');\n },\n\n toString: () => '<root>',\n };\n\n const { code } = resolveImpl(resolutionObj, {\n names:\n names === 'strict' ? new StrictNameRegistry() : new RandomNameRegistry(),\n 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 { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\nimport type { TgpuSlot } from '../slot/slotTypes';\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.withSlots(this._slotBindings, () => {\n ctx.resolve(this._entryFn);\n });\n return '';\n },\n\n toString: () => `computePipeline:${this.label ?? '<unnamed>'}`,\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, isUnstruct } from '../../data/dataTypes';\nimport type { Disarray } 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 | Disarray = WgslArray | Disarray,\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 | Disarray>(\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 | Disarray,\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 (isUnstruct(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 | Disarray>\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 isColorAttachment(\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 (!isColorAttachment(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 { 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 { TgpuSlot } from '../slot/slotTypes';\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.withSlots(slotBindings, () => {\n ctx.resolve(vertexFn);\n ctx.resolve(fragmentFn);\n });\n return '';\n },\n\n toString: () => `renderPipeline:${this.label ?? '<unnamed>'}`,\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 { AnyWgslData } from '../../data';\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 LayoutEntryToInput,\n TgpuBindGroup,\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n} from '../../tgpuBindGroupLayout';\nimport {\n TgpuBindGroupImpl,\n isBindGroup,\n isBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport {\n INTERNAL_createBuffer,\n type TgpuBuffer,\n isBuffer,\n} from '../buffer/buffer';\nimport type { TgpuBufferUsage } from '../buffer/bufferUsage';\nimport type { IOLayout } from '../function/fnTypes';\nimport type { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { TgpuFn } from '../function/tgpuFn';\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 TgpuAccessor,\n type TgpuSlot,\n isAccessor,\n} from '../slot/slotTypes';\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 extends AnyWgslData>(\n slot: TgpuSlot<T> | TgpuAccessor<T>,\n value: T | TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>,\n ): WithBinding {\n return new WithBindingImpl(this._getRoot, [\n ...this._slotBindings,\n [isAccessor(slot) ? slot.slot : 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 = INTERNAL_createBuffer(this, typeSchema, initialOrBuffer);\n this._disposables.push(buffer);\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 createBindGroup<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n >(\n layout: TgpuBindGroupLayout<Entries>,\n entries: {\n [K in keyof Entries]: LayoutEntryToInput<Entries[K]>;\n },\n ) {\n return new TgpuBindGroupImpl(layout, entries);\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} from './core/texture/texture';\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 { 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"]}
1
+ {"version":3,"sources":["../src/core/constant/tgpuConstant.ts","../src/namable.ts","../src/core/slot/slotTypes.ts","../src/types.ts","../src/core/resolve/externals.ts","../src/core/declare/tgpuDeclare.ts","../src/core/function/astUtils.ts","../src/core/function/fnCore.ts","../src/core/function/tgpuComputeFn.ts","../src/core/function/tgpuFn.ts","../src/core/function/ioOutputType.ts","../src/core/function/tgpuFragmentFn.ts","../src/core/function/tgpuVertexFn.ts","../src/nameRegistry.ts","../src/shared/utilityTypes.ts","../src/core/resolve/resolveData.ts","../src/shared/generators.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/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/core/slot/slot.ts","../src/core/slot/accessor.ts","../src/core/slot/derived.ts","../src/core/variable/tgpuVariable.ts","../src/index.ts"],"names":["constant","dataType","value","TgpuConstImpl","_value","__publicField","label","ctx","id","resolvedValue","_a","inGPUMode","isNamable","isSlot","isDerived","isAccessor","UnknownData","isSelfResolvable","isWgsl","isWgslData","isGPUBuffer","applyExternals","existing","newExternals","key","addArgTypesToExternals","implementation","argTypes","argTypeNames","found","argType","i","argTypeName","isWgslStruct","addReturnTypeToExternals","returnType","_b","_c","outputName","identifierRegex","name","replaceExternalsInWgsl","externalMap","wgsl","acc","externalName","external","innerAcc","prop","declare","declaration","TgpuDeclareImpl","dependencyMap","externals","replacedDeclaration","functionToAstMap","getPrebuiltAstFor","fn","assignAst","ast","createFnCore","shell","externalsToApply","fnAttribute","replacedImpl","pluginData","missing","missingExternals","MissingLinksError","args","idx","head","body","computeFn","options","workgroupSize","createComputeFn","core","newLabel","createFn","isTgpuFn","FnCall","slot","createBoundFunction","innerFn","slotValue","fnBase","_fn","_params","param","withLocations","members","nextLocation","member","isBuiltin","customLocation","getCustomLocation","attribute","createOutputType","isData","location","struct","fragmentFn","inputType","outputType","createFragmentFn","vertexFn","createVertexFn","RandomNameRegistry","primer","StrictNameRegistry","index","unusedName","assertExhaustive","x","identityTypes","isIdentityType","data","resolveStructProperty","property","getAttributesString","resolveStruct","resolveArray","array","element","resolveData","naturalsExcept","excluded","next","parenthesizedOps","resolveRes","res","generateBoolean","bool","generateBlock","statement","generateStatement","generateIdentifier","generateExpression","expression","lhs","op","rhs","lhsExpr","rhsExpr","arg","argExpr","targetId","target","propertyStr","targetStr","callee","idValue","argValues","cond","cons","alt","condition","consequent","alternate","rawId","rawValue","eq","generateFunction","BufferReader","BufferWriter","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","dataWriters","output","_schema","_","schema","alignment","alignmentOf","writeData","beginning","sizeOf","customAlignmentOf","packed","writer","dataReaders","input","vec2f","vec3f","vec4f","vec2h","vec3h","vec4h","vec2i","vec3i","vec4i","vec2u","vec3u","vec4u","mat2x2f","skipOneAfter","mat3x3f","mat4x4f","result","readData","elements","elementType","g","b","a","r","reader","INTERNAL_createBuffer","group","typeSchema","initialOrBuffer","TgpuBufferImpl","isBuffer","isUsableAsUniform","buffer","isUsableAsVertex","_group","_disallowedUsages","device","usages","usage","flags","gpuBuffer","mapped","size","hostBuffer","srcBuffer","stagingBuffer","commandEncoder","isUsableAsStorage","NotStorageError","_NotStorageError","isBufferUsage","usageToVarTemplateMap","TgpuFixedBufferImpl","binding","TgpuLaidOutBufferImpl","_membership","mutableUsageMap","asMutable","readonlyUsageMap","asReadonly","uniformUsageMap","asUniform","sampler","props","TgpuFixedSamplerImpl","comparisonSampler","TgpuFixedComparisonSamplerImpl","isSampler","resource","isComparisonSampler","TgpuLaidOutSamplerImpl","TgpuLaidOutComparisonSamplerImpl","_props","TgpuExternalTextureImpl","texelFormatToChannelType","f32","u32","i32","texelFormatToDataType","channelKindToFormat","channelFormatToSchema","INTERNAL_createTexture","branch","TgpuTextureImpl","isTexture","isStorageTextureView","isSampledTextureView","accessMap","_branch","_d","_e","hasStorage","hasSampled","hasRender","access","params","storageParams","format","type","invariant","TgpuFixedStorageTextureImpl","TgpuFixedSampledTextureImpl","dimensionToCodeMap","_texture","TgpuLaidOutStorageTextureImpl","_format","dimension","__spreadValues","multisampled","TgpuLaidOutSampledTextureImpl","sampleType","_multisampled","isUsableAsSampled","isUsableAsRender","NotSampledError","_NotSampledError","bindGroupLayout","entries","TgpuBindGroupLayoutImpl","isBindGroupLayout","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","entry","membership","unwrapper","visibility","v","TgpuBindGroupImpl","layout","NotUniformError","CATCHALL_BIND_GROUP_IDX_MARKER","ItemStateStack","state","pairs","layer","boundValue","declarationType","INDENT","N","IndentController","str","ResolutionCtxImpl","opts","argList","memoMap","placeholderKey","layoutEntry","MissingSlotValueError","callback","eventual","maybeEventual","derived","instances","instance","expectedValue","slotToValueMap","usedSlot","err","ResolutionError","item","eventualItem","provideCtx","isWgslArray","type_","resolve","code","bindGroupLayouts","takenIndices","automaticIds","layoutEntries","createCatchallGroup","catchallIdx","catchallLayout","catchall","placeholder","template","names","jitTranspiler","dependencies","resolutionObj","WeakMemo","_make","INTERNAL_createComputePipeline","slotBindings","entryFn","TgpuComputePipelineImpl","ComputePipelineCore","isComputePipeline","_TgpuComputePipelineImpl","_core","_priors","bindGroup","y","z","memo","pass","MissingBindGroupError","_slotBindings","_entryFn","l","isAttribute","connectAttributesToShader","shaderInputLayout","attributes","usedVertexLayouts","bufferDefinitions","layoutToAttribListMap","nextShaderLocation","matchingAttribute","attribList","vertexLayout","schemaForCount","stepMode","TgpuVertexLayoutImpl","isVertexLayout","dataToContainedAttribs","isDecorated","isLooseDecorated","roundUp","memberOffset","attrib","isUnstruct","vertexFormats","kindToDefaultFormatMap","arraySchema","isColorAttachment","connectAttachmentToShader","shaderOutputLayout","attachment","matching","isColorTargetState","connectTargetsToShader","targets","matchingTarget","INTERNAL_createRenderPipeline","TgpuRenderPipelineImpl","RenderPipelineCore","_TgpuRenderPipelineImpl","definition","__spreadProps","vertexCount","instanceCount","firstVertex","firstInstance","colorAttachments","connectedAttribs","primitiveState","module","descriptor","WithBindingImpl","_WithBindingImpl","_getRoot","WithComputeImpl","attribs","WithVertexImpl","_root","_options","_mismatch","WithFragmentImpl","_WithFragmentImpl","TgpuRootImpl","nameRegistry","_ownDevice","disposable","texture","init","adapterOpt","deviceOpt","adapter","initFromDevice","defaultValue","TgpuSlotImpl","getResolutionCtx","accessor","TgpuAccessorImpl","compute","createDerived","createBoundDerived","innerDerived","slotValuePair","privateVar","initialValue","TgpuVarImpl","workgroupVar","scope","_dataType","_initialValue","tgpu","src_default"],"mappings":"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","sourcesContent":["import type { AnyWgslData } from '../../data/wgslTypes';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport type { Exotic } from './../../data/exotic';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuConst<TDataType extends AnyWgslData = AnyWgslData>\n extends TgpuNamable {\n readonly dataType: TDataType;\n readonly value: Infer<TDataType>;\n}\n\n/**\n * Creates a module constant with specified value.\n */\nexport function constant<TDataType extends AnyWgslData>(\n dataType: Exotic<TDataType>,\n value: Infer<Exotic<TDataType>>,\n): TgpuConst<Exotic<TDataType>> {\n return new TgpuConstImpl(dataType, value);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuConstImpl<TDataType extends AnyWgslData>\n implements TgpuConst<TDataType>, SelfResolvable\n{\n private _label: string | undefined;\n\n constructor(\n public readonly dataType: TDataType,\n private readonly _value: Infer<TDataType>,\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 const resolvedValue = ctx.resolveValue(this._value, this.dataType);\n\n ctx.addDeclaration(`const ${id} = ${resolvedValue};`);\n\n return id;\n }\n\n toString() {\n return `const:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Infer<TDataType> {\n if (!inGPUMode()) {\n return this._value;\n }\n return this as Infer<TDataType>;\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 type { AnyWgslData } from '../../data';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport type { Labelled } from '../../types';\nimport type { TgpuFn } from '../function/tgpuFn';\nimport type { TgpuBufferUsage } from './../buffer/bufferUsage';\n\nexport interface TgpuSlot<T> extends TgpuNamable, Labelled {\n readonly resourceType: 'slot';\n\n readonly defaultValue: T | undefined;\n\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 interface TgpuDerived<T> {\n readonly resourceType: 'derived';\n readonly value: Infer<T>;\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): TgpuDerived<T>;\n\n /**\n * @internal\n */\n '~compute'(): T;\n}\n\nexport interface TgpuAccessor<T extends AnyWgslData = AnyWgslData>\n extends TgpuNamable,\n Labelled {\n readonly resourceType: 'accessor';\n\n readonly schema: T;\n readonly defaultValue:\n | TgpuFn<[], T>\n | TgpuBufferUsage<T>\n | Infer<T>\n | undefined;\n readonly slot: TgpuSlot<TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>>;\n\n readonly value: Infer<T>;\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | TgpuSlot<T> | TgpuDerived<T>;\n\nexport type SlotValuePair<T = unknown> = [TgpuSlot<T>, T];\n\nexport function isSlot<T>(value: unknown | TgpuSlot<T>): value is TgpuSlot<T> {\n return (value as TgpuSlot<T>)?.resourceType === 'slot';\n}\n\nexport function isDerived<T extends TgpuDerived<unknown>>(\n value: T | unknown,\n): value is T {\n return (value as T)?.resourceType === 'derived';\n}\n\nexport function isAccessor<T extends AnyWgslData>(\n value: unknown | TgpuAccessor<T>,\n): value is TgpuAccessor<T> {\n return (value as TgpuAccessor<T>)?.resourceType === 'accessor';\n}\n","import type { Block } from 'tinyest';\nimport type { TgpuBufferUsage } from './core/buffer/bufferUsage';\nimport type { TgpuConst } from './core/constant/tgpuConstant';\nimport type { TgpuDeclare } from './core/declare/tgpuDeclare';\nimport type { TgpuComputeFn } from './core/function/tgpuComputeFn';\nimport type { TgpuFn } from './core/function/tgpuFn';\nimport type { TgpuFragmentFn } from './core/function/tgpuFragmentFn';\nimport type { TgpuVertexFn } from './core/function/tgpuVertexFn';\nimport type { TgpuComputePipeline } from './core/pipeline/computePipeline';\nimport type { TgpuRenderPipeline } from './core/pipeline/renderPipeline';\nimport type { TgpuSampler } from './core/sampler/sampler';\nimport {\n type Eventual,\n type SlotValuePair,\n type TgpuAccessor,\n isDerived,\n isSlot,\n} from './core/slot/slotTypes';\nimport type { TgpuExternalTexture } from './core/texture/externalTexture';\nimport type { TgpuAnyTextureView, TgpuTexture } from './core/texture/texture';\nimport type { TgpuVar } from './core/variable/tgpuVariable';\nimport {\n type AnyMatInstance,\n type AnyVecInstance,\n type AnyWgslData,\n type BaseWgslData,\n isWgslData,\n} from './data/wgslTypes';\nimport type { NameRegistry } from './nameRegistry';\nimport type { Infer } from './shared/repr';\nimport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n} from './tgpuBindGroupLayout';\n\nexport type ResolvableObject =\n | SelfResolvable\n | TgpuBufferUsage\n | TgpuConst\n | TgpuDeclare\n | TgpuFn\n | TgpuComputeFn\n | TgpuFragmentFn\n | TgpuComputePipeline\n | TgpuRenderPipeline\n | TgpuVertexFn\n | TgpuSampler\n | TgpuAccessor\n | TgpuExternalTexture\n | TgpuTexture\n | TgpuAnyTextureView\n | TgpuVar\n | AnyVecInstance\n | AnyMatInstance\n | AnyWgslData\n // biome-ignore lint/suspicious/noExplicitAny: <has to be more permissive than unknown>\n | TgpuFn<any, any>;\n\nexport type Wgsl = Eventual<string | number | boolean | ResolvableObject>;\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 withSlots<T>(pairs: SlotValuePair<unknown>[], callback: () => T): T;\n\n /**\n * Unwraps all layers of slot/derived indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n\n resolve(item: unknown): string;\n resolveValue<T extends BaseWgslData>(value: Infer<T>, schema: T): 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\n/**\n * Houses a method '~resolve` that returns a code string\n * representing it, as opposed to offloading the resolution\n * to another mechanism.\n */\nexport interface SelfResolvable {\n '~resolve'(ctx: ResolutionCtx): string;\n toString(): string;\n}\n\nexport interface Labelled {\n readonly label?: string | undefined;\n}\n\nexport function isSelfResolvable(value: unknown): value is SelfResolvable {\n return typeof (value as SelfResolvable)?.['~resolve'] === 'function';\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 isSelfResolvable(value) ||\n isWgslData(value) ||\n isSlot(value) ||\n isDerived(value)\n );\n}\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","import { isWgslStruct } from '../../data/wgslTypes';\nimport { isNamable } from '../../namable';\nimport { type ResolutionCtx, isWgsl } from '../../types';\n\n/**\n * A key-value mapping where keys represent identifiers within shader code,\n * and values can be any type that can be resolved to a code string.\n */\nexport type ExternalMap = Record<string, unknown>;\n\n/**\n * Merges two external maps into one. If a key is present in both maps, the value from the new map is used.\n * If the external value is a namable object, it is given a name if it does not already have one.\n * @param existing - The existing external map.\n * @param newExternals - The new external map.\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 addArgTypesToExternals(\n implementation: string,\n argTypes: unknown[],\n applyExternals: (externals: ExternalMap) => void,\n) {\n const argTypeNames = [\n ...implementation.matchAll(/:\\s*(?<arg>.*?)\\s*[,)]/g),\n ].map((found) => found.groups?.arg);\n\n applyExternals(\n Object.fromEntries(\n argTypes.flatMap((argType, i) => {\n const argTypeName = argTypeNames ? argTypeNames[i] : undefined;\n return isWgslStruct(argType) && argTypeName !== undefined\n ? [[argTypeName, argType]]\n : [];\n }),\n ),\n );\n}\n\nexport function addReturnTypeToExternals(\n implementation: string,\n returnType: unknown,\n applyExternals: (externals: ExternalMap) => void,\n) {\n const outputName = implementation\n .match(/->(?<output>.*?){/s)\n ?.groups?.output?.trim();\n\n if (isWgslStruct(returnType) && outputName && !/\\s/g.test(outputName)) {\n applyExternals({ [outputName]: returnType });\n }\n}\n\nfunction identifierRegex(name: string) {\n return new RegExp(`(?<![\\\\w_.])${name}(?![\\\\w_])`, 'g');\n}\n\n/**\n * Replaces all occurrences of external names in WGSL code with their resolved values.\n * It adds all necessary definitions to the resolution context.\n * @param ctx - The resolution context.\n * @param externalMap - The external map.\n * @param wgsl - The WGSL code.\n *\n * @returns The WGSL code with all external names replaced with their resolved values.\n */\nexport function replaceExternalsInWgsl(\n ctx: ResolutionCtx,\n externalMap: ExternalMap,\n wgsl: string,\n): string {\n return Object.entries(externalMap).reduce((acc, [externalName, external]) => {\n if (isWgsl(external)) {\n return acc.replaceAll(\n identifierRegex(externalName),\n ctx.resolve(external),\n );\n }\n\n if (external !== null && typeof external === 'object') {\n const foundProperties =\n [\n ...wgsl.matchAll(\n new RegExp(`${externalName}\\\\.(?<prop>.*?)(?![\\\\w_])`, 'g'),\n ),\n ].map((found) => found[1]) ?? [];\n\n return foundProperties.reduce(\n (innerAcc: string, prop) =>\n prop && prop in external\n ? replaceExternalsInWgsl(\n ctx,\n {\n [`${externalName}.${prop}`]:\n external[prop as keyof typeof external],\n },\n innerAcc,\n )\n : innerAcc,\n acc,\n );\n }\n\n return acc;\n }, wgsl);\n}\n","import type { ResolutionCtx, SelfResolvable } from '../../types';\nimport {\n type ExternalMap,\n applyExternals,\n replaceExternalsInWgsl,\n} from '../resolve/externals';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Extra declaration that shall be included in final WGSL code,\n * when resolving objects that use it.\n */\nexport interface TgpuDeclare {\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\n/**\n * Allows defining extra declarations that shall be included in the final WGSL code,\n * when resolving objects that use them.\n *\n * Using this API is generally discouraged, as it shouldn't be necessary in any common scenario.\n * It was developed to ensure full compatibility of TypeGPU programs with current and future versions of WGSL.\n */\nexport function declare(declaration: string): TgpuDeclare {\n return new TgpuDeclareImpl(declaration);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuDeclareImpl implements TgpuDeclare, SelfResolvable {\n private externalsToApply: ExternalMap[] = [];\n\n constructor(private declaration: string) {}\n\n $uses(dependencyMap: Record<string, unknown>): this {\n this.externalsToApply.push(dependencyMap);\n return this;\n }\n\n '~resolve'(ctx: ResolutionCtx): string {\n const externalMap: ExternalMap = {};\n\n for (const externals of this.externalsToApply) {\n applyExternals(externalMap, externals);\n }\n\n const replacedDeclaration = replaceExternalsInWgsl(\n ctx,\n externalMap,\n this.declaration,\n );\n\n ctx.addDeclaration(replacedDeclaration);\n return '';\n }\n\n toString() {\n return `declare: ${this.declaration}`;\n }\n}\n","import type { Block } from 'tinyest';\n\nexport type Ast = {\n argNames: string[];\n body: Block;\n externalNames: string[];\n};\n\nexport type AstInfo = {\n ast: Ast;\n externals?: Record<string, unknown> | undefined;\n};\n\nconst functionToAstMap = new WeakMap<\n (...args: unknown[]) => unknown,\n AstInfo\n>();\n\nexport function getPrebuiltAstFor(\n fn: (...args: unknown[]) => unknown,\n): AstInfo | undefined {\n return functionToAstMap.get(fn);\n}\n\nexport function assignAst<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ast: Ast,\n externals?: Record<string, unknown> | undefined,\n): T {\n functionToAstMap.set(fn, { ast, externals });\n return fn;\n}\n","import type { AnyWgslData } from '../../data/wgslTypes';\nimport { MissingLinksError } from '../../errors';\nimport type { ResolutionCtx, Resource } from '../../types';\nimport {\n type ExternalMap,\n addArgTypesToExternals,\n addReturnTypeToExternals,\n applyExternals,\n replaceExternalsInWgsl,\n} from '../resolve/externals';\nimport { getPrebuiltAstFor } from './astUtils';\nimport type { Implementation } from './fnTypes';\n\nexport interface TgpuFnShellBase<Args extends unknown[], Return> {\n readonly argTypes: Args;\n readonly returnType: Return | undefined;\n}\n\nexport interface FnCore {\n label: string | undefined;\n applyExternals(newExternals: ExternalMap): void;\n resolve(ctx: ResolutionCtx, fnAttribute?: string): string;\n}\n\nexport function createFnCore(\n shell: TgpuFnShellBase<unknown[], unknown>,\n implementation: Implementation<unknown[], unknown>,\n): FnCore {\n /**\n * External application has to be deferred until resolution because\n * some externals can reference the owner function which has not been\n * initialized yet (like when accessing the Output struct of a vertex\n * entry fn).\n */\n const externalsToApply: ExternalMap[] = [];\n\n if (typeof implementation === 'string') {\n addArgTypesToExternals(implementation, shell.argTypes, (externals) =>\n externalsToApply.push(externals),\n );\n addReturnTypeToExternals(implementation, shell.returnType, (externals) =>\n externalsToApply.push(externals),\n );\n }\n\n return {\n label: undefined as string | undefined,\n\n applyExternals(newExternals: ExternalMap): void {\n externalsToApply.push(newExternals);\n },\n\n resolve(ctx: ResolutionCtx, fnAttribute = ''): string {\n const externalMap: ExternalMap = {};\n\n for (const externals of externalsToApply) {\n applyExternals(externalMap, externals);\n }\n\n const id = ctx.names.makeUnique(this.label);\n\n if (typeof implementation === 'string') {\n const replacedImpl = replaceExternalsInWgsl(\n ctx,\n externalMap,\n implementation.trim(),\n );\n\n ctx.addDeclaration(`${fnAttribute}fn ${id}${replacedImpl}`);\n } else {\n // get data generated by the plugin\n const pluginData = getPrebuiltAstFor(implementation);\n\n if (pluginData?.externals) {\n const missing = Object.fromEntries(\n Object.entries(pluginData.externals).filter(\n ([name]) => !(name in externalMap),\n ),\n );\n\n applyExternals(externalMap, missing);\n }\n const ast = pluginData?.ast ?? ctx.transpileFn(String(implementation));\n\n // Verifying all required externals are present.\n const missingExternals = ast.externalNames.filter(\n (name) => !(name in externalMap),\n );\n\n if (missingExternals.length > 0) {\n throw new MissingLinksError(this.label, missingExternals);\n }\n\n const args: Resource[] = ast.argNames.map((name, idx) => ({\n value: name,\n dataType: shell.argTypes[idx] as AnyWgslData,\n }));\n\n const { head, body } = ctx.fnToWgsl({\n args,\n returnType: shell.returnType as AnyWgslData,\n body: ast.body,\n externalMap,\n });\n\n ctx.addDeclaration(\n `${fnAttribute}fn ${id}${ctx.resolve(head)}${ctx.resolve(body)}`,\n );\n }\n\n return id;\n },\n };\n}\n","import type { AnyBuiltin } from '../../builtin';\nimport type { TgpuNamable } from '../../namable';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { createFnCore } from './fnCore';\nimport type { Implementation } from './fnTypes';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Describes a compute entry function signature (its arguments and return type)\n */\nexport interface TgpuComputeFnShell {\n readonly argTypes: [];\n readonly returnType: undefined;\n readonly workgroupSize: [number, number, number];\n\n /**\n * Creates a type-safe implementation of this signature\n */\n does(implementation: () => undefined): TgpuComputeFn;\n\n /**\n * @param implementation\n * Raw WGSL function implementation with header and body\n * without `fn` keyword and function name\n * e.g. `\"(x: f32) -> f32 { return x; }\"`;\n */\n does(implementation: string): TgpuComputeFn;\n}\n\nexport interface TgpuComputeFn extends TgpuNamable {\n readonly shell: TgpuComputeFnShell;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport interface ComputeFnOptions {\n workgroupSize: number[];\n}\n\n/**\n * Creates a shell of a typed entry function for the compute shader stage. Any function\n * that implements this shell can perform general-purpose computation.\n *\n * @param workgroupSize\n * Size of blocks that the thread grid will be divided into (up to 3 dimensions).\n */\nexport function computeFn(\n argTypes: AnyBuiltin[],\n options: ComputeFnOptions,\n): TgpuComputeFnShell {\n const { workgroupSize } = options;\n\n return {\n argTypes: [],\n returnType: undefined,\n workgroupSize: [\n workgroupSize[0] ?? 1,\n workgroupSize[1] ?? 1,\n workgroupSize[2] ?? 1,\n ],\n\n does(implementation) {\n return createComputeFn(this, workgroupSize, implementation);\n },\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createComputeFn(\n shell: TgpuComputeFnShell,\n workgroupSize: number[],\n implementation: Implementation<[], void>,\n): TgpuComputeFn {\n type This = TgpuComputeFn & Labelled & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n\n return {\n shell,\n\n get label() {\n return core.label;\n },\n\n $uses(newExternals) {\n core.applyExternals(newExternals);\n return this;\n },\n\n $name(newLabel: string): This {\n core.label = newLabel;\n return this;\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n return core.resolve(\n ctx,\n `@compute @workgroup_size(${workgroupSize.join(', ')}) `,\n );\n },\n\n toString() {\n return `computeFn:${this.label ?? '<unnamed>'}`;\n },\n } as This;\n}\n","import type { Infer } from '../../data';\nimport type { Exotic, ExoticArray } from '../../data/exotic';\nimport type { AnyWgslData } from '../../data/wgslTypes';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type {\n Labelled,\n ResolutionCtx,\n SelfResolvable,\n Wgsl,\n} from '../../types';\nimport type { TgpuBufferUsage } from '../buffer/bufferUsage';\nimport {\n type Eventual,\n type TgpuAccessor,\n type TgpuSlot,\n isAccessor,\n} from '../slot/slotTypes';\nimport { createFnCore } from './fnCore';\nimport type { Implementation, InferArgs, InferReturn } from './fnTypes';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Describes a function signature (its arguments and return type)\n */\nexport interface TgpuFnShell<\n Args extends AnyWgslData[] = AnyWgslData[],\n Return extends AnyWgslData | undefined = AnyWgslData | undefined,\n> {\n readonly argTypes: Args;\n readonly returnType: Return | undefined;\n\n /**\n * Creates a type-safe implementation of this signature\n */\n does(\n implementation: (...args: InferArgs<Args>) => InferReturn<Return>,\n ): TgpuFn<Args, Return>;\n\n /**\n * @param implementation\n * Raw WGSL function implementation with header and body\n * without `fn` keyword and function name\n * e.g. `\"(x: f32) -> f32 { return x; }\"`;\n */\n does(implementation: string): TgpuFn<Args, Return>;\n}\n\ninterface TgpuFnBase<\n Args extends AnyWgslData[],\n Return extends AnyWgslData | undefined = undefined,\n> extends TgpuNamable,\n Labelled {\n readonly resourceType: 'function';\n readonly shell: TgpuFnShell<Args, Return>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n with<T>(slot: TgpuSlot<T>, value: Eventual<T>): TgpuFn<Args, Return>;\n with<T extends AnyWgslData>(\n accessor: TgpuAccessor<T>,\n value: TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>,\n ): TgpuFn<Args, Return>;\n}\n\nexport type TgpuFn<\n Args extends AnyWgslData[] = AnyWgslData[],\n Return extends AnyWgslData | undefined = AnyWgslData | undefined,\n> = TgpuFnBase<Args, Return> &\n ((...args: InferArgs<Args>) => InferReturn<Return>);\n\nexport function fn<Args extends AnyWgslData[] | []>(\n argTypes: Args,\n returnType?: undefined,\n): TgpuFnShell<ExoticArray<Args>, undefined>;\n\nexport function fn<Args extends AnyWgslData[] | [], Return extends AnyWgslData>(\n argTypes: Args,\n returnType: Return,\n): TgpuFnShell<ExoticArray<Args>, Exotic<Return>>;\n\nexport function fn<\n Args extends AnyWgslData[],\n Return extends AnyWgslData | undefined = undefined,\n>(argTypes: Args, returnType?: Return): TgpuFnShell<Args, Return> {\n return {\n argTypes,\n returnType,\n\n does(\n implementation: Implementation<InferArgs<Args>, InferReturn<Return>>,\n ): TgpuFn<Args, Return> {\n return createFn(this, implementation as Implementation);\n },\n };\n}\n\nexport function isTgpuFn<\n Args extends AnyWgslData[],\n Return extends AnyWgslData | undefined = undefined,\n>(value: unknown | TgpuFn<Args, Return>): value is TgpuFn<Args, Return> {\n return (value as TgpuFn<Args, Return>)?.resourceType === 'function';\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createFn<\n Args extends AnyWgslData[],\n Return extends AnyWgslData | undefined,\n>(\n shell: TgpuFnShell<Args, Return>,\n implementation: Implementation,\n): TgpuFn<Args, Return> {\n type This = TgpuFnBase<Args, Return> & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n\n const fnBase: This = {\n shell,\n resourceType: 'function' as const,\n\n $uses(newExternals: Record<string, unknown>) {\n core.applyExternals(newExternals);\n return this;\n },\n\n $name(newLabel: string): This {\n core.label = newLabel;\n return this;\n },\n\n with<T extends AnyWgslData>(\n slot: TgpuSlot<T> | TgpuAccessor<T>,\n value: T | TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>,\n ): TgpuFn<Args, Return> {\n return createBoundFunction(\n fn,\n isAccessor(slot) ? slot.slot : slot,\n value,\n );\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n return core.resolve(ctx);\n },\n };\n\n const call = (...args: unknown[]): unknown => {\n if (inGPUMode()) {\n // TODO: Filter out only those arguments which are valid to pass around\n return new FnCall(fn, args as Wgsl[]);\n }\n\n if (typeof implementation === 'string') {\n throw new Error(\n 'Cannot execute on the CPU functions constructed with raw WGSL',\n );\n }\n\n return implementation(...args);\n };\n\n const fn = Object.assign(call, fnBase as This) as TgpuFn<Args, Return>;\n\n // Making the label available as a readonly property.\n Object.defineProperty(fn, 'label', {\n get: () => core.label,\n });\n\n Object.defineProperty(fn, 'toString', {\n value: () => `fn:${core.label ?? '<unnamed>'}`,\n });\n\n return fn;\n}\n\nfunction createBoundFunction<\n Args extends AnyWgslData[],\n Return extends AnyWgslData | undefined,\n>(\n innerFn: TgpuFn<Args, Return>,\n slot: TgpuSlot<unknown>,\n slotValue: unknown,\n): TgpuFn<Args, Return> {\n type This = TgpuFnBase<Args, Return> & SelfResolvable;\n\n const fnBase: This = {\n resourceType: 'function',\n shell: innerFn.shell,\n\n $uses(newExternals) {\n innerFn.$uses(newExternals);\n return this;\n },\n\n $name(newLabel: string): This {\n innerFn.$name(newLabel);\n return this;\n },\n\n with<T extends AnyWgslData>(\n slot: TgpuSlot<T> | TgpuAccessor<T>,\n value: T | TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>,\n ): TgpuFn<Args, Return> {\n return createBoundFunction(\n fn,\n isAccessor(slot) ? slot.slot : slot,\n value,\n );\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n return ctx.withSlots([[slot, slotValue]], () => ctx.resolve(innerFn));\n },\n };\n\n const call = (...args: InferArgs<Args>): unknown => {\n if (inGPUMode()) {\n // TODO: Filter out only those arguments which are valid to pass around\n return new FnCall(fn, args as Wgsl[]);\n }\n\n return innerFn(...args);\n };\n\n const fn = Object.assign(call, fnBase) as TgpuFn<Args, Return>;\n\n // Making the label available as a readonly property.\n Object.defineProperty(fn, 'label', {\n get: () => innerFn.label,\n });\n\n Object.defineProperty(fn, 'toString', {\n value() {\n return `fn:${innerFn.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${slotValue}]`;\n },\n });\n\n return fn;\n}\n\nclass FnCall<Args extends AnyWgslData[], Return extends AnyWgslData | undefined>\n implements SelfResolvable\n{\n constructor(\n private readonly _fn: TgpuFnBase<Args, Return>,\n private readonly _params: Wgsl[],\n ) {}\n\n get label() {\n return this._fn.label;\n }\n\n '~resolve'(ctx: ResolutionCtx): string {\n return ctx.resolve(\n `${ctx.resolve(this._fn)}(${this._params.map((param) => ctx.resolve(param)).join(', ')})`,\n );\n }\n\n toString() {\n return `call:${this.label ?? '<unnamed>'}`;\n }\n}\n","import { type TgpuStruct, isBuiltin, struct } from '../../data';\nimport {\n type Decorate,\n type HasCustomLocation,\n type IsBuiltin,\n attribute,\n location,\n} from '../../data/attributes';\nimport { getCustomLocation, isData } from '../../data/dataTypes';\nimport type { BaseWgslData, Location } from '../../data/wgslTypes';\nimport type { IOData, IOLayout, IORecord } from './fnTypes';\n\nexport type WithLocations<T extends IORecord> = {\n [Key in keyof T]: IsBuiltin<T[Key]> extends true\n ? T[Key]\n : HasCustomLocation<T[Key]> extends true\n ? T[Key]\n : Decorate<T[Key], Location<number>>;\n};\n\nexport type IOLayoutToOutputSchema<T extends IOLayout> = T extends BaseWgslData\n ? Decorate<T, Location<0>>\n : T extends IORecord\n ? TgpuStruct<WithLocations<T>>\n : never;\n\nexport function withLocations<T extends IOData>(\n members: IORecord<T>,\n): WithLocations<IORecord<T>> {\n let nextLocation = 0;\n\n return Object.fromEntries(\n Object.entries(members).map(([key, member]) => {\n if (isBuiltin(member)) {\n // Skipping builtins\n return [key, member];\n }\n\n const customLocation = getCustomLocation(member);\n if (customLocation !== undefined) {\n // This member is already marked, start counting from the next location over.\n nextLocation = customLocation + 1;\n return [key, member];\n }\n\n return [\n key,\n attribute(member, { type: '@location', value: nextLocation++ }),\n ];\n }),\n );\n}\n\nexport function createOutputType<T extends IOData>(returnType: IOLayout<T>) {\n return (\n isData(returnType)\n ? location(0, returnType)\n : struct(withLocations(returnType) as Record<string, T>)\n ) as IOLayoutToOutputSchema<IOLayout<T>>;\n}\n","import type { OmitBuiltins } from '../../builtin';\nimport { type Vec4f, isWgslStruct } from '../../data/wgslTypes';\nimport type { TgpuNamable } from '../../namable';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { addReturnTypeToExternals } from '../resolve/externals';\nimport { createFnCore } from './fnCore';\nimport type {\n ExoticIO,\n IOLayout,\n IORecord,\n Implementation,\n InferIO,\n} from './fnTypes';\nimport { type IOLayoutToOutputSchema, createOutputType } from './ioOutputType';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Describes a fragment entry function signature (its arguments and return type)\n */\nexport interface TgpuFragmentFnShell<\n FragmentIn extends IOLayout,\n FragmentOut extends IOLayout<Vec4f>,\n> {\n readonly argTypes: [FragmentIn];\n readonly returnType: FragmentOut;\n\n /**\n * Creates a type-safe implementation of this signature\n */\n does(\n implementation: (input: InferIO<FragmentIn>) => InferIO<FragmentOut>,\n ): TgpuFragmentFn<OmitBuiltins<FragmentIn>, OmitBuiltins<FragmentOut>>;\n\n /**\n * @param implementation\n * Raw WGSL function implementation with header and body\n * without `fn` keyword and function name\n * e.g. `\"(x: f32) -> f32 { return x; }\"`;\n */\n does(\n implementation: string,\n ): TgpuFragmentFn<OmitBuiltins<FragmentIn>, OmitBuiltins<FragmentOut>>;\n}\n\nexport interface TgpuFragmentFn<\n Varying extends IOLayout = IOLayout,\n Output extends IOLayout<Vec4f> = IOLayout<Vec4f>,\n> extends TgpuNamable {\n readonly shell: TgpuFragmentFnShell<Varying, Output>;\n readonly outputType: IOLayoutToOutputSchema<Output>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\n/**\n * Creates a shell of a typed entry function for the fragment shader stage. Any function\n * that implements this shell can run for each fragment (pixel), allowing the inner code\n * to process information received from the vertex shader stage and builtins to determine\n * the final color of the pixel (many pixels in case of multiple targets).\n *\n * @param inputType\n * Values computed in the vertex stage and builtins to be made available to functions that implement this shell.\n * @param outputType\n * A `vec4f`, signaling this function outputs a color for one target, or a struct/array containing\n * colors for multiple targets.\n */\nexport function fragmentFn<\n // Not allowing single-value input, as using objects here is more\n // readable, and refactoring to use a builtin argument is too much hassle.\n FragmentIn extends IORecord,\n FragmentOut extends IOLayout<Vec4f>,\n>(\n inputType: FragmentIn,\n outputType: FragmentOut,\n): TgpuFragmentFnShell<ExoticIO<FragmentIn>, ExoticIO<FragmentOut>> {\n return {\n argTypes: [inputType as ExoticIO<FragmentIn>],\n returnType: outputType as ExoticIO<FragmentOut>,\n\n does(implementation) {\n // biome-ignore lint/suspicious/noExplicitAny: <the usual>\n return createFragmentFn(this, implementation as Implementation) as any;\n },\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createFragmentFn(\n shell: TgpuFragmentFnShell<IOLayout, IOLayout<Vec4f>>,\n implementation: Implementation,\n): TgpuFragmentFn {\n type This = TgpuFragmentFn & Labelled & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n const outputType = createOutputType(shell.returnType);\n if (typeof implementation === 'string') {\n addReturnTypeToExternals(implementation, outputType, (externals) =>\n core.applyExternals(externals),\n );\n }\n\n const result: This = {\n shell,\n outputType,\n\n get label() {\n return core.label;\n },\n\n $uses(newExternals) {\n core.applyExternals(newExternals);\n return this;\n },\n\n $name(newLabel: string): This {\n core.label = newLabel;\n if (isWgslStruct(outputType)) {\n outputType.$name(`${newLabel}_Output`);\n }\n return this;\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n return core.resolve(ctx, '@fragment ');\n },\n\n toString() {\n return `fragmentFn:${this.label ?? '<unnamed>'}`;\n },\n };\n\n return result;\n}\n","import type { OmitBuiltins } from '../../builtin';\nimport { isWgslStruct } from '../../data/wgslTypes';\nimport type { TgpuNamable } from '../../namable';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { addReturnTypeToExternals } from '../resolve/externals';\nimport { createFnCore } from './fnCore';\nimport type {\n ExoticIO,\n IOLayout,\n IORecord,\n Implementation,\n InferIO,\n} from './fnTypes';\nimport { type IOLayoutToOutputSchema, createOutputType } from './ioOutputType';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Describes a vertex entry function signature (its arguments and return type)\n */\nexport interface TgpuVertexFnShell<\n VertexIn extends IOLayout,\n VertexOut extends IOLayout,\n> {\n readonly argTypes: [VertexIn];\n readonly returnType: VertexOut;\n\n /**\n * Creates a type-safe implementation of this signature\n */\n does(\n implementation: (input: InferIO<VertexIn>) => InferIO<VertexOut>,\n ): TgpuVertexFn<OmitBuiltins<VertexIn>, OmitBuiltins<VertexOut>>;\n\n /**\n * @param implementation\n * Raw WGSL function implementation with header and body\n * without `fn` keyword and function name\n * e.g. `\"(x: f32) -> f32 { return x; }\"`;\n */\n does(\n implementation: string,\n ): TgpuVertexFn<OmitBuiltins<VertexIn>, OmitBuiltins<VertexOut>>;\n}\n\nexport interface TgpuVertexFn<\n VertexIn extends IOLayout = IOLayout,\n VertexOut extends IOLayout = IOLayout,\n> extends TgpuNamable {\n readonly shell: TgpuVertexFnShell<VertexIn, VertexOut>;\n readonly outputType: IOLayoutToOutputSchema<VertexOut>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\n/**\n * Creates a shell of a typed entry function for the vertex shader stage. Any function\n * that implements this shell can run for each vertex, allowing the inner code to process\n * attributes and determine the final position of the vertex.\n *\n * @param inputType\n * Vertex attributes and builtins to be made available to functions that implement this shell.\n * @param outputType\n * A struct type containing the final position of the vertex, and any information\n * passed onto the fragment shader stage.\n */\nexport function vertexFn<\n VertexIn extends IOLayout,\n // Not allowing single-value output, as it is better practice\n // to properly label what the vertex shader is outputting.\n VertexOut extends IORecord,\n>(\n inputType: VertexIn,\n outputType: VertexOut,\n): TgpuVertexFnShell<ExoticIO<VertexIn>, ExoticIO<VertexOut>> {\n return {\n argTypes: [inputType as ExoticIO<VertexIn>],\n returnType: outputType as ExoticIO<VertexOut>,\n\n does(implementation) {\n // biome-ignore lint/suspicious/noExplicitAny: <no thanks>\n return createVertexFn(this, implementation as Implementation) as any;\n },\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createVertexFn(\n shell: TgpuVertexFnShell<IOLayout, IOLayout>,\n implementation: Implementation,\n): TgpuVertexFn<IOLayout, IOLayout> {\n type This = TgpuVertexFn<IOLayout, IOLayout> & Labelled & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n const outputType = createOutputType(shell.returnType);\n if (typeof implementation === 'string') {\n addReturnTypeToExternals(implementation, outputType, (externals) =>\n core.applyExternals(externals),\n );\n }\n\n return {\n shell,\n outputType,\n\n get label() {\n return core.label;\n },\n\n $uses(newExternals) {\n core.applyExternals(newExternals);\n return this;\n },\n\n $name(newLabel: string): This {\n core.label = newLabel;\n if (isWgslStruct(outputType)) {\n outputType.$name(`${newLabel}_Output`);\n }\n return this;\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n return core.resolve(ctx, '@vertex ');\n },\n\n toString() {\n return `vertexFn:${this.label ?? '<unnamed>'}`;\n },\n } as This;\n}\n","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 Vec2h,\n Vec2i,\n Vec2u,\n Vec3f,\n Vec3h,\n Vec3i,\n Vec3u,\n Vec4f,\n Vec4h,\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 'vec2h',\n 'vec3h',\n 'vec4h',\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 | Vec2h\n | Vec3h\n | Vec4h\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\n/**\n * Resolves a single property of a struct.\n * @param ctx - The resolution context.\n * @param key - The key of the property.\n * @param property - The property itself.\n *\n * @returns The resolved property string.\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\n/**\n * Resolves a struct and adds its declaration to the resolution context.\n * @param ctx - The resolution context.\n * @param struct - The struct to resolve.\n *\n * @returns The resolved struct name.\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\n/**\n * Resolves an array.\n * @param ctx - The resolution context.\n * @param array - The array to resolve.\n *\n * @returns The resolved array name along with its element type and count (if not runtime-sized).\n *\n * @example\n * ```ts\n * resolveArray(ctx, d.arrayOf(d.u32, 0)); // 'array<u32>' (not a real pattern, a function is preferred)\n * resolveArray(ctx, d.arrayOf(d.u32, 5)); // 'array<u32, 5>'\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\n/**\n * Resolves a WGSL data-type schema to a string.\n * @param ctx - The resolution context.\n * @param data - The data-type to resolve.\n *\n * @returns The resolved data-type string.\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","/**\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 * 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 isWgsl,\n} from '../types';\n\nconst parenthesizedOps = [\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n '<<',\n '>>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '|',\n '^',\n '&',\n '&&',\n '||',\n];\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n indent(): string;\n dedent(): string;\n getById(id: string): Resource;\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.b.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 ('x' in expression) {\n // Logical/Binary/Assignment Expression\n\n const [lhs, op, rhs] = expression.x;\n const lhsExpr = resolveRes(ctx, generateExpression(ctx, lhs));\n const rhsExpr = resolveRes(ctx, generateExpression(ctx, rhs));\n return {\n value: parenthesizedOps.includes(op)\n ? `(${lhsExpr} ${op} ${rhsExpr})`\n : `${lhsExpr} ${op} ${rhsExpr}`,\n // TODO: Infer data type from expression type and arguments.\n dataType: UnknownData,\n };\n }\n\n if ('u' in expression) {\n // Unary Expression\n\n const [op, arg] = expression.u;\n const argExpr = resolveRes(ctx, generateExpression(ctx, arg));\n return {\n value: `${op}${argExpr}`,\n // TODO: Infer data type from expression type and arguments.\n dataType: UnknownData,\n };\n }\n\n if ('a' in expression) {\n // Member Access\n\n const [targetId, property] = expression.a;\n const target = generateExpression(ctx, targetId);\n const propertyStr = resolveRes(ctx, generateExpression(ctx, property));\n\n if (typeof target.value === 'string') {\n return {\n value: `${target.value}.${propertyStr}`,\n // TODO: Infer data type\n dataType: UnknownData,\n };\n }\n\n if (isWgsl(target.value)) {\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 if (typeof target.value === 'object') {\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 throw new Error(`Cannot access member ${propertyStr} of ${target.value}`);\n }\n\n if ('i' in expression) {\n // Index Access\n\n const [target, property] = expression.i;\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 ('n' in expression) {\n // Numeric Literal\n\n // TODO: Infer numeric data type from literal\n return { value: expression.n, dataType: UnknownData };\n }\n\n if ('f' in expression) {\n // Function Call\n\n const [callee, args] = expression.f;\n const id = generateExpression(ctx, callee);\n const idValue = id.value;\n\n const argResources = args.map((arg) => generateExpression(ctx, arg));\n const argValues = argResources.map((res) => resolveRes(ctx, res));\n\n if (typeof idValue === 'string') {\n return {\n value: `${idValue}(${argValues.join(', ')})`,\n dataType: UnknownData,\n };\n }\n\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 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 ('r' in statement) {\n return statement.r === null\n ? `${ctx.pre}return;`\n : `${ctx.pre}return ${resolveRes(ctx, generateExpression(ctx, statement.r))};`;\n }\n\n if ('q' in statement) {\n const [cond, cons, alt] = statement.q;\n const condition = resolveRes(ctx, generateExpression(ctx, cond));\n\n ctx.indent(); // {\n const consequent = generateStatement(ctx, cons);\n ctx.dedent(); // }\n\n ctx.indent(); // {\n const alternate = alt ? generateStatement(ctx, alt) : 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 ('l' in statement || 'c' in statement) {\n const [rawId, rawValue] = 'l' in statement ? statement.l : statement.c;\n const id = resolveRes(ctx, generateIdentifier(ctx, rawId));\n const eq = rawValue ? generateExpression(ctx, rawValue) : 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 ('b' 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 { isWgslData } from '../../data';\nimport { readData, writeData } from '../../data/dataIO';\nimport type { AnyData } from '../../data/dataTypes';\nimport { sizeOf } from '../../data/sizeOf';\nimport type { WgslTypeLiteral } from '../../data/wgslTypes';\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 destroyed: boolean;\n\n $usage<T extends RestrictVertexUsages<TData>>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n\n write(data: Infer<TData>): void;\n copyFrom(srcBuffer: TgpuBuffer<TData>): void;\n read(): Promise<Infer<TData>>;\n destroy(): void;\n}\n\nexport function INTERNAL_createBuffer<TData extends AnyData>(\n group: ExperimentalTgpuRoot,\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n): TgpuBuffer<TData> {\n if (!isWgslData(typeSchema)) {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer, [\n 'storage',\n 'uniform',\n ]);\n }\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\ntype RestrictVertexUsages<TData extends AnyData> = TData extends {\n readonly type: WgslTypeLiteral;\n}\n ? ('uniform' | 'storage' | 'vertex')[]\n : 'vertex'[];\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 _buffer: GPUBuffer | null = null;\n private _ownBuffer: boolean;\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,\n public readonly dataType: TData,\n public readonly initialOrBuffer?: Infer<TData> | GPUBuffer | undefined,\n private readonly _disallowedUsages?: ('uniform' | 'storage' | 'vertex')[],\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._ownBuffer = false;\n this._buffer = initialOrBuffer;\n } else {\n this._ownBuffer = true;\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n const device = this._group.device;\n\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\n }\n\n if (!this._buffer) {\n this._buffer = 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 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 RestrictVertexUsages<TData>>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>> {\n for (const usage of usages) {\n if (this._disallowedUsages?.includes(usage)) {\n throw new Error(\n `Buffer of type ${this.dataType} cannot be used as ${usage}`,\n );\n }\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 $addFlags(flags: GPUBufferUsageFlags) {\n if (!this._ownBuffer) {\n throw new Error(\n 'Cannot add flags to a buffer that is not managed by TypeGPU.',\n );\n }\n\n if (flags & GPUBufferUsage.MAP_READ) {\n this.flags = GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;\n return this;\n }\n\n if (flags & GPUBufferUsage.MAP_WRITE) {\n this.flags = GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;\n return this;\n }\n\n this.flags |= flags;\n return this;\n }\n\n write(data: Infer<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this._group.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n writeData(new BufferWriter(mapped), this.dataType, data);\n return;\n }\n\n const size = sizeOf(this.dataType);\n\n // Flushing any commands yet to be encoded.\n this._group.flush();\n\n const hostBuffer = new ArrayBuffer(size);\n writeData(new BufferWriter(hostBuffer), this.dataType, data);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n copyFrom(srcBuffer: TgpuBuffer<TData>): void {\n if (this.buffer.mapState === 'mapped') {\n throw new Error('Cannot copy to a mapped buffer.');\n }\n\n const size = sizeOf(this.dataType);\n const encoder = this._group.commandEncoder;\n encoder.copyBufferToBuffer(srcBuffer.buffer, 0, this.buffer, 0, size);\n }\n\n async read(): Promise<Infer<TData>> {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n\n const gpuBuffer = this.buffer;\n const device = this._group.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 if (this._ownBuffer) {\n this._buffer?.destroy();\n }\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 { AnyData, Disarray, LooseDecorated, Unstruct } from './dataTypes';\nimport { mat2x2f, mat3x3f, mat4x4f } from './matrix';\nimport { sizeOf } from './sizeOf';\nimport {\n vec2f,\n vec2h,\n vec2i,\n vec2u,\n vec3f,\n vec3h,\n vec3i,\n vec3u,\n vec4f,\n vec4h,\n vec4i,\n vec4u,\n} from './vector';\nimport type * as wgsl from './wgslTypes';\n\ntype DataWriter<TSchema extends wgsl.BaseWgslData> = (\n output: ISerialOutput,\n schema: TSchema,\n value: Infer<TSchema>,\n) => void;\n\ntype DataReader<TSchema extends wgsl.BaseWgslData> = (\n input: ISerialInput,\n schema: TSchema,\n) => Infer<TSchema>;\n\ntype CompleteDataWriters = {\n [TType in AnyData['type']]: DataWriter<\n Extract<AnyData, { readonly type: TType }>\n >;\n};\n\ntype CompleteDataReaders = {\n [TType in AnyData['type']]: DataReader<\n Extract<AnyData, { readonly type: TType }>\n >;\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 vec2h(output, _, value: wgsl.v2h) {\n output.writeFloat16(value.x);\n output.writeFloat16(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 vec3h(output, _, value: wgsl.v3h) {\n output.writeFloat16(value.x);\n output.writeFloat16(value.y);\n output.writeFloat16(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 vec4h(output, _, value: wgsl.v4h) {\n output.writeFloat16(value.x);\n output.writeFloat16(value.y);\n output.writeFloat16(value.z);\n output.writeFloat16(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 uint8(output, _, value: number) {\n output.writeUint8(value);\n },\n uint8x2(output, _, value: wgsl.v2u) {\n output.writeUint8(value.x);\n output.writeUint8(value.y);\n },\n uint8x4(output, _, value: wgsl.v4u) {\n output.writeUint8(value.x);\n output.writeUint8(value.y);\n output.writeUint8(value.z);\n output.writeUint8(value.w);\n },\n sint8(output, _, value: number) {\n output.writeInt8(value);\n },\n sint8x2(output, _, value: wgsl.v2i) {\n output.writeInt8(value.x);\n output.writeInt8(value.y);\n },\n sint8x4(output, _, value: wgsl.v4i) {\n output.writeInt8(value.x);\n output.writeInt8(value.y);\n output.writeInt8(value.z);\n output.writeInt8(value.w);\n },\n unorm8(output, _, value: number) {\n output.writeUint8(value * 255);\n },\n unorm8x2(output, _, value: wgsl.v2f) {\n output.writeUint8(value.x * 255);\n output.writeUint8(value.y * 255);\n },\n unorm8x4(output, _, value: wgsl.v4f) {\n output.writeUint8(value.x * 255);\n output.writeUint8(value.y * 255);\n output.writeUint8(value.z * 255);\n output.writeUint8(value.w * 255);\n },\n snorm8(output, _, value: number) {\n output.writeUint8(value * 127 + 128);\n },\n snorm8x2(output, _, value: wgsl.v2f) {\n output.writeUint8(value.x * 127 + 128);\n output.writeUint8(value.y * 127 + 128);\n },\n snorm8x4(output, _, value: wgsl.v4f) {\n output.writeUint8(value.x * 127 + 128);\n output.writeUint8(value.y * 127 + 128);\n output.writeUint8(value.z * 127 + 128);\n output.writeUint8(value.w * 127 + 128);\n },\n uint16(output, _, value: number) {\n output.writeUint16(value);\n },\n uint16x2(output, _, value: wgsl.v2u) {\n output.writeUint16(value.x);\n output.writeUint16(value.y);\n },\n uint16x4(output, _, value: wgsl.v4u) {\n output.writeUint16(value.x);\n output.writeUint16(value.y);\n output.writeUint16(value.z);\n output.writeUint16(value.w);\n },\n sint16(output, _, value: number) {\n output.writeInt16(value);\n },\n sint16x2(output, _, value: wgsl.v2i) {\n output.writeInt16(value.x);\n output.writeInt16(value.y);\n },\n sint16x4(output, _, value: wgsl.v4i) {\n output.writeInt16(value.x);\n output.writeInt16(value.y);\n output.writeInt16(value.z);\n output.writeInt16(value.w);\n },\n unorm16(output, _, value: number) {\n output.writeUint16(value * 65535);\n },\n unorm16x2(output, _, value: wgsl.v2f) {\n output.writeUint16(value.x * 65535);\n output.writeUint16(value.y * 65535);\n },\n unorm16x4(output, _, value: wgsl.v4f) {\n output.writeUint16(value.x * 65535);\n output.writeUint16(value.y * 65535);\n output.writeUint16(value.z * 65535);\n output.writeUint16(value.w * 65535);\n },\n snorm16(output, _, value: number) {\n output.writeUint16(value * 32767 + 32768);\n },\n snorm16x2(output, _, value: wgsl.v2f) {\n output.writeUint16(value.x * 32767 + 32768);\n output.writeUint16(value.y * 32767 + 32768);\n },\n snorm16x4(output, _, value: wgsl.v4f) {\n output.writeUint16(value.x * 32767 + 32768);\n output.writeUint16(value.y * 32767 + 32768);\n output.writeUint16(value.z * 32767 + 32768);\n output.writeUint16(value.w * 32767 + 32768);\n },\n float16(output, _, value: number) {\n output.writeFloat16(value);\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 'unorm8x4-bgra'(output, _, value: wgsl.v4f) {\n output.writeUint8(value.z * 255);\n output.writeUint8(value.y * 255);\n output.writeUint8(value.x * 255);\n output.writeUint8(value.w * 255);\n },\n\n disarray(output, schema: Disarray, 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 unstruct(output, schema: Unstruct, 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): boolean {\n return input.readBool();\n },\n\n f32(input: ISerialInput): number {\n return input.readFloat32();\n },\n\n f16(input: ISerialInput): number {\n return input.readFloat16();\n },\n\n i32(input: ISerialInput): number {\n return input.readInt32();\n },\n\n u32(input: ISerialInput): number {\n return input.readUint32();\n },\n\n vec2f(input: ISerialInput): wgsl.v2f {\n return vec2f(input.readFloat32(), input.readFloat32());\n },\n\n vec3f(input: ISerialInput): wgsl.v3f {\n return vec3f(input.readFloat32(), input.readFloat32(), input.readFloat32());\n },\n\n vec4f(input: ISerialInput): wgsl.v4f {\n return vec4f(\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n );\n },\n\n vec2h(input): wgsl.v2h {\n return vec2h(input.readFloat16(), input.readFloat16());\n },\n\n vec3h(input: ISerialInput): wgsl.v3h {\n return vec3h(input.readFloat16(), input.readFloat16(), input.readFloat16());\n },\n\n vec4h(input: ISerialInput): wgsl.v4h {\n return vec4h(\n input.readFloat16(),\n input.readFloat16(),\n input.readFloat16(),\n input.readFloat16(),\n );\n },\n\n vec2i(input): wgsl.v2i {\n return vec2i(input.readInt32(), input.readInt32());\n },\n\n vec3i(input: ISerialInput): wgsl.v3i {\n return vec3i(input.readInt32(), input.readInt32(), input.readInt32());\n },\n\n vec4i(input: ISerialInput): wgsl.v4i {\n return vec4i(\n input.readInt32(),\n input.readInt32(),\n input.readInt32(),\n input.readInt32(),\n );\n },\n\n vec2u(input): wgsl.v2u {\n return vec2u(input.readUint32(), input.readUint32());\n },\n\n vec3u(input: ISerialInput): wgsl.v3u {\n return vec3u(input.readUint32(), input.readUint32(), input.readUint32());\n },\n\n vec4u(input: ISerialInput): wgsl.v4u {\n return vec4u(\n input.readUint32(),\n input.readUint32(),\n input.readUint32(),\n input.readUint32(),\n );\n },\n\n mat2x2f(input: ISerialInput): wgsl.m2x2f {\n return mat2x2f(\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n input.readFloat32(),\n );\n },\n\n mat3x3f(input: ISerialInput): wgsl.m3x3f {\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): wgsl.m4x4f {\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 uint8: (i) => i.readUint8(),\n uint8x2: (i) => vec2u(i.readUint8(), i.readUint8()),\n uint8x4: (i) =>\n vec4u(i.readUint8(), i.readUint8(), i.readUint8(), i.readUint8()),\n sint8: (i) => i.readInt8(),\n sint8x2: (i) => {\n return vec2i(i.readInt8(), i.readInt8());\n },\n sint8x4: (i) => vec4i(i.readInt8(), i.readInt8(), i.readInt8(), i.readInt8()),\n unorm8: (i) => i.readUint8() / 255,\n unorm8x2: (i) => vec2f(i.readUint8() / 255, i.readUint8() / 255),\n unorm8x4: (i) =>\n vec4f(\n i.readUint8() / 255,\n i.readUint8() / 255,\n i.readUint8() / 255,\n i.readUint8() / 255,\n ),\n snorm8: (i) => (i.readUint8() - 128) / 127,\n snorm8x2: (i) =>\n vec2f((i.readUint8() - 128) / 127, (i.readUint8() - 128) / 127),\n snorm8x4: (i) =>\n vec4f(\n (i.readUint8() - 128) / 127,\n (i.readUint8() - 128) / 127,\n (i.readUint8() - 128) / 127,\n (i.readUint8() - 128) / 127,\n ),\n uint16: (i) => i.readUint16(),\n uint16x2: (i) => vec2u(i.readUint16(), i.readUint16()),\n uint16x4: (i) =>\n vec4u(i.readUint16(), i.readUint16(), i.readUint16(), i.readUint16()),\n sint16: (i) => i.readInt16(),\n sint16x2: (i) => vec2i(i.readInt16(), i.readInt16()),\n sint16x4: (i) =>\n vec4i(i.readInt16(), i.readInt16(), i.readInt16(), i.readInt16()),\n unorm16: (i) => i.readUint16() / 65535,\n unorm16x2: (i) => vec2f(i.readUint16() / 65535, i.readUint16() / 65535),\n unorm16x4: (i) =>\n vec4f(\n i.readUint16() / 65535,\n i.readUint16() / 65535,\n i.readUint16() / 65535,\n i.readUint16() / 65535,\n ),\n snorm16: (i) => (i.readUint16() - 32768) / 32767,\n snorm16x2: (i): wgsl.v2f =>\n vec2f(dataReaders.snorm16(i), dataReaders.snorm16(i)),\n snorm16x4: (i): wgsl.v4f =>\n vec4f(\n dataReaders.snorm16(i),\n dataReaders.snorm16(i),\n dataReaders.snorm16(i),\n dataReaders.snorm16(i),\n ),\n float16(i) {\n return i.readFloat16();\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 'unorm8x4-bgra'(i) {\n const b = i.readByte() / 255;\n const g = i.readByte() / 255;\n const r = i.readByte() / 255;\n const a = i.readByte() / 255;\n return vec4f(r, g, b, a);\n },\n\n unstruct(input, schema: Unstruct) {\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 disarray(input, schema: Disarray) {\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;\n\nexport function readData<TData extends wgsl.BaseWgslData>(\n input: ISerialInput,\n schema: TData,\n): Infer<TData> {\n const reader = (dataReaders as Record<string, unknown>)[\n schema.type\n ] as DataReader<TData>;\n if (!reader) {\n throw new Error(`Cannot read data of type '${schema.type}'.`);\n }\n\n return reader(input, schema);\n}\n","export interface NotAllowed<TMsg> {\n reason: TMsg;\n}\n\nexport type ExtensionGuard<TFlag, TMsg, TAllowed> = boolean extends TFlag\n ? NotAllowed<TMsg> | TAllowed\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 SelfResolvable,\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 = BaseWgslData,\n TUsage extends BindableBufferUsage = BindableBufferUsage,\n> {\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>, SelfResolvable\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>, SelfResolvable\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, SelfResolvable } 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, SelfResolvable {\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\n }\n}\n\nexport class TgpuLaidOutComparisonSamplerImpl\n implements TgpuComparisonSampler, SelfResolvable\n{\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass TgpuFixedSamplerImpl implements TgpuFixedSampler, SelfResolvable {\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass TgpuFixedComparisonSamplerImpl\n implements TgpuFixedComparisonSampler, SelfResolvable\n{\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\n }\n}\n","import type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type { ResolutionCtx, SelfResolvable } 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\n implements TgpuExternalTexture, SelfResolvable\n{\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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\ntype TexelFormatToStringChannels = {\n [Key in keyof TexelFormatToChannelType]: TexelFormatToChannelType[Key]['type'];\n};\ntype KeysWithValue<T extends Record<string, unknown>, TValue> = keyof {\n [Key in keyof T as T[Key] extends TValue ? Key : never]: Key;\n};\nexport type ChannelTypeToLegalFormats = {\n [Key in TexelFormatToChannelType[keyof TexelFormatToChannelType]['type']]: KeysWithValue<\n TexelFormatToStringChannels,\n Key\n >;\n};\n\nexport type SampleTypeToStringChannelType = {\n float: 'f32';\n 'unfilterable-float': 'f32';\n depth: 'f32';\n sint: 'i32';\n uint: 'u32';\n};\n\nexport type ViewDimensionToDimension = {\n '1d': '1d';\n '2d': '2d';\n '2d-array': '2d';\n '3d': '3d';\n cube: '2d';\n 'cube-array': '2d';\n};\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 as F32,\n 'unfilterable-float': f32 as F32,\n uint: u32 as U32,\n sint: i32 as I32,\n depth: f32 as F32, // I guess?\n};\nexport type ChannelFormatToSchema = typeof channelFormatToSchema;\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 { TgpuNamable } from '../../namable';\nimport type { Default } from '../../shared/utilityTypes';\nimport type { UnionToIntersection } from '../../shared/utilityTypes';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type { ResolutionCtx, SelfResolvable } 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\ntype ResolveStorageDimension<\n TDimension extends GPUTextureViewDimension,\n TProps extends TextureProps,\n> = StorageTextureDimension extends TDimension\n ? Default<TProps['dimension'], '2d'>\n : TDimension extends StorageTextureDimension\n ? TDimension\n : '2d';\n\ntype ViewUsages<\n TProps extends TextureProps,\n TTexture extends TgpuTexture<TProps>,\n> = boolean extends TTexture['usableAsSampled']\n ? boolean extends TTexture['usableAsStorage']\n ? never\n : 'readonly' | 'writeonly' | 'mutable'\n : boolean extends TTexture['usableAsStorage']\n ? 'sampled'\n : 'readonly' | 'writeonly' | 'mutable' | 'sampled';\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 createView<\n TUsage extends ViewUsages<TProps, this>,\n TDimension extends 'sampled' extends TUsage\n ? GPUTextureViewDimension\n : StorageTextureDimension,\n TFormat extends 'sampled' extends TUsage\n ? SampledFormatOptions<TProps>\n : StorageFormatOptions<TProps>,\n >(\n access: TUsage,\n params?: TextureViewParams<TDimension, TFormat>,\n ): {\n mutable: TgpuMutableTexture<\n ResolveStorageDimension<TDimension, TProps>,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >;\n readonly: TgpuReadonlyTexture<\n ResolveStorageDimension<TDimension, TProps>,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >;\n writeonly: TgpuWriteonlyTexture<\n ResolveStorageDimension<TDimension, TProps>,\n TexelFormatToDataTypeOrNever<\n StorageFormatOptions<TProps> extends TFormat\n ? TProps['format']\n : TFormat\n >\n >;\n sampled: 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 }[TUsage];\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_TgpuFixedStorageTexture\n extends SelfResolvable,\n TgpuNamable {\n unwrap(): GPUTextureView;\n}\n\nexport interface INTERNAL_TgpuLaidOutStorageTexture extends SelfResolvable {}\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 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 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 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> {\n readonly resourceType: 'texture-sampled-view';\n readonly dimension: TDimension;\n readonly channelDataType: TData;\n}\n\nexport interface INTERNAL_TgpuFixedSampledTexture\n extends SelfResolvable,\n TgpuNamable {\n unwrap(): GPUTextureView;\n}\n\nexport interface INTERNAL_TgpuLaidOutSampledTexture extends SelfResolvable {}\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 createView(\n access: 'mutable' | 'readonly' | 'writeonly' | 'sampled',\n params?: TextureViewParams<GPUTextureViewDimension, GPUTextureFormat>,\n ) {\n if (access === 'sampled') {\n return this._asSampled(params);\n }\n\n const storageParams = params as TextureViewParams<\n StorageTextureDimension,\n StorageTextureTexelFormat\n >;\n\n switch (access) {\n case 'mutable':\n return this._asMutable(storageParams);\n case 'readonly':\n return this._asReadonly(storageParams);\n case 'writeonly':\n return this._asWriteonly(storageParams);\n }\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 private _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 private _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 private _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 private _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_TgpuFixedStorageTexture\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 & 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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\n }\n}\n\nexport class TgpuLaidOutStorageTextureImpl\n implements TgpuStorageTexture, INTERNAL_TgpuLaidOutStorageTexture\n{\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass TgpuFixedSampledTextureImpl\n implements TgpuSampledTexture, INTERNAL_TgpuFixedSampledTexture\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 & 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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\n }\n}\n\nexport class TgpuLaidOutSampledTextureImpl\n implements TgpuSampledTexture, INTERNAL_TgpuLaidOutSampledTexture\n{\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 toString() {\n return `${this.resourceType}:${this.label ?? '<unnamed>'}`;\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 type TgpuComparisonSampler,\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 type TgpuWriteonlyTexture,\n isTexture,\n} from './core/texture/texture';\nimport type {\n SampleTypeToStringChannelType,\n ViewDimensionToDimension,\n} from './core/texture/textureFormats';\nimport type {\n ChannelFormatToSchema,\n ChannelTypeToLegalFormats,\n StorageTextureTexelFormat,\n TexelFormatToDataType,\n} from './core/texture/textureFormats';\nimport type { TextureProps } from './core/texture/textureProps';\nimport {\n NotSampledError,\n type Sampled,\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 { Default, 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: 'filtering' | 'non-filtering';\n};\n\nexport type TgpuLayoutComparisonSampler = TgpuLayoutEntryBase & {\n sampler: 'comparison';\n};\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 | TgpuLayoutComparisonSampler\n | TgpuLayoutTexture\n | TgpuLayoutStorageTexture\n | TgpuLayoutExternalTexture;\n\ntype UnwrapRuntimeConstructorInner<\n T extends BaseWgslData | ((_: number) => BaseWgslData),\n> = T extends (_: number) => BaseWgslData ? ReturnType<T> : T;\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 /**\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 /**\n * @deprecated Use the `root.createBindGroup` API instead, accessible through `await tgpu.init()`\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\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\ntype GetUsageForStorageTexture<\n T extends TgpuLayoutStorageTexture,\n TAccess extends 'readonly' | 'writeonly' | 'mutable',\n> = {\n mutable: TgpuMutableTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n TexelFormatToDataType[T['storageTexture']]\n >;\n readonly: TgpuReadonlyTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n TexelFormatToDataType[T['storageTexture']]\n >;\n writeonly: TgpuWriteonlyTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n TexelFormatToDataType[T['storageTexture']]\n >;\n}[TAccess];\n\ntype StorageTextureUsageForEntry<T extends TgpuLayoutStorageTexture> =\n T extends unknown\n ? GetUsageForStorageTexture<T, Default<T['access'], 'writeonly'>>\n : never;\n\ntype GetDimension<T extends GPUTextureViewDimension | undefined> =\n T extends keyof ViewDimensionToDimension\n ? ViewDimensionToDimension[T]\n : undefined;\n\ntype GetTextureRestriction<T extends TgpuLayoutTexture> = Default<\n GetDimension<T['viewDimension']>,\n '2d'\n> extends infer Dimension\n ? Dimension extends '2d'\n ? {\n format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];\n dimension?: Dimension;\n }\n : {\n format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];\n dimension: Dimension;\n }\n : never;\n\ntype GetStorageTextureRestriction<T extends TgpuLayoutStorageTexture> = Default<\n GetDimension<T['viewDimension']>,\n '2d'\n> extends infer Dimension\n ? Dimension extends '2d'\n ? {\n format: T['storageTexture'];\n dimension?: Dimension;\n }\n : {\n format: T['storageTexture'];\n dimension: Dimension;\n }\n : never;\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 ? TgpuSampler | GPUSampler\n : T extends TgpuLayoutComparisonSampler\n ? TgpuComparisonSampler | GPUSampler\n : T extends TgpuLayoutTexture\n ?\n | GPUTextureView\n | (Sampled &\n TgpuTexture<\n Prettify<TextureProps & GetTextureRestriction<T>>\n >)\n : T extends TgpuLayoutStorageTexture\n ?\n | GPUTextureView\n | (Storage &\n TgpuTexture<\n Prettify<TextureProps & GetStorageTextureRestriction<T>>\n >)\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 : T extends TgpuLayoutComparisonSampler\n ? TgpuComparisonSampler\n : T extends TgpuLayoutTexture\n ? TgpuSampledTexture<\n Default<GetDimension<T['viewDimension']>, '2d'>,\n ChannelFormatToSchema[T['texture']]\n >\n : T extends TgpuLayoutStorageTexture\n ? StorageTextureUsageForEntry<T>\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 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 TgpuBindGroupLayout<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\nexport class 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 as TgpuTexture & Sampled).createView('sampled'),\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 as TgpuTexture & Storage).createView('readonly'),\n );\n } else if (entry.access === 'mutable') {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & Storage).createView('mutable'),\n );\n } else {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & Storage).createView('writeonly'),\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 {\n type Eventual,\n type SlotValuePair,\n type TgpuDerived,\n type TgpuSlot,\n isDerived,\n isSlot,\n} from './core/slot/slotTypes';\nimport {\n type AnyWgslData,\n type BaseWgslData,\n isWgslArray,\n isWgslData,\n isWgslStruct,\n} from './data/wgslTypes';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { provideCtx } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { naturalsExcept } from './shared/generators';\nimport type { Infer } from './shared/repr';\nimport { generateFunction } from './smol';\nimport {\n type TgpuBindGroup,\n TgpuBindGroupImpl,\n type TgpuBindGroupLayout,\n type TgpuLayoutEntry,\n bindGroupLayout,\n} from './tgpuBindGroupLayout';\nimport type { FnToWgslOptions, ResolutionCtx, Resource, Wgsl } from './types';\nimport { UnknownData, isSelfResolvable, isWgsl } 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 item does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n object,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n private readonly _memoizedDerived = new WeakMap<\n // WeakMap because if the \"derived\" does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n TgpuDerived<unknown>,\n { slotToValueMap: SlotToValueMap; result: unknown }[]\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 withSlots<T>(pairs: SlotValuePair<unknown>[], callback: () => T): T {\n this._itemStateStack.pushSlotBindings(pairs);\n\n try {\n return callback();\n } finally {\n this._itemStateStack.pop();\n }\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeEventual = eventual;\n\n // Unwrapping all layers of slots.\n while (true) {\n if (isSlot(maybeEventual)) {\n maybeEventual = this.readSlot(maybeEventual);\n } else if (isDerived(maybeEventual)) {\n maybeEventual = this._getOrCompute(maybeEventual);\n } else {\n break;\n }\n }\n\n return maybeEventual;\n }\n\n _getOrCompute<T>(derived: TgpuDerived<T>): T {\n // All memoized versions of `derived`\n const instances = this._memoizedDerived.get(derived) ?? [];\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(([slot, expectedValue]) =>\n slot.areEqual(this._itemStateStack.readSlot(slot), expectedValue),\n )\n ) {\n return instance.result as T;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n const result = derived['~compute']();\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._memoizedDerived.set(derived, instances);\n\n return result;\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(derived);\n }\n\n throw new ResolutionError(err, [derived]);\n } finally {\n this._itemStateStack.pop();\n }\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: object): 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(([slot, expectedValue]) =>\n slot.areEqual(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 let result: string;\n if (isWgslData(item)) {\n result = resolveData(this, item);\n } else if (isDerived(item) || isSlot(item)) {\n result = this.resolve(item);\n } else if (isSelfResolvable(item)) {\n result = item['~resolve'](this);\n } else {\n result = this.resolveValue(item);\n }\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(eventualItem: unknown): string {\n const item = this.unwrap(eventualItem);\n\n if ((item && typeof item === 'object') || typeof item === 'function') {\n if (this._itemStateStack.itemDepth === 0) {\n const result = provideCtx(this, () => this._getOrInstantiate(item));\n return `${[...this._declarations].join('\\n\\n')}${result}`;\n }\n\n return this._getOrInstantiate(item);\n }\n\n return String(item);\n }\n\n resolveValue<T extends BaseWgslData>(\n value: Infer<T>,\n schema?: T | undefined,\n ): string {\n if (isWgsl(value)) {\n return this.resolve(value);\n }\n\n if (schema && isWgslArray(schema)) {\n return `array(${(value as unknown[]).map((element) => this.resolveValue(element, schema.elementType))})`;\n }\n\n if (Array.isArray(value)) {\n return `array(${value.map((element) => this.resolveValue(element))})`;\n }\n\n if (schema && isWgslStruct(schema)) {\n return `${this.resolve(schema)}(${Object.entries(schema.propTypes).map(([key, type_]) => this.resolveValue((value as Infer<typeof schema>)[key], type_))})`;\n }\n\n throw new Error(\n `Value ${value} (as json: ${JSON.stringify(value)}) of schema ${schema} is not resolvable to WGSL`,\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 new TgpuBindGroupImpl(\n catchallLayout,\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","import type { JitTranspiler } from '../../jitTranspiler';\nimport { RandomNameRegistry, StrictNameRegistry } from '../../nameRegistry';\nimport { resolve as resolveImpl } from '../../resolutionCtx';\nimport type { SelfResolvable, Wgsl } from '../../types';\nimport { applyExternals, replaceExternalsInWgsl } from './externals';\n\nexport interface TgpuResolveOptions {\n /**\n * Map of external names to their resolvable values.\n */\n externals: Record<string, Wgsl | object>;\n /**\n * The code template to use for the resolution. All external names will be replaced with their resolved values.\n * @default ''\n */\n template?: string | undefined;\n /**\n * The naming strategy used for generating identifiers for resolved externals and their dependencies.\n * @default 'random'\n */\n names?: 'strict' | 'random' | undefined;\n /**\n * Optional JIT transpiler for resolving TGSL functions.\n * @experimental\n */\n unstable_jitTranspiler?: JitTranspiler | undefined;\n}\n\n/**\n * Resolves a template with external values. Each external will get resolved to a code string and replaced in the template.\n * Any dependencies of the externals will also be resolved and included in the output.\n * @param options - The options for the resolution.\n *\n * @returns The resolved code.\n *\n * @example\n * ```ts\n * const Gradient = d.struct({\n * from: d.vec3f,\n * to: d.vec3f,\n * });\n *\n * const resolved = tgpu.resolve({\n * template: `\n * fn getGradientAngle(gradient: Gradient) -> f32 {\n * return atan(gradient.to.y - gradient.from.y, gradient.to.x - gradient.from.x);\n * }\n * `,\n * externals: {\n * Gradient,\n * },\n * });\n *\n * console.log(resolved);\n * // struct Gradient_0 {\n * // from: vec3f,\n * // to: vec3f,\n * // }\n * // fn getGradientAngle(gradient: Gradient_0) -> f32 {\n * // return atan(gradient.to.y - gradient.from.y, gradient.to.x - gradient.from.x);\n * // }\n * ```\n */\nexport function resolve(options: TgpuResolveOptions): string {\n const {\n externals,\n template,\n names,\n unstable_jitTranspiler: jitTranspiler,\n } = options;\n\n const dependencies = {} as Record<string, Wgsl>;\n applyExternals(dependencies, externals ?? {});\n\n const resolutionObj: SelfResolvable = {\n '~resolve'(ctx) {\n return replaceExternalsInWgsl(ctx, dependencies, template ?? '');\n },\n\n toString: () => '<root>',\n };\n\n const { code } = resolveImpl(resolutionObj, {\n names:\n names === 'strict' ? new StrictNameRegistry() : new RandomNameRegistry(),\n 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 { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\nimport type { TgpuSlot } from '../slot/slotTypes';\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.withSlots(this._slotBindings, () => {\n ctx.resolve(this._entryFn);\n });\n return '';\n },\n\n toString: () => `computePipeline:${this.label ?? '<unnamed>'}`,\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, isUnstruct } from '../../data/dataTypes';\nimport type { Disarray } 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 { Labelled } from '../../types';\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 | Disarray = WgslArray | Disarray,\n> extends TgpuNamable,\n Labelled {\n readonly resourceType: 'vertex-layout';\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 | Disarray>(\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 | Disarray,\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 (isUnstruct(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 | Disarray>\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 isColorAttachment(\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 (!isColorAttachment(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 { Disarray } from '../../data/dataTypes';\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 type TgpuLayoutEntry,\n isBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\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 { TgpuSlot } from '../slot/slotTypes';\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 | Disarray>(\n vertexLayout: TgpuVertexLayout<TData>,\n buffer: TgpuBuffer<TData> & Vertex,\n ): TgpuRenderPipeline<IOLayout>;\n with<Entries extends Record<string, TgpuLayoutEntry | null>>(\n bindGroupLayout: TgpuBindGroupLayout<Entries>,\n bindGroup: TgpuBindGroup<Entries>,\n ): TgpuRenderPipeline<IOLayout>;\n\n withColorAttachment(\n attachment: FragmentOutToColorAttachment<Output>,\n ): TgpuRenderPipeline<IOLayout>;\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.withSlots(slotBindings, () => {\n ctx.resolve(vertexFn);\n ctx.resolve(fragmentFn);\n });\n return '';\n },\n\n toString: () => `renderPipeline:${this.label ?? '<unnamed>'}`,\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 const descriptor: GPURenderPipelineDescriptor = {\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 };\n\n if (this.label !== undefined) {\n descriptor.label = this.label;\n }\n\n if (primitiveState) {\n descriptor.primitive = primitiveState;\n }\n\n this._memo = {\n pipeline: device.createRenderPipeline(descriptor),\n bindGroupLayouts,\n catchall,\n };\n }\n\n return this._memo;\n }\n}\n","import type { OmitBuiltins } from '../../builtin';\nimport type { AnyWgslData } from '../../data';\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 LayoutEntryToInput,\n TgpuBindGroup,\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n} from '../../tgpuBindGroupLayout';\nimport {\n TgpuBindGroupImpl,\n isBindGroup,\n isBindGroupLayout,\n} from '../../tgpuBindGroupLayout';\nimport {\n INTERNAL_createBuffer,\n type TgpuBuffer,\n isBuffer,\n} from '../buffer/buffer';\nimport type { TgpuBufferUsage } from '../buffer/bufferUsage';\nimport type { IOLayout } from '../function/fnTypes';\nimport type { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { TgpuFn } from '../function/tgpuFn';\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 TgpuAccessor,\n type TgpuSlot,\n isAccessor,\n} from '../slot/slotTypes';\nimport {\n type INTERNAL_TgpuFixedSampledTexture,\n type INTERNAL_TgpuFixedStorageTexture,\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 extends AnyWgslData>(\n slot: TgpuSlot<T> | TgpuAccessor<T>,\n value: T | TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>,\n ): WithBinding {\n return new WithBindingImpl(this._getRoot, [\n ...this._slotBindings,\n [isAccessor(slot) ? slot.slot : 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 | undefined): 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\n extends WithBindingImpl\n implements TgpuRoot, ExperimentalTgpuRoot\n{\n '~unstable': Omit<ExperimentalTgpuRoot, keyof TgpuRoot>;\n\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 this['~unstable'] = {\n nameRegistry: this.nameRegistry,\n commandEncoder: this.commandEncoder,\n\n createTexture: this.createTexture.bind(this),\n\n with: this.with.bind(this),\n withCompute: this.withCompute.bind(this),\n withVertex: this.withVertex.bind(this),\n\n flush: this.flush.bind(this),\n };\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 = INTERNAL_createBuffer(this, typeSchema, initialOrBuffer);\n this._disposables.push(buffer);\n return buffer;\n }\n\n createBindGroup<\n Entries extends Record<string, TgpuLayoutEntry | null> = Record<\n string,\n TgpuLayoutEntry | null\n >,\n >(\n layout: TgpuBindGroupLayout<Entries>,\n entries: {\n [K in keyof Entries]: LayoutEntryToInput<Entries[K]>;\n },\n ) {\n return new TgpuBindGroupImpl(layout, entries);\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 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 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 // TODO: Verify that `resource` is actually a fixed view, not a laid-out one\n return (resource as unknown as INTERNAL_TgpuFixedStorageTexture).unwrap();\n }\n\n if (isSampledTextureView(resource)) {\n // TODO: Verify that `resource` is actually a fixed view, not a laid-out one\n return (resource as unknown as INTERNAL_TgpuFixedSampledTexture).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","import { getResolutionCtx } from '../../gpuMode';\nimport type { Infer } from '../../shared/repr';\nimport type { TgpuSlot } from './slotTypes';\n\n// ----------\n// Public API\n// ----------\n\nexport function slot<T>(defaultValue?: T): TgpuSlot<T> {\n return new TgpuSlotImpl(defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuSlotImpl<T> implements TgpuSlot<T> {\n readonly resourceType = 'slot';\n public label?: string | undefined;\n\n constructor(public defaultValue: T | undefined = undefined) {}\n\n $name(label: string) {\n this.label = label;\n return this;\n }\n\n areEqual(a: T, b: T): boolean {\n return Object.is(a, b);\n }\n\n toString(): string {\n return `slot:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Infer<T> {\n const ctx = getResolutionCtx();\n if (!ctx) {\n throw new Error(`Cannot access tgpu.slot's value outside of resolution.`);\n }\n\n return ctx.unwrap(this) as Infer<T>;\n }\n}\n","import type { AnyWgslData } from '../../data';\nimport type { Exotic } from '../../data/exotic';\nimport { getResolutionCtx } from '../../gpuMode';\nimport type { Infer } from '../../shared/repr';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport { type TgpuBufferUsage, isBufferUsage } from '../buffer/bufferUsage';\nimport { type TgpuFn, isTgpuFn } from '../function/tgpuFn';\nimport { slot } from './slot';\nimport type { TgpuAccessor, TgpuSlot } from './slotTypes';\n\n// ----------\n// Public API\n// ----------\n\nexport function accessor<T extends AnyWgslData>(\n schema: T,\n defaultValue?:\n | TgpuFn<[], Exotic<T>>\n | TgpuBufferUsage<Exotic<T>>\n | Infer<Exotic<T>>,\n): TgpuAccessor<Exotic<T>> {\n return new TgpuAccessorImpl(schema as Exotic<T>, defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nexport class TgpuAccessorImpl<T extends AnyWgslData>\n implements TgpuAccessor<T>, SelfResolvable\n{\n readonly resourceType = 'accessor';\n public label?: string | undefined;\n public slot: TgpuSlot<TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>>;\n\n constructor(\n public readonly schema: T,\n public readonly defaultValue:\n | TgpuFn<[], T>\n | TgpuBufferUsage<T>\n | Infer<T>\n | undefined = undefined,\n ) {\n this.slot = slot(defaultValue);\n }\n\n $name(label: string) {\n this.label = label;\n this.slot.$name(label);\n return this;\n }\n\n toString(): string {\n return `accessor:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Infer<T> {\n const ctx = getResolutionCtx();\n if (!ctx) {\n throw new Error(\n `Cannot access tgpu.accessor's value outside of resolution.`,\n );\n }\n\n return this as unknown as Infer<T>;\n }\n\n '~resolve'(ctx: ResolutionCtx): string {\n const value = ctx.unwrap(this.slot);\n\n if (isBufferUsage(value)) {\n return ctx.resolve(value);\n }\n\n if (isTgpuFn(value)) {\n return `${ctx.resolve(value)}()`;\n }\n\n return ctx.resolveValue(value as Infer<T>, this.schema);\n }\n}\n","import { getResolutionCtx } from '../../gpuMode';\nimport type { Infer } from '../../shared/repr';\nimport type {\n Eventual,\n SlotValuePair,\n TgpuDerived,\n TgpuSlot,\n} from './slotTypes';\n\n// ----------\n// Public API\n// ----------\n\nexport function derived<T>(compute: () => T): TgpuDerived<T> {\n return createDerived(compute);\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createDerived<T>(compute: () => T): TgpuDerived<T> {\n const result = {\n resourceType: 'derived' as const,\n '~compute': compute,\n\n get value(): Infer<T> {\n const ctx = getResolutionCtx();\n if (!ctx) {\n throw new Error(\n `Cannot access tgpu.derived's value outside of resolution.`,\n );\n }\n\n return ctx.unwrap(this) as Infer<T>;\n },\n\n with<TValue>(\n slot: TgpuSlot<TValue>,\n value: Eventual<TValue>,\n ): TgpuDerived<T> {\n return createBoundDerived(compute, this, [slot, value]);\n },\n\n toString(): string {\n return 'derived';\n },\n };\n\n return result;\n}\n\nfunction createBoundDerived<T>(\n compute: () => T,\n innerDerived: TgpuDerived<T>,\n slotValuePair: SlotValuePair<unknown>,\n): TgpuDerived<T> {\n const result = {\n resourceType: 'derived' as const,\n '~compute'() {\n const ctx = getResolutionCtx();\n if (!ctx) {\n throw new Error(\n `Cannot access tgpu.derived's value outside of resolution.`,\n );\n }\n\n return ctx.withSlots([slotValuePair], () => ctx.unwrap(innerDerived));\n },\n\n get value(): Infer<T> {\n const ctx = getResolutionCtx();\n if (!ctx) {\n throw new Error(\n `Cannot access tgpu.derived's value outside of resolution.`,\n );\n }\n\n return ctx.unwrap(this) as Infer<T>;\n },\n\n with<TValue>(\n slot: TgpuSlot<TValue>,\n value: Eventual<TValue>,\n ): TgpuDerived<T> {\n return createBoundDerived(compute, this, [slot, value]);\n },\n\n toString(): string {\n const [slot, value] = slotValuePair;\n return `derived[${slot.label ?? '<unnamed>'}=${value}]`;\n },\n };\n\n return result;\n}\n","import type { Exotic } from '../../data/exotic';\nimport type { AnyWgslData } from '../../data/wgslTypes';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\n\n// ----------\n// Public API\n// ----------\n\nexport type VariableScope = 'private' | 'workgroup';\n\nexport interface TgpuVar<\n TScope extends VariableScope = VariableScope,\n TDataType extends AnyWgslData = AnyWgslData,\n> extends TgpuNamable {\n value: Infer<TDataType>;\n readonly scope: TScope;\n}\n\n/**\n * Defines a variable scoped to each entry function (private).\n *\n * @param dataType The schema of the held data's type\n * @param initialValue If not provided, the variable will be initialized to the dataType's \"zero-value\".\n */\nexport function privateVar<TDataType extends AnyWgslData>(\n dataType: Exotic<TDataType>,\n initialValue?: Infer<Exotic<TDataType>>,\n): TgpuVar<'private', Exotic<TDataType>> {\n return new TgpuVarImpl('private', dataType, initialValue);\n}\n\n/**\n * Defines a variable scoped to the whole workgroup, shared between entry functions\n * of the same invocation.\n *\n * @param dataType The schema of the held data's type\n */\nexport function workgroupVar<TDataType extends AnyWgslData>(\n dataType: TDataType,\n): TgpuVar<'workgroup', TDataType> {\n return new TgpuVarImpl('workgroup', dataType);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuVarImpl<TScope extends VariableScope, TDataType extends AnyWgslData>\n implements TgpuVar<TScope, TDataType>, SelfResolvable\n{\n private _label: string | undefined;\n\n constructor(\n readonly scope: TScope,\n private readonly _dataType: TDataType,\n private readonly _initialValue?: Infer<TDataType> | undefined,\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 if (this._initialValue) {\n ctx.addDeclaration(\n `var<${this.scope}> ${id}: ${ctx.resolve(this._dataType)} = ${ctx.resolveValue(this._initialValue, this._dataType)};`,\n );\n } else {\n ctx.addDeclaration(\n `var<${this.scope}> ${id}: ${ctx.resolve(this._dataType)};`,\n );\n }\n\n return id;\n }\n\n get label() {\n return this._label;\n }\n\n toString() {\n return `var:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): Infer<TDataType> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access tgpu.var's value directly in JS.`);\n }\n return this as Infer<TDataType>;\n }\n}\n","/**\n * @module typegpu\n */\n\nimport { constant } from './core/constant/tgpuConstant';\nimport { declare } from './core/declare/tgpuDeclare';\nimport { assignAst } from './core/function/astUtils';\nimport { computeFn } from './core/function/tgpuComputeFn';\nimport { fn } from './core/function/tgpuFn';\nimport { fragmentFn } from './core/function/tgpuFragmentFn';\nimport { vertexFn } from './core/function/tgpuVertexFn';\nimport { resolve } from './core/resolve/tgpuResolve';\nimport { init, initFromDevice } from './core/root/init';\nimport { comparisonSampler, sampler } from './core/sampler/sampler';\nimport { accessor } from './core/slot/accessor';\nimport { derived } from './core/slot/derived';\nimport { slot } from './core/slot/slot';\nimport { privateVar, workgroupVar } from './core/variable/tgpuVariable';\nimport { vertexLayout } from './core/vertexLayout/vertexLayout';\nimport { bindGroupLayout } from './tgpuBindGroupLayout';\n\nexport const tgpu = {\n bindGroupLayout,\n\n init,\n initFromDevice,\n\n resolve,\n\n '~unstable': {\n fn,\n fragmentFn,\n vertexFn,\n computeFn,\n vertexLayout,\n derived,\n slot,\n accessor,\n privateVar,\n workgroupVar,\n const: constant,\n declare,\n sampler,\n comparisonSampler,\n },\n};\nexport default tgpu;\n\n// Hidden API, used only by tooling (e.g., rollup plugin).\nObject.assign(tgpu, {\n __assignAst: assignAst,\n});\n\nexport {\n MissingBindGroupError,\n MissingLinksError,\n MissingSlotValueError,\n NotUniformError,\n ResolutionError,\n} from './errors';\nexport { StrictNameRegistry, RandomNameRegistry } from './nameRegistry';\nexport {\n isBuffer,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './core/buffer/buffer';\nexport { isSlot, isDerived } from './core/slot/slotTypes';\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';\nexport {\n asUniform as unstable_asUniform,\n asReadonly as unstable_asReadonly,\n asMutable as unstable_asMutable,\n} from './core/buffer/bufferUsage';\nexport { isTgpuFn } from './core/function/tgpuFn';\n\n// types\n\nexport type {\n TgpuRoot,\n WithBinding,\n WithCompute,\n WithFragment,\n WithVertex,\n} from './core/root/rootTypes';\nexport type { Storage } from './extension';\nexport type { TgpuVertexLayout } from './core/vertexLayout/vertexLayout';\nexport type { TgpuRenderPipeline } from './core/pipeline/renderPipeline';\nexport type { TgpuComputePipeline } from './core/pipeline/computePipeline';\nexport type {\n TgpuBuffer,\n Uniform,\n Vertex,\n TgpuBufferUniform,\n TgpuBufferReadonly,\n TgpuBufferMutable,\n} from './core/buffer/public';\nexport type {\n TgpuSlot,\n TgpuDerived,\n TgpuAccessor,\n Eventual,\n} from './core/slot/slotTypes';\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 { TgpuConst } from './core/constant/tgpuConstant';\nexport type {\n TgpuVar,\n VariableScope,\n} from './core/variable/tgpuVariable';\nexport type { TgpuSampler } from './core/sampler/sampler';\nexport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n TgpuLayoutSampler,\n TgpuLayoutComparisonSampler,\n TgpuLayoutTexture,\n TgpuLayoutStorage,\n TgpuLayoutStorageTexture,\n TgpuLayoutExternalTexture,\n TgpuLayoutUniform,\n BindLayoutEntry,\n LayoutEntryToInput,\n TgpuBindGroup,\n} from './tgpuBindGroupLayout';\nexport type {\n TgpuFn,\n TgpuFnShell,\n} from './core/function/tgpuFn';\nexport type {\n TgpuVertexFnShell,\n TgpuVertexFn,\n} from './core/function/tgpuVertexFn';\nexport type {\n TgpuFragmentFnShell,\n TgpuFragmentFn,\n} from './core/function/tgpuFragmentFn';\nexport type {\n TgpuComputeFnShell,\n TgpuComputeFn,\n} from './core/function/tgpuComputeFn';\nexport type { TgpuDeclare } from './core/declare/tgpuDeclare';\n"]}