typegpu 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.cjs +16 -16
- package/index.cjs.map +1 -1
- package/index.js +16 -16
- package/index.js.map +1 -1
- package/package.json +2 -2
package/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/smol/generationHelpers.ts","../src/core/valueProxyUtils.ts","../src/core/constant/tgpuConstant.ts","../src/namable.ts","../src/core/resolve/externals.ts","../src/core/declare/tgpuDeclare.ts","../src/core/function/astUtils.ts","../src/core/function/fnCore.ts","../src/core/function/ioOutputType.ts","../src/core/function/tgpuComputeFn.ts","../src/core/function/tgpuFn.ts","../src/core/function/tgpuFragmentFn.ts","../src/core/function/tgpuVertexFn.ts","../src/nameRegistry.ts","../src/shared/utilityTypes.ts","../src/core/vertexLayout/connectAttributesToShader.ts","../src/core/resolve/resolveData.ts","../src/smol/wgslGenerator.ts","../src/core/buffer/buffer.ts","../src/data/offsets.ts","../src/data/alignIO.ts","../src/data/compiledIO.ts","../src/data/dataIO.ts","../src/data/partialIO.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/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"],"sourcesContent":["import { isDerived, isSlot } from '../core/slot/slotTypes';\nimport { mat2x2f, mat3x3f, mat4x4f } from '../data/matrix';\nimport {\n abstractFloat,\n abstractInt,\n bool,\n f16,\n f32,\n i32,\n u32,\n} from '../data/numeric';\nimport type { WgslStruct } from '../data/struct';\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 '../data/vector';\nimport {\n type AnyWgslData,\n type BaseData,\n isDecorated,\n isWgslArray,\n isWgslData,\n} from '../data/wgslTypes';\nimport { getResolutionCtx } from '../gpuMode';\nimport { $internal } from '../shared/symbols';\nimport {\n type Resource,\n UnknownData,\n type Wgsl,\n hasInternalDataType,\n} from '../types';\n\nconst swizzleableTypes = [\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 'struct',\n] as const;\n\ntype SwizzleableType = 'f' | 'h' | 'i' | 'u';\ntype SwizzleLength = 1 | 2 | 3 | 4;\n\nconst swizzleLenToType: Record<\n SwizzleableType,\n Record<SwizzleLength, AnyWgslData>\n> = {\n f: {\n 1: f32,\n 2: vec2f,\n 3: vec3f,\n 4: vec4f,\n },\n h: {\n 1: f16,\n 2: vec2h,\n 3: vec3h,\n 4: vec4h,\n },\n i: {\n 1: i32,\n 2: vec2i,\n 3: vec3i,\n 4: vec4i,\n },\n u: {\n 1: u32,\n 2: vec2u,\n 3: vec3u,\n 4: vec4u,\n },\n} as const;\n\nconst kindToSchema = {\n vec2f: vec2f,\n vec2h: vec2h,\n vec2i: vec2i,\n vec2u: vec2u,\n vec3f: vec3f,\n vec3h: vec3h,\n vec3i: vec3i,\n vec3u: vec3u,\n vec4f: vec4f,\n vec4h: vec4h,\n vec4i: vec4i,\n vec4u: vec4u,\n mat2x2f: mat2x2f,\n mat3x3f: mat3x3f,\n mat4x4f: mat4x4f,\n} as const;\n\nconst indexableTypeToResult = {\n vec2f: f32,\n vec2h: f16,\n vec2i: i32,\n vec2u: u32,\n vec3f: f32,\n vec3h: f16,\n vec3i: i32,\n vec3u: u32,\n vec4f: f32,\n vec4h: f16,\n vec4i: i32,\n vec4u: u32,\n mat2x2f: vec2f,\n mat3x3f: vec3f,\n mat4x4f: vec4f,\n} as const;\n\nexport function getTypeForPropAccess(\n targetType: Wgsl,\n propName: string,\n): BaseData | UnknownData {\n if (\n typeof targetType === 'string' ||\n typeof targetType === 'number' ||\n typeof targetType === 'boolean'\n ) {\n return UnknownData;\n }\n\n if (isDerived(targetType) || isSlot(targetType)) {\n const ctx = getResolutionCtx();\n if (!ctx) {\n throw new Error(\n 'Resolution context not found when unwrapping slot or derived',\n );\n }\n const unwrapped = ctx.unwrap(targetType);\n\n return getTypeFromWgsl(unwrapped as Wgsl) as BaseData;\n }\n\n let target = targetType as BaseData;\n\n if (hasInternalDataType(target)) {\n target = target[$internal].dataType;\n }\n while (isDecorated(target)) {\n target = target.inner;\n }\n\n const targetTypeStr =\n 'kind' in target ? (target.kind as string) : target.type;\n\n if (targetTypeStr === 'struct') {\n return (target as WgslStruct).propTypes[propName] ?? UnknownData;\n }\n\n const propLength = propName.length;\n if (\n swizzleableTypes.includes(\n targetTypeStr as (typeof swizzleableTypes)[number],\n ) &&\n propLength >= 1 &&\n propLength <= 4\n ) {\n const swizzleTypeChar = targetTypeStr[4] as SwizzleableType;\n const swizzleType =\n swizzleLenToType[swizzleTypeChar][propLength as SwizzleLength];\n if (swizzleType) {\n return swizzleType;\n }\n }\n\n return isWgslData(target) ? target : UnknownData;\n}\n\nexport function getTypeForIndexAccess(resource: Wgsl): BaseData | UnknownData {\n if (isWgslData(resource)) {\n // array\n if (isWgslArray(resource)) {\n return resource.elementType;\n }\n\n // vector or matrix\n if (resource.type in indexableTypeToResult) {\n return indexableTypeToResult[\n resource.type as keyof typeof indexableTypeToResult\n ];\n }\n }\n\n return UnknownData;\n}\n\nexport function getTypeFromWgsl(resource: Wgsl): BaseData | UnknownData {\n if (isDerived(resource) || isSlot(resource)) {\n return getTypeFromWgsl(resource.value as Wgsl);\n }\n\n if (typeof resource === 'string') {\n return UnknownData;\n }\n if (typeof resource === 'number') {\n return numericLiteralToResource(String(resource))?.dataType ?? UnknownData;\n }\n if (typeof resource === 'boolean') {\n return bool;\n }\n\n if ('kind' in resource) {\n const kind = resource.kind;\n if (kind in kindToSchema) {\n return kindToSchema[kind];\n }\n }\n\n return isWgslData(resource) ? resource : UnknownData;\n}\n\nexport function numericLiteralToResource(value: string): Resource | undefined {\n // Hex literals\n if (/^0x[0-9a-f]+$/i.test(value)) {\n return { value, dataType: abstractInt };\n }\n\n // Binary literals\n if (/^0b[01]+$/i.test(value)) {\n return {\n value: `${Number.parseInt(value.slice(2), 2)}`,\n dataType: abstractInt,\n };\n }\n\n // Floating point literals\n if (/^-?(?:\\d+\\.\\d*|\\d*\\.\\d+)$/i.test(value)) {\n return { value, dataType: abstractFloat };\n }\n\n // Floating point literals with scientific notation\n if (/^-?\\d+(?:\\.\\d+)?e-?\\d+$/i.test(value)) {\n return { value, dataType: abstractFloat };\n }\n\n // Integer literals\n if (/^-?\\d+$/i.test(value)) {\n return { value, dataType: abstractInt };\n }\n\n return undefined;\n}\n","import type { BaseData } from '../data';\nimport { $internal } from '../shared/symbols';\nimport { getTypeForPropAccess } from '../smol/generationHelpers';\nimport {\n type Labelled,\n type ResolutionCtx,\n type SelfResolvable,\n type Wgsl,\n isBufferUsage,\n} from '../types';\nimport { isAccessor, isDerived, isSlot } from './slot/slotTypes';\n\nexport const valueProxyHandler: ProxyHandler<\n SelfResolvable &\n Labelled & { readonly [$internal]: { readonly dataType: BaseData } }\n> = {\n get(target, prop) {\n if (prop in target) {\n return Reflect.get(target, prop);\n }\n\n if (prop === '~providing') {\n return undefined;\n }\n\n if (\n prop === 'toString' ||\n prop === Symbol.toStringTag ||\n prop === Symbol.toPrimitive\n ) {\n return () => target.toString();\n }\n\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) =>\n `${ctx.resolve(target)}.${String(prop)}`,\n\n toString: () =>\n `.value(...).${String(prop)}:${target.label ?? '<unnamed>'}`,\n\n [$internal]: {\n dataType: getTypeForPropAccess(\n target[$internal].dataType as Wgsl,\n String(prop),\n ) as BaseData,\n },\n },\n valueProxyHandler,\n );\n },\n};\n\nexport function unwrapProxy<T>(value: unknown): T {\n let unwrapped = value;\n\n while (\n isSlot(unwrapped) ||\n isDerived(unwrapped) ||\n isAccessor(unwrapped) ||\n isBufferUsage(unwrapped)\n ) {\n unwrapped = unwrapped.value;\n }\n\n return unwrapped as T;\n}\n","import type { AnyWgslData } from '../../data/wgslTypes';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport { valueProxyHandler } from '../valueProxyUtils';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuConst<TDataType extends AnyWgslData = AnyWgslData>\n extends TgpuNamable {\n readonly value: Infer<TDataType>;\n\n readonly [$internal]: {\n readonly dataType: TDataType;\n };\n}\n\n/**\n * Creates a module constant with specified value.\n */\nexport function constant<TDataType extends AnyWgslData>(\n dataType: TDataType,\n value: Infer<TDataType>,\n): TgpuConst<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 public readonly [$internal]: {\n readonly dataType: TDataType;\n };\n\n constructor(\n public readonly dataType: TDataType,\n private readonly _value: Infer<TDataType>,\n ) {\n this[$internal] = { dataType };\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\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.dataType,\n },\n },\n valueProxyHandler,\n ) 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 { isLooseData } from '../../data/dataTypes';\nimport { 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 ? found[1] : undefined));\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 matched = implementation.match(/->(?<output>.*?){/s);\n const outputName = matched ? matched[1]?.trim() : undefined;\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(\n `(?<![\\\\w_.])${name.replaceAll('.', '\\\\.')}(?![\\\\w_])`,\n 'g',\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): string {\n return Object.entries(externalMap).reduce((acc, [externalName, external]) => {\n if (isWgsl(external) || isLooseData(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(\n `${externalName.replaceAll('.', '\\\\.')}\\\\.(?<prop>.*?)(?![\\\\w_])`,\n 'g',\n ),\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 WgslStruct, 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 { BaseData, 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 IOLayoutToSchema<T extends IOLayout> = T extends BaseData\n ? Decorate<T, Location<0>>\n : T extends IORecord\n ? WgslStruct<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 ? getCustomLocation(returnType) !== undefined\n ? returnType\n : location(0, returnType)\n : struct(withLocations(returnType) as Record<string, T>)\n ) as IOLayoutToSchema<IOLayout<T>>;\n}\n\nexport function createStructFromIO<T extends IOData>(members: IORecord<T>) {\n return struct(withLocations(members) as Record<string, T>);\n}\n","import type { AnyComputeBuiltin } from '../../builtin';\nimport type { AnyWgslStruct } from '../../data/struct';\nimport { type TgpuNamable, isNamable } from '../../namable';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { createFnCore } from './fnCore';\nimport type { Implementation, InferIO } from './fnTypes';\nimport { createStructFromIO } from './ioOutputType';\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 ComputeIn extends Record<string, AnyComputeBuiltin>,\n> {\n readonly argTypes: [AnyWgslStruct];\n readonly returnType: undefined;\n readonly workgroupSize: [number, number, number];\n\n /**\n * Creates a type-safe implementation of this signature\n */\n does(\n implementation: (input: InferIO<ComputeIn>) => undefined,\n ): TgpuComputeFn<ComputeIn>;\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<ComputeIn>;\n}\n\nexport interface TgpuComputeFn<\n ComputeIn extends Record<string, AnyComputeBuiltin> = Record<\n string,\n AnyComputeBuiltin\n >,\n> extends TgpuNamable {\n readonly shell: TgpuComputeFnShell<ComputeIn>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport interface ComputeFnOptions {\n workgroupSize: number[];\n}\n\nexport function computeFn(options: {\n workgroupSize: number[];\n // biome-ignore lint/complexity/noBannedTypes: it's fine\n}): TgpuComputeFnShell<{}>;\n\nexport function computeFn<\n ComputeIn extends Record<string, AnyComputeBuiltin>,\n>(options: {\n in: ComputeIn;\n workgroupSize: number[];\n}): TgpuComputeFnShell<ComputeIn>;\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 options.in\n * Record with builtins used by the compute shader.\n * @param options.workgroupSize\n * Size of blocks that the thread grid will be divided into (up to 3 dimensions).\n */\nexport function computeFn<\n ComputeIn extends Record<string, AnyComputeBuiltin>,\n>(options: {\n in?: ComputeIn;\n workgroupSize: number[];\n}): TgpuComputeFnShell<ComputeIn> {\n return {\n argTypes: [createStructFromIO(options.in ?? {})],\n returnType: undefined,\n workgroupSize: [\n options.workgroupSize[0] ?? 1,\n options.workgroupSize[1] ?? 1,\n options.workgroupSize[2] ?? 1,\n ],\n\n does(implementation) {\n return createComputeFn(\n this,\n options.workgroupSize,\n implementation as Implementation,\n );\n },\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createComputeFn<ComputeIn extends Record<string, AnyComputeBuiltin>>(\n shell: TgpuComputeFnShell<ComputeIn>,\n workgroupSize: number[],\n implementation: Implementation,\n): TgpuComputeFn<ComputeIn> {\n type This = TgpuComputeFn<ComputeIn> & Labelled & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n const inputType = shell.argTypes[0];\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 if (isNamable(inputType)) {\n inputType.$name(`${newLabel}_Input`);\n }\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 { AnyWgslData } from '../../data/wgslTypes';\nimport type { TgpuNamable } from '../../namable';\nimport { createDualImpl } from '../../shared/generators';\nimport { $internal } from '../../shared/symbols';\nimport {\n type Labelled,\n type ResolutionCtx,\n type SelfResolvable,\n UnknownData,\n type Wgsl,\n} from '../../types';\nimport type { TgpuBufferUsage } from '../buffer/bufferUsage';\nimport {\n type Eventual,\n type Providing,\n type SlotValuePair,\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 readonly '~providing'?: Providing | undefined;\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 readonly [$internal]: {\n implementation: Implementation<InferArgs<Args>, InferReturn<Return>>;\n };\n };\n\nexport function fn<Args extends AnyWgslData[] | []>(\n argTypes: Args,\n returnType?: undefined,\n): TgpuFnShell<Args, undefined>;\n\nexport function fn<Args extends AnyWgslData[] | [], Return extends AnyWgslData>(\n argTypes: Args,\n returnType: Return,\n): TgpuFnShell<Args, 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 stringifyPair([slot, value]: SlotValuePair): string {\n return `${slot.label ?? '<unnamed>'}=${value}`;\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(fn, [\n [isAccessor(slot) ? slot.slot : slot, value],\n ]);\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n return core.resolve(ctx);\n },\n };\n\n const call = createDualImpl(\n (...args: unknown[]): unknown => {\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 (...args) => ({\n value: new FnCall(fn, args.map((arg) => arg.value) as Wgsl[]),\n dataType: shell.returnType ?? UnknownData,\n }),\n );\n\n Object.defineProperty(call, $internal, {\n value: {\n implementation,\n },\n });\n\n const fn = Object.assign(call, fnBase as This) as unknown as TgpuFn<\n Args,\n Return\n >;\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>(innerFn: TgpuFn<Args, Return>, pairs: SlotValuePair[]): TgpuFn<Args, Return> {\n type This = TgpuFnBase<Args, Return>;\n\n const fnBase: This = {\n resourceType: 'function',\n shell: innerFn.shell,\n '~providing': {\n inner: innerFn,\n pairs,\n },\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(fn, [\n ...pairs,\n [isAccessor(slot) ? slot.slot : slot, value],\n ]);\n },\n };\n\n const call = createDualImpl(\n (...args: InferArgs<Args>): unknown => {\n return innerFn(...args);\n },\n (...args) => {\n return {\n value: new FnCall(fn, args.map((arg) => arg.value) as Wgsl[]),\n dataType: innerFn.shell.returnType ?? UnknownData,\n };\n },\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 const fnLabel = innerFn.label ?? '<unnamed>';\n\n return `fn:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;\n },\n });\n\n Object.defineProperty(fn, $internal, {\n value: {\n implementation: innerFn[$internal].implementation,\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 {\n AnyFragmentInputBuiltin,\n AnyFragmentOutputBuiltin,\n OmitBuiltins,\n} from '../../builtin';\nimport type { AnyAttribute } from '../../data/attributes';\nimport type { AnyWgslStruct } from '../../data/struct';\nimport type { Decorated, Location, Vec4f } from '../../data/wgslTypes';\nimport { type TgpuNamable, isNamable } from '../../namable';\nimport type { GenerationCtx } from '../../smol/wgslGenerator';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { addReturnTypeToExternals } from '../resolve/externals';\nimport { createFnCore } from './fnCore';\nimport type { BaseIOData, IORecord, Implementation, InferIO } from './fnTypes';\nimport {\n type IOLayoutToSchema,\n createOutputType,\n createStructFromIO,\n} from './ioOutputType';\n\n// ----------\n// Public API\n// ----------\n\nexport type FragmentOutConstrained =\n | Vec4f\n | Decorated<Vec4f, [Location<number>]>\n | AnyFragmentOutputBuiltin\n | IORecord<\n Vec4f | Decorated<Vec4f, [Location<number>]> | AnyFragmentOutputBuiltin\n >;\n\nexport type FragmentInConstrained = IORecord<\n | BaseIOData\n | Decorated<BaseIOData, AnyAttribute<never>[]>\n | AnyFragmentInputBuiltin\n>;\n\n/**\n * Describes a fragment entry function signature (its arguments and return type)\n */\nexport interface TgpuFragmentFnShell<\n FragmentIn extends FragmentInConstrained,\n FragmentOut extends FragmentOutConstrained,\n> {\n readonly argTypes: [AnyWgslStruct];\n readonly targets: FragmentOut;\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 FragmentInConstrained = FragmentInConstrained,\n Output extends FragmentOutConstrained = FragmentOutConstrained,\n> extends TgpuNamable {\n readonly shell: TgpuFragmentFnShell<Varying, Output>;\n readonly outputType: IOLayoutToSchema<Output>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport function fragmentFn<\n FragmentOut extends FragmentOutConstrained,\n>(options: {\n out: FragmentOut;\n // biome-ignore lint/complexity/noBannedTypes: it's fine\n}): TgpuFragmentFnShell<{}, FragmentOut>;\n\nexport function fragmentFn<\n FragmentIn extends FragmentInConstrained,\n FragmentOut extends FragmentOutConstrained,\n>(options: {\n in: FragmentIn;\n out: FragmentOut;\n}): TgpuFragmentFnShell<FragmentIn, FragmentOut>;\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 options.in\n * Values computed in the vertex stage and builtins to be made available to functions that implement this shell.\n * @param options.out\n * A `vec4f`, signaling this function outputs a color for one target, or a record containing 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 FragmentInConstrained,\n FragmentOut extends FragmentOutConstrained,\n>(options: {\n in?: FragmentIn;\n out: FragmentOut;\n}): TgpuFragmentFnShell<FragmentIn, FragmentOut> {\n return {\n argTypes: [createStructFromIO(options.in ?? {})],\n targets: options.out,\n returnType: createOutputType(options.out) as 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<FragmentInConstrained, FragmentOutConstrained>,\n implementation: Implementation,\n): TgpuFragmentFn {\n type This = TgpuFragmentFn & Labelled & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n const outputType = shell.returnType as IOLayoutToSchema<\n typeof shell.returnType\n >;\n const inputType = shell.argTypes[0];\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 (isNamable(outputType)) {\n outputType.$name(`${newLabel}_Output`);\n }\n if (isNamable(inputType)) {\n inputType.$name(`${newLabel}_Input`);\n }\n return this;\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n if (typeof implementation === 'string') {\n return core.resolve(ctx, '@fragment ');\n }\n\n const generationCtx = ctx as GenerationCtx;\n if (generationCtx.callStack === undefined) {\n throw new Error(\n 'Cannot resolve a TGSL function outside of a generation context',\n );\n }\n\n try {\n generationCtx.callStack.push(outputType);\n return core.resolve(ctx, '@fragment ');\n } finally {\n generationCtx.callStack.pop();\n }\n },\n\n toString() {\n return `fragmentFn:${this.label ?? '<unnamed>'}`;\n },\n };\n\n return result;\n}\n","import type { OmitBuiltins } from '../../builtin';\nimport type { AnyWgslStruct } from '../../data/struct';\nimport { type TgpuNamable, isNamable } from '../../namable';\nimport type { GenerationCtx } from '../../smol/wgslGenerator';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { addReturnTypeToExternals } from '../resolve/externals';\nimport { createFnCore } from './fnCore';\nimport type { IOLayout, IORecord, Implementation, InferIO } from './fnTypes';\nimport {\n type IOLayoutToSchema,\n createOutputType,\n createStructFromIO,\n} 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: [AnyWgslStruct];\n readonly returnType: VertexOut;\n readonly attributes: [VertexIn];\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: IOLayoutToSchema<VertexOut>;\n readonly inputType: IOLayoutToSchema<VertexIn>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport function vertexFn<VertexOut extends IORecord>(options: {\n out: VertexOut;\n // biome-ignore lint/complexity/noBannedTypes: it's fine\n}): TgpuVertexFnShell<{}, VertexOut>;\n\nexport function vertexFn<\n VertexIn extends IORecord,\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>(options: {\n in: VertexIn;\n out: VertexOut;\n}): TgpuVertexFnShell<VertexIn, VertexOut>;\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 options.in\n * Vertex attributes and builtins to be made available to functions that implement this shell.\n * @param options.out\n * A record containing the final position of the vertex, and any information\n * passed onto the fragment shader stage.\n */\nexport function vertexFn<\n VertexIn extends IORecord,\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>(options: {\n in?: VertexIn;\n out: VertexOut;\n}): TgpuVertexFnShell<VertexIn, VertexOut> {\n return {\n attributes: [options.in ?? ({} as VertexIn)],\n returnType: createOutputType(options.out) as unknown as VertexOut,\n argTypes: [createStructFromIO(options.in ?? {})],\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 = shell.returnType;\n const inputType = shell.argTypes[0];\n if (typeof implementation === 'string') {\n addReturnTypeToExternals(implementation, outputType, (externals) =>\n core.applyExternals(externals),\n );\n }\n\n return {\n shell,\n outputType,\n inputType,\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 (isNamable(outputType)) {\n outputType.$name(`${newLabel}_Output`);\n }\n if (isNamable(inputType)) {\n inputType.$name(`${newLabel}_Input`);\n }\n return this;\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n if (typeof implementation === 'string') {\n return core.resolve(ctx, '@vertex ');\n }\n\n const generationCtx = ctx as GenerationCtx;\n if (generationCtx.callStack === undefined) {\n throw new Error(\n 'Cannot resolve a TGSL function outside of a generation context',\n );\n }\n\n try {\n generationCtx.callStack.push(outputType);\n return core.resolve(ctx, '@vertex ');\n } finally {\n generationCtx.callStack.pop();\n }\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\n/**\n * Any typed array\n */\nexport type TypedArray =\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array;\n\nexport function assertExhaustive(x: never, location: string): never {\n throw new Error(`Failed to handle ${x} at ${location}`);\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\nexport function isAttribute<\n T extends TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib,\n>(value: unknown | T): 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 { getAttributesString } from '../../data/attributes';\nimport {\n type AnyData,\n type Disarray,\n type Unstruct,\n isLooseData,\n} from '../../data/dataTypes';\nimport type { WgslStruct } from '../../data/struct';\nimport { formatToWGSLType } from '../../data/vertexFormatData';\nimport type {\n AnyWgslData,\n BaseData,\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} from '../../data/wgslTypes';\nimport { assertExhaustive } from '../../shared/utilityTypes';\nimport type { ResolutionCtx } from '../../types';\nimport { isAttribute } from '../vertexLayout/connectAttributesToShader';\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, BaseData],\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 unstruct (struct that does not align data by default) to its struct data counterpart.\n * @param ctx - The resolution context.\n * @param unstruct - The unstruct to resolve.\n *\n * @returns The resolved unstruct name.\n *\n * @example\n * ```ts\n * resolveUnstruct(ctx, {\n * uv: d.float16x2, // -> d.vec2f after resolution\n * color: d.snorm8x4, -> d.vec4f after resolution\n * });\n * ```\n */\nfunction resolveUnstruct(ctx: ResolutionCtx, unstruct: Unstruct) {\n const id = ctx.names.makeUnique(unstruct.label);\n\n ctx.addDeclaration(`\nstruct ${id} {\n${Object.entries(unstruct.propTypes)\n .map((prop) =>\n isAttribute(prop[1])\n ? resolveStructProperty(ctx, [prop[0], formatToWGSLType[prop[1].format]])\n : resolveStructProperty(ctx, prop),\n )\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\nfunction resolveDisarray(ctx: ResolutionCtx, disarray: Disarray) {\n const element = ctx.resolve(\n isAttribute(disarray.elementType)\n ? formatToWGSLType[disarray.elementType.format]\n : (disarray.elementType as AnyWgslData),\n );\n\n return disarray.elementCount === 0\n ? `array<${element}>`\n : `array<${element}, ${disarray.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: AnyData): string {\n if (isLooseData(data)) {\n if (data.type === 'unstruct') {\n return resolveUnstruct(ctx, data);\n }\n\n if (data.type === 'disarray') {\n return resolveDisarray(ctx, data);\n }\n\n if (data.type === 'loose-decorated') {\n return ctx.resolve(\n isAttribute(data.inner)\n ? formatToWGSLType[data.inner.format]\n : data.inner,\n );\n }\n\n return ctx.resolve(formatToWGSLType[data.type]);\n }\n\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 if (data.type === 'ptr') {\n if (data.addressSpace === 'storage') {\n return `ptr<storage, ${ctx.resolve(data.inner)}, ${data.access === 'read-write' ? 'read_write' : data.access}>`;\n }\n return `ptr<${data.addressSpace}, ${ctx.resolve(data.inner)}>`;\n }\n\n if (data.type === 'abstractInt' || data.type === 'abstractFloat') {\n throw new Error('Abstract types have no concrete representation in WGSL');\n }\n\n assertExhaustive(data, 'resolveData');\n}\n","import type * as smol from 'tinyest';\nimport * as d from '../data';\nimport * as wgsl from '../data/wgslTypes';\nimport {\n type ResolutionCtx,\n type Resource,\n UnknownData,\n type Wgsl,\n isWgsl,\n} from '../types';\nimport {\n getTypeForIndexAccess,\n getTypeForPropAccess,\n getTypeFromWgsl,\n numericLiteralToResource,\n} from './generationHelpers';\n\nconst parenthesizedOps = [\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n '<<',\n '>>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '|',\n '^',\n '&',\n '&&',\n '||',\n];\n\nconst binaryLogicalOps = ['&&', '||', '==', '!=', '<', '<=', '>', '>='];\n\ntype Operator =\n | smol.BinaryOperator\n | smol.AssignmentOperator\n | smol.LogicalOperator\n | smol.UnaryOperator;\n\nfunction operatorToType<\n TL extends wgsl.AnyWgslData | UnknownData,\n TR extends wgsl.AnyWgslData | UnknownData,\n>(lhs: TL, op: Operator, rhs?: TR): TL | TR | wgsl.Bool {\n if (!rhs) {\n if (op === '!' || op === '~') {\n return d.bool;\n }\n\n return lhs;\n }\n\n if (binaryLogicalOps.includes(op)) {\n return d.bool;\n }\n\n if (op === '=') {\n return rhs;\n }\n\n return lhs;\n}\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n readonly callStack: unknown[];\n indent(): string;\n dedent(): string;\n pushBlockScope(): void;\n popBlockScope(): void;\n getById(id: string): Resource | null;\n defineVariable(\n id: string,\n dataType: wgsl.AnyWgslData | UnknownData,\n ): Resource;\n};\n\nexport function resolveRes(ctx: GenerationCtx, res: Resource): string {\n if (isWgsl(res.value)) {\n return ctx.resolve(res.value);\n }\n\n return String(res.value);\n}\n\nfunction assertExhaustive(value: never): never {\n throw new Error(\n `'${JSON.stringify(value)}' was not handled by the WGSL generator.`,\n );\n}\n\nexport function generateBoolean(ctx: GenerationCtx, value: boolean): Resource {\n return { value: value ? 'true' : 'false', dataType: d.bool };\n}\n\nexport function generateBlock(ctx: GenerationCtx, value: smol.Block): string {\n ctx.pushBlockScope();\n try {\n return `${ctx.indent()}{\n${value.b.map((statement) => generateStatement(ctx, statement)).join('\\n')}\n${ctx.dedent()}}`;\n } finally {\n ctx.popBlockScope();\n }\n}\n\nexport function registerBlockVariable(\n ctx: GenerationCtx,\n id: string,\n dataType: wgsl.AnyWgslData | UnknownData,\n): Resource {\n return ctx.defineVariable(id, dataType);\n}\n\nexport function generateIdentifier(ctx: GenerationCtx, id: string): Resource {\n const res = ctx.getById(id);\n if (!res) {\n throw new Error(`Identifier ${id} not found`);\n }\n\n return res;\n}\n\nexport function generateExpression(\n ctx: GenerationCtx,\n expression: smol.Expression,\n): Resource {\n if (typeof expression === 'string') {\n return generateIdentifier(ctx, expression);\n }\n if (typeof expression === 'boolean') {\n return generateBoolean(ctx, expression);\n }\n\n if ('x' in expression) {\n // Logical/Binary/Assignment Expression\n const [lhs, op, rhs] = expression.x;\n const lhsExpr = generateExpression(ctx, lhs);\n const rhsExpr = generateExpression(ctx, rhs);\n\n const lhsStr = resolveRes(ctx, lhsExpr);\n const rhsStr = resolveRes(ctx, rhsExpr);\n const type = operatorToType(lhsExpr.dataType, op, rhsExpr.dataType);\n\n return {\n value: parenthesizedOps.includes(op)\n ? `(${lhsStr} ${op} ${rhsStr})`\n : `${lhsStr} ${op} ${rhsStr}`,\n dataType: type,\n };\n }\n\n if ('p' in expression) {\n // Update Expression\n const [op, arg] = expression.p;\n const argExpr = generateExpression(ctx, arg);\n const argStr = resolveRes(ctx, argExpr);\n\n return {\n value: `${argStr}${op}`,\n dataType: argExpr.dataType,\n };\n }\n\n if ('u' in expression) {\n // Unary Expression\n const [op, arg] = expression.u;\n const argExpr = generateExpression(ctx, arg);\n const argStr = resolveRes(ctx, argExpr);\n\n const type = operatorToType(argExpr.dataType, op);\n return {\n value: `${op}${argStr}`,\n dataType: type,\n };\n }\n\n if ('a' in expression) {\n // Member Access\n const [targetId, property] = expression.a;\n const target = generateExpression(ctx, targetId);\n\n if (typeof target.value === 'string') {\n return {\n value: `${target.value}.${property}`,\n dataType: getTypeForPropAccess(target.dataType as Wgsl, property),\n };\n }\n // biome-ignore lint/suspicious/noExplicitAny: <sorry TypeScript>\n const propValue = (target.value as any)[property];\n\n if (isWgsl(target.value)) {\n return {\n value: propValue,\n dataType: getTypeForPropAccess(target.value as d.AnyWgslData, property),\n };\n }\n\n if (typeof target.value === 'object') {\n const dataType = isWgsl(propValue)\n ? getTypeFromWgsl(propValue)\n : UnknownData;\n\n return {\n value: propValue,\n dataType,\n };\n }\n\n throw new Error(`Cannot access member ${property} of ${target.value}`);\n }\n\n if ('i' in expression) {\n // Index Access\n const [target, property] = expression.i;\n const targetExpr = generateExpression(ctx, target);\n const propertyExpr = generateExpression(ctx, property);\n const targetStr = resolveRes(ctx, targetExpr);\n const propertyStr = resolveRes(ctx, propertyExpr);\n\n return {\n value: `${targetStr}[${propertyStr}]`,\n dataType: getTypeForIndexAccess(targetExpr.dataType as d.AnyWgslData),\n };\n }\n\n if ('n' in expression) {\n // Numeric Literal\n const type = numericLiteralToResource(expression.n);\n if (!type) {\n throw new Error(`Invalid numeric literal ${expression.n}`);\n }\n return type;\n }\n\n if ('f' in expression) {\n // Function Call\n const [callee, args] = expression.f;\n const id = generateExpression(ctx, callee);\n const idValue = id.value;\n\n ctx.callStack.push(idValue);\n\n const argResources = args.map((arg) => generateExpression(ctx, arg));\n const resolvedResources = argResources.map((res) => ({\n value: resolveRes(ctx, res),\n dataType: res.dataType,\n }));\n const argValues = resolvedResources.map((res) => res.value);\n\n ctx.callStack.pop();\n\n if (typeof idValue === 'string') {\n return {\n value: `${idValue}(${argValues.join(', ')})`,\n dataType: id.dataType,\n };\n }\n\n if (wgsl.isWgslStruct(idValue)) {\n const resolvedId = ctx.resolve(idValue);\n\n return {\n value: `${resolvedId}(${argValues.join(', ')})`,\n dataType: id.dataType,\n };\n }\n\n // Assuming that `id` is callable\n return (idValue as unknown as (...args: unknown[]) => unknown)(\n ...resolvedResources,\n ) as Resource;\n }\n\n if ('o' in expression) {\n // Object Literal\n const obj = expression.o;\n const callee = ctx.callStack[ctx.callStack.length - 1];\n\n const generateEntries = (values: smol.Expression[]) =>\n values\n .map((value) => {\n const valueRes = generateExpression(ctx, value);\n return resolveRes(ctx, valueRes);\n })\n .join(', ');\n\n if (wgsl.isWgslStruct(callee)) {\n const propKeys = Object.keys(callee.propTypes);\n const values = propKeys.map((key) => {\n const val = obj[key];\n if (val === undefined) {\n throw new Error(\n `Missing property ${key} in object literal for struct ${callee}`,\n );\n }\n return val;\n });\n\n return {\n value: generateEntries(values),\n dataType: callee,\n };\n }\n\n return {\n value: generateEntries(Object.values(obj)),\n dataType: UnknownData,\n };\n }\n\n if ('s' in expression) {\n throw new Error('Cannot use string literals in TGSL.');\n }\n\n assertExhaustive(expression);\n}\n\nexport function 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 // check if the thing at the top of the call stack is a struct and the statement is a plain JS object\n // if so wrap the value returned in a constructor of the struct (its resolved name)\n if (\n wgsl.isWgslStruct(ctx.callStack[ctx.callStack.length - 1]) &&\n statement.r !== null &&\n typeof statement.r === 'object' &&\n 'o' in statement.r\n ) {\n const resource = resolveRes(ctx, generateExpression(ctx, statement.r));\n const resolvedStruct = ctx.resolve(\n ctx.callStack[ctx.callStack.length - 1],\n );\n return `${ctx.pre}return ${resolvedStruct}(${resource});`;\n }\n\n return statement.r === null\n ? `${ctx.pre}return;`\n : `${ctx.pre}return ${resolveRes(\n ctx,\n generateExpression(ctx, statement.r),\n )};`;\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 eq = rawValue ? generateExpression(ctx, rawValue) : undefined;\n\n if (!eq || !rawValue) {\n throw new Error('Cannot create variable without an initial value.');\n }\n\n registerBlockVariable(ctx, rawId, eq.dataType);\n const id = resolveRes(ctx, generateIdentifier(ctx, rawId));\n\n // If the value is a plain JS object it has to be an output struct\n if (\n typeof rawValue === 'object' &&\n 'o' in rawValue &&\n wgsl.isWgslStruct(ctx.callStack[ctx.callStack.length - 1])\n ) {\n const resolvedStruct = ctx.resolve(\n ctx.callStack[ctx.callStack.length - 1],\n );\n return `${ctx.pre}var ${id} = ${resolvedStruct}(${resolveRes(ctx, eq)});`;\n }\n\n return `${ctx.pre}var ${id} = ${resolveRes(ctx, eq)};`;\n }\n\n if ('b' in statement) {\n ctx.pushBlockScope();\n try {\n return generateBlock(ctx, statement);\n } finally {\n ctx.popBlockScope();\n }\n }\n\n // 'j' stands for for (trust me)\n if ('j' in statement) {\n const [init, condition, update, body] = statement.j;\n\n const initStatement = init ? generateStatement(ctx, init) : undefined;\n const initStr = initStatement ? initStatement.slice(0, -1) : '';\n\n const conditionExpr = condition\n ? generateExpression(ctx, condition)\n : undefined;\n const conditionStr = conditionExpr ? resolveRes(ctx, conditionExpr) : '';\n\n const updateStatement = update ? generateStatement(ctx, update) : undefined;\n const updateStr = updateStatement ? updateStatement.slice(0, -1) : '';\n\n ctx.indent();\n const bodyStr = generateStatement(ctx, body);\n ctx.dedent();\n\n return `\\\n${ctx.pre}for (${initStr}; ${conditionStr}; ${updateStr})\n${bodyStr}`;\n }\n\n if ('w' in statement) {\n const [condition, body] = statement.w;\n const conditionStr = resolveRes(ctx, generateExpression(ctx, condition));\n\n ctx.indent();\n const bodyStr = generateStatement(ctx, body);\n ctx.dedent();\n\n return `\\\n${ctx.pre}while (${conditionStr})\n${bodyStr}`;\n }\n\n if ('k' in statement) {\n return `${ctx.pre}continue;`;\n }\n\n if ('d' in statement) {\n return `${ctx.pre}break;`;\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 { getSystemEndianness } from 'typed-binary';\nimport { isWgslData } from '../../data';\nimport {\n EVAL_ALLOWED_IN_ENV,\n getCompiledWriterForSchema,\n} from '../../data/compiledIO';\nimport { readData, writeData } from '../../data/dataIO';\nimport type { AnyData } from '../../data/dataTypes';\nimport { getWriteInstructions } from '../../data/partialIO';\nimport { sizeOf } from '../../data/sizeOf';\nimport type { BaseData, WgslTypeLiteral } from '../../data/wgslTypes';\nimport type { StorageFlag } from '../../extension';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer, InferPartial } from '../../shared/repr';\nimport type { MemIdentity } from '../../shared/repr';\nimport type { UnionToIntersection } from '../../shared/utilityTypes';\nimport { isGPUBuffer } from '../../types';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n type TgpuFixedBufferUsage,\n asMutable,\n asReadonly,\n asUniform,\n} from './bufferUsage';\n\n// ----------\n// Public API\n// ----------\n\nexport interface UniformFlag {\n usableAsUniform: true;\n}\n\n/**\n * @deprecated Use UniformFlag instead.\n */\nexport type Uniform = UniformFlag;\n\nexport interface VertexFlag {\n usableAsVertex: true;\n}\n\n/**\n * @deprecated Use VertexFlag instead.\n */\nexport type Vertex = VertexFlag;\n\ntype LiteralToUsageType<T extends 'uniform' | 'storage' | 'vertex'> =\n T extends 'uniform'\n ? UniformFlag\n : T extends 'storage'\n ? StorageFlag\n : T extends 'vertex'\n ? VertexFlag\n : never;\n\ntype ViewUsages<TBuffer extends TgpuBuffer<BaseData>> =\n | (boolean extends TBuffer['usableAsUniform'] ? never : 'uniform')\n | (boolean extends TBuffer['usableAsStorage']\n ? never\n : 'readonly' | 'mutable');\n\ntype UsageTypeToBufferUsage<TData extends BaseData> = {\n uniform: TgpuBufferUniform<TData> & TgpuFixedBufferUsage<TData>;\n mutable: TgpuBufferMutable<TData> & TgpuFixedBufferUsage<TData>;\n readonly: TgpuBufferReadonly<TData> & TgpuFixedBufferUsage<TData>;\n};\n\nconst usageToUsageConstructor = {\n uniform: asUniform,\n mutable: asMutable,\n readonly: asReadonly,\n};\n\nexport interface TgpuBuffer<TData extends BaseData> 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 usableAsUniform: boolean;\n usableAsStorage: boolean;\n usableAsVertex: boolean;\n\n $usage<T extends RestrictVertexUsages<TData>>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n\n as<T extends ViewUsages<this>>(usage: T): UsageTypeToBufferUsage<TData>[T];\n\n compileWriter(): void;\n write(data: Infer<TData>): void;\n writePartial(data: InferPartial<TData>): void;\n copyFrom(srcBuffer: TgpuBuffer<MemIdentity<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 isUsableAsVertex<T extends TgpuBuffer<AnyData>>(\n buffer: T,\n): buffer is T & VertexFlag {\n return !!(buffer as unknown as VertexFlag).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\nconst endianness = getSystemEndianness();\n\ntype RestrictVertexUsages<TData extends BaseData> = 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 private _hostBuffer: ArrayBuffer | undefined;\n\n private _label: string | undefined;\n readonly initial: Infer<TData> | undefined;\n\n usableAsUniform = false;\n usableAsStorage = false;\n 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.type} 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 compileWriter(): void {\n if (EVAL_ALLOWED_IN_ENV) {\n getCompiledWriterForSchema(this.dataType);\n } else {\n throw new Error('This environment does not allow eval');\n }\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 if (EVAL_ALLOWED_IN_ENV) {\n const writer = getCompiledWriterForSchema(this.dataType);\n writer(new DataView(mapped), 0, data, endianness === 'little');\n return;\n }\n writeData(new BufferWriter(mapped), this.dataType, data);\n return;\n }\n\n const size = sizeOf(this.dataType);\n if (!this._hostBuffer) {\n this._hostBuffer = new ArrayBuffer(size);\n }\n\n // Flushing any commands yet to be encoded.\n this._group.flush();\n\n if (EVAL_ALLOWED_IN_ENV) {\n const writer = getCompiledWriterForSchema(this.dataType);\n writer(new DataView(this._hostBuffer), 0, data, endianness === 'little');\n } else {\n writeData(new BufferWriter(this._hostBuffer), this.dataType, data);\n }\n device.queue.writeBuffer(gpuBuffer, 0, this._hostBuffer, 0, size);\n }\n\n public writePartial(data: InferPartial<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this._group.device;\n\n const instructions = getWriteInstructions(this.dataType, data);\n\n if (gpuBuffer.mapState === 'mapped') {\n const mappedRange = gpuBuffer.getMappedRange();\n const mappedView = new Uint8Array(mappedRange);\n\n for (const instruction of instructions) {\n mappedView.set(instruction.data, instruction.data.byteOffset);\n }\n } else {\n for (const instruction of instructions) {\n device.queue.writeBuffer(\n gpuBuffer,\n instruction.data.byteOffset,\n instruction.data,\n 0,\n instruction.data.byteLength,\n );\n }\n }\n }\n\n copyFrom(srcBuffer: TgpuBuffer<MemIdentity<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 as<T extends ViewUsages<this>>(usage: T): UsageTypeToBufferUsage<TData>[T] {\n return usageToUsageConstructor[usage]?.(\n this as never,\n ) as UsageTypeToBufferUsage<TData>[T];\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 { Measurer } from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport alignIO from './alignIO';\nimport { alignmentOf, customAlignmentOf } from './alignmentOf';\nimport { type Unstruct, isUnstruct } from './dataTypes';\nimport { sizeOf } from './sizeOf';\nimport type { AnyWgslStruct, WgslStruct } from './struct';\nimport type { BaseData } from './wgslTypes';\n\nexport interface OffsetInfo {\n offset: number;\n size: number;\n padding?: number | undefined;\n}\n\nconst cachedOffsets = new WeakMap<\n AnyWgslStruct | Unstruct,\n Record<string, OffsetInfo>\n>();\n\nexport function offsetsForProps<T extends Record<string, BaseData>>(\n struct: WgslStruct<T> | Unstruct<T>,\n): Record<keyof T, OffsetInfo> {\n const cached = cachedOffsets.get(struct);\n if (cached) {\n return cached as Record<keyof T, OffsetInfo>;\n }\n\n const measurer = new Measurer();\n const offsets = {} as Record<keyof T, OffsetInfo>;\n let lastEntry: OffsetInfo | undefined = undefined;\n\n for (const key in struct.propTypes) {\n const prop = struct.propTypes[key];\n if (prop === undefined) {\n throw new Error(`Property ${key} is undefined in struct`);\n }\n\n const beforeAlignment = measurer.size;\n\n alignIO(\n measurer,\n isUnstruct(struct) ? customAlignmentOf(prop) : alignmentOf(prop),\n );\n\n if (lastEntry) {\n lastEntry.padding = measurer.size - beforeAlignment;\n }\n\n const propSize = sizeOf(prop);\n offsets[key] = { offset: measurer.size, size: propSize };\n lastEntry = offsets[key];\n measurer.add(propSize);\n }\n\n if (lastEntry) {\n lastEntry.padding =\n roundUp(sizeOf(struct), alignmentOf(struct)) - measurer.size;\n }\n\n cachedOffsets.set(\n struct as\n | WgslStruct<Record<string, BaseData>>\n | Unstruct<Record<string, BaseData>>,\n offsets,\n );\n\n return offsets;\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 { roundUp } from '../mathUtils';\nimport type { Infer } from '../shared/repr';\nimport { alignmentOf } from './alignmentOf';\nimport { isDisarray, isUnstruct } from './dataTypes';\nimport { offsetsForProps } from './offsets';\nimport { sizeOf } from './sizeOf';\nimport * as wgsl from './wgslTypes';\n\nexport const EVAL_ALLOWED_IN_ENV: boolean = (() => {\n try {\n new Function('return true');\n return true;\n } catch {\n return false;\n }\n})();\n\nconst compiledWriters = new WeakMap<\n wgsl.BaseData,\n (\n output: DataView,\n offset: number,\n value: unknown,\n littleEndian?: boolean,\n ) => void\n>();\n\nconst typeToPrimitive = {\n u32: 'u32',\n vec2u: 'u32',\n vec3u: 'u32',\n vec4u: 'u32',\n\n i32: 'i32',\n vec2i: 'i32',\n vec3i: 'i32',\n vec4i: 'i32',\n\n f32: 'f32',\n vec2f: 'f32',\n vec3f: 'f32',\n vec4f: 'f32',\n\n vec2h: 'f32',\n vec3h: 'f32',\n vec4h: 'f32',\n\n mat2x2f: 'f32',\n mat3x3f: 'f32',\n mat4x4f: 'f32',\n} as const;\n\nconst primitiveToWriteFunction = {\n u32: 'setUint32',\n i32: 'setInt32',\n f32: 'setFloat32',\n} as const;\n\nexport function buildWriter(\n node: wgsl.BaseData,\n offsetExpr: string,\n valueExpr: string,\n): string {\n if (wgsl.isWgslStruct(node) || isUnstruct(node)) {\n const propOffsets = offsetsForProps(node);\n const sortedProps = Object.entries(propOffsets).sort(\n (a, b) => a[1].offset - b[1].offset,\n );\n let code = '';\n for (const [key, propOffset] of sortedProps) {\n const subSchema = node.propTypes[key];\n if (!subSchema) continue;\n code += buildWriter(\n subSchema,\n `(${offsetExpr} + ${propOffset.offset})`,\n `${valueExpr}.${key}`,\n );\n }\n return code;\n }\n\n if (wgsl.isWgslArray(node) || isDisarray(node)) {\n const arrSchema = node as wgsl.WgslArray;\n const elementSize = roundUp(\n sizeOf(arrSchema.elementType),\n alignmentOf(arrSchema.elementType),\n );\n let code = '';\n\n code += `for (let i = 0; i < ${arrSchema.elementCount}; i++) {\\n`;\n code += buildWriter(\n arrSchema.elementType,\n `(${offsetExpr} + i * ${elementSize})`,\n `${valueExpr}[i]`,\n );\n code += '}\\n';\n\n return code;\n }\n\n if (wgsl.isVec(node)) {\n const primitive = typeToPrimitive[node.type];\n let code = '';\n const writeFunc = primitiveToWriteFunction[primitive];\n const components = ['x', 'y', 'z', 'w'];\n const count = wgsl.isVec2(node) ? 2 : wgsl.isVec3(node) ? 3 : 4;\n\n for (let i = 0; i < count; i++) {\n code += `output.${writeFunc}((${offsetExpr} + ${i * 4}), ${valueExpr}.${components[i]}, littleEndian);\\n`;\n }\n return code;\n }\n\n if (wgsl.isMat(node)) {\n const primitive = typeToPrimitive[node.type];\n const writeFunc = primitiveToWriteFunction[primitive];\n\n const matSize = wgsl.isMat2x2f(node) ? 2 : wgsl.isMat3x3f(node) ? 3 : 4;\n const elementCount = matSize * matSize;\n const rowStride = roundUp(matSize * 4, 8);\n\n let code = '';\n for (let i = 0; i < elementCount; i++) {\n const colIndex = Math.floor(i / matSize);\n const rowIndex = i % matSize;\n const byteOffset = colIndex * rowStride + rowIndex * 4;\n\n code += `output.${writeFunc}((${offsetExpr} + ${byteOffset}), ${valueExpr}.columns[${colIndex}].${['x', 'y', 'z', 'w'][rowIndex]}, littleEndian);\\n`;\n }\n\n return code;\n }\n\n const primitive =\n typeToPrimitive[\n wgsl.isAtomic(node)\n ? node.inner.type\n : (node.type as keyof typeof typeToPrimitive)\n ];\n return `output.${primitiveToWriteFunction[primitive]}(${offsetExpr}, ${valueExpr}, littleEndian);\\n`;\n}\n\nexport function getCompiledWriterForSchema<T extends wgsl.BaseData>(\n schema: T,\n): (\n output: DataView,\n offset: number,\n value: Infer<T>,\n littleEndian?: boolean,\n) => void {\n if (compiledWriters.has(schema)) {\n return compiledWriters.get(schema) as (\n output: DataView,\n offset: number,\n value: Infer<T>,\n littleEndian?: boolean,\n ) => void;\n }\n\n const body = buildWriter(schema, 'offset', 'value');\n\n const fn = new Function(\n 'output',\n 'offset',\n 'value',\n 'littleEndian=true',\n body,\n ) as (\n output: DataView,\n offset: number,\n value: Infer<T> | unknown,\n littleEndian?: boolean,\n ) => void;\n\n compiledWriters.set(schema, fn);\n\n return fn;\n}\n","import type { ISerialInput, ISerialOutput } from 'typed-binary';\nimport type { Infer, InferRecord } from '../shared/repr';\nimport alignIO from './alignIO';\nimport { alignmentOf, customAlignmentOf } from './alignmentOf';\nimport type {\n AnyConcreteData,\n AnyData,\n Disarray,\n LooseDecorated,\n Unstruct,\n} from './dataTypes';\nimport { mat2x2f, mat3x3f, mat4x4f } from './matrix';\nimport { sizeOf } from './sizeOf';\nimport type { WgslStruct } from './struct';\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.BaseData> = (\n output: ISerialOutput,\n schema: TSchema,\n value: Infer<TSchema>,\n) => void;\n\ntype DataReader<TSchema extends wgsl.BaseData> = (\n input: ISerialInput,\n schema: TSchema,\n) => Infer<TSchema>;\n\ntype CompleteDataWriters = {\n [TType in AnyConcreteData['type']]: DataWriter<\n Extract<AnyData, { readonly type: TType }>\n >;\n};\n\ntype CompleteDataReaders = {\n [TType in AnyConcreteData['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: WgslStruct,\n value: InferRecord<Record<string, wgsl.BaseData>>,\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.BaseData);\n }\n\n alignIO(output, alignment);\n },\n\n array(output, schema: wgsl.WgslArray, value: Infer<wgsl.BaseData>[]) {\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 ptr() {\n throw new Error('Pointers are not host-shareable');\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.BaseData>(\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: 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.BaseData>>;\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 ptr() {\n throw new Error('Pointers are not host-shareable');\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.BaseData>>;\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.BaseData>(\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","import { BufferWriter } from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport type { Infer, InferPartial } from '../shared/repr';\nimport { alignmentOf } from './alignmentOf';\nimport { writeData } from './dataIO';\nimport { isDisarray, isUnstruct } from './dataTypes';\nimport { offsetsForProps } from './offsets';\nimport { sizeOf } from './sizeOf';\nimport type * as wgsl from './wgslTypes';\nimport { isWgslArray, isWgslStruct } from './wgslTypes';\n\nexport interface WriteInstruction {\n data: Uint8Array;\n}\n\nexport function getWriteInstructions<TData extends wgsl.BaseData>(\n schema: TData,\n data: InferPartial<TData>,\n): WriteInstruction[] {\n const totalSize = sizeOf(schema);\n if (totalSize === 0 || data === undefined || data === null) {\n return [];\n }\n\n const bigBuffer = new ArrayBuffer(totalSize);\n const writer = new BufferWriter(bigBuffer);\n\n const segments: Array<{\n start: number;\n end: number;\n padding?: number | undefined;\n }> = [];\n\n function gatherAndWrite<T extends wgsl.BaseData>(\n node: T,\n partialValue: InferPartial<T> | undefined,\n offset: number,\n padding?: number | undefined,\n ) {\n if (partialValue === undefined || partialValue === null) {\n return;\n }\n\n if (isWgslStruct(node) || isUnstruct(node)) {\n const propOffsets = offsetsForProps(node);\n\n for (const [key, propOffset] of Object.entries(propOffsets)) {\n const subSchema = node.propTypes[key];\n if (!subSchema) {\n continue;\n }\n\n const childValue = partialValue[key as keyof typeof partialValue];\n if (childValue !== undefined) {\n gatherAndWrite(\n subSchema,\n childValue,\n offset + propOffset.offset,\n propOffset.padding ?? padding,\n );\n }\n }\n return;\n }\n\n if (isWgslArray(node) || isDisarray(node)) {\n const arrSchema = node as wgsl.WgslArray;\n const elementSize = roundUp(\n sizeOf(arrSchema.elementType),\n alignmentOf(arrSchema.elementType),\n );\n\n if (!Array.isArray(partialValue)) {\n throw new Error('Partial value for array must be an array');\n }\n const arrayPartialValue = partialValue as InferPartial<wgsl.WgslArray>;\n\n arrayPartialValue.sort((a, b) => a.idx - b.idx);\n\n for (const { idx, value } of arrayPartialValue) {\n gatherAndWrite(\n arrSchema.elementType,\n value,\n offset + idx * elementSize,\n elementSize - sizeOf(arrSchema.elementType),\n );\n }\n } else {\n const leafSize = sizeOf(node);\n writer.seekTo(offset);\n writeData(writer, node, partialValue as Infer<T>);\n\n segments.push({ start: offset, end: offset + leafSize, padding });\n }\n }\n\n gatherAndWrite(schema, data, 0);\n\n if (segments.length === 0) {\n return [];\n }\n\n const instructions: WriteInstruction[] = [];\n let current = segments[0];\n\n for (let i = 1; i < segments.length; i++) {\n const next = segments[i];\n if (!next || !current) {\n throw new Error('Internal error: missing segment');\n }\n if (next.start === current.end + (current.padding ?? 0)) {\n current.end = next.end;\n current.padding = next.padding;\n } else {\n instructions.push({\n data: new Uint8Array(\n bigBuffer,\n current.start,\n current.end - current.start,\n ),\n });\n current = next;\n }\n }\n\n if (!current) {\n throw new Error('Internal error: missing segment');\n }\n\n instructions.push({\n data: new Uint8Array(bigBuffer, current.start, current.end - current.start),\n });\n\n return instructions;\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 StorageFlag {\n usableAsStorage: true;\n}\n\n/**\n * @deprecated Use StorageFlag instead.\n */\nexport type Storage = StorageFlag;\n\nexport function isUsableAsStorage<T>(value: T): value is T & StorageFlag {\n return !!(value as unknown as StorageFlag)?.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 { AnyData } from '../../data/dataTypes';\nimport type { AnyWgslData, BaseData } from '../../data/wgslTypes';\nimport { type StorageFlag, isUsableAsStorage } from '../../extension';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer, InferGPU } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type {\n BindableBufferUsage,\n ResolutionCtx,\n SelfResolvable,\n} from '../../types';\nimport { valueProxyHandler } from '../valueProxyUtils';\nimport type { TgpuBuffer, UniformFlag } from './buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUsage<\n TData extends BaseData = BaseData,\n TUsage extends BindableBufferUsage = BindableBufferUsage,\n> {\n readonly resourceType: 'buffer-usage';\n readonly usage: TUsage;\n readonly '~repr': Infer<TData>;\n value: InferGPU<TData>;\n\n readonly [$internal]: {\n readonly dataType: TData;\n };\n}\n\nexport interface TgpuBufferUniform<TData extends BaseData>\n extends TgpuBufferUsage<TData, 'uniform'> {\n readonly value: InferGPU<TData>;\n}\n\nexport interface TgpuBufferReadonly<TData extends BaseData>\n extends TgpuBufferUsage<TData, 'readonly'> {\n readonly value: InferGPU<TData>;\n}\n\nexport interface TgpuFixedBufferUsage<TData extends BaseData>\n extends TgpuNamable {\n readonly buffer: TgpuBuffer<TData>;\n write(data: Infer<TData>): void;\n}\n\nexport interface TgpuBufferMutable<TData extends BaseData>\n extends TgpuBufferUsage<TData, 'mutable'> {}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyData>>(\n buffer: T,\n): buffer is T & UniformFlag {\n return !!(buffer as unknown as UniformFlag).usableAsUniform;\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\n TgpuBufferUsage<TData, TUsage>,\n SelfResolvable,\n TgpuFixedBufferUsage<TData>\n{\n /** Type-token, not available at runtime */\n public readonly '~repr'!: Infer<TData>;\n public readonly resourceType = 'buffer-usage' as const;\n public readonly [$internal]: { readonly dataType: TData };\n\n constructor(\n public readonly usage: TUsage,\n public readonly buffer: TgpuBuffer<TData>,\n ) {\n this[$internal] = { dataType: buffer.dataType };\n }\n\n get label() {\n return this.buffer.label;\n }\n\n $name(label: string) {\n this.buffer.$name(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 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(\n this.buffer.dataType,\n )};`,\n );\n\n return id;\n }\n\n write(data: Infer<TData>) {\n this.buffer.write(data);\n }\n\n toString(): string {\n return `${this.usage}:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): InferGPU<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.buffer.dataType,\n },\n },\n valueProxyHandler,\n ) as InferGPU<TData>;\n }\n}\nexport class TgpuLaidOutBufferImpl<\n TData extends BaseData,\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 public readonly [$internal]: { readonly dataType: TData };\n\n constructor(\n public readonly usage: TUsage,\n public readonly dataType: TData,\n private readonly _membership: LayoutMembership,\n ) {\n this[$internal] = { dataType };\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(${\n this._membership.idx\n }) 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(): InferGPU<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.dataType,\n },\n },\n valueProxyHandler,\n ) as InferGPU<TData>;\n }\n}\n\nconst mutableUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'mutable'>\n>();\n\n/**\n * @deprecated Use buffer.as('mutable') instead.\n */\nexport function asMutable<TData extends AnyWgslData>(\n buffer: TgpuBuffer<TData> & StorageFlag,\n): TgpuBufferMutable<TData> & TgpuFixedBufferUsage<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 TgpuFixedBufferUsage<TData>;\n}\n\nconst readonlyUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'readonly'>\n>();\n\n/**\n * @deprecated Use buffer.as('readonly') instead.\n */\nexport function asReadonly<TData extends AnyWgslData>(\n buffer: TgpuBuffer<TData> & StorageFlag,\n): TgpuBufferReadonly<TData> & TgpuFixedBufferUsage<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 TgpuFixedBufferUsage<TData>;\n}\n\nconst uniformUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'uniform'>\n>();\n\n/**\n * @deprecated Use buffer.as('uniform') instead.\n */\nexport function asUniform<TData extends AnyWgslData>(\n buffer: TgpuBuffer<TData> & UniformFlag,\n): TgpuBufferUniform<TData> & TgpuFixedBufferUsage<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 TgpuFixedBufferUsage<TData>;\n}\n","// ----------\n// Public API\n// ----------\n\nimport type { TgpuNamable } from '../../namable';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport type { Unwrapper } from '../../unwrapper';\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 INTERNAL_TgpuFixedSampler {\n unwrap(branch: Unwrapper): GPUSampler;\n}\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\n implements TgpuFixedSampler, SelfResolvable, INTERNAL_TgpuFixedSampler\n{\n public readonly resourceType = 'sampler';\n\n private _label: string | undefined;\n private _filtering: boolean;\n private _sampler: GPUSampler | null = null;\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 /**\n * NOTE: Internal use only\n */\n unwrap(branch: Unwrapper): GPUSampler {\n if (!this._sampler) {\n this._sampler = branch.device.createSampler({\n ...this._props,\n label: this._label ?? '<unnamed>',\n });\n }\n\n return this._sampler;\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\n TgpuFixedComparisonSampler,\n SelfResolvable,\n INTERNAL_TgpuFixedSampler\n{\n public readonly resourceType = 'sampler-comparison';\n\n private _label: string | undefined;\n private _sampler: GPUSampler | null = null;\n\n constructor(private readonly _props: ComparisonSamplerProps) {}\n\n /**\n * NOTE: Internal use only\n */\n unwrap(branch: Unwrapper): GPUSampler {\n if (!this._sampler) {\n this._sampler = branch.device.createSampler({\n ...this._props,\n label: this._label ?? '<unnamed>',\n });\n }\n\n return this._sampler;\n }\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 { StorageFlag } 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: StorageFlag; // <- 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 UniformFlag,\n isBuffer,\n} from './core/buffer/buffer';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n TgpuLaidOutBufferImpl,\n isUsableAsUniform,\n} from './core/buffer/bufferUsage';\nimport {\n type TgpuComparisonSampler,\n TgpuLaidOutComparisonSamplerImpl,\n TgpuLaidOutSamplerImpl,\n type TgpuSampler,\n isComparisonSampler,\n isSampler,\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 isSampledTextureView,\n isStorageTextureView,\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 { AnyWgslData, BaseData } from './data/wgslTypes';\nimport { NotUniformError } from './errors';\nimport {\n NotStorageError,\n type StorageFlag,\n isUsableAsStorage,\n} 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 BaseData | ((_: number) => BaseData),\n> = T extends (_: number) => BaseData ? 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 ?\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & UniformFlag)\n | GPUBuffer\n : T extends TgpuLayoutStorage\n ?\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & StorageFlag)\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 | TgpuSampledTexture<\n Default<T['viewDimension'], '2d'>,\n ChannelFormatToSchema[T['texture']]\n >\n : T extends TgpuLayoutStorageTexture\n ?\n | GPUTextureView\n | (StorageFlag &\n TgpuTexture<\n Prettify<TextureProps & GetStorageTextureRestriction<T>>\n >)\n | StorageTextureUsageForEntry<T>\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\nexport function bindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayout<Prettify<Entries>> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function isBindGroupLayout<T extends TgpuBindGroupLayout>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group-layout';\n}\n\nexport function isBindGroup<T extends TgpuBindGroup>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group';\n}\n\n/**\n * @category Errors\n */\nexport class MissingBindingError extends Error {\n constructor(groupLabel: string | undefined, key: string) {\n super(\n `Bind group '${groupLabel ?? '<unnamed>'}' is missing a required binding '${key}'`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingBindingError.prototype);\n }\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst DEFAULT_MUTABLE_VISIBILITY: TgpuShaderStage[] = ['compute'];\nconst DEFAULT_READONLY_VISIBILITY: TgpuShaderStage[] = [\n 'compute',\n 'vertex',\n 'fragment',\n];\n\nclass TgpuBindGroupLayoutImpl<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n> implements 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 NotStorageError(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 if (isSampledTextureView(value)) {\n resource = unwrapper.unwrap(value);\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 & StorageFlag).createView('readonly'),\n );\n } else if (entry.access === 'mutable') {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & StorageFlag).createView('mutable'),\n );\n } else {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & StorageFlag).createView('writeonly'),\n );\n }\n } else if (isStorageTextureView(value)) {\n resource = unwrapper.unwrap(value);\n } else {\n resource = value as GPUTextureView;\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('sampler' in entry) {\n if (isSampler(value) || isComparisonSampler(value)) {\n return {\n binding: idx,\n resource: unwrapper.unwrap(value as TgpuSampler),\n };\n }\n\n return {\n binding: idx,\n resource: value as GPUSampler,\n };\n }\n\n if ('externalTexture' in entry) {\n return {\n binding: idx,\n resource: value as GPUExternalTexture,\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 isProviding,\n isSlot,\n} from './core/slot/slotTypes';\nimport { isData } from './data';\nimport { getAttributesString } from './data/attributes';\nimport {\n type AnyWgslData,\n type BaseData,\n isWgslArray,\n isWgslStruct,\n} from './data/wgslTypes';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { RuntimeMode, popMode, provideCtx, pushMode } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { naturalsExcept } from './shared/generators';\nimport type { Infer } from './shared/repr';\nimport { $internal } from './shared/symbols';\nimport { generateFunction } from './smol';\nimport { getTypeFromWgsl } from './smol/generationHelpers';\nimport {\n type TgpuBindGroup,\n TgpuBindGroupImpl,\n type TgpuBindGroupLayout,\n type TgpuLayoutEntry,\n bindGroupLayout,\n} from './tgpuBindGroupLayout';\nimport type {\n FnToWgslOptions,\n ItemLayer,\n ItemStateStack,\n ResolutionCtx,\n Resource,\n Wgsl,\n} 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 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 ItemStateStackImpl implements 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 popItem() {\n this.pop('item');\n }\n\n pushSlotBindings(pairs: SlotValuePair<unknown>[]) {\n this._stack.push({\n type: 'slotBinding',\n bindingMap: new WeakMap(pairs),\n });\n }\n\n popSlotBindings() {\n this.pop('slotBinding');\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 popFunctionScope() {\n this.pop('functionScope');\n }\n\n pushBlockScope() {\n this._stack.push({\n type: 'blockScope',\n declarations: new Map<string, AnyWgslData | UnknownData>(),\n });\n }\n\n popBlockScope() {\n this.pop('blockScope');\n }\n\n pop(type?: (typeof this._stack)[number]['type']) {\n const layer = this._stack[this._stack.length - 1];\n if (!layer || (type && layer.type !== type)) {\n throw new Error(`Internal error, expected a ${type} layer to be on top.`);\n }\n\n this._stack.pop();\n if (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 return {\n value: external,\n dataType: isWgsl(external)\n ? getTypeFromWgsl(external)\n : UnknownData,\n };\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 defineBlockVariable(id: string, type: AnyWgslData | UnknownData): Resource {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n\n if (layer?.type === 'blockScope') {\n layer.declarations.set(id, type);\n\n return { value: id, dataType: type };\n }\n }\n\n throw new Error('No block scope found to define a variable in.');\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\nexport class 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 ItemStateStackImpl();\n private readonly _declarations: string[] = [];\n\n readonly [$internal] = {\n itemStateStack: this._itemStateStack,\n };\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 callStack: unknown[] = [];\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 | null {\n const item = this._itemStateStack.getResourceById(id);\n\n if (item === undefined) {\n return null;\n }\n\n return item;\n }\n\n defineVariable(id: string, dataType: AnyWgslData | UnknownData): Resource {\n return this._itemStateStack.defineBlockVariable(id, dataType);\n }\n\n pushBlockScope() {\n this._itemStateStack.pushBlockScope();\n }\n\n popBlockScope() {\n this._itemStateStack.popBlockScope();\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\n try {\n const str = generateFunction(this, options.body);\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}) -> ${getAttributesString(options.returnType)} ${this.resolve(options.returnType)}`\n : `(${argList})`,\n body: str,\n };\n } finally {\n this._itemStateStack.popFunctionScope();\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.popSlotBindings();\n }\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n if (isProviding(eventual)) {\n return this.withSlots(\n eventual['~providing'].pairs,\n () => this.unwrap(eventual['~providing'].inner) as T,\n );\n }\n\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 // Derived computations are always done on the CPU\n pushMode(RuntimeMode.CPU);\n\n let result: T;\n try {\n result = derived['~compute']();\n } finally {\n popMode(RuntimeMode.CPU);\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._memoizedDerived.set(derived, instances);\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.popItem();\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 (isData(item)) {\n result = resolveData(this, item);\n } else if (isDerived(item) || isSlot(item)) {\n result = this.resolve(this.unwrap(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.popItem();\n }\n }\n\n resolve(item: unknown): string {\n if (isProviding(item)) {\n return this.withSlots(item['~providing'].pairs, () =>\n this.resolve(item['~providing'].inner),\n );\n }\n\n if ((item && typeof item === 'object') || typeof item === 'function') {\n if (this._itemStateStack.itemDepth === 0) {\n try {\n pushMode(RuntimeMode.GPU);\n const result = provideCtx(this, () => this._getOrInstantiate(item));\n return `${[...this._declarations].join('\\n\\n')}${result}`;\n } finally {\n popMode(RuntimeMode.GPU);\n }\n }\n\n return this._getOrInstantiate(item);\n }\n\n return String(item);\n }\n\n resolveValue<T extends BaseData>(\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 { MissingBindGroupsError } 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 const { branch, label } = this._core;\n\n const pass = branch.commandEncoder.beginComputePass({\n label: label ?? '<unnamed>',\n });\n\n pass.setPipeline(memo.pipeline);\n\n const missingBindGroups = new Set(memo.bindGroupLayouts);\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 missingBindGroups.delete(layout);\n } else {\n const bindGroup = this._priors.bindGroupLayoutMap?.get(layout);\n if (bindGroup !== undefined) {\n missingBindGroups.delete(layout);\n pass.setBindGroup(idx, branch.unwrap(bindGroup));\n }\n }\n });\n\n if (missingBindGroups.size > 0) {\n throw new MissingBindGroupsError(missingBindGroups);\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 { alignmentOf, customAlignmentOf } from '../../data/alignmentOf';\nimport {\n getCustomLocation,\n isLooseDecorated,\n isUnstruct,\n} from '../../data/dataTypes';\nimport type { Disarray } from '../../data/dataTypes';\nimport { sizeOf } from '../../data/sizeOf';\nimport { isDecorated, isWgslStruct } from '../../data/wgslTypes';\nimport type { BaseData, 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 {\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 readonly vertexLayout: GPUVertexBufferLayout;\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<TData> {\n return new TgpuVertexLayoutImpl(schemaForCount, stepMode);\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\nconst defaultAttribEntry = Symbol('defaultAttribEntry');\n\nfunction dataToContainedAttribs<\n TLayoutData extends WgslArray | Disarray,\n TData extends BaseData,\n>(\n layout: TgpuVertexLayout<TLayoutData>,\n data: TData,\n offset: number,\n customLocationMap: Record<string | symbol, number>,\n key?: string,\n): DataToContainedAttribs<TData> {\n if (isDecorated(data) || isLooseDecorated(data)) {\n const customLocation = getCustomLocation(data);\n if (customLocation !== undefined) {\n customLocationMap[key ?? defaultAttribEntry] = customLocation;\n }\n\n return dataToContainedAttribs(\n layout,\n data.inner,\n roundUp(offset, customAlignmentOf(data)),\n customLocationMap,\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(\n layout,\n value,\n memberOffset,\n customLocationMap,\n key,\n ),\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(\n layout,\n value,\n memberOffset,\n customLocationMap,\n key,\n ),\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 private readonly _customLocationMap = {} as Record<string | symbol, number>;\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(\n this,\n arraySchema.elementType,\n 0,\n this._customLocationMap,\n );\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get vertexLayout(): GPUVertexBufferLayout {\n // If defaultAttribEntry is in the custom location map,\n // it means that the vertex layout is based on a single attribute\n if (this._customLocationMap[defaultAttribEntry] !== undefined) {\n if (\n typeof this.attrib.format !== 'string' ||\n typeof this.attrib.offset !== 'number'\n ) {\n throw new Error(\n 'Single attribute vertex layouts must have a format and offset.',\n );\n }\n\n return {\n arrayStride: this.stride,\n stepMode: this.stepMode,\n attributes: [\n {\n format: this.attrib.format,\n offset: this.attrib.offset,\n shaderLocation: this._customLocationMap[defaultAttribEntry],\n },\n ],\n };\n }\n\n // check if all attributes have custom locations\n const allAttributesHaveCustomLocations = Object.keys(this.attrib).every(\n (key) => this._customLocationMap[key] !== undefined,\n );\n\n if (!allAttributesHaveCustomLocations) {\n throw new Error(\n 'All attributes must have custom locations in order to unwrap a vertex layout.',\n );\n }\n\n return {\n arrayStride: this.stride,\n stepMode: this.stepMode,\n attributes: [\n ...Object.entries(this.attrib).map(([key, attrib]) => ({\n format: attrib.format,\n offset: attrib.offset,\n shaderLocation: this._customLocationMap[key],\n })),\n ] as GPUVertexAttribute[],\n };\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 { FragmentOutConstrained } from '../function/tgpuFragmentFn';\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: FragmentOutConstrained,\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 { FragmentOutConstrained } from '../function/tgpuFragmentFn';\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: FragmentOutConstrained,\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, VertexFlag } from '../../core/buffer/buffer';\nimport type { Disarray } from '../../data/dataTypes';\nimport type { AnyWgslData, WgslArray } from '../../data/wgslTypes';\nimport {\n MissingBindGroupsError,\n MissingVertexBuffersError,\n} 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> & VertexFlag,\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 withDepthStencilAttachment(\n attachment: DepthStencilAttachment,\n ): TgpuRenderPipeline<IOLayout>;\n\n draw(\n vertexCount: number,\n instanceCount?: number,\n firstVertex?: number,\n firstInstance?: number,\n ): void;\n}\n\nexport interface INTERNAL_TgpuRenderPipeline {\n readonly core: RenderPipelineCore;\n readonly priors: TgpuRenderPipelinePriors;\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 interface DepthStencilAttachment {\n /**\n * A {@link GPUTextureView} | ({@link TgpuTexture} & {@link Render}) describing the texture subresource that will be output to\n * and read from for this depth/stencil attachment.\n */\n view: (TgpuTexture & Render) | GPUTextureView;\n /**\n * Indicates the value to clear {@link GPURenderPassDepthStencilAttachment#view}'s depth component\n * to prior to executing the render pass. Ignored if {@link GPURenderPassDepthStencilAttachment#depthLoadOp}\n * is not {@link GPULoadOp#\"clear\"}. Must be between 0.0 and 1.0, inclusive (unless unrestricted depth is enabled).\n */\n depthClearValue?: number;\n /**\n * Indicates the load operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * depth component prior to executing the render pass.\n * Note: It is recommended to prefer clearing; see {@link GPULoadOp#\"clear\"} for details.\n */\n depthLoadOp?: GPULoadOp;\n /**\n * The store operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * depth component after executing the render pass.\n */\n depthStoreOp?: GPUStoreOp;\n /**\n * Indicates that the depth component of {@link GPURenderPassDepthStencilAttachment#view}\n * is read only.\n */\n depthReadOnly?: boolean;\n /**\n * Indicates the value to clear {@link GPURenderPassDepthStencilAttachment#view}'s stencil component\n * to prior to executing the render pass. Ignored if {@link GPURenderPassDepthStencilAttachment#stencilLoadOp}\n * is not {@link GPULoadOp#\"clear\"}.\n * The value will be converted to the type of the stencil aspect of `view` by taking the same\n * number of LSBs as the number of bits in the stencil aspect of one texel block|texel of `view`.\n */\n stencilClearValue?: GPUStencilValue;\n /**\n * Indicates the load operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * stencil component prior to executing the render pass.\n * Note: It is recommended to prefer clearing; see {@link GPULoadOp#\"clear\"} for details.\n */\n stencilLoadOp?: GPULoadOp;\n /**\n * The store operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * stencil component after executing the render pass.\n */\n stencilStoreOp?: GPUStoreOp;\n /**\n * Indicates that the stencil component of {@link GPURenderPassDepthStencilAttachment#view}\n * is read only.\n */\n stencilReadOnly?: boolean;\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 depthStencilState: GPUDepthStencilState | undefined;\n targets: AnyFragmentTargets;\n multisampleState: GPUMultisampleState | undefined;\n};\n\nexport function INTERNAL_createRenderPipeline(\n options: RenderPipelineCoreOptions,\n) {\n return new TgpuRenderPipelineImpl(new RenderPipelineCore(options), {});\n}\n\nexport function isRenderPipeline(value: unknown): value is TgpuRenderPipeline {\n return (value as TgpuRenderPipeline)?.resourceType === 'render-pipeline';\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype TgpuRenderPipelinePriors = {\n readonly vertexLayoutMap?:\n | Map<TgpuVertexLayout, TgpuBuffer<AnyWgslData> & VertexFlag>\n | undefined;\n readonly bindGroupLayoutMap?:\n | Map<TgpuBindGroupLayout, TgpuBindGroup>\n | undefined;\n readonly colorAttachment?: AnyFragmentColorAttachment | undefined;\n readonly depthStencilAttachment?: DepthStencilAttachment | undefined;\n};\n\ntype Memo = {\n pipeline: GPURenderPipeline;\n bindGroupLayouts: TgpuBindGroupLayout[];\n catchall: [number, TgpuBindGroup] | null;\n};\n\nclass TgpuRenderPipelineImpl\n implements TgpuRenderPipeline, INTERNAL_TgpuRenderPipeline\n{\n public readonly resourceType = 'render-pipeline';\n\n constructor(\n public readonly core: RenderPipelineCore,\n public 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> & VertexFlag,\n ): TgpuRenderPipeline;\n with(\n bindGroupLayout: TgpuBindGroupLayout,\n bindGroup: TgpuBindGroup,\n ): TgpuRenderPipeline;\n with(\n definition: TgpuVertexLayout | TgpuBindGroupLayout,\n resource: (TgpuBuffer<AnyWgslData> & VertexFlag) | 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> & VertexFlag],\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 withDepthStencilAttachment(\n attachment: DepthStencilAttachment,\n ): TgpuRenderPipeline {\n return new TgpuRenderPipelineImpl(this.core, {\n ...this.priors,\n depthStencilAttachment: 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.targets,\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 renderPassDescriptor: GPURenderPassDescriptor = {\n colorAttachments,\n };\n\n if (this.core.label !== undefined) {\n renderPassDescriptor.label = this.core.label;\n }\n\n if (this.priors.depthStencilAttachment !== undefined) {\n const attachment = this.priors.depthStencilAttachment;\n if (isTexture(attachment.view)) {\n renderPassDescriptor.depthStencilAttachment = {\n ...attachment,\n view: branch.unwrap(attachment.view).createView(),\n };\n } else {\n renderPassDescriptor.depthStencilAttachment =\n attachment as GPURenderPassDepthStencilAttachment;\n }\n }\n\n const pass = branch.commandEncoder.beginRenderPass(renderPassDescriptor);\n\n pass.setPipeline(memo.pipeline);\n\n const missingBindGroups = new Set(memo.bindGroupLayouts);\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 missingBindGroups.delete(layout);\n } else {\n const bindGroup = this.priors.bindGroupLayoutMap?.get(layout);\n if (bindGroup !== undefined) {\n missingBindGroups.delete(layout);\n pass.setBindGroup(idx, branch.unwrap(bindGroup));\n }\n }\n });\n\n const missingVertexLayouts = new Set(this.core.usedVertexLayouts);\n\n const usedVertexLayouts = this.core.usedVertexLayouts;\n usedVertexLayouts.forEach((vertexLayout, idx) => {\n const buffer = this.priors.vertexLayoutMap?.get(vertexLayout);\n if (buffer) {\n missingVertexLayouts.delete(vertexLayout);\n pass.setVertexBuffer(idx, branch.unwrap(buffer));\n }\n });\n\n if (missingBindGroups.size > 0) {\n throw new MissingBindGroupsError(missingBindGroups);\n }\n\n if (missingVertexLayouts.size > 0) {\n throw new MissingVertexBuffersError(missingVertexLayouts);\n }\n\n pass.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n\n pass.end();\n branch.flush();\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.attributes[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.targets,\n options.targets,\n );\n }\n\n public unwrap(): Memo {\n if (this._memo === undefined) {\n const {\n branch,\n vertexFn,\n fragmentFn,\n slotBindings,\n primitiveState,\n depthStencilState,\n multisampleState,\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 if (depthStencilState) {\n descriptor.depthStencil = depthStencilState;\n }\n\n if (multisampleState) {\n descriptor.multisample = multisampleState;\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 { AnyComputeBuiltin, OmitBuiltins } from '../../builtin';\nimport type { AnyData, Disarray } from '../../data/dataTypes';\nimport type { AnyWgslData, BaseData, WgslArray } from '../../data/wgslTypes';\nimport {\n MissingBindGroupsError,\n MissingVertexBuffersError,\n invariant,\n} 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 type VertexFlag,\n isBuffer,\n} from '../buffer/buffer';\nimport type {\n TgpuBufferMutable,\n TgpuBufferReadonly,\n TgpuBufferUniform,\n TgpuBufferUsage,\n TgpuFixedBufferUsage,\n} from '../buffer/bufferUsage';\nimport type { IOLayout } from '../function/fnTypes';\nimport type { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { TgpuFn } from '../function/tgpuFn';\nimport type {\n FragmentOutConstrained,\n TgpuFragmentFn,\n} 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 type INTERNAL_TgpuRenderPipeline,\n INTERNAL_createRenderPipeline,\n type RenderPipelineCoreOptions,\n type TgpuRenderPipeline,\n isRenderPipeline,\n} from '../pipeline/renderPipeline';\nimport {\n type INTERNAL_TgpuFixedSampler,\n type TgpuComparisonSampler,\n type TgpuSampler,\n isComparisonSampler,\n isSampler,\n} from '../sampler/sampler';\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 {\n type TgpuVertexLayout,\n isVertexLayout,\n} from '../vertexLayout/vertexLayout';\nimport type {\n CreateTextureOptions,\n CreateTextureResult,\n ExperimentalTgpuRoot,\n RenderPass,\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<ComputeIn extends Record<string, AnyComputeBuiltin>>(\n entryFn: TgpuComputeFn<ComputeIn>,\n ): 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 depthStencilState: undefined,\n slotBindings: this._slotBindings,\n vertexFn,\n vertexAttribs: attribs as AnyVertexAttribs,\n multisampleState: undefined,\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 withDepthStencil(\n depthStencilState: GPUDepthStencilState | undefined,\n ): WithFragment {\n return new WithFragmentImpl({ ...this._options, depthStencilState });\n }\n\n withMultisample(\n multisampleState: GPUMultisampleState | undefined,\n ): WithFragment<FragmentOutConstrained> {\n return new WithFragmentImpl({ ...this._options, multisampleState });\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'] = 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 createUniform<TData extends AnyWgslData>(\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n ): TgpuBufferUniform<TData> & TgpuFixedBufferUsage<TData> {\n return this.createBuffer<AnyWgslData>(typeSchema, initialOrBuffer)\n .$usage('uniform')\n .as('uniform') as TgpuBufferUniform<TData> & TgpuFixedBufferUsage<TData>;\n }\n\n createMutable<TData extends AnyWgslData>(\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n ): TgpuBufferMutable<TData> & TgpuFixedBufferUsage<TData> {\n return this.createBuffer<AnyWgslData>(typeSchema, initialOrBuffer)\n .$usage('storage')\n .as('mutable') as TgpuBufferMutable<TData> & TgpuFixedBufferUsage<TData>;\n }\n\n createReadonly<TData extends AnyWgslData>(\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n ): TgpuBufferReadonly<TData> & TgpuFixedBufferUsage<TData> {\n return this.createBuffer<AnyWgslData>(typeSchema, initialOrBuffer)\n .$usage('storage')\n .as('readonly') as TgpuBufferReadonly<TData> &\n TgpuFixedBufferUsage<TData>;\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: TgpuRenderPipeline): GPURenderPipeline;\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(resource: TgpuVertexLayout): GPUVertexBufferLayout;\n unwrap(resource: TgpuSampler): GPUSampler;\n unwrap(resource: TgpuComparisonSampler): GPUSampler;\n unwrap(\n resource:\n | TgpuComputePipeline\n | TgpuRenderPipeline\n | TgpuBindGroupLayout\n | TgpuBindGroup\n | TgpuBuffer<AnyData>\n | TgpuTexture\n | TgpuReadonlyTexture\n | TgpuWriteonlyTexture\n | TgpuMutableTexture\n | TgpuSampledTexture\n | TgpuVertexLayout\n | TgpuSampler\n | TgpuComparisonSampler,\n ):\n | GPUComputePipeline\n | GPURenderPipeline\n | GPUBindGroupLayout\n | GPUBindGroup\n | GPUBuffer\n | GPUTexture\n | GPUTextureView\n | GPUVertexBufferLayout\n | GPUSampler {\n if (isComputePipeline(resource)) {\n return (resource as unknown as INTERNAL_TgpuComputePipeline).rawPipeline;\n }\n\n if (isRenderPipeline(resource)) {\n return (resource as unknown as INTERNAL_TgpuRenderPipeline).core.unwrap()\n .pipeline;\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 if (isVertexLayout(resource)) {\n return resource.vertexLayout;\n }\n\n if (isSampler(resource)) {\n if ('unwrap' in resource) {\n return (resource as INTERNAL_TgpuFixedSampler).unwrap(this);\n }\n throw new Error('Cannot unwrap laid-out sampler.');\n }\n\n if (isComparisonSampler(resource)) {\n if ('unwrap' in resource) {\n return (resource as INTERNAL_TgpuFixedSampler).unwrap(this);\n }\n throw new Error('Cannot unwrap laid-out comparison sampler.');\n }\n\n throw new Error(`Unknown resource type: ${resource}`);\n }\n\n beginRenderPass(\n descriptor: GPURenderPassDescriptor,\n callback: (pass: RenderPass) => void,\n ): void {\n const pass = this.commandEncoder.beginRenderPass(descriptor);\n\n const bindGroups = new Map<\n TgpuBindGroupLayout,\n TgpuBindGroup | GPUBindGroup\n >();\n const vertexBuffers = new Map<\n TgpuVertexLayout,\n {\n buffer:\n | (TgpuBuffer<WgslArray<BaseData> | Disarray<BaseData>> & VertexFlag)\n | GPUBuffer;\n offset?: number | undefined;\n size?: number | undefined;\n }\n >();\n\n let currentPipeline:\n | (TgpuRenderPipeline & INTERNAL_TgpuRenderPipeline)\n | undefined;\n\n const setupPassBeforeDraw = () => {\n if (!currentPipeline) {\n throw new Error('Cannot draw without a call to pass.setPipeline');\n }\n\n const { core, priors } = currentPipeline;\n const memo = core.unwrap();\n\n pass.setPipeline(memo.pipeline);\n\n const missingBindGroups = new Set(memo.bindGroupLayouts);\n memo.bindGroupLayouts.forEach((layout, idx) => {\n if (memo.catchall && idx === memo.catchall[0]) {\n // Catch-all\n pass.setBindGroup(idx, this.unwrap(memo.catchall[1]));\n missingBindGroups.delete(layout);\n } else {\n const bindGroup =\n priors.bindGroupLayoutMap?.get(layout) ?? bindGroups.get(layout);\n if (bindGroup !== undefined) {\n missingBindGroups.delete(layout);\n if (isBindGroup(bindGroup)) {\n pass.setBindGroup(idx, this.unwrap(bindGroup));\n } else {\n pass.setBindGroup(idx, bindGroup);\n }\n }\n }\n });\n\n const missingVertexLayouts = new Set<TgpuVertexLayout>();\n core.usedVertexLayouts.forEach((vertexLayout, idx) => {\n const priorBuffer = priors.vertexLayoutMap?.get(vertexLayout);\n const opts = priorBuffer\n ? {\n buffer: priorBuffer,\n offset: undefined,\n size: undefined,\n }\n : vertexBuffers.get(vertexLayout);\n\n if (!opts || !opts.buffer) {\n missingVertexLayouts.add(vertexLayout);\n } else if (isBuffer(opts.buffer)) {\n pass.setVertexBuffer(\n idx,\n this.unwrap(opts.buffer),\n opts.offset,\n opts.size,\n );\n } else {\n pass.setVertexBuffer(idx, opts.buffer, opts.offset, opts.size);\n }\n });\n\n if (missingBindGroups.size > 0) {\n throw new MissingBindGroupsError(missingBindGroups);\n }\n\n if (missingVertexLayouts.size > 0) {\n throw new MissingVertexBuffersError(missingVertexLayouts);\n }\n };\n\n callback({\n setViewport(...args) {\n pass.setViewport(...args);\n },\n setScissorRect(...args) {\n pass.setScissorRect(...args);\n },\n setBlendConstant(...args) {\n pass.setBlendConstant(...args);\n },\n setStencilReference(...args) {\n pass.setStencilReference(...args);\n },\n beginOcclusionQuery(...args) {\n pass.beginOcclusionQuery(...args);\n },\n endOcclusionQuery(...args) {\n pass.endOcclusionQuery(...args);\n },\n executeBundles(...args) {\n pass.executeBundles(...args);\n },\n setPipeline(pipeline) {\n currentPipeline = pipeline as TgpuRenderPipeline &\n INTERNAL_TgpuRenderPipeline;\n },\n\n setIndexBuffer: (buffer, indexFormat, offset, size) => {\n if (isBuffer(buffer)) {\n pass.setIndexBuffer(this.unwrap(buffer), indexFormat, offset, size);\n } else {\n pass.setIndexBuffer(buffer, indexFormat, offset, size);\n }\n },\n\n setVertexBuffer(vertexLayout, buffer, offset, size) {\n vertexBuffers.set(vertexLayout, { buffer, offset, size });\n },\n\n setBindGroup(bindGroupLayout, bindGroup) {\n bindGroups.set(bindGroupLayout, bindGroup);\n },\n\n draw(vertexCount, instanceCount, firstVertex, firstInstance) {\n setupPassBeforeDraw();\n pass.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n },\n\n drawIndexed(...args) {\n setupPassBeforeDraw();\n pass.drawIndexed(...args);\n },\n\n drawIndirect(...args) {\n setupPassBeforeDraw();\n pass.drawIndirect(...args);\n },\n\n drawIndexedIndirect(...args) {\n setupPassBeforeDraw();\n pass.drawIndexedIndirect(...args);\n },\n });\n\n pass.end();\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 { unwrapProxy } from '../valueProxyUtils';\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 '~repr' = undefined as Infer<T>;\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 unwrapProxy(ctx.unwrap(this));\n }\n}\n","import type { AnyWgslData } from '../../data';\nimport { getResolutionCtx } from '../../gpuMode';\nimport type { Infer } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport {\n type ResolutionCtx,\n type SelfResolvable,\n isBufferUsage,\n} from '../../types';\nimport type { TgpuBufferUsage } from '../buffer/bufferUsage';\nimport { type TgpuFn, isTgpuFn } from '../function/tgpuFn';\nimport { valueProxyHandler } from '../valueProxyUtils';\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?: TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>,\n): TgpuAccessor<T> {\n return new TgpuAccessorImpl(schema, 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 '~repr' = undefined as Infer<T>;\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 new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.schema,\n },\n },\n valueProxyHandler,\n ) 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 { unwrapProxy } from '../valueProxyUtils';\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 stringifyPair([slot, value]: SlotValuePair): string {\n return `${slot.label ?? '<unnamed>'}=${value}`;\n}\n\nfunction createDerived<T>(compute: () => T): TgpuDerived<T> {\n const result = {\n resourceType: 'derived' as const,\n '~compute': compute,\n '~repr': undefined as Infer<T>,\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 unwrapProxy(ctx.unwrap(this));\n },\n\n with<TValue>(\n slot: TgpuSlot<TValue>,\n value: Eventual<TValue>,\n ): TgpuDerived<T> {\n return createBoundDerived(this, [[slot, value]]);\n },\n\n toString(): string {\n return 'derived';\n },\n };\n\n return result;\n}\n\nfunction createBoundDerived<T>(\n innerDerived: TgpuDerived<T>,\n pairs: SlotValuePair[],\n): TgpuDerived<T> {\n const result = {\n resourceType: 'derived' as const,\n '~repr': undefined as Infer<T>,\n\n '~compute'() {\n throw new Error(\n `'~compute' should never be read on bound derived items.`,\n );\n },\n '~providing': {\n inner: innerDerived,\n pairs,\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 unwrapProxy(ctx.unwrap(this));\n },\n\n with<TValue>(\n slot: TgpuSlot<TValue>,\n value: Eventual<TValue>,\n ): TgpuDerived<T> {\n return createBoundDerived(innerDerived, [...pairs, [slot, value]]);\n },\n\n toString(): string {\n return `derived[${pairs.map(stringifyPair).join(', ')}]`;\n },\n };\n\n return result;\n}\n","import type { AnyWgslData } from '../../data/wgslTypes';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport { valueProxyHandler } from '../valueProxyUtils';\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: TDataType,\n initialValue?: Infer<TDataType>,\n): TgpuVar<'private', 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\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this._dataType,\n },\n },\n valueProxyHandler,\n ) 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 vertexLayout,\n\n init,\n initFromDevice,\n\n resolve,\n\n '~unstable': {\n fn,\n fragmentFn,\n vertexFn,\n computeFn,\n /**\n * @deprecated This feature is now stable, use tgpu.vertexLayout.\n */\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 MissingBindGroupsError,\n MissingVertexBuffersError,\n MissingLinksError,\n MissingSlotValueError,\n NotUniformError,\n ResolutionError,\n} from './errors';\nexport { StrictNameRegistry, RandomNameRegistry } from './nameRegistry';\nexport {\n isBuffer,\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 isUsableAsUniform,\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 { StorageFlag, 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 UniformFlag,\n Uniform,\n VertexFlag,\n Vertex,\n} from './core/buffer/buffer';\nexport type {\n TgpuBufferUniform,\n TgpuBufferReadonly,\n TgpuBufferMutable,\n} from './core/buffer/bufferUsage';\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"],"mappings":"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","names":["swizzleableTypes","swizzleLenToType","f32","vec2f","vec3f","vec4f","f16","vec2h","vec3h","vec4h","i32","vec2i","vec3i","vec4i","u32","vec2u","vec3u","vec4u","kindToSchema","mat2x2f","mat3x3f","mat4x4f","indexableTypeToResult","getTypeForPropAccess","targetType","propName","_a","UnknownData","isDerived","isSlot","ctx","getResolutionCtx","unwrapped","getTypeFromWgsl","target","hasInternalDataType","$internal","isDecorated","targetTypeStr","propLength","swizzleTypeChar","swizzleType","isWgslData","getTypeForIndexAccess","resource","isWgslArray","_b","numericLiteralToResource","bool","kind","value","abstractInt","abstractFloat","valueProxyHandler","target","prop","ctx","_a","$internal","getTypeForPropAccess","unwrapProxy","value","unwrapped","isSlot","isDerived","isAccessor","isBufferUsage","constant","dataType","value","TgpuConstImpl","_a","$internal","_value","__publicField","label","ctx","id","resolvedValue","inGPUMode","valueProxyHandler","isNamable","value","applyExternals","existing","newExternals","key","value","isNamable","addArgTypesToExternals","implementation","argTypes","argTypeNames","found","argType","i","argTypeName","isWgslStruct","addReturnTypeToExternals","returnType","_a","matched","outputName","identifierRegex","name","replaceExternalsInWgsl","ctx","externalMap","wgsl","acc","externalName","external","isWgsl","isLooseData","innerAcc","prop","declare","declaration","TgpuDeclareImpl","__publicField","dependencyMap","ctx","externalMap","externals","applyExternals","replacedDeclaration","replaceExternalsInWgsl","functionToAstMap","getPrebuiltAstFor","fn","assignAst","ast","externals","createFnCore","shell","implementation","externalsToApply","addArgTypesToExternals","externals","addReturnTypeToExternals","newExternals","ctx","fnAttribute","_a","externalMap","applyExternals","id","replacedImpl","replaceExternalsInWgsl","pluginData","getPrebuiltAstFor","missing","name","ast","missingExternals","MissingLinksError","args","idx","head","body","withLocations","members","nextLocation","key","member","isBuiltin","customLocation","getCustomLocation","attribute","createOutputType","returnType","isData","location","struct","createStructFromIO","computeFn","options","_a","_b","_c","_d","createStructFromIO","implementation","createComputeFn","shell","workgroupSize","core","createFnCore","inputType","newExternals","newLabel","isNamable","ctx","fn","argTypes","returnType","implementation","createFn","isTgpuFn","value","stringifyPair","slot","_a","shell","core","createFnCore","fnBase","newExternals","newLabel","createBoundFunction","isAccessor","ctx","call","createDualImpl","args","FnCall","arg","UnknownData","$internal","innerFn","pairs","_fn","_params","param","fragmentFn","options","_a","createStructFromIO","createOutputType","implementation","createFragmentFn","shell","core","createFnCore","outputType","inputType","addReturnTypeToExternals","externals","newExternals","newLabel","isNamable","ctx","generationCtx","vertexFn","options","_a","_b","createOutputType","createStructFromIO","implementation","createVertexFn","shell","core","createFnCore","outputType","inputType","addReturnTypeToExternals","externals","newExternals","newLabel","isNamable","ctx","generationCtx","RandomNameRegistry","__publicField","primer","label","StrictNameRegistry","index","unusedName","assertExhaustive","x","location","isAttribute","value","connectAttributesToShader","shaderInputLayout","attributes","_a","_b","usedVertexLayouts","isData","getCustomLocation","bufferDefinitions","layoutToAttribListMap","nextShaderLocation","key","member","isBuiltin","matchingAttribute","layout","attribList","identityTypes","isIdentityType","data","resolveStructProperty","ctx","key","property","getAttributesString","resolveStruct","struct","id","prop","resolveUnstruct","unstruct","isAttribute","formatToWGSLType","resolveArray","array","element","resolveDisarray","disarray","resolveData","isLooseData","assertExhaustive","parenthesizedOps","binaryLogicalOps","operatorToType","lhs","op","rhs","bool","resolveRes","ctx","res","isWgsl","assertExhaustive","value","generateBoolean","generateBlock","statement","generateStatement","registerBlockVariable","id","dataType","generateIdentifier","generateExpression","expression","lhsExpr","rhsExpr","lhsStr","rhsStr","type","arg","argExpr","argStr","targetId","property","target","getTypeForPropAccess","propValue","getTypeFromWgsl","UnknownData","targetExpr","propertyExpr","targetStr","propertyStr","getTypeForIndexAccess","numericLiteralToResource","callee","args","idValue","resolvedResources","argValues","isWgslStruct","obj","generateEntries","values","valueRes","key","val","resource","resolvedStruct","cond","cons","alt","condition","consequent","alternate","rawId","rawValue","eq","init","update","body","initStatement","initStr","conditionExpr","conditionStr","updateStatement","updateStr","bodyStr","generateFunction","BufferReader","BufferWriter","getSystemEndianness","Measurer","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","cachedOffsets","offsetsForProps","struct","cached","measurer","Measurer","offsets","lastEntry","key","prop","beforeAlignment","alignIO_default","isUnstruct","customAlignmentOf","alignmentOf","propSize","sizeOf","roundUp","EVAL_ALLOWED_IN_ENV","compiledWriters","typeToPrimitive","primitiveToWriteFunction","buildWriter","node","offsetExpr","valueExpr","isWgslStruct","isUnstruct","propOffsets","offsetsForProps","sortedProps","a","b","code","key","propOffset","subSchema","isWgslArray","isDisarray","arrSchema","elementSize","roundUp","sizeOf","alignmentOf","isVec","primitive","writeFunc","components","count","isVec2","isVec3","i","isMat","matSize","isMat2x2f","isMat3x3f","elementCount","rowStride","colIndex","rowIndex","byteOffset","isAtomic","getCompiledWriterForSchema","schema","body","fn","dataWriters","output","_schema","value","_","i","schema","alignment","alignmentOf","alignIO_default","key","property","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","BufferWriter","getWriteInstructions","schema","data","_a","totalSize","sizeOf","bigBuffer","writer","BufferWriter","segments","gatherAndWrite","node","partialValue","offset","padding","isWgslStruct","isUnstruct","propOffsets","offsetsForProps","key","propOffset","subSchema","childValue","isWgslArray","isDisarray","arrSchema","elementSize","roundUp","alignmentOf","arrayPartialValue","a","b","idx","value","leafSize","writeData","instructions","current","i","next","isUsableAsStorage","value","NotStorageError","_NotStorageError","_a","isUsableAsUniform","buffer","usageToVarTemplateMap","_a","$internal","TgpuFixedBufferImpl","usage","__publicField","label","ctx","id","group","binding","data","inGPUMode","valueProxyHandler","TgpuLaidOutBufferImpl","dataType","_membership","mutableUsageMap","asMutable","isUsableAsStorage","readonlyUsageMap","asReadonly","uniformUsageMap","asUniform","usageToUsageConstructor","asUniform","asMutable","asReadonly","INTERNAL_createBuffer","group","typeSchema","initialOrBuffer","isWgslData","TgpuBufferImpl","isBuffer","value","isUsableAsVertex","buffer","endianness","getSystemEndianness","_group","dataType","_disallowedUsages","__publicField","isGPUBuffer","_a","device","sizeOf","writer","BufferWriter","writeData","label","usages","usage","flags","EVAL_ALLOWED_IN_ENV","getCompiledWriterForSchema","data","gpuBuffer","mapped","size","instructions","getWriteInstructions","mappedRange","mappedView","instruction","srcBuffer","readData","BufferReader","res","stagingBuffer","commandEncoder","sampler","props","TgpuFixedSamplerImpl","comparisonSampler","TgpuFixedComparisonSamplerImpl","isSampler","resource","isComparisonSampler","TgpuLaidOutSamplerImpl","_membership","__publicField","ctx","id","group","_a","TgpuLaidOutComparisonSamplerImpl","_props","branch","__spreadProps","__spreadValues","label","binding","TgpuExternalTextureImpl","_membership","__publicField","ctx","id","group","_a","texelFormatToChannelType","f32","u32","i32","texelFormatToDataType","vec4f","vec4u","vec4i","channelKindToFormat","channelFormatToSchema","INTERNAL_createTexture","props","branch","TgpuTextureImpl","isTexture","value","isStorageTextureView","isSampledTextureView","accessMap","_branch","__publicField","label","_a","_b","_c","_d","_e","usages","hasStorage","hasSampled","hasRender","access","params","storageParams","format","type","texelFormatToDataType","invariant","TgpuFixedStorageTextureImpl","TgpuFixedSampledTextureImpl","dimensionToCodeMap","_texture","ctx","id","group","binding","TgpuLaidOutStorageTextureImpl","_format","dimension","_membership","_props","texelFormatToChannelType","__spreadValues","multisampled","channelKindToFormat","TgpuLaidOutSampledTextureImpl","sampleType","_multisampled","channelFormatToSchema","isUsableAsSampled","value","isUsableAsRender","NotSampledError","_NotSampledError","_a","bindGroupLayout","entries","TgpuBindGroupLayoutImpl","isBindGroupLayout","value","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","key","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","__publicField","_a","_b","_c","_d","_e","idx","entry","membership","TgpuLaidOutBufferImpl","dataType","TgpuLaidOutSampledTextureImpl","TgpuLaidOutStorageTextureImpl","TgpuExternalTextureImpl","TgpuLaidOutComparisonSamplerImpl","TgpuLaidOutSamplerImpl","label","index","unwrapper","visibility","binding","access","v","TgpuBindGroupImpl","layout","resource","isBuffer","isUsableAsUniform","NotUniformError","isUsableAsStorage","NotStorageError","isTexture","isUsableAsSampled","NotSampledError","isSampledTextureView","isStorageTextureView","isSampler","isComparisonSampler","CATCHALL_BIND_GROUP_IDX_MARKER","ItemStateStackImpl","__publicField","state","pairs","args","returnType","externalMap","type","layer","slot","i","boundValue","id","arg","a","external","isWgsl","getTypeFromWgsl","UnknownData","declarationType","INDENT","N","IndentController","_a","str","$internal","ResolutionCtxImpl","opts","item","dataType","fn","options","generateFunction","argList","getAttributesString","declaration","layout","memoMap","placeholderKey","layoutEntry","resource","binding","value","MissingSlotValueError","callback","eventual","isProviding","maybeEventual","isSlot","isDerived","derived","instances","instance","expectedValue","pushMode","RuntimeMode","result","popMode","slotToValueMap","usedSlot","err","ResolutionError","isData","resolveData","isSelfResolvable","provideCtx","schema","isWgslArray","element","isWgslStruct","key","type_","resolve","ctx","code","bindGroupLayouts","takenIndices","v","automaticIds","naturalsExcept","layoutEntries","idx","createCatchallGroup","catchallIdx","catchallLayout","bindGroupLayout","TgpuBindGroupImpl","catchall","placeholder","resolve","options","externals","template","names","jitTranspiler","dependencies","applyExternals","resolutionObj","ctx","replaceExternalsInWgsl","code","StrictNameRegistry","RandomNameRegistry","WeakMemo","_make","__publicField","key","args","value","INTERNAL_createComputePipeline","branch","slotBindings","entryFn","TgpuComputePipelineImpl","ComputePipelineCore","isComputePipeline","value","_TgpuComputePipelineImpl","_core","_priors","__publicField","bindGroupLayout","bindGroup","_a","x","y","z","memo","label","pass","missingBindGroups","layout","idx","MissingBindGroupsError","_slotBindings","_entryFn","_b","_c","_d","_e","device","code","bindGroupLayouts","catchall","resolve","ctx","l","vertexLayout","schemaForCount","stepMode","TgpuVertexLayoutImpl","isVertexLayout","value","defaultAttribEntry","dataToContainedAttribs","layout","data","offset","customLocationMap","key","isDecorated","isLooseDecorated","customLocation","getCustomLocation","roundUp","customAlignmentOf","isWgslStruct","memberOffset","alignmentOf","attrib","sizeOf","isUnstruct","vertexFormats","format","kindToDefaultFormatMap","__publicField","arraySchema","label","isColorAttachment","value","connectAttachmentToShader","shaderOutputLayout","attachment","isData","result","key","matching","isColorTargetState","value","connectTargetsToShader","shaderOutputLayout","targets","isData","result","key","matchingTarget","INTERNAL_createRenderPipeline","options","TgpuRenderPipelineImpl","RenderPipelineCore","isRenderPipeline","value","_TgpuRenderPipelineImpl","core","priors","__publicField","label","definition","resource","_a","_b","isBindGroupLayout","__spreadProps","__spreadValues","isVertexLayout","attachment","vertexCount","instanceCount","firstVertex","firstInstance","memo","branch","fragmentFn","renderPassDescriptor","connectAttachmentToShader","isTexture","pass","missingBindGroups","layout","idx","bindGroup","missingVertexLayouts","vertexLayout","buffer","MissingBindGroupsError","MissingVertexBuffersError","connectedAttribs","connectAttributesToShader","connectTargetsToShader","_c","_d","vertexFn","slotBindings","primitiveState","depthStencilState","multisampleState","code","bindGroupLayouts","catchall","resolve","ctx","device","module","descriptor","l","WithBindingImpl","_WithBindingImpl","_getRoot","_slotBindings","slot","value","isAccessor","entryFn","WithComputeImpl","vertexFn","attribs","WithVertexImpl","_root","_entryFn","INTERNAL_createComputePipeline","_options","fragmentFn","targets","_mismatch","invariant","WithFragmentImpl","__spreadProps","__spreadValues","_WithFragmentImpl","primitiveState","depthStencilState","multisampleState","INTERNAL_createRenderPipeline","TgpuRootImpl","device","nameRegistry","jitTranspiler","_ownDevice","__publicField","WeakMemo","key","typeSchema","initialOrBuffer","buffer","INTERNAL_createBuffer","layout","entries","TgpuBindGroupImpl","disposable","props","texture","INTERNAL_createTexture","resource","isComputePipeline","isRenderPipeline","isBindGroupLayout","isBindGroup","isBuffer","isTexture","isStorageTextureView","isSampledTextureView","isVertexLayout","isSampler","isComparisonSampler","descriptor","callback","pass","bindGroups","vertexBuffers","currentPipeline","setupPassBeforeDraw","core","priors","memo","missingBindGroups","idx","_a","_b","bindGroup","missingVertexLayouts","vertexLayout","priorBuffer","opts","MissingBindGroupsError","MissingVertexBuffersError","args","pipeline","indexFormat","offset","size","bindGroupLayout","vertexCount","instanceCount","firstVertex","firstInstance","init","options","adapterOpt","deviceOpt","names","adapter","RandomNameRegistry","StrictNameRegistry","initFromDevice","slot","defaultValue","TgpuSlotImpl","__publicField","label","a","b","_a","ctx","getResolutionCtx","unwrapProxy","accessor","schema","defaultValue","TgpuAccessorImpl","__publicField","slot","label","_a","getResolutionCtx","ctx","$internal","valueProxyHandler","value","isBufferUsage","isTgpuFn","derived","compute","createDerived","stringifyPair","slot","value","_a","ctx","getResolutionCtx","unwrapProxy","createBoundDerived","innerDerived","pairs","privateVar","dataType","initialValue","TgpuVarImpl","workgroupVar","scope","_dataType","_initialValue","__publicField","label","ctx","id","_a","inGPUMode","$internal","valueProxyHandler","tgpu","bindGroupLayout","vertexLayout","init","initFromDevice","resolve","fn","fragmentFn","vertexFn","computeFn","derived","slot","accessor","privateVar","workgroupVar","constant","declare","sampler","comparisonSampler","index_default","assignAst"]}
|
1
|
+
{"version":3,"sources":["../src/smol/generationHelpers.ts","../src/core/valueProxyUtils.ts","../src/core/constant/tgpuConstant.ts","../src/namable.ts","../src/core/resolve/externals.ts","../src/core/declare/tgpuDeclare.ts","../src/core/function/astUtils.ts","../src/core/function/fnCore.ts","../src/core/function/ioOutputType.ts","../src/core/function/tgpuComputeFn.ts","../src/core/function/tgpuFn.ts","../src/core/function/tgpuFragmentFn.ts","../src/core/function/tgpuVertexFn.ts","../src/nameRegistry.ts","../src/shared/utilityTypes.ts","../src/core/vertexLayout/connectAttributesToShader.ts","../src/core/resolve/resolveData.ts","../src/smol/wgslGenerator.ts","../src/core/buffer/buffer.ts","../src/data/offsets.ts","../src/data/alignIO.ts","../src/data/compiledIO.ts","../src/data/dataIO.ts","../src/data/partialIO.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/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"],"sourcesContent":["import { isDerived, isSlot } from '../core/slot/slotTypes';\nimport { mat2x2f, mat3x3f, mat4x4f } from '../data/matrix';\nimport {\n abstractFloat,\n abstractInt,\n bool,\n f16,\n f32,\n i32,\n u32,\n} from '../data/numeric';\nimport type { WgslStruct } from '../data/struct';\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 '../data/vector';\nimport {\n type AnyWgslData,\n type BaseData,\n isDecorated,\n isWgslArray,\n isWgslData,\n} from '../data/wgslTypes';\nimport { getResolutionCtx } from '../gpuMode';\nimport { $internal } from '../shared/symbols';\nimport {\n type Resource,\n UnknownData,\n type Wgsl,\n hasInternalDataType,\n} from '../types';\n\nconst swizzleableTypes = [\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 'struct',\n] as const;\n\ntype SwizzleableType = 'f' | 'h' | 'i' | 'u';\ntype SwizzleLength = 1 | 2 | 3 | 4;\n\nconst swizzleLenToType: Record<\n SwizzleableType,\n Record<SwizzleLength, AnyWgslData>\n> = {\n f: {\n 1: f32,\n 2: vec2f,\n 3: vec3f,\n 4: vec4f,\n },\n h: {\n 1: f16,\n 2: vec2h,\n 3: vec3h,\n 4: vec4h,\n },\n i: {\n 1: i32,\n 2: vec2i,\n 3: vec3i,\n 4: vec4i,\n },\n u: {\n 1: u32,\n 2: vec2u,\n 3: vec3u,\n 4: vec4u,\n },\n} as const;\n\nconst kindToSchema = {\n vec2f: vec2f,\n vec2h: vec2h,\n vec2i: vec2i,\n vec2u: vec2u,\n vec3f: vec3f,\n vec3h: vec3h,\n vec3i: vec3i,\n vec3u: vec3u,\n vec4f: vec4f,\n vec4h: vec4h,\n vec4i: vec4i,\n vec4u: vec4u,\n mat2x2f: mat2x2f,\n mat3x3f: mat3x3f,\n mat4x4f: mat4x4f,\n} as const;\n\nconst indexableTypeToResult = {\n vec2f: f32,\n vec2h: f16,\n vec2i: i32,\n vec2u: u32,\n vec3f: f32,\n vec3h: f16,\n vec3i: i32,\n vec3u: u32,\n vec4f: f32,\n vec4h: f16,\n vec4i: i32,\n vec4u: u32,\n mat2x2f: vec2f,\n mat3x3f: vec3f,\n mat4x4f: vec4f,\n} as const;\n\nexport function getTypeForPropAccess(\n targetType: Wgsl,\n propName: string,\n): BaseData | UnknownData {\n if (\n typeof targetType === 'string' ||\n typeof targetType === 'number' ||\n typeof targetType === 'boolean'\n ) {\n return UnknownData;\n }\n\n if (isDerived(targetType) || isSlot(targetType)) {\n const ctx = getResolutionCtx();\n if (!ctx) {\n throw new Error(\n 'Resolution context not found when unwrapping slot or derived',\n );\n }\n const unwrapped = ctx.unwrap(targetType);\n\n return getTypeFromWgsl(unwrapped as Wgsl) as BaseData;\n }\n\n let target = targetType as BaseData;\n\n if (hasInternalDataType(target)) {\n target = target[$internal].dataType;\n }\n while (isDecorated(target)) {\n target = target.inner;\n }\n\n const targetTypeStr =\n 'kind' in target ? (target.kind as string) : target.type;\n\n if (targetTypeStr === 'struct') {\n return (target as WgslStruct).propTypes[propName] ?? UnknownData;\n }\n\n const propLength = propName.length;\n if (\n swizzleableTypes.includes(\n targetTypeStr as (typeof swizzleableTypes)[number],\n ) &&\n propLength >= 1 &&\n propLength <= 4\n ) {\n const swizzleTypeChar = targetTypeStr[4] as SwizzleableType;\n const swizzleType =\n swizzleLenToType[swizzleTypeChar][propLength as SwizzleLength];\n if (swizzleType) {\n return swizzleType;\n }\n }\n\n return isWgslData(target) ? target : UnknownData;\n}\n\nexport function getTypeForIndexAccess(resource: Wgsl): BaseData | UnknownData {\n if (isWgslData(resource)) {\n // array\n if (isWgslArray(resource)) {\n return resource.elementType;\n }\n\n // vector or matrix\n if (resource.type in indexableTypeToResult) {\n return indexableTypeToResult[\n resource.type as keyof typeof indexableTypeToResult\n ];\n }\n }\n\n return UnknownData;\n}\n\nexport function getTypeFromWgsl(resource: Wgsl): BaseData | UnknownData {\n if (isDerived(resource) || isSlot(resource)) {\n return getTypeFromWgsl(resource.value as Wgsl);\n }\n\n if (typeof resource === 'string') {\n return UnknownData;\n }\n if (typeof resource === 'number') {\n return numericLiteralToResource(String(resource))?.dataType ?? UnknownData;\n }\n if (typeof resource === 'boolean') {\n return bool;\n }\n\n if ('kind' in resource) {\n const kind = resource.kind;\n if (kind in kindToSchema) {\n return kindToSchema[kind];\n }\n }\n\n return isWgslData(resource) ? resource : UnknownData;\n}\n\nexport function numericLiteralToResource(value: string): Resource | undefined {\n // Hex literals\n if (/^0x[0-9a-f]+$/i.test(value)) {\n return { value, dataType: abstractInt };\n }\n\n // Binary literals\n if (/^0b[01]+$/i.test(value)) {\n return {\n value: `${Number.parseInt(value.slice(2), 2)}`,\n dataType: abstractInt,\n };\n }\n\n // Floating point literals\n if (/^-?(?:\\d+\\.\\d*|\\d*\\.\\d+)$/i.test(value)) {\n return { value, dataType: abstractFloat };\n }\n\n // Floating point literals with scientific notation\n if (/^-?\\d+(?:\\.\\d+)?e-?\\d+$/i.test(value)) {\n return { value, dataType: abstractFloat };\n }\n\n // Integer literals\n if (/^-?\\d+$/i.test(value)) {\n return { value, dataType: abstractInt };\n }\n\n return undefined;\n}\n","import type { BaseData } from '../data';\nimport { $internal } from '../shared/symbols';\nimport { getTypeForPropAccess } from '../smol/generationHelpers';\nimport {\n type Labelled,\n type ResolutionCtx,\n type SelfResolvable,\n type Wgsl,\n isBufferUsage,\n} from '../types';\nimport { isAccessor, isDerived, isSlot } from './slot/slotTypes';\n\nexport const valueProxyHandler: ProxyHandler<\n SelfResolvable &\n Labelled & { readonly [$internal]: { readonly dataType: BaseData } }\n> = {\n get(target, prop) {\n if (prop in target) {\n return Reflect.get(target, prop);\n }\n\n if (prop === '~providing') {\n return undefined;\n }\n\n if (\n prop === 'toString' ||\n prop === Symbol.toStringTag ||\n prop === Symbol.toPrimitive\n ) {\n return () => target.toString();\n }\n\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) =>\n `${ctx.resolve(target)}.${String(prop)}`,\n\n toString: () =>\n `.value(...).${String(prop)}:${target.label ?? '<unnamed>'}`,\n\n [$internal]: {\n dataType: getTypeForPropAccess(\n target[$internal].dataType as Wgsl,\n String(prop),\n ) as BaseData,\n },\n },\n valueProxyHandler,\n );\n },\n};\n\nexport function unwrapProxy<T>(value: unknown): T {\n let unwrapped = value;\n\n while (\n isSlot(unwrapped) ||\n isDerived(unwrapped) ||\n isAccessor(unwrapped) ||\n isBufferUsage(unwrapped)\n ) {\n unwrapped = unwrapped.value;\n }\n\n return unwrapped as T;\n}\n","import type { AnyWgslData } from '../../data/wgslTypes';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport { valueProxyHandler } from '../valueProxyUtils';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuConst<TDataType extends AnyWgslData = AnyWgslData>\n extends TgpuNamable {\n readonly value: Infer<TDataType>;\n\n readonly [$internal]: {\n readonly dataType: TDataType;\n };\n}\n\n/**\n * Creates a module constant with specified value.\n */\nexport function constant<TDataType extends AnyWgslData>(\n dataType: TDataType,\n value: Infer<TDataType>,\n): TgpuConst<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 public readonly [$internal]: {\n readonly dataType: TDataType;\n };\n\n constructor(\n public readonly dataType: TDataType,\n private readonly _value: Infer<TDataType>,\n ) {\n this[$internal] = { dataType };\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\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.dataType,\n },\n },\n valueProxyHandler,\n ) 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 { isLooseData } from '../../data/dataTypes';\nimport { 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 ? found[1] : undefined));\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 matched = implementation.match(/->(?<output>.*?){/s);\n const outputName = matched ? matched[1]?.trim() : undefined;\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(\n `(?<![\\\\w_.])${name.replaceAll('.', '\\\\.')}(?![\\\\w_])`,\n 'g',\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): string {\n return Object.entries(externalMap).reduce((acc, [externalName, external]) => {\n if (isWgsl(external) || isLooseData(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(\n `${externalName.replaceAll('.', '\\\\.')}\\\\.(?<prop>.*?)(?![\\\\w_])`,\n 'g',\n ),\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 WgslStruct, 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 { BaseData, 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 IOLayoutToSchema<T extends IOLayout> = T extends BaseData\n ? Decorate<T, Location<0>>\n : T extends IORecord\n ? WgslStruct<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 ? getCustomLocation(returnType) !== undefined\n ? returnType\n : location(0, returnType)\n : struct(withLocations(returnType) as Record<string, T>)\n ) as IOLayoutToSchema<IOLayout<T>>;\n}\n\nexport function createStructFromIO<T extends IOData>(members: IORecord<T>) {\n return struct(withLocations(members) as Record<string, T>);\n}\n","import type { AnyComputeBuiltin } from '../../builtin';\nimport type { AnyWgslStruct } from '../../data/struct';\nimport { type TgpuNamable, isNamable } from '../../namable';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { createFnCore } from './fnCore';\nimport type { Implementation, InferIO } from './fnTypes';\nimport { createStructFromIO } from './ioOutputType';\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 ComputeIn extends Record<string, AnyComputeBuiltin>,\n> {\n readonly argTypes: [AnyWgslStruct];\n readonly returnType: undefined;\n readonly workgroupSize: [number, number, number];\n\n /**\n * Creates a type-safe implementation of this signature\n */\n does(\n implementation: (input: InferIO<ComputeIn>) => undefined,\n ): TgpuComputeFn<ComputeIn>;\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<ComputeIn>;\n}\n\nexport interface TgpuComputeFn<\n ComputeIn extends Record<string, AnyComputeBuiltin> = Record<\n string,\n AnyComputeBuiltin\n >,\n> extends TgpuNamable {\n readonly shell: TgpuComputeFnShell<ComputeIn>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport interface ComputeFnOptions {\n workgroupSize: number[];\n}\n\nexport function computeFn(options: {\n workgroupSize: number[];\n // biome-ignore lint/complexity/noBannedTypes: it's fine\n}): TgpuComputeFnShell<{}>;\n\nexport function computeFn<\n ComputeIn extends Record<string, AnyComputeBuiltin>,\n>(options: {\n in: ComputeIn;\n workgroupSize: number[];\n}): TgpuComputeFnShell<ComputeIn>;\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 options.in\n * Record with builtins used by the compute shader.\n * @param options.workgroupSize\n * Size of blocks that the thread grid will be divided into (up to 3 dimensions).\n */\nexport function computeFn<\n ComputeIn extends Record<string, AnyComputeBuiltin>,\n>(options: {\n in?: ComputeIn;\n workgroupSize: number[];\n}): TgpuComputeFnShell<ComputeIn> {\n return {\n argTypes: [createStructFromIO(options.in ?? {})],\n returnType: undefined,\n workgroupSize: [\n options.workgroupSize[0] ?? 1,\n options.workgroupSize[1] ?? 1,\n options.workgroupSize[2] ?? 1,\n ],\n\n does(implementation) {\n return createComputeFn(\n this,\n options.workgroupSize,\n implementation as Implementation,\n );\n },\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createComputeFn<ComputeIn extends Record<string, AnyComputeBuiltin>>(\n shell: TgpuComputeFnShell<ComputeIn>,\n workgroupSize: number[],\n implementation: Implementation,\n): TgpuComputeFn<ComputeIn> {\n type This = TgpuComputeFn<ComputeIn> & Labelled & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n const inputType = shell.argTypes[0];\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 if (isNamable(inputType)) {\n inputType.$name(`${newLabel}_Input`);\n }\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 { AnyWgslData } from '../../data/wgslTypes';\nimport type { TgpuNamable } from '../../namable';\nimport { createDualImpl } from '../../shared/generators';\nimport { $internal } from '../../shared/symbols';\nimport {\n type Labelled,\n type ResolutionCtx,\n type SelfResolvable,\n UnknownData,\n type Wgsl,\n} from '../../types';\nimport type { TgpuBufferUsage } from '../buffer/bufferUsage';\nimport {\n type Eventual,\n type Providing,\n type SlotValuePair,\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 readonly '~providing'?: Providing | undefined;\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 readonly [$internal]: {\n implementation: Implementation<InferArgs<Args>, InferReturn<Return>>;\n };\n };\n\nexport function fn<Args extends AnyWgslData[] | []>(\n argTypes: Args,\n returnType?: undefined,\n): TgpuFnShell<Args, undefined>;\n\nexport function fn<Args extends AnyWgslData[] | [], Return extends AnyWgslData>(\n argTypes: Args,\n returnType: Return,\n): TgpuFnShell<Args, 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 stringifyPair([slot, value]: SlotValuePair): string {\n return `${slot.label ?? '<unnamed>'}=${value}`;\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(fn, [\n [isAccessor(slot) ? slot.slot : slot, value],\n ]);\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n return core.resolve(ctx);\n },\n };\n\n const call = createDualImpl(\n (...args: unknown[]): unknown => {\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 (...args) => ({\n value: new FnCall(fn, args.map((arg) => arg.value) as Wgsl[]),\n dataType: shell.returnType ?? UnknownData,\n }),\n );\n\n Object.defineProperty(call, $internal, {\n value: {\n implementation,\n },\n });\n\n const fn = Object.assign(call, fnBase as This) as unknown as TgpuFn<\n Args,\n Return\n >;\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>(innerFn: TgpuFn<Args, Return>, pairs: SlotValuePair[]): TgpuFn<Args, Return> {\n type This = TgpuFnBase<Args, Return>;\n\n const fnBase: This = {\n resourceType: 'function',\n shell: innerFn.shell,\n '~providing': {\n inner: innerFn,\n pairs,\n },\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(fn, [\n ...pairs,\n [isAccessor(slot) ? slot.slot : slot, value],\n ]);\n },\n };\n\n const call = createDualImpl(\n (...args: InferArgs<Args>): unknown => {\n return innerFn(...args);\n },\n (...args) => {\n return {\n value: new FnCall(fn, args.map((arg) => arg.value) as Wgsl[]),\n dataType: innerFn.shell.returnType ?? UnknownData,\n };\n },\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 const fnLabel = innerFn.label ?? '<unnamed>';\n\n return `fn:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;\n },\n });\n\n Object.defineProperty(fn, $internal, {\n value: {\n implementation: innerFn[$internal].implementation,\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 {\n AnyFragmentInputBuiltin,\n AnyFragmentOutputBuiltin,\n OmitBuiltins,\n} from '../../builtin';\nimport type { AnyAttribute } from '../../data/attributes';\nimport type { AnyWgslStruct } from '../../data/struct';\nimport type { Decorated, Location, Vec4f } from '../../data/wgslTypes';\nimport { type TgpuNamable, isNamable } from '../../namable';\nimport type { GenerationCtx } from '../../smol/wgslGenerator';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { addReturnTypeToExternals } from '../resolve/externals';\nimport { createFnCore } from './fnCore';\nimport type { BaseIOData, IORecord, Implementation, InferIO } from './fnTypes';\nimport {\n type IOLayoutToSchema,\n createOutputType,\n createStructFromIO,\n} from './ioOutputType';\n\n// ----------\n// Public API\n// ----------\n\nexport type FragmentOutConstrained =\n | Vec4f\n | Decorated<Vec4f, [Location<number>]>\n | AnyFragmentOutputBuiltin\n | IORecord<\n Vec4f | Decorated<Vec4f, [Location<number>]> | AnyFragmentOutputBuiltin\n >;\n\nexport type FragmentInConstrained = IORecord<\n | BaseIOData\n | Decorated<BaseIOData, AnyAttribute<never>[]>\n | AnyFragmentInputBuiltin\n>;\n\n/**\n * Describes a fragment entry function signature (its arguments and return type)\n */\nexport interface TgpuFragmentFnShell<\n FragmentIn extends FragmentInConstrained,\n FragmentOut extends FragmentOutConstrained,\n> {\n readonly argTypes: [AnyWgslStruct];\n readonly targets: FragmentOut;\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 FragmentInConstrained = FragmentInConstrained,\n Output extends FragmentOutConstrained = FragmentOutConstrained,\n> extends TgpuNamable {\n readonly shell: TgpuFragmentFnShell<Varying, Output>;\n readonly outputType: IOLayoutToSchema<Output>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport function fragmentFn<\n FragmentOut extends FragmentOutConstrained,\n>(options: {\n out: FragmentOut;\n // biome-ignore lint/complexity/noBannedTypes: it's fine\n}): TgpuFragmentFnShell<{}, FragmentOut>;\n\nexport function fragmentFn<\n FragmentIn extends FragmentInConstrained,\n FragmentOut extends FragmentOutConstrained,\n>(options: {\n in: FragmentIn;\n out: FragmentOut;\n}): TgpuFragmentFnShell<FragmentIn, FragmentOut>;\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 options.in\n * Values computed in the vertex stage and builtins to be made available to functions that implement this shell.\n * @param options.out\n * A `vec4f`, signaling this function outputs a color for one target, or a record containing 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 FragmentInConstrained,\n FragmentOut extends FragmentOutConstrained,\n>(options: {\n in?: FragmentIn;\n out: FragmentOut;\n}): TgpuFragmentFnShell<FragmentIn, FragmentOut> {\n return {\n argTypes: [createStructFromIO(options.in ?? {})],\n targets: options.out,\n returnType: createOutputType(options.out) as 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<FragmentInConstrained, FragmentOutConstrained>,\n implementation: Implementation,\n): TgpuFragmentFn {\n type This = TgpuFragmentFn & Labelled & SelfResolvable;\n\n const core = createFnCore(shell, implementation);\n const outputType = shell.returnType as IOLayoutToSchema<\n typeof shell.returnType\n >;\n const inputType = shell.argTypes[0];\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 (isNamable(outputType)) {\n outputType.$name(`${newLabel}_Output`);\n }\n if (isNamable(inputType)) {\n inputType.$name(`${newLabel}_Input`);\n }\n return this;\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n if (typeof implementation === 'string') {\n return core.resolve(ctx, '@fragment ');\n }\n\n const generationCtx = ctx as GenerationCtx;\n if (generationCtx.callStack === undefined) {\n throw new Error(\n 'Cannot resolve a TGSL function outside of a generation context',\n );\n }\n\n try {\n generationCtx.callStack.push(outputType);\n return core.resolve(ctx, '@fragment ');\n } finally {\n generationCtx.callStack.pop();\n }\n },\n\n toString() {\n return `fragmentFn:${this.label ?? '<unnamed>'}`;\n },\n };\n\n return result;\n}\n","import type { OmitBuiltins } from '../../builtin';\nimport type { AnyWgslStruct } from '../../data/struct';\nimport { type TgpuNamable, isNamable } from '../../namable';\nimport type { GenerationCtx } from '../../smol/wgslGenerator';\nimport type { Labelled, ResolutionCtx, SelfResolvable } from '../../types';\nimport { addReturnTypeToExternals } from '../resolve/externals';\nimport { createFnCore } from './fnCore';\nimport type { IOLayout, IORecord, Implementation, InferIO } from './fnTypes';\nimport {\n type IOLayoutToSchema,\n createOutputType,\n createStructFromIO,\n} 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: [AnyWgslStruct];\n readonly returnType: VertexOut;\n readonly attributes: [VertexIn];\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: IOLayoutToSchema<VertexOut>;\n readonly inputType: IOLayoutToSchema<VertexIn>;\n\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport function vertexFn<VertexOut extends IORecord>(options: {\n out: VertexOut;\n // biome-ignore lint/complexity/noBannedTypes: it's fine\n}): TgpuVertexFnShell<{}, VertexOut>;\n\nexport function vertexFn<\n VertexIn extends IORecord,\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>(options: {\n in: VertexIn;\n out: VertexOut;\n}): TgpuVertexFnShell<VertexIn, VertexOut>;\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 options.in\n * Vertex attributes and builtins to be made available to functions that implement this shell.\n * @param options.out\n * A record containing the final position of the vertex, and any information\n * passed onto the fragment shader stage.\n */\nexport function vertexFn<\n VertexIn extends IORecord,\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>(options: {\n in?: VertexIn;\n out: VertexOut;\n}): TgpuVertexFnShell<VertexIn, VertexOut> {\n return {\n attributes: [options.in ?? ({} as VertexIn)],\n returnType: createOutputType(options.out) as unknown as VertexOut,\n argTypes: [createStructFromIO(options.in ?? {})],\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 = shell.returnType;\n const inputType = shell.argTypes[0];\n if (typeof implementation === 'string') {\n addReturnTypeToExternals(implementation, outputType, (externals) =>\n core.applyExternals(externals),\n );\n }\n\n return {\n shell,\n outputType,\n inputType,\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 (isNamable(outputType)) {\n outputType.$name(`${newLabel}_Output`);\n }\n if (isNamable(inputType)) {\n inputType.$name(`${newLabel}_Input`);\n }\n return this;\n },\n\n '~resolve'(ctx: ResolutionCtx): string {\n if (typeof implementation === 'string') {\n return core.resolve(ctx, '@vertex ');\n }\n\n const generationCtx = ctx as GenerationCtx;\n if (generationCtx.callStack === undefined) {\n throw new Error(\n 'Cannot resolve a TGSL function outside of a generation context',\n );\n }\n\n try {\n generationCtx.callStack.push(outputType);\n return core.resolve(ctx, '@vertex ');\n } finally {\n generationCtx.callStack.pop();\n }\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\n/**\n * Any typed array\n */\nexport type TypedArray =\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array;\n\nexport function assertExhaustive(x: never, location: string): never {\n throw new Error(`Failed to handle ${x} at ${location}`);\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\nexport function isAttribute<\n T extends TgpuVertexAttrib & INTERNAL_TgpuVertexAttrib,\n>(value: unknown | T): 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 { getAttributesString } from '../../data/attributes';\nimport {\n type AnyData,\n type Disarray,\n type Unstruct,\n isLooseData,\n} from '../../data/dataTypes';\nimport type { WgslStruct } from '../../data/struct';\nimport { formatToWGSLType } from '../../data/vertexFormatData';\nimport type {\n AnyWgslData,\n BaseData,\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} from '../../data/wgslTypes';\nimport { assertExhaustive } from '../../shared/utilityTypes';\nimport type { ResolutionCtx } from '../../types';\nimport { isAttribute } from '../vertexLayout/connectAttributesToShader';\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, BaseData],\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 unstruct (struct that does not align data by default) to its struct data counterpart.\n * @param ctx - The resolution context.\n * @param unstruct - The unstruct to resolve.\n *\n * @returns The resolved unstruct name.\n *\n * @example\n * ```ts\n * resolveUnstruct(ctx, {\n * uv: d.float16x2, // -> d.vec2f after resolution\n * color: d.snorm8x4, -> d.vec4f after resolution\n * });\n * ```\n */\nfunction resolveUnstruct(ctx: ResolutionCtx, unstruct: Unstruct) {\n const id = ctx.names.makeUnique(unstruct.label);\n\n ctx.addDeclaration(`\nstruct ${id} {\n${Object.entries(unstruct.propTypes)\n .map((prop) =>\n isAttribute(prop[1])\n ? resolveStructProperty(ctx, [prop[0], formatToWGSLType[prop[1].format]])\n : resolveStructProperty(ctx, prop),\n )\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\nfunction resolveDisarray(ctx: ResolutionCtx, disarray: Disarray) {\n const element = ctx.resolve(\n isAttribute(disarray.elementType)\n ? formatToWGSLType[disarray.elementType.format]\n : (disarray.elementType as AnyWgslData),\n );\n\n return disarray.elementCount === 0\n ? `array<${element}>`\n : `array<${element}, ${disarray.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: AnyData): string {\n if (isLooseData(data)) {\n if (data.type === 'unstruct') {\n return resolveUnstruct(ctx, data);\n }\n\n if (data.type === 'disarray') {\n return resolveDisarray(ctx, data);\n }\n\n if (data.type === 'loose-decorated') {\n return ctx.resolve(\n isAttribute(data.inner)\n ? formatToWGSLType[data.inner.format]\n : data.inner,\n );\n }\n\n return ctx.resolve(formatToWGSLType[data.type]);\n }\n\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 if (data.type === 'ptr') {\n if (data.addressSpace === 'storage') {\n return `ptr<storage, ${ctx.resolve(data.inner)}, ${data.access === 'read-write' ? 'read_write' : data.access}>`;\n }\n return `ptr<${data.addressSpace}, ${ctx.resolve(data.inner)}>`;\n }\n\n if (data.type === 'abstractInt' || data.type === 'abstractFloat') {\n throw new Error('Abstract types have no concrete representation in WGSL');\n }\n\n assertExhaustive(data, 'resolveData');\n}\n","import type * as smol from 'tinyest';\nimport * as d from '../data';\nimport * as wgsl from '../data/wgslTypes';\nimport {\n type ResolutionCtx,\n type Resource,\n UnknownData,\n type Wgsl,\n isWgsl,\n} from '../types';\nimport {\n getTypeForIndexAccess,\n getTypeForPropAccess,\n getTypeFromWgsl,\n numericLiteralToResource,\n} from './generationHelpers';\n\nconst parenthesizedOps = [\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n '<<',\n '>>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '|',\n '^',\n '&',\n '&&',\n '||',\n];\n\nconst binaryLogicalOps = ['&&', '||', '==', '!=', '<', '<=', '>', '>='];\n\ntype Operator =\n | smol.BinaryOperator\n | smol.AssignmentOperator\n | smol.LogicalOperator\n | smol.UnaryOperator;\n\nfunction operatorToType<\n TL extends wgsl.AnyWgslData | UnknownData,\n TR extends wgsl.AnyWgslData | UnknownData,\n>(lhs: TL, op: Operator, rhs?: TR): TL | TR | wgsl.Bool {\n if (!rhs) {\n if (op === '!' || op === '~') {\n return d.bool;\n }\n\n return lhs;\n }\n\n if (binaryLogicalOps.includes(op)) {\n return d.bool;\n }\n\n if (op === '=') {\n return rhs;\n }\n\n return lhs;\n}\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n readonly callStack: unknown[];\n indent(): string;\n dedent(): string;\n pushBlockScope(): void;\n popBlockScope(): void;\n getById(id: string): Resource | null;\n defineVariable(\n id: string,\n dataType: wgsl.AnyWgslData | UnknownData,\n ): Resource;\n};\n\nexport function resolveRes(ctx: GenerationCtx, res: Resource): string {\n if (isWgsl(res.value)) {\n return ctx.resolve(res.value);\n }\n\n return String(res.value);\n}\n\nfunction assertExhaustive(value: never): never {\n throw new Error(\n `'${JSON.stringify(value)}' was not handled by the WGSL generator.`,\n );\n}\n\nexport function generateBoolean(ctx: GenerationCtx, value: boolean): Resource {\n return { value: value ? 'true' : 'false', dataType: d.bool };\n}\n\nexport function generateBlock(ctx: GenerationCtx, value: smol.Block): string {\n ctx.pushBlockScope();\n try {\n return `${ctx.indent()}{\n${value.b.map((statement) => generateStatement(ctx, statement)).join('\\n')}\n${ctx.dedent()}}`;\n } finally {\n ctx.popBlockScope();\n }\n}\n\nexport function registerBlockVariable(\n ctx: GenerationCtx,\n id: string,\n dataType: wgsl.AnyWgslData | UnknownData,\n): Resource {\n return ctx.defineVariable(id, dataType);\n}\n\nexport function generateIdentifier(ctx: GenerationCtx, id: string): Resource {\n const res = ctx.getById(id);\n if (!res) {\n throw new Error(`Identifier ${id} not found`);\n }\n\n return res;\n}\n\nexport function generateExpression(\n ctx: GenerationCtx,\n expression: smol.Expression,\n): Resource {\n if (typeof expression === 'string') {\n return generateIdentifier(ctx, expression);\n }\n if (typeof expression === 'boolean') {\n return generateBoolean(ctx, expression);\n }\n\n if ('x' in expression) {\n // Logical/Binary/Assignment Expression\n const [lhs, op, rhs] = expression.x;\n const lhsExpr = generateExpression(ctx, lhs);\n const rhsExpr = generateExpression(ctx, rhs);\n\n const lhsStr = resolveRes(ctx, lhsExpr);\n const rhsStr = resolveRes(ctx, rhsExpr);\n const type = operatorToType(lhsExpr.dataType, op, rhsExpr.dataType);\n\n return {\n value: parenthesizedOps.includes(op)\n ? `(${lhsStr} ${op} ${rhsStr})`\n : `${lhsStr} ${op} ${rhsStr}`,\n dataType: type,\n };\n }\n\n if ('p' in expression) {\n // Update Expression\n const [op, arg] = expression.p;\n const argExpr = generateExpression(ctx, arg);\n const argStr = resolveRes(ctx, argExpr);\n\n return {\n value: `${argStr}${op}`,\n dataType: argExpr.dataType,\n };\n }\n\n if ('u' in expression) {\n // Unary Expression\n const [op, arg] = expression.u;\n const argExpr = generateExpression(ctx, arg);\n const argStr = resolveRes(ctx, argExpr);\n\n const type = operatorToType(argExpr.dataType, op);\n return {\n value: `${op}${argStr}`,\n dataType: type,\n };\n }\n\n if ('a' in expression) {\n // Member Access\n const [targetId, property] = expression.a;\n const target = generateExpression(ctx, targetId);\n\n if (typeof target.value === 'string') {\n return {\n value: `${target.value}.${property}`,\n dataType: getTypeForPropAccess(target.dataType as Wgsl, property),\n };\n }\n // biome-ignore lint/suspicious/noExplicitAny: <sorry TypeScript>\n const propValue = (target.value as any)[property];\n\n if (isWgsl(target.value)) {\n return {\n value: propValue,\n dataType: getTypeForPropAccess(target.value as d.AnyWgslData, property),\n };\n }\n\n if (typeof target.value === 'object') {\n const dataType = isWgsl(propValue)\n ? getTypeFromWgsl(propValue)\n : UnknownData;\n\n return {\n value: propValue,\n dataType,\n };\n }\n\n throw new Error(`Cannot access member ${property} of ${target.value}`);\n }\n\n if ('i' in expression) {\n // Index Access\n const [target, property] = expression.i;\n const targetExpr = generateExpression(ctx, target);\n const propertyExpr = generateExpression(ctx, property);\n const targetStr = resolveRes(ctx, targetExpr);\n const propertyStr = resolveRes(ctx, propertyExpr);\n\n return {\n value: `${targetStr}[${propertyStr}]`,\n dataType: getTypeForIndexAccess(targetExpr.dataType as d.AnyWgslData),\n };\n }\n\n if ('n' in expression) {\n // Numeric Literal\n const type = numericLiteralToResource(expression.n);\n if (!type) {\n throw new Error(`Invalid numeric literal ${expression.n}`);\n }\n return type;\n }\n\n if ('f' in expression) {\n // Function Call\n const [callee, args] = expression.f;\n const id = generateExpression(ctx, callee);\n const idValue = id.value;\n\n ctx.callStack.push(idValue);\n\n const argResources = args.map((arg) => generateExpression(ctx, arg));\n const resolvedResources = argResources.map((res) => ({\n value: resolveRes(ctx, res),\n dataType: res.dataType,\n }));\n const argValues = resolvedResources.map((res) => res.value);\n\n ctx.callStack.pop();\n\n if (typeof idValue === 'string') {\n return {\n value: `${idValue}(${argValues.join(', ')})`,\n dataType: id.dataType,\n };\n }\n\n if (wgsl.isWgslStruct(idValue)) {\n const resolvedId = ctx.resolve(idValue);\n\n return {\n value: `${resolvedId}(${argValues.join(', ')})`,\n dataType: id.dataType,\n };\n }\n\n // Assuming that `id` is callable\n return (idValue as unknown as (...args: unknown[]) => unknown)(\n ...resolvedResources,\n ) as Resource;\n }\n\n if ('o' in expression) {\n // Object Literal\n const obj = expression.o;\n const callee = ctx.callStack[ctx.callStack.length - 1];\n\n const generateEntries = (values: smol.Expression[]) =>\n values\n .map((value) => {\n const valueRes = generateExpression(ctx, value);\n return resolveRes(ctx, valueRes);\n })\n .join(', ');\n\n if (wgsl.isWgslStruct(callee)) {\n const propKeys = Object.keys(callee.propTypes);\n const values = propKeys.map((key) => {\n const val = obj[key];\n if (val === undefined) {\n throw new Error(\n `Missing property ${key} in object literal for struct ${callee}`,\n );\n }\n return val;\n });\n\n return {\n value: generateEntries(values),\n dataType: callee,\n };\n }\n\n return {\n value: generateEntries(Object.values(obj)),\n dataType: UnknownData,\n };\n }\n\n if ('y' in expression) {\n // Array Expression\n const values = expression.y.map((value) => {\n return generateExpression(ctx, value);\n });\n if (values.length === 0) {\n throw new Error('Cannot create empty array literal.');\n }\n\n let type = values[0]?.dataType;\n const mismatchedType = values.find((value) => value.dataType !== type);\n if (mismatchedType) {\n throw new Error(\n `Cannot mix types in array literal. Type ${mismatchedType.dataType.type} does not match expected type ${type?.type}.`,\n );\n }\n\n if (!wgsl.isWgslData(type)) {\n throw new Error('Cannot use non-WGSL data types in array literals.');\n }\n\n type =\n type.type === 'abstractInt'\n ? d.u32\n : type.type === 'abstractFloat'\n ? d.f32\n : type;\n\n const typeId = ctx.resolve(type);\n\n const arrayType = `array<${typeId}, ${values.length}>`;\n const arrayValues = values.map((value) => resolveRes(ctx, value));\n\n return {\n value: `${arrayType}( ${arrayValues.join(', ')} )`,\n dataType: d.arrayOf(type as d.AnyWgslData, values.length),\n };\n }\n\n if ('s' in expression) {\n throw new Error('Cannot use string literals in TGSL.');\n }\n\n assertExhaustive(expression);\n}\n\nexport function 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 // check if the thing at the top of the call stack is a struct and the statement is a plain JS object\n // if so wrap the value returned in a constructor of the struct (its resolved name)\n if (\n wgsl.isWgslStruct(ctx.callStack[ctx.callStack.length - 1]) &&\n statement.r !== null &&\n typeof statement.r === 'object' &&\n 'o' in statement.r\n ) {\n const resource = resolveRes(ctx, generateExpression(ctx, statement.r));\n const resolvedStruct = ctx.resolve(\n ctx.callStack[ctx.callStack.length - 1],\n );\n return `${ctx.pre}return ${resolvedStruct}(${resource});`;\n }\n\n return statement.r === null\n ? `${ctx.pre}return;`\n : `${ctx.pre}return ${resolveRes(\n ctx,\n generateExpression(ctx, statement.r),\n )};`;\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 eq = rawValue ? generateExpression(ctx, rawValue) : undefined;\n\n if (!eq || !rawValue) {\n throw new Error('Cannot create variable without an initial value.');\n }\n\n registerBlockVariable(ctx, rawId, eq.dataType);\n const id = resolveRes(ctx, generateIdentifier(ctx, rawId));\n\n // If the value is a plain JS object it has to be an output struct\n if (\n typeof rawValue === 'object' &&\n 'o' in rawValue &&\n wgsl.isWgslStruct(ctx.callStack[ctx.callStack.length - 1])\n ) {\n const resolvedStruct = ctx.resolve(\n ctx.callStack[ctx.callStack.length - 1],\n );\n return `${ctx.pre}var ${id} = ${resolvedStruct}(${resolveRes(ctx, eq)});`;\n }\n\n return `${ctx.pre}var ${id} = ${resolveRes(ctx, eq)};`;\n }\n\n if ('b' in statement) {\n ctx.pushBlockScope();\n try {\n return generateBlock(ctx, statement);\n } finally {\n ctx.popBlockScope();\n }\n }\n\n // 'j' stands for for (trust me)\n if ('j' in statement) {\n const [init, condition, update, body] = statement.j;\n\n const initStatement = init ? generateStatement(ctx, init) : undefined;\n const initStr = initStatement ? initStatement.slice(0, -1) : '';\n\n const conditionExpr = condition\n ? generateExpression(ctx, condition)\n : undefined;\n const conditionStr = conditionExpr ? resolveRes(ctx, conditionExpr) : '';\n\n const updateStatement = update ? generateStatement(ctx, update) : undefined;\n const updateStr = updateStatement ? updateStatement.slice(0, -1) : '';\n\n ctx.indent();\n const bodyStr = generateStatement(ctx, body);\n ctx.dedent();\n\n return `\\\n${ctx.pre}for (${initStr}; ${conditionStr}; ${updateStr})\n${bodyStr}`;\n }\n\n if ('w' in statement) {\n const [condition, body] = statement.w;\n const conditionStr = resolveRes(ctx, generateExpression(ctx, condition));\n\n ctx.indent();\n const bodyStr = generateStatement(ctx, body);\n ctx.dedent();\n\n return `\\\n${ctx.pre}while (${conditionStr})\n${bodyStr}`;\n }\n\n if ('k' in statement) {\n return `${ctx.pre}continue;`;\n }\n\n if ('d' in statement) {\n return `${ctx.pre}break;`;\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 { getSystemEndianness } from 'typed-binary';\nimport { isWgslData } from '../../data';\nimport {\n EVAL_ALLOWED_IN_ENV,\n getCompiledWriterForSchema,\n} from '../../data/compiledIO';\nimport { readData, writeData } from '../../data/dataIO';\nimport type { AnyData } from '../../data/dataTypes';\nimport { getWriteInstructions } from '../../data/partialIO';\nimport { sizeOf } from '../../data/sizeOf';\nimport type { BaseData, WgslTypeLiteral } from '../../data/wgslTypes';\nimport type { StorageFlag } from '../../extension';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer, InferPartial } from '../../shared/repr';\nimport type { MemIdentity } from '../../shared/repr';\nimport type { UnionToIntersection } from '../../shared/utilityTypes';\nimport { isGPUBuffer } from '../../types';\nimport type { ExperimentalTgpuRoot } from '../root/rootTypes';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n type TgpuFixedBufferUsage,\n asMutable,\n asReadonly,\n asUniform,\n} from './bufferUsage';\n\n// ----------\n// Public API\n// ----------\n\nexport interface UniformFlag {\n usableAsUniform: true;\n}\n\n/**\n * @deprecated Use UniformFlag instead.\n */\nexport type Uniform = UniformFlag;\n\nexport interface VertexFlag {\n usableAsVertex: true;\n}\n\n/**\n * @deprecated Use VertexFlag instead.\n */\nexport type Vertex = VertexFlag;\n\ntype LiteralToUsageType<T extends 'uniform' | 'storage' | 'vertex'> =\n T extends 'uniform'\n ? UniformFlag\n : T extends 'storage'\n ? StorageFlag\n : T extends 'vertex'\n ? VertexFlag\n : never;\n\ntype ViewUsages<TBuffer extends TgpuBuffer<BaseData>> =\n | (boolean extends TBuffer['usableAsUniform'] ? never : 'uniform')\n | (boolean extends TBuffer['usableAsStorage']\n ? never\n : 'readonly' | 'mutable');\n\ntype UsageTypeToBufferUsage<TData extends BaseData> = {\n uniform: TgpuBufferUniform<TData> & TgpuFixedBufferUsage<TData>;\n mutable: TgpuBufferMutable<TData> & TgpuFixedBufferUsage<TData>;\n readonly: TgpuBufferReadonly<TData> & TgpuFixedBufferUsage<TData>;\n};\n\nconst usageToUsageConstructor = {\n uniform: asUniform,\n mutable: asMutable,\n readonly: asReadonly,\n};\n\nexport interface TgpuBuffer<TData extends BaseData> 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 usableAsUniform: boolean;\n usableAsStorage: boolean;\n usableAsVertex: boolean;\n\n $usage<T extends RestrictVertexUsages<TData>>(\n ...usages: T\n ): this & UnionToIntersection<LiteralToUsageType<T[number]>>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n\n as<T extends ViewUsages<this>>(usage: T): UsageTypeToBufferUsage<TData>[T];\n\n compileWriter(): void;\n write(data: Infer<TData>): void;\n writePartial(data: InferPartial<TData>): void;\n copyFrom(srcBuffer: TgpuBuffer<MemIdentity<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 isUsableAsVertex<T extends TgpuBuffer<AnyData>>(\n buffer: T,\n): buffer is T & VertexFlag {\n return !!(buffer as unknown as VertexFlag).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\nconst endianness = getSystemEndianness();\n\ntype RestrictVertexUsages<TData extends BaseData> = 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 private _hostBuffer: ArrayBuffer | undefined;\n\n private _label: string | undefined;\n readonly initial: Infer<TData> | undefined;\n\n usableAsUniform = false;\n usableAsStorage = false;\n 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.type} 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 compileWriter(): void {\n if (EVAL_ALLOWED_IN_ENV) {\n getCompiledWriterForSchema(this.dataType);\n } else {\n throw new Error('This environment does not allow eval');\n }\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 if (EVAL_ALLOWED_IN_ENV) {\n const writer = getCompiledWriterForSchema(this.dataType);\n writer(new DataView(mapped), 0, data, endianness === 'little');\n return;\n }\n writeData(new BufferWriter(mapped), this.dataType, data);\n return;\n }\n\n const size = sizeOf(this.dataType);\n if (!this._hostBuffer) {\n this._hostBuffer = new ArrayBuffer(size);\n }\n\n // Flushing any commands yet to be encoded.\n this._group.flush();\n\n if (EVAL_ALLOWED_IN_ENV) {\n const writer = getCompiledWriterForSchema(this.dataType);\n writer(new DataView(this._hostBuffer), 0, data, endianness === 'little');\n } else {\n writeData(new BufferWriter(this._hostBuffer), this.dataType, data);\n }\n device.queue.writeBuffer(gpuBuffer, 0, this._hostBuffer, 0, size);\n }\n\n public writePartial(data: InferPartial<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this._group.device;\n\n const instructions = getWriteInstructions(this.dataType, data);\n\n if (gpuBuffer.mapState === 'mapped') {\n const mappedRange = gpuBuffer.getMappedRange();\n const mappedView = new Uint8Array(mappedRange);\n\n for (const instruction of instructions) {\n mappedView.set(instruction.data, instruction.data.byteOffset);\n }\n } else {\n for (const instruction of instructions) {\n device.queue.writeBuffer(\n gpuBuffer,\n instruction.data.byteOffset,\n instruction.data,\n 0,\n instruction.data.byteLength,\n );\n }\n }\n }\n\n copyFrom(srcBuffer: TgpuBuffer<MemIdentity<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 as<T extends ViewUsages<this>>(usage: T): UsageTypeToBufferUsage<TData>[T] {\n return usageToUsageConstructor[usage]?.(\n this as never,\n ) as UsageTypeToBufferUsage<TData>[T];\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 { Measurer } from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport alignIO from './alignIO';\nimport { alignmentOf, customAlignmentOf } from './alignmentOf';\nimport { type Unstruct, isUnstruct } from './dataTypes';\nimport { sizeOf } from './sizeOf';\nimport type { AnyWgslStruct, WgslStruct } from './struct';\nimport type { BaseData } from './wgslTypes';\n\nexport interface OffsetInfo {\n offset: number;\n size: number;\n padding?: number | undefined;\n}\n\nconst cachedOffsets = new WeakMap<\n AnyWgslStruct | Unstruct,\n Record<string, OffsetInfo>\n>();\n\nexport function offsetsForProps<T extends Record<string, BaseData>>(\n struct: WgslStruct<T> | Unstruct<T>,\n): Record<keyof T, OffsetInfo> {\n const cached = cachedOffsets.get(struct);\n if (cached) {\n return cached as Record<keyof T, OffsetInfo>;\n }\n\n const measurer = new Measurer();\n const offsets = {} as Record<keyof T, OffsetInfo>;\n let lastEntry: OffsetInfo | undefined = undefined;\n\n for (const key in struct.propTypes) {\n const prop = struct.propTypes[key];\n if (prop === undefined) {\n throw new Error(`Property ${key} is undefined in struct`);\n }\n\n const beforeAlignment = measurer.size;\n\n alignIO(\n measurer,\n isUnstruct(struct) ? customAlignmentOf(prop) : alignmentOf(prop),\n );\n\n if (lastEntry) {\n lastEntry.padding = measurer.size - beforeAlignment;\n }\n\n const propSize = sizeOf(prop);\n offsets[key] = { offset: measurer.size, size: propSize };\n lastEntry = offsets[key];\n measurer.add(propSize);\n }\n\n if (lastEntry) {\n lastEntry.padding =\n roundUp(sizeOf(struct), alignmentOf(struct)) - measurer.size;\n }\n\n cachedOffsets.set(\n struct as\n | WgslStruct<Record<string, BaseData>>\n | Unstruct<Record<string, BaseData>>,\n offsets,\n );\n\n return offsets;\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 { roundUp } from '../mathUtils';\nimport type { Infer } from '../shared/repr';\nimport { alignmentOf } from './alignmentOf';\nimport { isDisarray, isUnstruct } from './dataTypes';\nimport { offsetsForProps } from './offsets';\nimport { sizeOf } from './sizeOf';\nimport * as wgsl from './wgslTypes';\n\nexport const EVAL_ALLOWED_IN_ENV: boolean = (() => {\n try {\n new Function('return true');\n return true;\n } catch {\n return false;\n }\n})();\n\nconst compiledWriters = new WeakMap<\n wgsl.BaseData,\n (\n output: DataView,\n offset: number,\n value: unknown,\n littleEndian?: boolean,\n ) => void\n>();\n\nconst typeToPrimitive = {\n u32: 'u32',\n vec2u: 'u32',\n vec3u: 'u32',\n vec4u: 'u32',\n\n i32: 'i32',\n vec2i: 'i32',\n vec3i: 'i32',\n vec4i: 'i32',\n\n f32: 'f32',\n vec2f: 'f32',\n vec3f: 'f32',\n vec4f: 'f32',\n\n vec2h: 'f32',\n vec3h: 'f32',\n vec4h: 'f32',\n\n mat2x2f: 'f32',\n mat3x3f: 'f32',\n mat4x4f: 'f32',\n} as const;\n\nconst primitiveToWriteFunction = {\n u32: 'setUint32',\n i32: 'setInt32',\n f32: 'setFloat32',\n} as const;\n\nexport function buildWriter(\n node: wgsl.BaseData,\n offsetExpr: string,\n valueExpr: string,\n): string {\n if (wgsl.isWgslStruct(node) || isUnstruct(node)) {\n const propOffsets = offsetsForProps(node);\n const sortedProps = Object.entries(propOffsets).sort(\n (a, b) => a[1].offset - b[1].offset,\n );\n let code = '';\n for (const [key, propOffset] of sortedProps) {\n const subSchema = node.propTypes[key];\n if (!subSchema) continue;\n code += buildWriter(\n subSchema,\n `(${offsetExpr} + ${propOffset.offset})`,\n `${valueExpr}.${key}`,\n );\n }\n return code;\n }\n\n if (wgsl.isWgslArray(node) || isDisarray(node)) {\n const arrSchema = node as wgsl.WgslArray;\n const elementSize = roundUp(\n sizeOf(arrSchema.elementType),\n alignmentOf(arrSchema.elementType),\n );\n let code = '';\n\n code += `for (let i = 0; i < ${arrSchema.elementCount}; i++) {\\n`;\n code += buildWriter(\n arrSchema.elementType,\n `(${offsetExpr} + i * ${elementSize})`,\n `${valueExpr}[i]`,\n );\n code += '}\\n';\n\n return code;\n }\n\n if (wgsl.isVec(node)) {\n const primitive = typeToPrimitive[node.type];\n let code = '';\n const writeFunc = primitiveToWriteFunction[primitive];\n const components = ['x', 'y', 'z', 'w'];\n const count = wgsl.isVec2(node) ? 2 : wgsl.isVec3(node) ? 3 : 4;\n\n for (let i = 0; i < count; i++) {\n code += `output.${writeFunc}((${offsetExpr} + ${i * 4}), ${valueExpr}.${components[i]}, littleEndian);\\n`;\n }\n return code;\n }\n\n if (wgsl.isMat(node)) {\n const primitive = typeToPrimitive[node.type];\n const writeFunc = primitiveToWriteFunction[primitive];\n\n const matSize = wgsl.isMat2x2f(node) ? 2 : wgsl.isMat3x3f(node) ? 3 : 4;\n const elementCount = matSize * matSize;\n const rowStride = roundUp(matSize * 4, 8);\n\n let code = '';\n for (let i = 0; i < elementCount; i++) {\n const colIndex = Math.floor(i / matSize);\n const rowIndex = i % matSize;\n const byteOffset = colIndex * rowStride + rowIndex * 4;\n\n code += `output.${writeFunc}((${offsetExpr} + ${byteOffset}), ${valueExpr}.columns[${colIndex}].${['x', 'y', 'z', 'w'][rowIndex]}, littleEndian);\\n`;\n }\n\n return code;\n }\n\n let unwrappedNode = node;\n\n while (wgsl.isAtomic(unwrappedNode) || wgsl.isDecorated(unwrappedNode)) {\n unwrappedNode = unwrappedNode.inner;\n }\n\n const primitive =\n typeToPrimitive[unwrappedNode.type as keyof typeof typeToPrimitive];\n return `output.${primitiveToWriteFunction[primitive]}(${offsetExpr}, ${valueExpr}, littleEndian);\\n`;\n}\n\nexport function getCompiledWriterForSchema<T extends wgsl.BaseData>(\n schema: T,\n): (\n output: DataView,\n offset: number,\n value: Infer<T>,\n littleEndian?: boolean,\n) => void {\n if (compiledWriters.has(schema)) {\n return compiledWriters.get(schema) as (\n output: DataView,\n offset: number,\n value: Infer<T>,\n littleEndian?: boolean,\n ) => void;\n }\n\n const body = buildWriter(schema, 'offset', 'value');\n\n const fn = new Function(\n 'output',\n 'offset',\n 'value',\n 'littleEndian=true',\n body,\n ) as (\n output: DataView,\n offset: number,\n value: Infer<T> | unknown,\n littleEndian?: boolean,\n ) => void;\n\n compiledWriters.set(schema, fn);\n\n return fn;\n}\n","import type { ISerialInput, ISerialOutput } from 'typed-binary';\nimport type { Infer, InferRecord } from '../shared/repr';\nimport alignIO from './alignIO';\nimport { alignmentOf, customAlignmentOf } from './alignmentOf';\nimport type {\n AnyConcreteData,\n AnyData,\n Disarray,\n LooseDecorated,\n Unstruct,\n} from './dataTypes';\nimport { mat2x2f, mat3x3f, mat4x4f } from './matrix';\nimport { sizeOf } from './sizeOf';\nimport type { WgslStruct } from './struct';\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.BaseData> = (\n output: ISerialOutput,\n schema: TSchema,\n value: Infer<TSchema>,\n) => void;\n\ntype DataReader<TSchema extends wgsl.BaseData> = (\n input: ISerialInput,\n schema: TSchema,\n) => Infer<TSchema>;\n\ntype CompleteDataWriters = {\n [TType in AnyConcreteData['type']]: DataWriter<\n Extract<AnyData, { readonly type: TType }>\n >;\n};\n\ntype CompleteDataReaders = {\n [TType in AnyConcreteData['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: WgslStruct,\n value: InferRecord<Record<string, wgsl.BaseData>>,\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.BaseData);\n }\n\n alignIO(output, alignment);\n },\n\n array(output, schema: wgsl.WgslArray, value: Infer<wgsl.BaseData>[]) {\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 ptr() {\n throw new Error('Pointers are not host-shareable');\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.BaseData>(\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: 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.BaseData>>;\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 ptr() {\n throw new Error('Pointers are not host-shareable');\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.BaseData>>;\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.BaseData>(\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","import { BufferWriter } from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport type { Infer, InferPartial } from '../shared/repr';\nimport { alignmentOf } from './alignmentOf';\nimport { writeData } from './dataIO';\nimport { isDisarray, isUnstruct } from './dataTypes';\nimport { offsetsForProps } from './offsets';\nimport { sizeOf } from './sizeOf';\nimport type * as wgsl from './wgslTypes';\nimport { isWgslArray, isWgslStruct } from './wgslTypes';\n\nexport interface WriteInstruction {\n data: Uint8Array;\n}\n\nexport function getWriteInstructions<TData extends wgsl.BaseData>(\n schema: TData,\n data: InferPartial<TData>,\n): WriteInstruction[] {\n const totalSize = sizeOf(schema);\n if (totalSize === 0 || data === undefined || data === null) {\n return [];\n }\n\n const bigBuffer = new ArrayBuffer(totalSize);\n const writer = new BufferWriter(bigBuffer);\n\n const segments: Array<{\n start: number;\n end: number;\n padding?: number | undefined;\n }> = [];\n\n function gatherAndWrite<T extends wgsl.BaseData>(\n node: T,\n partialValue: InferPartial<T> | undefined,\n offset: number,\n padding?: number | undefined,\n ) {\n if (partialValue === undefined || partialValue === null) {\n return;\n }\n\n if (isWgslStruct(node) || isUnstruct(node)) {\n const propOffsets = offsetsForProps(node);\n\n for (const [key, propOffset] of Object.entries(propOffsets)) {\n const subSchema = node.propTypes[key];\n if (!subSchema) {\n continue;\n }\n\n const childValue = partialValue[key as keyof typeof partialValue];\n if (childValue !== undefined) {\n gatherAndWrite(\n subSchema,\n childValue,\n offset + propOffset.offset,\n propOffset.padding ?? padding,\n );\n }\n }\n return;\n }\n\n if (isWgslArray(node) || isDisarray(node)) {\n const arrSchema = node as wgsl.WgslArray;\n const elementSize = roundUp(\n sizeOf(arrSchema.elementType),\n alignmentOf(arrSchema.elementType),\n );\n\n if (!Array.isArray(partialValue)) {\n throw new Error('Partial value for array must be an array');\n }\n const arrayPartialValue = partialValue as InferPartial<wgsl.WgslArray>;\n\n arrayPartialValue.sort((a, b) => a.idx - b.idx);\n\n for (const { idx, value } of arrayPartialValue) {\n gatherAndWrite(\n arrSchema.elementType,\n value,\n offset + idx * elementSize,\n elementSize - sizeOf(arrSchema.elementType),\n );\n }\n } else {\n const leafSize = sizeOf(node);\n writer.seekTo(offset);\n writeData(writer, node, partialValue as Infer<T>);\n\n segments.push({ start: offset, end: offset + leafSize, padding });\n }\n }\n\n gatherAndWrite(schema, data, 0);\n\n if (segments.length === 0) {\n return [];\n }\n\n const instructions: WriteInstruction[] = [];\n let current = segments[0];\n\n for (let i = 1; i < segments.length; i++) {\n const next = segments[i];\n if (!next || !current) {\n throw new Error('Internal error: missing segment');\n }\n if (next.start === current.end + (current.padding ?? 0)) {\n current.end = next.end;\n current.padding = next.padding;\n } else {\n instructions.push({\n data: new Uint8Array(\n bigBuffer,\n current.start,\n current.end - current.start,\n ),\n });\n current = next;\n }\n }\n\n if (!current) {\n throw new Error('Internal error: missing segment');\n }\n\n instructions.push({\n data: new Uint8Array(bigBuffer, current.start, current.end - current.start),\n });\n\n return instructions;\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 StorageFlag {\n usableAsStorage: true;\n}\n\n/**\n * @deprecated Use StorageFlag instead.\n */\nexport type Storage = StorageFlag;\n\nexport function isUsableAsStorage<T>(value: T): value is T & StorageFlag {\n return !!(value as unknown as StorageFlag)?.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 { AnyData } from '../../data/dataTypes';\nimport type { AnyWgslData, BaseData } from '../../data/wgslTypes';\nimport { type StorageFlag, isUsableAsStorage } from '../../extension';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer, InferGPU } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type {\n BindableBufferUsage,\n ResolutionCtx,\n SelfResolvable,\n} from '../../types';\nimport { valueProxyHandler } from '../valueProxyUtils';\nimport type { TgpuBuffer, UniformFlag } from './buffer';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUsage<\n TData extends BaseData = BaseData,\n TUsage extends BindableBufferUsage = BindableBufferUsage,\n> {\n readonly resourceType: 'buffer-usage';\n readonly usage: TUsage;\n readonly '~repr': Infer<TData>;\n value: InferGPU<TData>;\n\n readonly [$internal]: {\n readonly dataType: TData;\n };\n}\n\nexport interface TgpuBufferUniform<TData extends BaseData>\n extends TgpuBufferUsage<TData, 'uniform'> {\n readonly value: InferGPU<TData>;\n}\n\nexport interface TgpuBufferReadonly<TData extends BaseData>\n extends TgpuBufferUsage<TData, 'readonly'> {\n readonly value: InferGPU<TData>;\n}\n\nexport interface TgpuFixedBufferUsage<TData extends BaseData>\n extends TgpuNamable {\n readonly buffer: TgpuBuffer<TData>;\n write(data: Infer<TData>): void;\n}\n\nexport interface TgpuBufferMutable<TData extends BaseData>\n extends TgpuBufferUsage<TData, 'mutable'> {}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyData>>(\n buffer: T,\n): buffer is T & UniformFlag {\n return !!(buffer as unknown as UniformFlag).usableAsUniform;\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\n TgpuBufferUsage<TData, TUsage>,\n SelfResolvable,\n TgpuFixedBufferUsage<TData>\n{\n /** Type-token, not available at runtime */\n public readonly '~repr'!: Infer<TData>;\n public readonly resourceType = 'buffer-usage' as const;\n public readonly [$internal]: { readonly dataType: TData };\n\n constructor(\n public readonly usage: TUsage,\n public readonly buffer: TgpuBuffer<TData>,\n ) {\n this[$internal] = { dataType: buffer.dataType };\n }\n\n get label() {\n return this.buffer.label;\n }\n\n $name(label: string) {\n this.buffer.$name(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 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(\n this.buffer.dataType,\n )};`,\n );\n\n return id;\n }\n\n write(data: Infer<TData>) {\n this.buffer.write(data);\n }\n\n toString(): string {\n return `${this.usage}:${this.label ?? '<unnamed>'}`;\n }\n\n get value(): InferGPU<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.buffer.dataType,\n },\n },\n valueProxyHandler,\n ) as InferGPU<TData>;\n }\n}\nexport class TgpuLaidOutBufferImpl<\n TData extends BaseData,\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 public readonly [$internal]: { readonly dataType: TData };\n\n constructor(\n public readonly usage: TUsage,\n public readonly dataType: TData,\n private readonly _membership: LayoutMembership,\n ) {\n this[$internal] = { dataType };\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(${\n this._membership.idx\n }) 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(): InferGPU<TData> {\n if (!inGPUMode()) {\n throw new Error(`Cannot access buffer's value directly in JS.`);\n }\n\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.dataType,\n },\n },\n valueProxyHandler,\n ) as InferGPU<TData>;\n }\n}\n\nconst mutableUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'mutable'>\n>();\n\n/**\n * @deprecated Use buffer.as('mutable') instead.\n */\nexport function asMutable<TData extends AnyWgslData>(\n buffer: TgpuBuffer<TData> & StorageFlag,\n): TgpuBufferMutable<TData> & TgpuFixedBufferUsage<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 TgpuFixedBufferUsage<TData>;\n}\n\nconst readonlyUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'readonly'>\n>();\n\n/**\n * @deprecated Use buffer.as('readonly') instead.\n */\nexport function asReadonly<TData extends AnyWgslData>(\n buffer: TgpuBuffer<TData> & StorageFlag,\n): TgpuBufferReadonly<TData> & TgpuFixedBufferUsage<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 TgpuFixedBufferUsage<TData>;\n}\n\nconst uniformUsageMap = new WeakMap<\n TgpuBuffer<AnyWgslData>,\n TgpuFixedBufferImpl<AnyWgslData, 'uniform'>\n>();\n\n/**\n * @deprecated Use buffer.as('uniform') instead.\n */\nexport function asUniform<TData extends AnyWgslData>(\n buffer: TgpuBuffer<TData> & UniformFlag,\n): TgpuBufferUniform<TData> & TgpuFixedBufferUsage<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 TgpuFixedBufferUsage<TData>;\n}\n","// ----------\n// Public API\n// ----------\n\nimport type { TgpuNamable } from '../../namable';\nimport type { LayoutMembership } from '../../tgpuBindGroupLayout';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport type { Unwrapper } from '../../unwrapper';\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 INTERNAL_TgpuFixedSampler {\n unwrap(branch: Unwrapper): GPUSampler;\n}\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\n implements TgpuFixedSampler, SelfResolvable, INTERNAL_TgpuFixedSampler\n{\n public readonly resourceType = 'sampler';\n\n private _label: string | undefined;\n private _filtering: boolean;\n private _sampler: GPUSampler | null = null;\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 /**\n * NOTE: Internal use only\n */\n unwrap(branch: Unwrapper): GPUSampler {\n if (!this._sampler) {\n this._sampler = branch.device.createSampler({\n ...this._props,\n label: this._label ?? '<unnamed>',\n });\n }\n\n return this._sampler;\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\n TgpuFixedComparisonSampler,\n SelfResolvable,\n INTERNAL_TgpuFixedSampler\n{\n public readonly resourceType = 'sampler-comparison';\n\n private _label: string | undefined;\n private _sampler: GPUSampler | null = null;\n\n constructor(private readonly _props: ComparisonSamplerProps) {}\n\n /**\n * NOTE: Internal use only\n */\n unwrap(branch: Unwrapper): GPUSampler {\n if (!this._sampler) {\n this._sampler = branch.device.createSampler({\n ...this._props,\n label: this._label ?? '<unnamed>',\n });\n }\n\n return this._sampler;\n }\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 { StorageFlag } 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: StorageFlag; // <- 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 UniformFlag,\n isBuffer,\n} from './core/buffer/buffer';\nimport {\n type TgpuBufferMutable,\n type TgpuBufferReadonly,\n type TgpuBufferUniform,\n TgpuLaidOutBufferImpl,\n isUsableAsUniform,\n} from './core/buffer/bufferUsage';\nimport {\n type TgpuComparisonSampler,\n TgpuLaidOutComparisonSamplerImpl,\n TgpuLaidOutSamplerImpl,\n type TgpuSampler,\n isComparisonSampler,\n isSampler,\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 isSampledTextureView,\n isStorageTextureView,\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 { AnyWgslData, BaseData } from './data/wgslTypes';\nimport { NotUniformError } from './errors';\nimport {\n NotStorageError,\n type StorageFlag,\n isUsableAsStorage,\n} 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 BaseData | ((_: number) => BaseData),\n> = T extends (_: number) => BaseData ? 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 ?\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & UniformFlag)\n | GPUBuffer\n : T extends TgpuLayoutStorage\n ?\n | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & StorageFlag)\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 | TgpuSampledTexture<\n Default<T['viewDimension'], '2d'>,\n ChannelFormatToSchema[T['texture']]\n >\n : T extends TgpuLayoutStorageTexture\n ?\n | GPUTextureView\n | (StorageFlag &\n TgpuTexture<\n Prettify<TextureProps & GetStorageTextureRestriction<T>>\n >)\n | StorageTextureUsageForEntry<T>\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\nexport function bindGroupLayout<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n>(entries: Entries): TgpuBindGroupLayout<Prettify<Entries>> {\n return new TgpuBindGroupLayoutImpl(entries);\n}\n\nexport function isBindGroupLayout<T extends TgpuBindGroupLayout>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group-layout';\n}\n\nexport function isBindGroup<T extends TgpuBindGroup>(\n value: T | unknown,\n): value is T {\n return !!value && (value as T).resourceType === 'bind-group';\n}\n\n/**\n * @category Errors\n */\nexport class MissingBindingError extends Error {\n constructor(groupLabel: string | undefined, key: string) {\n super(\n `Bind group '${groupLabel ?? '<unnamed>'}' is missing a required binding '${key}'`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingBindingError.prototype);\n }\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst DEFAULT_MUTABLE_VISIBILITY: TgpuShaderStage[] = ['compute'];\nconst DEFAULT_READONLY_VISIBILITY: TgpuShaderStage[] = [\n 'compute',\n 'vertex',\n 'fragment',\n];\n\nclass TgpuBindGroupLayoutImpl<\n Entries extends Record<string, TgpuLayoutEntry | null>,\n> implements 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 NotStorageError(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 if (isSampledTextureView(value)) {\n resource = unwrapper.unwrap(value);\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 & StorageFlag).createView('readonly'),\n );\n } else if (entry.access === 'mutable') {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & StorageFlag).createView('mutable'),\n );\n } else {\n resource = unwrapper.unwrap(\n (value as TgpuTexture & StorageFlag).createView('writeonly'),\n );\n }\n } else if (isStorageTextureView(value)) {\n resource = unwrapper.unwrap(value);\n } else {\n resource = value as GPUTextureView;\n }\n\n return {\n binding: idx,\n resource,\n };\n }\n\n if ('sampler' in entry) {\n if (isSampler(value) || isComparisonSampler(value)) {\n return {\n binding: idx,\n resource: unwrapper.unwrap(value as TgpuSampler),\n };\n }\n\n return {\n binding: idx,\n resource: value as GPUSampler,\n };\n }\n\n if ('externalTexture' in entry) {\n return {\n binding: idx,\n resource: value as GPUExternalTexture,\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 isProviding,\n isSlot,\n} from './core/slot/slotTypes';\nimport { isData } from './data';\nimport { getAttributesString } from './data/attributes';\nimport {\n type AnyWgslData,\n type BaseData,\n isWgslArray,\n isWgslStruct,\n} from './data/wgslTypes';\nimport { MissingSlotValueError, ResolutionError } from './errors';\nimport { RuntimeMode, popMode, provideCtx, pushMode } from './gpuMode';\nimport type { JitTranspiler } from './jitTranspiler';\nimport type { NameRegistry } from './nameRegistry';\nimport { naturalsExcept } from './shared/generators';\nimport type { Infer } from './shared/repr';\nimport { $internal } from './shared/symbols';\nimport { generateFunction } from './smol';\nimport { getTypeFromWgsl } from './smol/generationHelpers';\nimport {\n type TgpuBindGroup,\n TgpuBindGroupImpl,\n type TgpuBindGroupLayout,\n type TgpuLayoutEntry,\n bindGroupLayout,\n} from './tgpuBindGroupLayout';\nimport type {\n FnToWgslOptions,\n ItemLayer,\n ItemStateStack,\n ResolutionCtx,\n Resource,\n Wgsl,\n} 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 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 ItemStateStackImpl implements 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 popItem() {\n this.pop('item');\n }\n\n pushSlotBindings(pairs: SlotValuePair<unknown>[]) {\n this._stack.push({\n type: 'slotBinding',\n bindingMap: new WeakMap(pairs),\n });\n }\n\n popSlotBindings() {\n this.pop('slotBinding');\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 popFunctionScope() {\n this.pop('functionScope');\n }\n\n pushBlockScope() {\n this._stack.push({\n type: 'blockScope',\n declarations: new Map<string, AnyWgslData | UnknownData>(),\n });\n }\n\n popBlockScope() {\n this.pop('blockScope');\n }\n\n pop(type?: (typeof this._stack)[number]['type']) {\n const layer = this._stack[this._stack.length - 1];\n if (!layer || (type && layer.type !== type)) {\n throw new Error(`Internal error, expected a ${type} layer to be on top.`);\n }\n\n this._stack.pop();\n if (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 return {\n value: external,\n dataType: isWgsl(external)\n ? getTypeFromWgsl(external)\n : UnknownData,\n };\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 defineBlockVariable(id: string, type: AnyWgslData | UnknownData): Resource {\n for (let i = this._stack.length - 1; i >= 0; --i) {\n const layer = this._stack[i];\n\n if (layer?.type === 'blockScope') {\n layer.declarations.set(id, type);\n\n return { value: id, dataType: type };\n }\n }\n\n throw new Error('No block scope found to define a variable in.');\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\nexport class 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 ItemStateStackImpl();\n private readonly _declarations: string[] = [];\n\n readonly [$internal] = {\n itemStateStack: this._itemStateStack,\n };\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 callStack: unknown[] = [];\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 | null {\n const item = this._itemStateStack.getResourceById(id);\n\n if (item === undefined) {\n return null;\n }\n\n return item;\n }\n\n defineVariable(id: string, dataType: AnyWgslData | UnknownData): Resource {\n return this._itemStateStack.defineBlockVariable(id, dataType);\n }\n\n pushBlockScope() {\n this._itemStateStack.pushBlockScope();\n }\n\n popBlockScope() {\n this._itemStateStack.popBlockScope();\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\n try {\n const str = generateFunction(this, options.body);\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}) -> ${getAttributesString(options.returnType)} ${this.resolve(options.returnType)}`\n : `(${argList})`,\n body: str,\n };\n } finally {\n this._itemStateStack.popFunctionScope();\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.popSlotBindings();\n }\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n if (isProviding(eventual)) {\n return this.withSlots(\n eventual['~providing'].pairs,\n () => this.unwrap(eventual['~providing'].inner) as T,\n );\n }\n\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 // Derived computations are always done on the CPU\n pushMode(RuntimeMode.CPU);\n\n let result: T;\n try {\n result = derived['~compute']();\n } finally {\n popMode(RuntimeMode.CPU);\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._memoizedDerived.set(derived, instances);\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.popItem();\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 (isData(item)) {\n result = resolveData(this, item);\n } else if (isDerived(item) || isSlot(item)) {\n result = this.resolve(this.unwrap(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.popItem();\n }\n }\n\n resolve(item: unknown): string {\n if (isProviding(item)) {\n return this.withSlots(item['~providing'].pairs, () =>\n this.resolve(item['~providing'].inner),\n );\n }\n\n if ((item && typeof item === 'object') || typeof item === 'function') {\n if (this._itemStateStack.itemDepth === 0) {\n try {\n pushMode(RuntimeMode.GPU);\n const result = provideCtx(this, () => this._getOrInstantiate(item));\n return `${[...this._declarations].join('\\n\\n')}${result}`;\n } finally {\n popMode(RuntimeMode.GPU);\n }\n }\n\n return this._getOrInstantiate(item);\n }\n\n return String(item);\n }\n\n resolveValue<T extends BaseData>(\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 { MissingBindGroupsError } 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 const { branch, label } = this._core;\n\n const pass = branch.commandEncoder.beginComputePass({\n label: label ?? '<unnamed>',\n });\n\n pass.setPipeline(memo.pipeline);\n\n const missingBindGroups = new Set(memo.bindGroupLayouts);\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 missingBindGroups.delete(layout);\n } else {\n const bindGroup = this._priors.bindGroupLayoutMap?.get(layout);\n if (bindGroup !== undefined) {\n missingBindGroups.delete(layout);\n pass.setBindGroup(idx, branch.unwrap(bindGroup));\n }\n }\n });\n\n if (missingBindGroups.size > 0) {\n throw new MissingBindGroupsError(missingBindGroups);\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 { alignmentOf, customAlignmentOf } from '../../data/alignmentOf';\nimport {\n getCustomLocation,\n isLooseDecorated,\n isUnstruct,\n} from '../../data/dataTypes';\nimport type { Disarray } from '../../data/dataTypes';\nimport { sizeOf } from '../../data/sizeOf';\nimport { isDecorated, isWgslStruct } from '../../data/wgslTypes';\nimport type { BaseData, 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 {\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 readonly vertexLayout: GPUVertexBufferLayout;\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<TData> {\n return new TgpuVertexLayoutImpl(schemaForCount, stepMode);\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\nconst defaultAttribEntry = Symbol('defaultAttribEntry');\n\nfunction dataToContainedAttribs<\n TLayoutData extends WgslArray | Disarray,\n TData extends BaseData,\n>(\n layout: TgpuVertexLayout<TLayoutData>,\n data: TData,\n offset: number,\n customLocationMap: Record<string | symbol, number>,\n key?: string,\n): DataToContainedAttribs<TData> {\n if (isDecorated(data) || isLooseDecorated(data)) {\n const customLocation = getCustomLocation(data);\n if (customLocation !== undefined) {\n customLocationMap[key ?? defaultAttribEntry] = customLocation;\n }\n\n return dataToContainedAttribs(\n layout,\n data.inner,\n roundUp(offset, customAlignmentOf(data)),\n customLocationMap,\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(\n layout,\n value,\n memberOffset,\n customLocationMap,\n key,\n ),\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(\n layout,\n value,\n memberOffset,\n customLocationMap,\n key,\n ),\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 private readonly _customLocationMap = {} as Record<string | symbol, number>;\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(\n this,\n arraySchema.elementType,\n 0,\n this._customLocationMap,\n );\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get vertexLayout(): GPUVertexBufferLayout {\n // If defaultAttribEntry is in the custom location map,\n // it means that the vertex layout is based on a single attribute\n if (this._customLocationMap[defaultAttribEntry] !== undefined) {\n if (\n typeof this.attrib.format !== 'string' ||\n typeof this.attrib.offset !== 'number'\n ) {\n throw new Error(\n 'Single attribute vertex layouts must have a format and offset.',\n );\n }\n\n return {\n arrayStride: this.stride,\n stepMode: this.stepMode,\n attributes: [\n {\n format: this.attrib.format,\n offset: this.attrib.offset,\n shaderLocation: this._customLocationMap[defaultAttribEntry],\n },\n ],\n };\n }\n\n // check if all attributes have custom locations\n const allAttributesHaveCustomLocations = Object.keys(this.attrib).every(\n (key) => this._customLocationMap[key] !== undefined,\n );\n\n if (!allAttributesHaveCustomLocations) {\n throw new Error(\n 'All attributes must have custom locations in order to unwrap a vertex layout.',\n );\n }\n\n return {\n arrayStride: this.stride,\n stepMode: this.stepMode,\n attributes: [\n ...Object.entries(this.attrib).map(([key, attrib]) => ({\n format: attrib.format,\n offset: attrib.offset,\n shaderLocation: this._customLocationMap[key],\n })),\n ] as GPUVertexAttribute[],\n };\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 { FragmentOutConstrained } from '../function/tgpuFragmentFn';\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: FragmentOutConstrained,\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 { FragmentOutConstrained } from '../function/tgpuFragmentFn';\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: FragmentOutConstrained,\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, VertexFlag } from '../../core/buffer/buffer';\nimport type { Disarray } from '../../data/dataTypes';\nimport type { AnyWgslData, WgslArray } from '../../data/wgslTypes';\nimport {\n MissingBindGroupsError,\n MissingVertexBuffersError,\n} 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> & VertexFlag,\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 withDepthStencilAttachment(\n attachment: DepthStencilAttachment,\n ): TgpuRenderPipeline<IOLayout>;\n\n draw(\n vertexCount: number,\n instanceCount?: number,\n firstVertex?: number,\n firstInstance?: number,\n ): void;\n}\n\nexport interface INTERNAL_TgpuRenderPipeline {\n readonly core: RenderPipelineCore;\n readonly priors: TgpuRenderPipelinePriors;\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 interface DepthStencilAttachment {\n /**\n * A {@link GPUTextureView} | ({@link TgpuTexture} & {@link Render}) describing the texture subresource that will be output to\n * and read from for this depth/stencil attachment.\n */\n view: (TgpuTexture & Render) | GPUTextureView;\n /**\n * Indicates the value to clear {@link GPURenderPassDepthStencilAttachment#view}'s depth component\n * to prior to executing the render pass. Ignored if {@link GPURenderPassDepthStencilAttachment#depthLoadOp}\n * is not {@link GPULoadOp#\"clear\"}. Must be between 0.0 and 1.0, inclusive (unless unrestricted depth is enabled).\n */\n depthClearValue?: number;\n /**\n * Indicates the load operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * depth component prior to executing the render pass.\n * Note: It is recommended to prefer clearing; see {@link GPULoadOp#\"clear\"} for details.\n */\n depthLoadOp?: GPULoadOp;\n /**\n * The store operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * depth component after executing the render pass.\n */\n depthStoreOp?: GPUStoreOp;\n /**\n * Indicates that the depth component of {@link GPURenderPassDepthStencilAttachment#view}\n * is read only.\n */\n depthReadOnly?: boolean;\n /**\n * Indicates the value to clear {@link GPURenderPassDepthStencilAttachment#view}'s stencil component\n * to prior to executing the render pass. Ignored if {@link GPURenderPassDepthStencilAttachment#stencilLoadOp}\n * is not {@link GPULoadOp#\"clear\"}.\n * The value will be converted to the type of the stencil aspect of `view` by taking the same\n * number of LSBs as the number of bits in the stencil aspect of one texel block|texel of `view`.\n */\n stencilClearValue?: GPUStencilValue;\n /**\n * Indicates the load operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * stencil component prior to executing the render pass.\n * Note: It is recommended to prefer clearing; see {@link GPULoadOp#\"clear\"} for details.\n */\n stencilLoadOp?: GPULoadOp;\n /**\n * The store operation to perform on {@link GPURenderPassDepthStencilAttachment#view}'s\n * stencil component after executing the render pass.\n */\n stencilStoreOp?: GPUStoreOp;\n /**\n * Indicates that the stencil component of {@link GPURenderPassDepthStencilAttachment#view}\n * is read only.\n */\n stencilReadOnly?: boolean;\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 depthStencilState: GPUDepthStencilState | undefined;\n targets: AnyFragmentTargets;\n multisampleState: GPUMultisampleState | undefined;\n};\n\nexport function INTERNAL_createRenderPipeline(\n options: RenderPipelineCoreOptions,\n) {\n return new TgpuRenderPipelineImpl(new RenderPipelineCore(options), {});\n}\n\nexport function isRenderPipeline(value: unknown): value is TgpuRenderPipeline {\n return (value as TgpuRenderPipeline)?.resourceType === 'render-pipeline';\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype TgpuRenderPipelinePriors = {\n readonly vertexLayoutMap?:\n | Map<TgpuVertexLayout, TgpuBuffer<AnyWgslData> & VertexFlag>\n | undefined;\n readonly bindGroupLayoutMap?:\n | Map<TgpuBindGroupLayout, TgpuBindGroup>\n | undefined;\n readonly colorAttachment?: AnyFragmentColorAttachment | undefined;\n readonly depthStencilAttachment?: DepthStencilAttachment | undefined;\n};\n\ntype Memo = {\n pipeline: GPURenderPipeline;\n bindGroupLayouts: TgpuBindGroupLayout[];\n catchall: [number, TgpuBindGroup] | null;\n};\n\nclass TgpuRenderPipelineImpl\n implements TgpuRenderPipeline, INTERNAL_TgpuRenderPipeline\n{\n public readonly resourceType = 'render-pipeline';\n\n constructor(\n public readonly core: RenderPipelineCore,\n public 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> & VertexFlag,\n ): TgpuRenderPipeline;\n with(\n bindGroupLayout: TgpuBindGroupLayout,\n bindGroup: TgpuBindGroup,\n ): TgpuRenderPipeline;\n with(\n definition: TgpuVertexLayout | TgpuBindGroupLayout,\n resource: (TgpuBuffer<AnyWgslData> & VertexFlag) | 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> & VertexFlag],\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 withDepthStencilAttachment(\n attachment: DepthStencilAttachment,\n ): TgpuRenderPipeline {\n return new TgpuRenderPipelineImpl(this.core, {\n ...this.priors,\n depthStencilAttachment: 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.targets,\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 renderPassDescriptor: GPURenderPassDescriptor = {\n colorAttachments,\n };\n\n if (this.core.label !== undefined) {\n renderPassDescriptor.label = this.core.label;\n }\n\n if (this.priors.depthStencilAttachment !== undefined) {\n const attachment = this.priors.depthStencilAttachment;\n if (isTexture(attachment.view)) {\n renderPassDescriptor.depthStencilAttachment = {\n ...attachment,\n view: branch.unwrap(attachment.view).createView(),\n };\n } else {\n renderPassDescriptor.depthStencilAttachment =\n attachment as GPURenderPassDepthStencilAttachment;\n }\n }\n\n const pass = branch.commandEncoder.beginRenderPass(renderPassDescriptor);\n\n pass.setPipeline(memo.pipeline);\n\n const missingBindGroups = new Set(memo.bindGroupLayouts);\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 missingBindGroups.delete(layout);\n } else {\n const bindGroup = this.priors.bindGroupLayoutMap?.get(layout);\n if (bindGroup !== undefined) {\n missingBindGroups.delete(layout);\n pass.setBindGroup(idx, branch.unwrap(bindGroup));\n }\n }\n });\n\n const missingVertexLayouts = new Set(this.core.usedVertexLayouts);\n\n const usedVertexLayouts = this.core.usedVertexLayouts;\n usedVertexLayouts.forEach((vertexLayout, idx) => {\n const buffer = this.priors.vertexLayoutMap?.get(vertexLayout);\n if (buffer) {\n missingVertexLayouts.delete(vertexLayout);\n pass.setVertexBuffer(idx, branch.unwrap(buffer));\n }\n });\n\n if (missingBindGroups.size > 0) {\n throw new MissingBindGroupsError(missingBindGroups);\n }\n\n if (missingVertexLayouts.size > 0) {\n throw new MissingVertexBuffersError(missingVertexLayouts);\n }\n\n pass.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n\n pass.end();\n branch.flush();\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.attributes[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.targets,\n options.targets,\n );\n }\n\n public unwrap(): Memo {\n if (this._memo === undefined) {\n const {\n branch,\n vertexFn,\n fragmentFn,\n slotBindings,\n primitiveState,\n depthStencilState,\n multisampleState,\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 if (depthStencilState) {\n descriptor.depthStencil = depthStencilState;\n }\n\n if (multisampleState) {\n descriptor.multisample = multisampleState;\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 { AnyComputeBuiltin, OmitBuiltins } from '../../builtin';\nimport type { AnyData, Disarray } from '../../data/dataTypes';\nimport type { AnyWgslData, BaseData, WgslArray } from '../../data/wgslTypes';\nimport {\n MissingBindGroupsError,\n MissingVertexBuffersError,\n invariant,\n} 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 type VertexFlag,\n isBuffer,\n} from '../buffer/buffer';\nimport type {\n TgpuBufferMutable,\n TgpuBufferReadonly,\n TgpuBufferUniform,\n TgpuBufferUsage,\n TgpuFixedBufferUsage,\n} from '../buffer/bufferUsage';\nimport type { IOLayout } from '../function/fnTypes';\nimport type { TgpuComputeFn } from '../function/tgpuComputeFn';\nimport type { TgpuFn } from '../function/tgpuFn';\nimport type {\n FragmentOutConstrained,\n TgpuFragmentFn,\n} 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 type INTERNAL_TgpuRenderPipeline,\n INTERNAL_createRenderPipeline,\n type RenderPipelineCoreOptions,\n type TgpuRenderPipeline,\n isRenderPipeline,\n} from '../pipeline/renderPipeline';\nimport {\n type INTERNAL_TgpuFixedSampler,\n type TgpuComparisonSampler,\n type TgpuSampler,\n isComparisonSampler,\n isSampler,\n} from '../sampler/sampler';\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 {\n type TgpuVertexLayout,\n isVertexLayout,\n} from '../vertexLayout/vertexLayout';\nimport type {\n CreateTextureOptions,\n CreateTextureResult,\n ExperimentalTgpuRoot,\n RenderPass,\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<ComputeIn extends Record<string, AnyComputeBuiltin>>(\n entryFn: TgpuComputeFn<ComputeIn>,\n ): 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 depthStencilState: undefined,\n slotBindings: this._slotBindings,\n vertexFn,\n vertexAttribs: attribs as AnyVertexAttribs,\n multisampleState: undefined,\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 withDepthStencil(\n depthStencilState: GPUDepthStencilState | undefined,\n ): WithFragment {\n return new WithFragmentImpl({ ...this._options, depthStencilState });\n }\n\n withMultisample(\n multisampleState: GPUMultisampleState | undefined,\n ): WithFragment<FragmentOutConstrained> {\n return new WithFragmentImpl({ ...this._options, multisampleState });\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'] = 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 createUniform<TData extends AnyWgslData>(\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n ): TgpuBufferUniform<TData> & TgpuFixedBufferUsage<TData> {\n return this.createBuffer<AnyWgslData>(typeSchema, initialOrBuffer)\n .$usage('uniform')\n .as('uniform') as TgpuBufferUniform<TData> & TgpuFixedBufferUsage<TData>;\n }\n\n createMutable<TData extends AnyWgslData>(\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n ): TgpuBufferMutable<TData> & TgpuFixedBufferUsage<TData> {\n return this.createBuffer<AnyWgslData>(typeSchema, initialOrBuffer)\n .$usage('storage')\n .as('mutable') as TgpuBufferMutable<TData> & TgpuFixedBufferUsage<TData>;\n }\n\n createReadonly<TData extends AnyWgslData>(\n typeSchema: TData,\n initialOrBuffer?: Infer<TData> | GPUBuffer,\n ): TgpuBufferReadonly<TData> & TgpuFixedBufferUsage<TData> {\n return this.createBuffer<AnyWgslData>(typeSchema, initialOrBuffer)\n .$usage('storage')\n .as('readonly') as TgpuBufferReadonly<TData> &\n TgpuFixedBufferUsage<TData>;\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: TgpuRenderPipeline): GPURenderPipeline;\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(resource: TgpuVertexLayout): GPUVertexBufferLayout;\n unwrap(resource: TgpuSampler): GPUSampler;\n unwrap(resource: TgpuComparisonSampler): GPUSampler;\n unwrap(\n resource:\n | TgpuComputePipeline\n | TgpuRenderPipeline\n | TgpuBindGroupLayout\n | TgpuBindGroup\n | TgpuBuffer<AnyData>\n | TgpuTexture\n | TgpuReadonlyTexture\n | TgpuWriteonlyTexture\n | TgpuMutableTexture\n | TgpuSampledTexture\n | TgpuVertexLayout\n | TgpuSampler\n | TgpuComparisonSampler,\n ):\n | GPUComputePipeline\n | GPURenderPipeline\n | GPUBindGroupLayout\n | GPUBindGroup\n | GPUBuffer\n | GPUTexture\n | GPUTextureView\n | GPUVertexBufferLayout\n | GPUSampler {\n if (isComputePipeline(resource)) {\n return (resource as unknown as INTERNAL_TgpuComputePipeline).rawPipeline;\n }\n\n if (isRenderPipeline(resource)) {\n return (resource as unknown as INTERNAL_TgpuRenderPipeline).core.unwrap()\n .pipeline;\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 if (isVertexLayout(resource)) {\n return resource.vertexLayout;\n }\n\n if (isSampler(resource)) {\n if ('unwrap' in resource) {\n return (resource as INTERNAL_TgpuFixedSampler).unwrap(this);\n }\n throw new Error('Cannot unwrap laid-out sampler.');\n }\n\n if (isComparisonSampler(resource)) {\n if ('unwrap' in resource) {\n return (resource as INTERNAL_TgpuFixedSampler).unwrap(this);\n }\n throw new Error('Cannot unwrap laid-out comparison sampler.');\n }\n\n throw new Error(`Unknown resource type: ${resource}`);\n }\n\n beginRenderPass(\n descriptor: GPURenderPassDescriptor,\n callback: (pass: RenderPass) => void,\n ): void {\n const pass = this.commandEncoder.beginRenderPass(descriptor);\n\n const bindGroups = new Map<\n TgpuBindGroupLayout,\n TgpuBindGroup | GPUBindGroup\n >();\n const vertexBuffers = new Map<\n TgpuVertexLayout,\n {\n buffer:\n | (TgpuBuffer<WgslArray<BaseData> | Disarray<BaseData>> & VertexFlag)\n | GPUBuffer;\n offset?: number | undefined;\n size?: number | undefined;\n }\n >();\n\n let currentPipeline:\n | (TgpuRenderPipeline & INTERNAL_TgpuRenderPipeline)\n | undefined;\n\n const setupPassBeforeDraw = () => {\n if (!currentPipeline) {\n throw new Error('Cannot draw without a call to pass.setPipeline');\n }\n\n const { core, priors } = currentPipeline;\n const memo = core.unwrap();\n\n pass.setPipeline(memo.pipeline);\n\n const missingBindGroups = new Set(memo.bindGroupLayouts);\n memo.bindGroupLayouts.forEach((layout, idx) => {\n if (memo.catchall && idx === memo.catchall[0]) {\n // Catch-all\n pass.setBindGroup(idx, this.unwrap(memo.catchall[1]));\n missingBindGroups.delete(layout);\n } else {\n const bindGroup =\n priors.bindGroupLayoutMap?.get(layout) ?? bindGroups.get(layout);\n if (bindGroup !== undefined) {\n missingBindGroups.delete(layout);\n if (isBindGroup(bindGroup)) {\n pass.setBindGroup(idx, this.unwrap(bindGroup));\n } else {\n pass.setBindGroup(idx, bindGroup);\n }\n }\n }\n });\n\n const missingVertexLayouts = new Set<TgpuVertexLayout>();\n core.usedVertexLayouts.forEach((vertexLayout, idx) => {\n const priorBuffer = priors.vertexLayoutMap?.get(vertexLayout);\n const opts = priorBuffer\n ? {\n buffer: priorBuffer,\n offset: undefined,\n size: undefined,\n }\n : vertexBuffers.get(vertexLayout);\n\n if (!opts || !opts.buffer) {\n missingVertexLayouts.add(vertexLayout);\n } else if (isBuffer(opts.buffer)) {\n pass.setVertexBuffer(\n idx,\n this.unwrap(opts.buffer),\n opts.offset,\n opts.size,\n );\n } else {\n pass.setVertexBuffer(idx, opts.buffer, opts.offset, opts.size);\n }\n });\n\n if (missingBindGroups.size > 0) {\n throw new MissingBindGroupsError(missingBindGroups);\n }\n\n if (missingVertexLayouts.size > 0) {\n throw new MissingVertexBuffersError(missingVertexLayouts);\n }\n };\n\n callback({\n setViewport(...args) {\n pass.setViewport(...args);\n },\n setScissorRect(...args) {\n pass.setScissorRect(...args);\n },\n setBlendConstant(...args) {\n pass.setBlendConstant(...args);\n },\n setStencilReference(...args) {\n pass.setStencilReference(...args);\n },\n beginOcclusionQuery(...args) {\n pass.beginOcclusionQuery(...args);\n },\n endOcclusionQuery(...args) {\n pass.endOcclusionQuery(...args);\n },\n executeBundles(...args) {\n pass.executeBundles(...args);\n },\n setPipeline(pipeline) {\n currentPipeline = pipeline as TgpuRenderPipeline &\n INTERNAL_TgpuRenderPipeline;\n },\n\n setIndexBuffer: (buffer, indexFormat, offset, size) => {\n if (isBuffer(buffer)) {\n pass.setIndexBuffer(this.unwrap(buffer), indexFormat, offset, size);\n } else {\n pass.setIndexBuffer(buffer, indexFormat, offset, size);\n }\n },\n\n setVertexBuffer(vertexLayout, buffer, offset, size) {\n vertexBuffers.set(vertexLayout, { buffer, offset, size });\n },\n\n setBindGroup(bindGroupLayout, bindGroup) {\n bindGroups.set(bindGroupLayout, bindGroup);\n },\n\n draw(vertexCount, instanceCount, firstVertex, firstInstance) {\n setupPassBeforeDraw();\n pass.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n },\n\n drawIndexed(...args) {\n setupPassBeforeDraw();\n pass.drawIndexed(...args);\n },\n\n drawIndirect(...args) {\n setupPassBeforeDraw();\n pass.drawIndirect(...args);\n },\n\n drawIndexedIndirect(...args) {\n setupPassBeforeDraw();\n pass.drawIndexedIndirect(...args);\n },\n });\n\n pass.end();\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 { unwrapProxy } from '../valueProxyUtils';\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 '~repr' = undefined as Infer<T>;\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 unwrapProxy(ctx.unwrap(this));\n }\n}\n","import type { AnyWgslData } from '../../data';\nimport { getResolutionCtx } from '../../gpuMode';\nimport type { Infer } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport {\n type ResolutionCtx,\n type SelfResolvable,\n isBufferUsage,\n} from '../../types';\nimport type { TgpuBufferUsage } from '../buffer/bufferUsage';\nimport { type TgpuFn, isTgpuFn } from '../function/tgpuFn';\nimport { valueProxyHandler } from '../valueProxyUtils';\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?: TgpuFn<[], T> | TgpuBufferUsage<T> | Infer<T>,\n): TgpuAccessor<T> {\n return new TgpuAccessorImpl(schema, 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 '~repr' = undefined as Infer<T>;\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 new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this.schema,\n },\n },\n valueProxyHandler,\n ) 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 { unwrapProxy } from '../valueProxyUtils';\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 stringifyPair([slot, value]: SlotValuePair): string {\n return `${slot.label ?? '<unnamed>'}=${value}`;\n}\n\nfunction createDerived<T>(compute: () => T): TgpuDerived<T> {\n const result = {\n resourceType: 'derived' as const,\n '~compute': compute,\n '~repr': undefined as Infer<T>,\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 unwrapProxy(ctx.unwrap(this));\n },\n\n with<TValue>(\n slot: TgpuSlot<TValue>,\n value: Eventual<TValue>,\n ): TgpuDerived<T> {\n return createBoundDerived(this, [[slot, value]]);\n },\n\n toString(): string {\n return 'derived';\n },\n };\n\n return result;\n}\n\nfunction createBoundDerived<T>(\n innerDerived: TgpuDerived<T>,\n pairs: SlotValuePair[],\n): TgpuDerived<T> {\n const result = {\n resourceType: 'derived' as const,\n '~repr': undefined as Infer<T>,\n\n '~compute'() {\n throw new Error(\n `'~compute' should never be read on bound derived items.`,\n );\n },\n '~providing': {\n inner: innerDerived,\n pairs,\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 unwrapProxy(ctx.unwrap(this));\n },\n\n with<TValue>(\n slot: TgpuSlot<TValue>,\n value: Eventual<TValue>,\n ): TgpuDerived<T> {\n return createBoundDerived(innerDerived, [...pairs, [slot, value]]);\n },\n\n toString(): string {\n return `derived[${pairs.map(stringifyPair).join(', ')}]`;\n },\n };\n\n return result;\n}\n","import type { AnyWgslData } from '../../data/wgslTypes';\nimport { inGPUMode } from '../../gpuMode';\nimport type { TgpuNamable } from '../../namable';\nimport type { Infer } from '../../shared/repr';\nimport { $internal } from '../../shared/symbols';\nimport type { ResolutionCtx, SelfResolvable } from '../../types';\nimport { valueProxyHandler } from '../valueProxyUtils';\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: TDataType,\n initialValue?: Infer<TDataType>,\n): TgpuVar<'private', 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\n return new Proxy(\n {\n '~resolve': (ctx: ResolutionCtx) => ctx.resolve(this),\n toString: () => `.value:${this.label ?? '<unnamed>'}`,\n [$internal]: {\n dataType: this._dataType,\n },\n },\n valueProxyHandler,\n ) 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 vertexLayout,\n\n init,\n initFromDevice,\n\n resolve,\n\n '~unstable': {\n fn,\n fragmentFn,\n vertexFn,\n computeFn,\n /**\n * @deprecated This feature is now stable, use tgpu.vertexLayout.\n */\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 MissingBindGroupsError,\n MissingVertexBuffersError,\n MissingLinksError,\n MissingSlotValueError,\n NotUniformError,\n ResolutionError,\n} from './errors';\nexport { StrictNameRegistry, RandomNameRegistry } from './nameRegistry';\nexport {\n isBuffer,\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 isUsableAsUniform,\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 { StorageFlag, 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 UniformFlag,\n Uniform,\n VertexFlag,\n Vertex,\n} from './core/buffer/buffer';\nexport type {\n TgpuBufferUniform,\n TgpuBufferReadonly,\n TgpuBufferMutable,\n} from './core/buffer/bufferUsage';\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"],"mappings":"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","names":["swizzleableTypes","swizzleLenToType","f32","vec2f","vec3f","vec4f","f16","vec2h","vec3h","vec4h","i32","vec2i","vec3i","vec4i","u32","vec2u","vec3u","vec4u","kindToSchema","mat2x2f","mat3x3f","mat4x4f","indexableTypeToResult","getTypeForPropAccess","targetType","propName","_a","UnknownData","isDerived","isSlot","ctx","getResolutionCtx","unwrapped","getTypeFromWgsl","target","hasInternalDataType","$internal","isDecorated","targetTypeStr","propLength","swizzleTypeChar","swizzleType","isWgslData","getTypeForIndexAccess","resource","isWgslArray","_b","numericLiteralToResource","bool","kind","value","abstractInt","abstractFloat","valueProxyHandler","target","prop","ctx","_a","$internal","getTypeForPropAccess","unwrapProxy","value","unwrapped","isSlot","isDerived","isAccessor","isBufferUsage","constant","dataType","value","TgpuConstImpl","_a","$internal","_value","__publicField","label","ctx","id","resolvedValue","inGPUMode","valueProxyHandler","isNamable","value","applyExternals","existing","newExternals","key","value","isNamable","addArgTypesToExternals","implementation","argTypes","argTypeNames","found","argType","i","argTypeName","isWgslStruct","addReturnTypeToExternals","returnType","_a","matched","outputName","identifierRegex","name","replaceExternalsInWgsl","ctx","externalMap","wgsl","acc","externalName","external","isWgsl","isLooseData","innerAcc","prop","declare","declaration","TgpuDeclareImpl","__publicField","dependencyMap","ctx","externalMap","externals","applyExternals","replacedDeclaration","replaceExternalsInWgsl","functionToAstMap","getPrebuiltAstFor","fn","assignAst","ast","externals","createFnCore","shell","implementation","externalsToApply","addArgTypesToExternals","externals","addReturnTypeToExternals","newExternals","ctx","fnAttribute","_a","externalMap","applyExternals","id","replacedImpl","replaceExternalsInWgsl","pluginData","getPrebuiltAstFor","missing","name","ast","missingExternals","MissingLinksError","args","idx","head","body","withLocations","members","nextLocation","key","member","isBuiltin","customLocation","getCustomLocation","attribute","createOutputType","returnType","isData","location","struct","createStructFromIO","computeFn","options","_a","_b","_c","_d","createStructFromIO","implementation","createComputeFn","shell","workgroupSize","core","createFnCore","inputType","newExternals","newLabel","isNamable","ctx","fn","argTypes","returnType","implementation","createFn","isTgpuFn","value","stringifyPair","slot","_a","shell","core","createFnCore","fnBase","newExternals","newLabel","createBoundFunction","isAccessor","ctx","call","createDualImpl","args","FnCall","arg","UnknownData","$internal","innerFn","pairs","_fn","_params","param","fragmentFn","options","_a","createStructFromIO","createOutputType","implementation","createFragmentFn","shell","core","createFnCore","outputType","inputType","addReturnTypeToExternals","externals","newExternals","newLabel","isNamable","ctx","generationCtx","vertexFn","options","_a","_b","createOutputType","createStructFromIO","implementation","createVertexFn","shell","core","createFnCore","outputType","inputType","addReturnTypeToExternals","externals","newExternals","newLabel","isNamable","ctx","generationCtx","RandomNameRegistry","__publicField","primer","label","StrictNameRegistry","index","unusedName","assertExhaustive","x","location","isAttribute","value","connectAttributesToShader","shaderInputLayout","attributes","_a","_b","usedVertexLayouts","isData","getCustomLocation","bufferDefinitions","layoutToAttribListMap","nextShaderLocation","key","member","isBuiltin","matchingAttribute","layout","attribList","identityTypes","isIdentityType","data","resolveStructProperty","ctx","key","property","getAttributesString","resolveStruct","struct","id","prop","resolveUnstruct","unstruct","isAttribute","formatToWGSLType","resolveArray","array","element","resolveDisarray","disarray","resolveData","isLooseData","assertExhaustive","parenthesizedOps","binaryLogicalOps","operatorToType","lhs","op","rhs","bool","resolveRes","ctx","res","isWgsl","assertExhaustive","value","generateBoolean","generateBlock","statement","generateStatement","registerBlockVariable","id","dataType","generateIdentifier","generateExpression","expression","_a","lhsExpr","rhsExpr","lhsStr","rhsStr","type","arg","argExpr","argStr","targetId","property","target","getTypeForPropAccess","propValue","getTypeFromWgsl","UnknownData","targetExpr","propertyExpr","targetStr","propertyStr","getTypeForIndexAccess","numericLiteralToResource","callee","args","idValue","resolvedResources","argValues","isWgslStruct","obj","generateEntries","values","valueRes","key","val","mismatchedType","isWgslData","u32","f32","arrayType","arrayValues","arrayOf","resource","resolvedStruct","cond","cons","alt","condition","consequent","alternate","rawId","rawValue","eq","init","update","body","initStatement","initStr","conditionExpr","conditionStr","updateStatement","updateStr","bodyStr","generateFunction","BufferReader","BufferWriter","getSystemEndianness","Measurer","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","cachedOffsets","offsetsForProps","struct","cached","measurer","Measurer","offsets","lastEntry","key","prop","beforeAlignment","alignIO_default","isUnstruct","customAlignmentOf","alignmentOf","propSize","sizeOf","roundUp","EVAL_ALLOWED_IN_ENV","compiledWriters","typeToPrimitive","primitiveToWriteFunction","buildWriter","node","offsetExpr","valueExpr","isWgslStruct","isUnstruct","propOffsets","offsetsForProps","sortedProps","a","b","code","key","propOffset","subSchema","isWgslArray","isDisarray","arrSchema","elementSize","roundUp","sizeOf","alignmentOf","isVec","primitive","writeFunc","components","count","isVec2","isVec3","i","isMat","matSize","isMat2x2f","isMat3x3f","elementCount","rowStride","colIndex","rowIndex","byteOffset","unwrappedNode","isAtomic","isDecorated","getCompiledWriterForSchema","schema","body","fn","dataWriters","output","_schema","value","_","i","schema","alignment","alignmentOf","alignIO_default","key","property","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","BufferWriter","getWriteInstructions","schema","data","_a","totalSize","sizeOf","bigBuffer","writer","BufferWriter","segments","gatherAndWrite","node","partialValue","offset","padding","isWgslStruct","isUnstruct","propOffsets","offsetsForProps","key","propOffset","subSchema","childValue","isWgslArray","isDisarray","arrSchema","elementSize","roundUp","alignmentOf","arrayPartialValue","a","b","idx","value","leafSize","writeData","instructions","current","i","next","isUsableAsStorage","value","NotStorageError","_NotStorageError","_a","isUsableAsUniform","buffer","usageToVarTemplateMap","_a","$internal","TgpuFixedBufferImpl","usage","__publicField","label","ctx","id","group","binding","data","inGPUMode","valueProxyHandler","TgpuLaidOutBufferImpl","dataType","_membership","mutableUsageMap","asMutable","isUsableAsStorage","readonlyUsageMap","asReadonly","uniformUsageMap","asUniform","usageToUsageConstructor","asUniform","asMutable","asReadonly","INTERNAL_createBuffer","group","typeSchema","initialOrBuffer","isWgslData","TgpuBufferImpl","isBuffer","value","isUsableAsVertex","buffer","endianness","getSystemEndianness","_group","dataType","_disallowedUsages","__publicField","isGPUBuffer","_a","device","sizeOf","writer","BufferWriter","writeData","label","usages","usage","flags","EVAL_ALLOWED_IN_ENV","getCompiledWriterForSchema","data","gpuBuffer","mapped","size","instructions","getWriteInstructions","mappedRange","mappedView","instruction","srcBuffer","readData","BufferReader","res","stagingBuffer","commandEncoder","sampler","props","TgpuFixedSamplerImpl","comparisonSampler","TgpuFixedComparisonSamplerImpl","isSampler","resource","isComparisonSampler","TgpuLaidOutSamplerImpl","_membership","__publicField","ctx","id","group","_a","TgpuLaidOutComparisonSamplerImpl","_props","branch","__spreadProps","__spreadValues","label","binding","TgpuExternalTextureImpl","_membership","__publicField","ctx","id","group","_a","texelFormatToChannelType","f32","u32","i32","texelFormatToDataType","vec4f","vec4u","vec4i","channelKindToFormat","channelFormatToSchema","INTERNAL_createTexture","props","branch","TgpuTextureImpl","isTexture","value","isStorageTextureView","isSampledTextureView","accessMap","_branch","__publicField","label","_a","_b","_c","_d","_e","usages","hasStorage","hasSampled","hasRender","access","params","storageParams","format","type","texelFormatToDataType","invariant","TgpuFixedStorageTextureImpl","TgpuFixedSampledTextureImpl","dimensionToCodeMap","_texture","ctx","id","group","binding","TgpuLaidOutStorageTextureImpl","_format","dimension","_membership","_props","texelFormatToChannelType","__spreadValues","multisampled","channelKindToFormat","TgpuLaidOutSampledTextureImpl","sampleType","_multisampled","channelFormatToSchema","isUsableAsSampled","value","isUsableAsRender","NotSampledError","_NotSampledError","_a","bindGroupLayout","entries","TgpuBindGroupLayoutImpl","isBindGroupLayout","value","isBindGroup","MissingBindingError","_MissingBindingError","groupLabel","key","DEFAULT_MUTABLE_VISIBILITY","DEFAULT_READONLY_VISIBILITY","__publicField","_a","_b","_c","_d","_e","idx","entry","membership","TgpuLaidOutBufferImpl","dataType","TgpuLaidOutSampledTextureImpl","TgpuLaidOutStorageTextureImpl","TgpuExternalTextureImpl","TgpuLaidOutComparisonSamplerImpl","TgpuLaidOutSamplerImpl","label","index","unwrapper","visibility","binding","access","v","TgpuBindGroupImpl","layout","resource","isBuffer","isUsableAsUniform","NotUniformError","isUsableAsStorage","NotStorageError","isTexture","isUsableAsSampled","NotSampledError","isSampledTextureView","isStorageTextureView","isSampler","isComparisonSampler","CATCHALL_BIND_GROUP_IDX_MARKER","ItemStateStackImpl","__publicField","state","pairs","args","returnType","externalMap","type","layer","slot","i","boundValue","id","arg","a","external","isWgsl","getTypeFromWgsl","UnknownData","declarationType","INDENT","N","IndentController","_a","str","$internal","ResolutionCtxImpl","opts","item","dataType","fn","options","generateFunction","argList","getAttributesString","declaration","layout","memoMap","placeholderKey","layoutEntry","resource","binding","value","MissingSlotValueError","callback","eventual","isProviding","maybeEventual","isSlot","isDerived","derived","instances","instance","expectedValue","pushMode","RuntimeMode","result","popMode","slotToValueMap","usedSlot","err","ResolutionError","isData","resolveData","isSelfResolvable","provideCtx","schema","isWgslArray","element","isWgslStruct","key","type_","resolve","ctx","code","bindGroupLayouts","takenIndices","v","automaticIds","naturalsExcept","layoutEntries","idx","createCatchallGroup","catchallIdx","catchallLayout","bindGroupLayout","TgpuBindGroupImpl","catchall","placeholder","resolve","options","externals","template","names","jitTranspiler","dependencies","applyExternals","resolutionObj","ctx","replaceExternalsInWgsl","code","StrictNameRegistry","RandomNameRegistry","WeakMemo","_make","__publicField","key","args","value","INTERNAL_createComputePipeline","branch","slotBindings","entryFn","TgpuComputePipelineImpl","ComputePipelineCore","isComputePipeline","value","_TgpuComputePipelineImpl","_core","_priors","__publicField","bindGroupLayout","bindGroup","_a","x","y","z","memo","label","pass","missingBindGroups","layout","idx","MissingBindGroupsError","_slotBindings","_entryFn","_b","_c","_d","_e","device","code","bindGroupLayouts","catchall","resolve","ctx","l","vertexLayout","schemaForCount","stepMode","TgpuVertexLayoutImpl","isVertexLayout","value","defaultAttribEntry","dataToContainedAttribs","layout","data","offset","customLocationMap","key","isDecorated","isLooseDecorated","customLocation","getCustomLocation","roundUp","customAlignmentOf","isWgslStruct","memberOffset","alignmentOf","attrib","sizeOf","isUnstruct","vertexFormats","format","kindToDefaultFormatMap","__publicField","arraySchema","label","isColorAttachment","value","connectAttachmentToShader","shaderOutputLayout","attachment","isData","result","key","matching","isColorTargetState","value","connectTargetsToShader","shaderOutputLayout","targets","isData","result","key","matchingTarget","INTERNAL_createRenderPipeline","options","TgpuRenderPipelineImpl","RenderPipelineCore","isRenderPipeline","value","_TgpuRenderPipelineImpl","core","priors","__publicField","label","definition","resource","_a","_b","isBindGroupLayout","__spreadProps","__spreadValues","isVertexLayout","attachment","vertexCount","instanceCount","firstVertex","firstInstance","memo","branch","fragmentFn","renderPassDescriptor","connectAttachmentToShader","isTexture","pass","missingBindGroups","layout","idx","bindGroup","missingVertexLayouts","vertexLayout","buffer","MissingBindGroupsError","MissingVertexBuffersError","connectedAttribs","connectAttributesToShader","connectTargetsToShader","_c","_d","vertexFn","slotBindings","primitiveState","depthStencilState","multisampleState","code","bindGroupLayouts","catchall","resolve","ctx","device","module","descriptor","l","WithBindingImpl","_WithBindingImpl","_getRoot","_slotBindings","slot","value","isAccessor","entryFn","WithComputeImpl","vertexFn","attribs","WithVertexImpl","_root","_entryFn","INTERNAL_createComputePipeline","_options","fragmentFn","targets","_mismatch","invariant","WithFragmentImpl","__spreadProps","__spreadValues","_WithFragmentImpl","primitiveState","depthStencilState","multisampleState","INTERNAL_createRenderPipeline","TgpuRootImpl","device","nameRegistry","jitTranspiler","_ownDevice","__publicField","WeakMemo","key","typeSchema","initialOrBuffer","buffer","INTERNAL_createBuffer","layout","entries","TgpuBindGroupImpl","disposable","props","texture","INTERNAL_createTexture","resource","isComputePipeline","isRenderPipeline","isBindGroupLayout","isBindGroup","isBuffer","isTexture","isStorageTextureView","isSampledTextureView","isVertexLayout","isSampler","isComparisonSampler","descriptor","callback","pass","bindGroups","vertexBuffers","currentPipeline","setupPassBeforeDraw","core","priors","memo","missingBindGroups","idx","_a","_b","bindGroup","missingVertexLayouts","vertexLayout","priorBuffer","opts","MissingBindGroupsError","MissingVertexBuffersError","args","pipeline","indexFormat","offset","size","bindGroupLayout","vertexCount","instanceCount","firstVertex","firstInstance","init","options","adapterOpt","deviceOpt","names","adapter","RandomNameRegistry","StrictNameRegistry","initFromDevice","slot","defaultValue","TgpuSlotImpl","__publicField","label","a","b","_a","ctx","getResolutionCtx","unwrapProxy","accessor","schema","defaultValue","TgpuAccessorImpl","__publicField","slot","label","_a","getResolutionCtx","ctx","$internal","valueProxyHandler","value","isBufferUsage","isTgpuFn","derived","compute","createDerived","stringifyPair","slot","value","_a","ctx","getResolutionCtx","unwrapProxy","createBoundDerived","innerDerived","pairs","privateVar","dataType","initialValue","TgpuVarImpl","workgroupVar","scope","_dataType","_initialValue","__publicField","label","ctx","id","_a","inGPUMode","$internal","valueProxyHandler","tgpu","bindGroupLayout","vertexLayout","init","initFromDevice","resolve","fn","fragmentFn","vertexFn","computeFn","derived","slot","accessor","privateVar","workgroupVar","constant","declare","sampler","comparisonSampler","index_default","assignAst"]}
|