typegpu 0.0.0-alpha.2 → 0.0.0-alpha.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. package/README.md +29 -0
  2. package/chunk-7HTWRNOH.cjs +12 -0
  3. package/chunk-7HTWRNOH.cjs.map +1 -0
  4. package/chunk-K2GYQABQ.js +12 -0
  5. package/chunk-K2GYQABQ.js.map +1 -0
  6. package/data/index.cjs +2 -0
  7. package/data/index.cjs.map +1 -0
  8. package/data/index.d.cts +38 -0
  9. package/data/index.d.ts +38 -0
  10. package/data/index.js +2 -0
  11. package/data/index.js.map +1 -0
  12. package/index.cjs +49 -0
  13. package/index.cjs.map +1 -0
  14. package/{dist/index.d.cts → index.d.cts} +129 -30
  15. package/{dist/index.d.ts → index.d.ts} +129 -30
  16. package/index.js +49 -0
  17. package/index.js.map +1 -0
  18. package/macro/index.cjs +8 -0
  19. package/{dist/macro → macro}/index.d.cts +1 -1
  20. package/{dist/macro → macro}/index.d.ts +1 -1
  21. package/{dist/macro → macro}/index.js +1 -1
  22. package/package.json +30 -37
  23. package/std140-Cv7GDE9w.d.ts +26 -0
  24. package/std140-DRitCcmc.d.cts +26 -0
  25. package/types-ENDwr_p9.d.cts +243 -0
  26. package/types-ENDwr_p9.d.ts +243 -0
  27. package/dist/chunk-3VCFA6WZ.cjs +0 -2
  28. package/dist/chunk-3VCFA6WZ.cjs.map +0 -1
  29. package/dist/chunk-G3U6RTMF.cjs +0 -2
  30. package/dist/chunk-G3U6RTMF.cjs.map +0 -1
  31. package/dist/chunk-GHP25GEO.js +0 -2
  32. package/dist/chunk-GHP25GEO.js.map +0 -1
  33. package/dist/chunk-XGSMOADT.js +0 -2
  34. package/dist/chunk-XGSMOADT.js.map +0 -1
  35. package/dist/data/index.cjs +0 -10
  36. package/dist/data/index.cjs.map +0 -1
  37. package/dist/data/index.d.cts +0 -84
  38. package/dist/data/index.d.ts +0 -84
  39. package/dist/data/index.js +0 -10
  40. package/dist/data/index.js.map +0 -1
  41. package/dist/index.cjs +0 -29
  42. package/dist/index.cjs.map +0 -1
  43. package/dist/index.js +0 -29
  44. package/dist/index.js.map +0 -1
  45. package/dist/macro/index.cjs +0 -8
  46. package/dist/struct-CpjQEnf9.d.cts +0 -9
  47. package/dist/struct-HAlb4aG-.d.ts +0 -9
  48. package/dist/types-gpN_64mT.d.cts +0 -148
  49. package/dist/types-gpN_64mT.d.ts +0 -148
  50. /package/{dist/macro → macro}/index.cjs.map +0 -0
  51. /package/{dist/macro → macro}/index.js.map +0 -0
package/index.cjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/callable.ts","../src/typegpuRuntime.ts","../src/nameRegistry.ts","../src/wgslSampler.ts","../src/wgslTexture.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/wgslBufferUsage.ts","../src/wgslBuffer.ts","../src/wgslConstant.ts","../src/wgslDeclare.ts","../src/wgslFunction.ts","../src/wgslFunctionExperimental.ts","../src/settableTrait.ts","../src/wgslPlum.ts","../src/wgslSlot.ts","../src/wgslVariable.ts","../src/wgsl.ts","../src/createRuntime.ts","../src/mathUtils.ts","../src/plumStore.ts","../src/taskQueue.ts"],"names":["Callable","__publicField","callable_default","typeToVertexFormatMap","deriveVertexFormat","typeSchema","code","vertexFormat","RandomNameRegistry","item","name","label","StrictNameRegistry","assignedName","index","unusedName","sampler","descriptor","WgslSamplerImpl","ctx","identifier","WgslIdentifier","isSampler","resource","texture","WgslTextureImpl","textureExternal","WgslTextureExternalImpl","flags","enrichedThis","params","stringified","hashFromShallowObj","existing","type","texelFormatToWgslType","view","WgslTextureViewImpl","maybeView","dataType","access","isExternalTexture","isTextureView","vec4f","vec4u","vec4i","obj","withKeysSorted","a","b","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","itemCtx","_a","instances","instance","slot","expectedValue","result","err","ResolutionError","slotToValueMap","usedSlot","bindable","nextIdx","declaration","builtin","ResolutionCtxImpl","bindingGroup","_declaration","_bindable","_identifier","MissingSlotValueError","eventual","slotValueOverrides","isResolvable","ScopedResolutionCtx","_ScopedResolutionCtx","_parent","_shared","_slotValuePairs","group","idx","isSamplerType","isExternalTextureType","isDepthTextureType","token","slotToValuePair","boundSlot","maybeSlot","isSlot","usageToBindingTypeMap","ProgramBuilder","runtime","root","options","codeString","usedBindables","usedRenderResources","usedSamplers","usedTextures","usedExternalTextures","allEntries","textureView","external","allBindGroupEntries","externalTexture","bindGroupLayout","bindGroup","RenderProgramBuilder","vertexRoot","fragmentRoot","vertexOutputFormat","_b","_c","_d","symbolOutputs","symbol","symbolRecord","vertexOutputBuiltins","getUsedBuiltinsNamed","vertexOutput","varInfo","structFields","entry","vertexContext","vertexBuffers","vertexUserArgs","elem","vertexArgs","vertexCode","fragmentContext","fragmentBuiltinArgs","fragmentInputs","fragmentArgs","fragmentCode","vertexProgram","fragmentProgram","ComputeProgramBuilder","computeRoot","workgroupSize","context","builtinArgs","workgroupSizeDeclaration","shaderCode","bufferUsage","buffer","usage","WgslBufferUsageImpl","initial","WgslBufferImpl","stepMode","SimpleWgslData","underlyingThis","constant","expr","WgslConstImpl","declare","strings","WgslDeclareImpl","fn","WgslFnImpl","body","value","BoundWgslFnImpl","_BoundWgslFnImpl","_innerFn","_slotValuePair","argTypes","returnType","argPairs","argType","argValues","argIdent","bodyProducer","WgslFunctionCall","usedFn","args","argsCode","argSegment","comma","ident","isPointer","WgslSettableTrait","WgslExternalPlumTrait","isExternalPlum","plum","initialOrCompute","WgslDerivedPlumImpl","WgslSourcePlumImpl","plumFromEvent","subscribe","getLatest","WgslExternalPlumImpl","isPlum","_initial","_get","_compute","get","_subscribe","_getLatest","listener","latest","defaultValue","WgslSlotImpl","isWgsl","variable","initialValue","scope","WgslVarImpl","_dataType","_initialValue","wgsl_default","BufferReader","BufferWriter","roundUp","modulo","bitMask","invBitMask","PlumStore","state","dependencies","listeners","getter","dep","depState","unsub","dirty","prevVersion","externalUnsub","unsubs","TaskQueue","task","resolve","reject","e","TypeGpuRuntimeImpl","device","allocatable","writer","source","__spreadProps","__spreadValues","gpuSampler","commandEncoder","res","data","gpuBuffer","size","hostBuffer","compute","_e","_f","_g","_h","vertexBufferDescriptors","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","buffers","executor","RenderPipelineExecutor","program","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","usedVertexBuffers","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","__objRest","passEncoder","workgroups","i","createRuntime","adapter"],"mappings":"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","sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: <generics>\nabstract class Callable<TArgs extends [...any[]], TReturn> extends Function {\n _bound: Callable<TArgs, TReturn>;\n\n constructor() {\n // We create a new Function object using `super`, with a `this` reference\n // to itself (the Function object) provided by binding it to `this`,\n // then returning the bound Function object (which is a wrapper around the\n // the original `this`/Function object). We then also have to store\n // a reference to the bound Function object, as `_bound` on the unbound `this`,\n // so the bound function has access to the new bound object.\n // Pro: Works well, doesn't rely on deprecated features.\n // Con: A little convoluted, and requires wrapping `this` in a bound object.\n\n super('...args', 'return this._bound._call(...args)');\n // Or without the spread/rest operator:\n // super('return this._bound._call.apply(this._bound, arguments)')\n this._bound = this.bind(this);\n\n // biome-ignore lint/correctness/noConstructorReturn: <quirks of creating a custom callable>\n return this._bound;\n }\n\n abstract _call(...args: TArgs): TReturn;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type ICallable<TArgs extends [...any[]], TReturn> = (\n ...args: TArgs\n) => TReturn;\n\n// biome-ignore lint/suspicious/noExplicitAny: <generics>\nexport type AsCallable<T, TArgs extends [...any[]], TReturn> = T &\n ICallable<TArgs, TReturn>;\n\nexport default Callable;\n","import type { AnySchema } from 'typed-binary';\nimport type { Parsed } from 'typed-binary';\nimport type { SimpleWgslData } from './data';\nimport type { PlumListener } from './plumStore';\nimport type { WgslSettable } from './settableTrait';\nimport type { AnyWgslData, WgslAllocatable } from './types';\nimport type { BoundWgslCode, WgslCode } from './wgslCode';\nimport type { ExtractPlumValue, Unsubscribe, WgslPlum } from './wgslPlum';\nimport type { WgslSampler } from './wgslSampler';\nimport type {\n WgslAnyTexture,\n WgslAnyTextureView,\n WgslTextureExternal,\n} from './wgslTexture';\n\n// ----------\n// Public API\n// ----------\n\nexport type SetPlumAction<T> = T | ((prev: T) => T);\n\nexport interface TypeGpuRuntime {\n readonly device: GPUDevice;\n /**\n * The current command encoder. This property will\n * hold the same value until `flush()` is called.\n */\n readonly commandEncoder: GPUCommandEncoder;\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ): void;\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe;\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ): void;\n\n readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>>;\n\n bufferFor(allocatable: WgslAllocatable): GPUBuffer;\n textureFor(view: WgslAnyTexture | WgslAnyTextureView): GPUTexture;\n viewFor(view: WgslAnyTextureView): GPUTextureView;\n externalTextureFor(texture: WgslTextureExternal): GPUExternalTexture;\n samplerFor(sampler: WgslSampler): GPUSampler;\n dispose(): void;\n\n /**\n * Causes all commands enqueued by pipelines to be\n * submitted to the GPU.\n */\n flush(): void;\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;\n makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;\n}\n\nexport interface RenderPipelineOptions {\n vertex: {\n code: WgslCode | BoundWgslCode;\n output: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyWgslData;\n };\n };\n fragment: {\n code: WgslCode | BoundWgslCode;\n target: Iterable<GPUColorTargetState | null>;\n };\n primitive: GPUPrimitiveState;\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport interface ComputePipelineOptions {\n code: WgslCode | BoundWgslCode;\n workgroupSize?: readonly [number, number?, number?];\n externalLayouts?: GPUBindGroupLayout[];\n label?: string;\n}\n\nexport type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {\n vertexCount: number;\n instanceCount?: number;\n firstVertex?: number;\n firstInstance?: number;\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface RenderPipelineExecutor {\n execute(options: RenderPipelineExecutorOptions): void;\n}\n\nexport type ComputePipelineExecutorOptions = {\n workgroups?: readonly [number, number?, number?];\n externalBindGroups?: GPUBindGroup[];\n};\n\nexport interface ComputePipelineExecutor {\n execute(options?: ComputePipelineExecutorOptions): void;\n}\n\nconst typeToVertexFormatMap: Record<string, GPUVertexFormat> = {\n f32: 'float32',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n u32: 'uint32',\n vec2u: 'uint32x2',\n vec3u: 'uint32x3',\n vec4u: 'uint32x4',\n i32: 'sint32',\n vec2i: 'sint32x2',\n vec3i: 'sint32x3',\n vec4i: 'sint32x4',\n};\n\nexport function deriveVertexFormat<TData extends SimpleWgslData<AnySchema>>(\n typeSchema: TData,\n): GPUVertexFormat {\n if (!('expressionCode' in typeSchema)) {\n throw new Error(`Type schema must contain a 'code' field`);\n }\n const code = typeSchema.getUnderlyingTypeString();\n\n const vertexFormat = typeToVertexFormatMap[code];\n if (!vertexFormat) {\n throw new Error(`Unknown vertex format for type code: ${code}`);\n }\n return vertexFormat;\n}\n","import type { WgslResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: WgslResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable) {\n let name = this.names.get(item);\n\n if (name === undefined) {\n // creating sanitized name\n let label: string;\n if (item.label) {\n label = item.label.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n name = `${label}_${this.lastUniqueId++}`;\n this.names.set(item, name);\n }\n\n return name;\n }\n}\n\nexport class StrictNameRegistry implements NameRegistry {\n /**\n * Allows to provide a good fallback for instances of the\n * same function that are bound to different slot values.\n */\n private readonly _usedNames = new Set<string>();\n\n private readonly _assignedNames = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable): string {\n const assignedName = this._assignedNames.get(item);\n if (assignedName !== undefined) {\n return assignedName;\n }\n\n if (item.label === undefined) {\n throw new Error('Unnamed item found when using a strict NameRegistry');\n }\n\n let index = 0;\n let unusedName = item.label;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${item.label}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n this._assignedNames.set(item, unusedName);\n return unusedName;\n }\n}\n","import type {\n ResolutionCtx,\n WgslRenderResource,\n WgslSamplerType,\n} from './types';\nimport { WgslIdentifier } from './wgslIdentifier';\n\nexport interface WgslSampler extends WgslRenderResource {\n readonly descriptor: GPUSamplerDescriptor;\n $name(label: string): WgslSampler;\n}\n\nexport function sampler(descriptor: GPUSamplerDescriptor): WgslSampler {\n return new WgslSamplerImpl(descriptor);\n}\n\nclass WgslSamplerImpl implements WgslSampler {\n private _label: string | undefined;\n private _type: WgslSamplerType;\n\n constructor(public readonly descriptor: GPUSamplerDescriptor) {\n if (descriptor.compare === undefined) this._type = 'sampler';\n else this._type = 'sampler_comparison';\n }\n\n get label() {\n return this._label;\n }\n\n get type() {\n return this._type;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addRenderResource(this, identifier);\n\n return ctx.resolve(identifier);\n }\n}\n\nexport function isSampler(\n resource: WgslRenderResource,\n): resource is WgslSampler {\n return resource.type === 'sampler' || resource.type === 'sampler_comparison';\n}\n","import { vec4f, vec4i, vec4u } from './data';\nimport type {\n AnyWgslPrimitive,\n AnyWgslTexelFormat,\n ResolutionCtx,\n SampledTextureParams,\n StorageTextureAccess,\n StorageTextureParams,\n TextureUsage,\n WgslRenderResource,\n WgslRenderResourceType,\n} from './types';\nimport { WgslIdentifier } from './wgslIdentifier';\nimport { isSampler } from './wgslSampler';\n\nexport interface WgslAnyTextureView extends WgslRenderResource {\n readonly descriptor: GPUTextureViewDescriptor;\n readonly texture: WgslAnyTexture;\n readonly dataType: AnyWgslPrimitive | AnyWgslTexelFormat;\n readonly access: StorageTextureAccess | undefined;\n}\n\nexport interface WgslAnyTexture {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get flags(): GPUTextureUsageFlags;\n}\n\nexport interface WgslTexture<TAllows extends TextureUsage = never> {\n readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;\n get label(): string | undefined;\n get flags(): GPUTextureUsageFlags;\n\n $name(label: string): WgslTexture<TAllows>;\n $allowSampled(): WgslTexture<TAllows | 'sampled'>;\n $allowStorage(): WgslTexture<TAllows | 'storage'>;\n\n asStorage(\n params: StorageTextureParams,\n ): 'storage' extends TAllows\n ? WgslTextureView<AnyWgslTexelFormat, 'storage'>\n : null;\n asSampled(\n params: SampledTextureParams,\n ): 'sampled' extends TAllows\n ? WgslTextureView<typeof params.dataType, 'sampled'>\n : null;\n}\n\nexport interface WgslTextureView<\n TData extends AnyWgslPrimitive | AnyWgslTexelFormat,\n TUsage extends TextureUsage,\n> extends WgslRenderResource {\n readonly texture: WgslTexture<TUsage>;\n readonly descriptor: Omit<GPUTextureViewDescriptor, 'usage'>;\n readonly type: WgslRenderResourceType;\n readonly dataType: TData;\n readonly access: StorageTextureAccess | undefined;\n\n $name(label: string): WgslTextureView<TData, TUsage>;\n}\n\nexport interface WgslTextureExternal extends WgslRenderResource {\n readonly descriptor: GPUExternalTextureDescriptor;\n}\n\nexport function texture<TUsage extends TextureUsage = never>(\n descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n): WgslTexture<TUsage> {\n return new WgslTextureImpl(descriptor);\n}\n\nexport function textureExternal(descriptor: GPUExternalTextureDescriptor) {\n return new WgslTextureExternalImpl(descriptor);\n}\n\nclass WgslTextureImpl<TAllows extends TextureUsage = never>\n implements WgslTexture<TAllows>, WgslAnyTexture\n{\n private _flags: GPUTextureUsageFlags =\n GPUTextureUsage.COPY_DST |\n GPUTextureUsage.COPY_SRC |\n GPUTextureUsage.RENDER_ATTACHMENT;\n private _allowedUsages: {\n sampled: Map<string, WgslTextureView<AnyWgslPrimitive, 'sampled'>> | null;\n storage: Map<string, WgslTextureView<AnyWgslTexelFormat, 'storage'>> | null;\n } = {\n sampled: null,\n storage: null,\n };\n private _label: string | undefined;\n\n constructor(\n public readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get flags() {\n return this._flags;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $addFlags(flags: GPUTextureUsageFlags) {\n this._flags |= flags;\n return this;\n }\n\n $allowSampled() {\n const enrichedThis = this as WgslTexture<TAllows | 'sampled'>;\n if (!this._allowedUsages.sampled) {\n this._allowedUsages.sampled = new Map();\n }\n this.$addFlags(GPUTextureUsage.TEXTURE_BINDING);\n return enrichedThis;\n }\n\n $allowStorage() {\n const enrichedThis = this as WgslTexture<TAllows | 'storage'>;\n if (!this._allowedUsages.storage) {\n this._allowedUsages.storage = new Map();\n }\n this.$addFlags(GPUTextureUsage.STORAGE_BINDING);\n return enrichedThis;\n }\n\n private getStorageIfAllowed(\n params: StorageTextureParams,\n ): WgslTextureView<AnyWgslTexelFormat, 'storage'> | null {\n if (!this._allowedUsages.storage) {\n return null;\n }\n const stringified = hashFromShallowObj(params);\n const existing = this._allowedUsages.storage.get(stringified);\n if (existing) {\n return existing;\n }\n const type = texelFormatToWgslType[this.descriptor.format];\n if (!type) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n const view = new WgslTextureViewImpl(\n params.type,\n this,\n type,\n params.descriptor,\n params.access,\n ) as unknown as WgslTextureView<typeof type, 'storage'>;\n this._allowedUsages.storage.set(stringified, view);\n return view;\n }\n\n private getSampledIfAllowed(\n params: SampledTextureParams,\n ): WgslTextureView<AnyWgslPrimitive, 'sampled'> | null {\n if (!this._allowedUsages.sampled) {\n return null;\n }\n const stringified = hashFromShallowObj(params);\n const existing = this._allowedUsages.sampled.get(stringified);\n if (existing) {\n return existing;\n }\n const view = new WgslTextureViewImpl(\n params.type,\n this,\n params.dataType,\n params.descriptor,\n ) as unknown as WgslTextureView<typeof params.dataType, 'sampled'>;\n this._allowedUsages.sampled.set(stringified, view);\n return view;\n }\n\n asStorage(params: StorageTextureParams) {\n const maybeView = this.getStorageIfAllowed(params);\n const maybeType = texelFormatToWgslType[this.descriptor.format];\n if (!maybeType) {\n throw new Error(`Unsupported texture format ${this.descriptor.format}`);\n }\n return maybeView as 'storage' extends TAllows\n ? WgslTextureView<typeof maybeType, 'storage'>\n : null;\n }\n\n asSampled(params: SampledTextureParams) {\n return this.getSampledIfAllowed(params) as 'sampled' extends TAllows\n ? WgslTextureView<typeof params.dataType, 'sampled'>\n : null;\n }\n}\n\nclass WgslTextureViewImpl<\n TData extends AnyWgslPrimitive | AnyWgslTexelFormat,\n TUsage extends TextureUsage,\n> implements WgslTextureView<TData, TUsage>, WgslAnyTextureView\n{\n private _label: string | undefined;\n\n constructor(\n public readonly type: WgslRenderResourceType,\n public readonly texture: WgslTexture<TUsage>,\n public readonly dataType: TData,\n public readonly descriptor: GPUTextureViewDescriptor = {},\n public readonly access: StorageTextureAccess | undefined = undefined,\n ) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addRenderResource(this, identifier);\n\n return ctx.resolve(identifier);\n }\n}\n\nclass WgslTextureExternalImpl implements WgslTextureExternal {\n private _label: string | undefined;\n public readonly type = 'texture_external';\n\n constructor(public readonly descriptor: GPUExternalTextureDescriptor) {}\n\n get label() {\n return this._label;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addRenderResource(this, identifier);\n\n return ctx.resolve(identifier);\n }\n}\n\nexport function isExternalTexture(\n texture: WgslRenderResource,\n): texture is WgslTextureExternal {\n return !('texture' in texture) && !isSampler(texture);\n}\n\nexport function isTextureView(\n texture: WgslRenderResource,\n): texture is WgslAnyTextureView {\n return 'texture' in texture;\n}\n\nconst texelFormatToWgslType: Record<string, AnyWgslTexelFormat> = {\n rgba8unorm: vec4f,\n rgba8snorm: vec4f,\n rgba8uint: vec4u,\n rgba8sint: vec4i,\n rgba16uint: vec4u,\n rgba16sint: vec4i,\n rgba16float: vec4f,\n r32uint: vec4u,\n r32sint: vec4i,\n r32float: vec4f,\n rg32uint: vec4u,\n rg32sint: vec4i,\n rg32float: vec4f,\n rgba32uint: vec4u,\n rgba32sint: vec4i,\n rgba32float: vec4f,\n bgra8unorm: vec4f,\n};\n\nfunction hashFromShallowObj(obj: object): string {\n const withKeysSorted = Object.fromEntries(\n Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n return JSON.stringify(withKeysSorted);\n}\n","import { MissingSlotValueError, ResolutionError } from './errors';\nimport type { NameRegistry } from './nameRegistry';\nimport type {\n BufferUsage,\n Eventual,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslBindable,\n WgslRenderResource,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport {\n isDepthTextureType,\n isExternalTextureType,\n isResolvable,\n isSamplerType,\n isSlot,\n} from './types';\nimport type { Builtin } from './wgslBuiltin';\nimport { code } from './wgslCode';\nimport type { WgslIdentifier } from './wgslIdentifier';\nimport { isTextureView } from './wgslTexture';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n};\n\ntype SlotToValueMap = Map<WgslSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<Exclude<BufferUsage, 'vertex'>, string> = {\n uniform: 'uniform',\n mutable: 'storage, read_write',\n readonly: 'storage, read',\n};\n\nclass SharedResolutionState {\n private readonly _memoizedResolves = new WeakMap<\n // WeakMap because if the resolvable does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n WgslResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private _nextFreeBindingIdx = 0;\n private readonly _usedBindables = new Set<WgslBindable>();\n private readonly _usedRenderResources = new Set<WgslRenderResource>();\n private readonly _resourceToIndexMap = new WeakMap<\n WgslRenderResource | WgslBindable,\n number\n >();\n private readonly _usedBuiltins = new Set<Builtin>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n ) {}\n\n get usedBindables(): Iterable<WgslBindable> {\n return this._usedBindables;\n }\n\n get usedRenderResources(): Iterable<WgslRenderResource> {\n return this._usedRenderResources;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n get usedBuiltins(): Iterable<Builtin> {\n return this._usedBuiltins;\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 * with the `compute` method.\n * @param compute Returns the resolved item and the corresponding bindingMap. This result will be discarded if a sufficient cache entry is found.\n */\n getOrInstantiate(item: WgslResolvable, itemCtx: ScopedResolutionCtx): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) => itemCtx.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 try {\n result = item.resolve(itemCtx);\n } catch (err) {\n if (err instanceof ResolutionError) {\n throw err.appendToTrace(item);\n }\n\n throw new ResolutionError(err, [item]);\n }\n\n // We know which bindables the item used while resolving\n const slotToValueMap = new Map<WgslSlot<unknown>, unknown>();\n for (const usedSlot of itemCtx.usedSlots) {\n slotToValueMap.set(usedSlot, itemCtx.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n }\n\n reserveBindingEntry(bindable: WgslBindable) {\n this._usedBindables.add(bindable);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(bindable, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n registerBindingNoEntry(bindable: WgslBindable) {\n this._usedBindables.add(bindable);\n }\n\n reserveRenderResourceEntry(resource: WgslRenderResource) {\n this._usedRenderResources.add(resource);\n const nextIdx = this._nextFreeBindingIdx++;\n this._resourceToIndexMap.set(resource, nextIdx);\n\n return { group: this._bindingGroup, idx: nextIdx };\n }\n\n getBindingIndex(resource: WgslRenderResource | WgslBindable) {\n return this._resourceToIndexMap.get(resource);\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n\n addBuiltin(builtin: Builtin) {\n this._usedBuiltins.add(builtin);\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\n private readonly _shared: SharedResolutionState;\n\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor({ names, bindingGroup }: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(names, bindingGroup ?? 0);\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n get usedRenderResources() {\n return this._shared.usedRenderResources;\n }\n\n get usedBuiltins() {\n return this._shared.usedBuiltins;\n }\n\n addDeclaration(_declaration: WgslResolvable) {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBinding(_bindable: WgslBindable, _identifier: WgslIdentifier): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addRenderResource(\n resource: WgslRenderResource,\n identifier: WgslIdentifier,\n ): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBuiltin(builtin: Builtin): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n nameFor(item: WgslResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n if (slot.defaultValue === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return slot.defaultValue;\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n const result = this._shared.getOrInstantiate(item, itemCtx);\n\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n\n getIndexFor(item: WgslBindable | WgslRenderResource) {\n const index = this._shared.getBindingIndex(item);\n if (index === undefined) {\n throw new Error('No index found for item');\n }\n return index;\n }\n}\n\nclass ScopedResolutionCtx implements ResolutionCtx {\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor(\n private readonly _parent: ResolutionCtxImpl | ScopedResolutionCtx,\n private readonly _shared: SharedResolutionState,\n private readonly _slotValuePairs: SlotValuePair<unknown>[],\n ) {}\n\n addDeclaration(declaration: WgslResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void {\n if (bindable.usage === 'vertex') {\n this._shared.registerBindingNoEntry(bindable);\n return;\n }\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n addRenderResource(\n resource: WgslRenderResource,\n identifier: WgslIdentifier,\n ): void {\n const { group, idx } = this._shared.reserveRenderResourceEntry(resource);\n\n if (\n isSamplerType(resource.type) ||\n isExternalTextureType(resource.type) ||\n isDepthTextureType(resource.type)\n ) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type};`,\n );\n return;\n }\n\n if (isTextureView(resource)) {\n if (resource.access !== undefined) {\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.texture.descriptor.format}, ${resource.access}>;`,\n );\n return;\n }\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var ${identifier}: ${resource.type}<${resource.dataType}>;`,\n );\n return;\n }\n\n throw new Error(`Unsupported resource type: ${resource.type}`);\n }\n\n addBuiltin(builtin: Builtin): void {\n this._shared.addBuiltin(builtin);\n }\n\n nameFor(token: WgslResolvable): string {\n return this._shared.names.nameFor(token);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n const slotToValuePair = this._slotValuePairs.find(\n ([boundSlot]) => boundSlot === slot,\n ) as SlotValuePair<T> | undefined;\n\n if (!slotToValuePair) {\n // Not yet available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n // Maybe the parent ctx has it.\n return this._parent.readSlot(slot);\n }\n\n // Available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n return slotToValuePair[1];\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeSlot = eventual;\n\n // Unwrapping all layers of slots.\n while (isSlot(maybeSlot)) {\n maybeSlot = this.readSlot(maybeSlot);\n }\n\n return maybeSlot;\n }\n\n resolve(\n item: Wgsl,\n slotValueOverrides: SlotValuePair<unknown>[] = [],\n ): string {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n return this._shared.getOrInstantiate(item, itemCtx);\n }\n}\n","import type { AnySchema } from 'typed-binary';\nimport type { SimpleWgslData } from './data';\nimport { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport type { TypeGpuRuntime } from './typegpuRuntime';\nimport type {\n AnyWgslData,\n BufferUsage,\n WgslBindable,\n WgslResolvable,\n} from './types';\nimport { getUsedBuiltinsNamed } from './wgslBuiltin';\nimport { type BoundWgslCode, type WgslCode, code } from './wgslCode';\nimport { isSampler } from './wgslSampler';\nimport { isExternalTexture, isTextureView } from './wgslTexture';\n\nexport type Program = {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly bindGroup: GPUBindGroup;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nconst usageToBindingTypeMap: Record<\n Exclude<BufferUsage, 'vertex'>,\n GPUBufferBindingType\n> = {\n uniform: 'uniform',\n mutable: 'storage',\n readonly: 'read-only-storage',\n};\n\nexport default class ProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private root: WgslResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.root);\n const usedBindables = Array.from(ctx.usedBindables);\n const usedRenderResources = Array.from(ctx.usedRenderResources);\n const usedSamplers = usedRenderResources.filter(isSampler);\n const usedTextures = usedRenderResources.filter(isTextureView);\n const usedExternalTextures = usedRenderResources.filter(isExternalTexture);\n\n const allEntries: GPUBindGroupLayoutEntry[] = [];\n for (const textureView of usedTextures) {\n if (textureView.access === undefined) {\n allEntries.push({\n binding: ctx.getIndexFor(textureView),\n visibility: options.shaderStage,\n texture: {},\n });\n } else {\n allEntries.push({\n binding: ctx.getIndexFor(textureView),\n visibility: options.shaderStage,\n storageTexture: { format: textureView.texture.descriptor.format },\n });\n }\n }\n for (const external of usedExternalTextures) {\n allEntries.push({\n binding: ctx.getIndexFor(external),\n visibility: options.shaderStage,\n externalTexture: {},\n });\n }\n for (const sampler of usedSamplers) {\n allEntries.push({\n binding: ctx.getIndexFor(sampler),\n visibility: options.shaderStage,\n sampler: {},\n });\n }\n for (const bindable of usedBindables) {\n if (bindable.usage === 'vertex') continue;\n allEntries.push({\n binding: ctx.getIndexFor(bindable),\n visibility: options.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[bindable.usage],\n },\n });\n }\n\n const allBindGroupEntries: GPUBindGroupEntry[] = [];\n for (const texture of usedTextures) {\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(texture),\n resource: this.runtime.viewFor(texture),\n });\n }\n for (const externalTexture of usedExternalTextures) {\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(externalTexture),\n resource: this.runtime.externalTextureFor(externalTexture),\n });\n }\n for (const sampler of usedSamplers) {\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(sampler),\n resource: this.runtime.samplerFor(sampler),\n });\n }\n for (const bindable of usedBindables) {\n if (bindable.usage === 'vertex') continue;\n allBindGroupEntries.push({\n binding: ctx.getIndexFor(bindable),\n resource: {\n buffer: this.runtime.bufferFor(bindable.allocatable),\n },\n });\n }\n\n const bindGroupLayout = this.runtime.device.createBindGroupLayout({\n entries: allEntries,\n });\n\n const bindGroup = this.runtime.device.createBindGroup({\n layout: bindGroupLayout,\n entries: allBindGroupEntries,\n });\n\n return {\n bindGroupLayout,\n bindGroup,\n code: codeString,\n };\n }\n}\n\nexport class RenderProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private vertexRoot: WgslCode | BoundWgslCode,\n private fragmentRoot: WgslCode | BoundWgslCode,\n private vertexOutputFormat: {\n [K in symbol]: string;\n } & {\n [K in string]: AnyWgslData;\n },\n ) {}\n\n build(\n options: Omit<BuildOptions, 'shaderStage'>,\n ): [Program, Program, WgslBindable<AnyWgslData, 'vertex'>[]] {\n const symbolOutputs = Object.getOwnPropertySymbols(\n this.vertexOutputFormat,\n ).map((symbol) => {\n const name = this.vertexOutputFormat[symbol];\n if (typeof name !== 'string') {\n throw new Error('Output names must be strings.');\n }\n return { symbol, name };\n });\n const symbolRecord: Record<symbol, string> = Object.fromEntries(\n symbolOutputs.map(({ symbol, name }) => [symbol, name]),\n );\n\n const vertexOutputBuiltins = getUsedBuiltinsNamed(symbolRecord);\n const outputVars = Object.keys(this.vertexOutputFormat);\n const vertexOutput = outputVars.map((name, index) => {\n const varInfo = this.vertexOutputFormat[name];\n if (!varInfo) {\n throw new Error('Output names must be strings.');\n }\n return { name, varInfo, index };\n });\n\n const structFields = [\n ...vertexOutputBuiltins.map(\n (entry) =>\n code`\n @builtin(${entry.builtin.name}) ${entry.name}: ${entry.builtin.type},\n `,\n ),\n ...vertexOutput.map(\n ({ name, varInfo, index }) =>\n code`\n @location(${index}) ${name}: ${varInfo},\n `,\n ),\n ];\n\n const vertexContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n vertexContext.resolve(this.vertexRoot);\n const vertexBuffers = Array.from(vertexContext.usedBindables).filter(\n (bindable) => bindable.usage === 'vertex',\n ) as WgslBindable<AnyWgslData, 'vertex'>[];\n const entries = vertexBuffers.map((elem) => {\n return {\n bindable: elem,\n underlyingType: elem.allocatable.dataType as SimpleWgslData<AnySchema>,\n };\n });\n\n const vertexUserArgs = entries.map(\n (entry, idx) => code`\n @location(${idx}) ${entry.bindable} : ${entry.underlyingType.getUnderlyingTypeString()},\n `,\n );\n const vertexBuiltins = Array.from(vertexContext.usedBuiltins);\n const vertexBuiltinsArgs = vertexBuiltins.map(\n (builtin) => code`\n @builtin(${builtin.name}) ${builtin.identifier}: ${builtin.type},\n `,\n );\n const vertexArgs = [...vertexBuiltinsArgs, ...vertexUserArgs];\n\n const vertexCode = code`\n struct VertexOutput {\n ${structFields}\n };\n\n @vertex\n fn main(${vertexArgs}) -> VertexOutput {\n ${this.vertexRoot}\n var output: VertexOutput;\n ${vertexOutputBuiltins.map(\n (entry) =>\n code`\n output.${entry.name} = ${entry.name};\n `,\n )}\n ${vertexOutput.map(\n ({ name }) =>\n code`\n output.${name} = ${name};\n `,\n )}\n return output;\n }\n `;\n const fragmentContext = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n fragmentContext.resolve(this.fragmentRoot);\n\n const fragmentUsedBuiltins = Array.from(fragmentContext.usedBuiltins);\n const fragmentBuiltinArgs = fragmentUsedBuiltins.map(\n (builtin) => code`\n @builtin(${builtin.name}) ${builtin.identifier}: ${builtin.type},\n `,\n );\n\n const fragmentInputs = vertexOutput.map(\n ({ name, varInfo }, idx) => code`\n @location(${idx}) ${name}: ${varInfo},\n `,\n );\n const fragmentArgs = [...fragmentBuiltinArgs, ...fragmentInputs];\n const fragmentCode = code`\n @fragment\n fn main(${fragmentArgs}) -> @location(0) vec4f {\n ${this.fragmentRoot}\n }\n `;\n\n const vertexProgram = new ProgramBuilder(this.runtime, vertexCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.VERTEX,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n const fragmentProgram = new ProgramBuilder(\n this.runtime,\n fragmentCode,\n ).build({\n bindingGroup: options.bindingGroup + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n return [vertexProgram, fragmentProgram, vertexBuffers];\n }\n}\n\nexport class ComputeProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private computeRoot: WgslCode | BoundWgslCode,\n private workgroupSize: readonly [\n number,\n (number | null)?,\n (number | null)?,\n ],\n ) {}\n\n build(options: Omit<BuildOptions, 'shaderStage'>): Program {\n const context = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n context.resolve(this.computeRoot);\n\n const usedBuiltins = Array.from(context.usedBuiltins);\n const builtinArgs = usedBuiltins.map(\n (builtin) => code`\n @builtin(${builtin.name}) ${builtin.identifier}: ${builtin.type},\n `,\n );\n\n const workgroupSizeDeclaration = `@workgroup_size(${this.workgroupSize[0]}, ${this.workgroupSize[1] ?? 1}, ${this.workgroupSize[2] ?? 1})`;\n\n const shaderCode = code`\n @compute ${workgroupSizeDeclaration}\n fn main(${builtinArgs}) {\n ${this.computeRoot}\n }\n `;\n\n const program = new ProgramBuilder(this.runtime, shaderCode).build({\n bindingGroup: options.bindingGroup,\n shaderStage: GPUShaderStage.COMPUTE,\n nameRegistry: options.nameRegistry ?? new RandomNameRegistry(),\n });\n\n return program;\n }\n}\n","import type {\n AnyWgslData,\n BufferUsage,\n ResolutionCtx,\n WgslBindable,\n} from './types';\nimport type { WgslBuffer } from './wgslBuffer';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslBufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = BufferUsage,\n> extends WgslBindable<TData, TUsage> {\n $name(label: string): WgslBufferUsage<TData, TUsage>;\n}\n\nexport function bufferUsage<\n TData extends AnyWgslData,\n TUsage extends BufferUsage,\n>(\n buffer: WgslBuffer<TData, TUsage>,\n usage: TUsage,\n): WgslBufferUsage<TData, TUsage> {\n return new WgslBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferUsageImpl<TData extends AnyWgslData, TUsage extends BufferUsage>\n implements WgslBufferUsage<TData, TUsage>\n{\n private _label: string | undefined;\n\n constructor(\n public readonly buffer: WgslBuffer<TData, TUsage>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this._label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n $name(label: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier();\n\n ctx.addBinding(this, identifier);\n\n return ctx.resolve(identifier);\n }\n\n toString(): string {\n return `${this.usage}:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { AnySchema, Parsed } from 'typed-binary';\nimport { SimpleWgslData } from './data';\nimport type { AnyWgslData, BufferUsage, WgslAllocatable } from './types';\nimport { type WgslBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { WgslPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\ntype UsageGuard<\n TUsage extends BufferUsage,\n TData extends AnyWgslData,\n TAllows,\n> = TUsage extends TAllows ? WgslBufferUsage<TData, TUsage> : null;\n\nexport interface WgslBuffer<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> extends WgslAllocatable<TData> {\n $name(label: string): WgslBuffer<TData, TAllows>;\n $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;\n $allowReadonly(): WgslBuffer<TData, TAllows | 'readonly'>;\n $allowMutable(): WgslBuffer<TData, TAllows | 'mutable'>;\n $allowVertex(\n stepMode: 'vertex' | 'instance',\n ): WgslBuffer<TData, TAllows | 'vertex'>;\n $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;\n\n asUniform(): UsageGuard<'uniform', TData, TAllows>;\n asMutable(): UsageGuard<'mutable', TData, TAllows>;\n asReadonly(): UsageGuard<'readonly', TData, TAllows>;\n asVertex(): UsageGuard<'vertex', TData, TAllows>;\n}\n\nexport function buffer<\n TData extends AnyWgslData,\n TUsage extends BufferUsage = never,\n>(\n typeSchema: TData,\n initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined,\n): WgslBuffer<TData, TUsage> {\n return new WgslBufferImpl<TData, TUsage>(typeSchema, initial);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslBufferImpl<\n TData extends AnyWgslData,\n TAllows extends BufferUsage = never,\n> implements WgslBuffer<TData, TAllows>\n{\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n\n public vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'> | null = null;\n private _allowedUsages: {\n uniform: WgslBufferUsage<TData, TAllows | 'uniform'> | null;\n mutable: WgslBufferUsage<TData, TAllows | 'mutable'> | null;\n readonly: WgslBufferUsage<TData, TAllows | 'readonly'> | null;\n vertex: WgslBufferUsage<TData, TAllows | 'vertex'> | null;\n } = {\n uniform: null,\n mutable: null,\n readonly: null,\n vertex: null,\n };\n\n private _label: string | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>>,\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 $allowUniform() {\n this.$addFlags(GPUBufferUsage.UNIFORM);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'uniform'>;\n if (!this._allowedUsages.uniform) {\n this._allowedUsages.uniform = bufferUsage(enrichedThis, 'uniform');\n }\n\n return enrichedThis;\n }\n\n $allowReadonly() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'readonly'>;\n if (!this._allowedUsages.readonly) {\n this._allowedUsages.readonly = bufferUsage(enrichedThis, 'readonly');\n }\n\n return enrichedThis;\n }\n\n $allowMutable() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'mutable'>;\n if (!this._allowedUsages.mutable) {\n this._allowedUsages.mutable = bufferUsage(enrichedThis, 'mutable');\n }\n\n return enrichedThis;\n }\n\n $allowVertex(stepMode: 'vertex' | 'instance' = 'vertex') {\n this.$addFlags(GPUBufferUsage.VERTEX);\n\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'vertex'>;\n if (!this.vertexLayout) {\n if (!(this.dataType instanceof SimpleWgslData)) {\n throw new Error('Only simple data types can be used as vertex buffers');\n }\n\n let underlyingThis = this.dataType as SimpleWgslData<AnySchema>;\n underlyingThis = underlyingThis.getUnderlyingType();\n this.vertexLayout = {\n arrayStride: underlyingThis.size,\n stepMode,\n };\n\n this._allowedUsages.vertex = bufferUsage(enrichedThis, 'vertex');\n }\n\n if (this.vertexLayout.stepMode !== stepMode) {\n throw new Error('Cannot change step mode of a vertex buffer');\n }\n\n return enrichedThis;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n asUniform() {\n return this._allowedUsages.uniform as UsageGuard<'uniform', TData, TAllows>;\n }\n\n asMutable() {\n return this._allowedUsages.mutable as UsageGuard<'mutable', TData, TAllows>;\n }\n\n asReadonly() {\n return this._allowedUsages.readonly as UsageGuard<\n 'readonly',\n TData,\n TAllows\n >;\n }\n\n asVertex() {\n return this._allowedUsages.vertex as UsageGuard<'vertex', TData, TAllows>;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslConst extends WgslResolvable {\n $name(label: string): WgslConst;\n}\n\n/**\n * Creates a constant is computed at shader initialization according\n * to the passed in expression.\n */\nexport function constant(expr: Wgsl): WgslConst {\n return new WgslConstImpl(expr);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslConstImpl implements WgslConst {\n private _label: string | undefined;\n\n constructor(private readonly expr: Wgsl) {}\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 identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`const ${identifier} = ${this.expr};`);\n\n return ctx.resolve(identifier);\n }\n}\n","import type {\n InlineResolve,\n ResolutionCtx,\n Wgsl,\n WgslResolvable,\n} from './types';\nimport { code } from './wgslCode';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslDeclare extends WgslResolvable {}\n\nexport function declare(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): WgslDeclare {\n return new WgslDeclareImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslDeclareImpl implements WgslDeclare {\n constructor(private readonly _declaration: Wgsl) {}\n\n resolve(ctx: ResolutionCtx): string {\n ctx.addDeclaration(code`${this._declaration}`);\n return '';\n }\n}\n","import type {\n Eventual,\n InlineResolve,\n ResolutionCtx,\n SlotValuePair,\n Wgsl,\n WgslResolvable,\n WgslSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn extends WgslResolvable {\n $name(label: string): WgslFn;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;\n}\n\nexport type BoundWgslFn = Omit<WgslFn, '$name'>;\n\nexport function fn(\n strings: TemplateStringsArray,\n ...params: (Wgsl | InlineResolve)[]\n): WgslFn {\n return new WgslFnImpl(code(strings, ...params));\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslFnImpl implements WgslFn {\n private _label: string | undefined;\n\n constructor(private readonly body: Wgsl) {}\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 identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`fn ${identifier}${this.body}`.$name(this._label));\n\n return ctx.resolve(identifier);\n }\n\n with<T>(slot: WgslSlot<T>, value: T): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `fn:${this.label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslFnImpl<T> implements BoundWgslFn {\n constructor(\n private readonly _innerFn: BoundWgslFn,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslFn {\n return new BoundWgslFnImpl(this, [slot, value]);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this._innerFn, [this._slotValuePair]);\n }\n\n toString(): string {\n const [slot, value] = this._slotValuePair;\n return `fn:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import Callable, { type AsCallable } from './callable';\nimport { isPointer } from './types';\nimport type {\n AnyWgslData,\n ResolutionCtx,\n Wgsl,\n WgslFnArgument,\n WgslResolvable,\n WgslValue,\n} from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslFn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> extends WgslResolvable,\n Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n > {}\n\nexport function fn<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n>(argTypes: TArgTypes, returnType?: TReturn) {\n const argPairs = argTypes.map(\n (argType) => [new WgslIdentifier(), argType] as const,\n ) as PairsFromTypes<TArgTypes>;\n\n const argValues = argPairs.map(\n ([argIdent, argType]) =>\n argIdent as WgslValue<typeof argType> & WgslIdentifier,\n );\n\n type TArgValues = ValuesFromTypes<TArgTypes>;\n return (bodyProducer: (...args: TArgValues) => Wgsl) => {\n const body = bodyProducer(...(argValues as TArgValues));\n\n const fnInstance = new WgslFnImpl<TArgTypes, TReturn>(\n argPairs,\n returnType,\n body,\n );\n\n return fnInstance as AsCallable<\n typeof fnInstance,\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes>\n >;\n };\n}\n\n// --------------\n// Implementation\n// --------------\n\ntype ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;\n};\n\ntype PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];\n};\n\ntype SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {\n [K in keyof TArgTypes]: Wgsl;\n};\n\nclass WgslFunctionCall<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n TReturn extends AnyWgslData | undefined = undefined,\n> implements WgslResolvable\n{\n constructor(\n private usedFn: WgslFn<TArgTypes, TReturn>,\n private readonly args: SegmentsFromTypes<TArgTypes>,\n ) {}\n\n resolve(ctx: ResolutionCtx): string {\n const argsCode = this.args.map((argSegment, idx) => {\n const comma = idx < this.args.length - 1 ? ', ' : '';\n return code`${argSegment}${comma}`;\n });\n\n return ctx.resolve(code`${this.usedFn}(${argsCode})`.$name('internal'));\n }\n\n toString(): string {\n return `fun:${this.usedFn.label ?? '<unnamed>'}()`;\n }\n}\n\nclass WgslFnImpl<\n TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [],\n // TArgPairs extends (readonly [WgslIdentifier, WgslFnArgument])[],\n TReturn extends AnyWgslData | undefined = undefined,\n >\n extends Callable<\n SegmentsFromTypes<TArgTypes>,\n WgslFunctionCall<TArgTypes, TReturn>\n >\n implements WgslFn<TArgTypes, TReturn>\n{\n private _label: string | undefined;\n\n constructor(\n private argPairs: PairsFromTypes<TArgTypes>,\n private returnType: TReturn | undefined,\n private readonly body: Wgsl,\n ) {\n super();\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 identifier = new WgslIdentifier().$name(this._label);\n\n const argsCode = this.argPairs.map(([ident, argType], idx) => {\n const comma = idx < this.argPairs.length - 1 ? ', ' : '';\n\n if (isPointer(argType)) {\n return code`${ident}: ptr<${argType.scope}, ${argType.pointsTo}>${comma}`;\n }\n\n return code`${ident}: ${argType}${comma}`;\n });\n\n if (this.returnType !== undefined) {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) -> ${this.returnType} {\n ${this.body}\n }`);\n } else {\n ctx.addDeclaration(code`fn ${identifier}(${argsCode}) {\n ${this.body}\n }`);\n }\n\n return ctx.resolve(identifier);\n }\n\n _call(\n ...args: SegmentsFromTypes<TArgTypes>\n ): WgslFunctionCall<TArgTypes, TReturn> {\n return new WgslFunctionCall(this, args);\n }\n\n toString(): string {\n return `fun:${this._label ?? '<unnamed>'}`;\n }\n}\n","export const WgslSettableTrait = Symbol(\n 'This item can be set, owns its value (does not get value from an external source)',\n);\n\nexport interface WgslSettable {\n readonly [WgslSettableTrait]: true;\n}\n\nexport function isSettable(\n value: WgslSettable | unknown,\n): value is WgslSettable {\n return (value as WgslSettable)[WgslSettableTrait] === true;\n}\n","import { type WgslSettable, WgslSettableTrait } from './settableTrait';\nimport type { Wgsl, WgslResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport type Getter = <T>(plum: WgslPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends WgslPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface WgslPlum<TValue = unknown> {\n readonly __brand: 'WgslPlum';\n\n $name(label: string): this;\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const WgslExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\nexport interface WgslExternalPlum {\n readonly [WgslExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | WgslExternalPlum,\n): value is WgslExternalPlum {\n return (value as WgslExternalPlum)[WgslExternalPlumTrait] === true;\n}\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T extends Wgsl>(\n compute: (get: Getter) => T,\n): WgslPlum<T> & WgslResolvable;\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T>(compute: (get: Getter) => T): WgslPlum<T>;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T extends Wgsl>(\n initial: T,\n): WgslPlum<T> & WgslSettable & WgslResolvable;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T>(initial: T): WgslPlum<T> & WgslSettable;\n\nexport function plum<T>(\n initialOrCompute: T | ((get: Getter) => T),\n): WgslPlum<T> | (WgslPlum<T> & WgslSettable) {\n if (typeof initialOrCompute === 'function') {\n return new WgslDerivedPlumImpl(initialOrCompute as (get: Getter) => T);\n }\n\n return new WgslSourcePlumImpl(initialOrCompute);\n}\n\nexport function plumFromEvent<T>(\n subscribe: (listener: () => unknown) => Unsubscribe,\n getLatest: () => T,\n): WgslPlum<T> & WgslExternalPlum {\n return new WgslExternalPlumImpl(subscribe, getLatest);\n}\n\nexport function isPlum<T>(value: WgslPlum<T> | unknown): value is WgslPlum<T> {\n return (value as WgslPlum).__brand === 'WgslPlum';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSourcePlumImpl<TValue> implements WgslPlum<TValue>, WgslSettable {\n readonly __brand = 'WgslPlum';\n readonly [WgslSettableTrait] = true;\n\n private _label: string | undefined;\n\n constructor(private readonly _initial: TValue) {}\n\n compute(_get: Getter) {\n return this._initial;\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslDerivedPlumImpl<TValue> implements WgslPlum<TValue> {\n readonly __brand = 'WgslPlum';\n private _label: string | undefined;\n\n constructor(private readonly _compute: (get: Getter) => TValue) {}\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n compute(get: Getter): TValue {\n return this._compute(get);\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslExternalPlumImpl<TValue>\n implements WgslPlum<TValue>, WgslExternalPlum\n{\n readonly __brand = 'WgslPlum';\n readonly [WgslExternalPlumTrait] = true;\n\n private _label: string | undefined;\n private _prev: TValue;\n private _version = 0;\n\n constructor(\n private readonly _subscribe: (listener: () => unknown) => Unsubscribe,\n private readonly _getLatest: () => TValue,\n ) {\n this._prev = _getLatest();\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get version(): number {\n return this._version;\n }\n\n subscribe(listener: () => unknown): Unsubscribe {\n return this._subscribe(listener);\n }\n\n compute(): TValue {\n const latest = this._getLatest();\n\n if (!Object.is(latest, this._prev)) {\n this._version++;\n this._prev = latest;\n }\n\n return this._prev;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n","import {\n type ResolutionCtx,\n type Wgsl,\n type WgslResolvable,\n type WgslResolvableSlot,\n type WgslSlot,\n isWgsl,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T>;\n\nexport function slot<T>(defaultValue?: T): WgslSlot<T> {\n return new WgslSlotImpl(defaultValue);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSlotImpl<T> implements WgslResolvable, WgslSlot<T> {\n readonly __brand = 'WgslSlot';\n public label?: string | undefined;\n\n constructor(public defaultValue: T | undefined = undefined) {}\n\n public $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 resolve(ctx: ResolutionCtx): string {\n const value = ctx.unwrap(this);\n\n if (!isWgsl(value)) {\n throw new Error(\n `Cannot inject value of type ${typeof value} of slot '${this.label ?? '<unnamed>'}' in code.`,\n );\n }\n\n return ctx.resolve(value);\n }\n\n toString(): string {\n return `slot:${this.label ?? '<unnamed>'}`;\n }\n}\n","import type { AnyWgslData, ResolutionCtx, Wgsl, WgslResolvable } from './types';\nimport { code } from './wgslCode';\nimport { WgslIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport type VariableScope = 'private' | 'workgroup';\n\nexport interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {\n $name(label: string): WgslVar<TDataType>;\n}\n\n/**\n * Creates a variable, with an optional initial value.\n */\nexport const variable = <TDataType extends AnyWgslData>(\n dataType: TDataType,\n initialValue?: Wgsl,\n scope: VariableScope = 'private',\n): WgslVar<TDataType> => new WgslVarImpl(dataType, initialValue, scope);\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslVarImpl<TDataType extends AnyWgslData> implements WgslVar<TDataType> {\n public identifier = new WgslIdentifier();\n\n constructor(\n private readonly _dataType: TDataType,\n private readonly _initialValue: Wgsl | undefined,\n public readonly scope: VariableScope,\n ) {}\n\n $name(label: string) {\n this.identifier.$name(label);\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n if (this._initialValue) {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`,\n );\n } else {\n ctx.addDeclaration(\n code`var<${this.scope}> ${this.identifier}: ${this._dataType};`,\n );\n }\n\n return ctx.resolve(this.identifier);\n }\n}\n","import { buffer } from './wgslBuffer';\nimport { builtin } from './wgslBuiltin';\nimport { code } from './wgslCode';\nimport { constant } from './wgslConstant';\nimport { declare } from './wgslDeclare';\nimport { fn } from './wgslFunction';\nimport { fn as fun } from './wgslFunctionExperimental';\nimport { plum, plumFromEvent } from './wgslPlum';\nimport { sampler } from './wgslSampler';\nimport { slot } from './wgslSlot';\nimport { texture, textureExternal } from './wgslTexture';\nimport { variable } from './wgslVariable';\n\nexport default Object.assign(code, {\n code,\n fn,\n fun,\n buffer,\n plum,\n plumFromEvent,\n slot,\n constant,\n declare,\n var: variable,\n sampler,\n texture,\n textureExternal,\n builtin,\n});\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { SimpleWgslData } from './data';\nimport { roundUp } from './mathUtils';\nimport { type PlumListener, PlumStore } from './plumStore';\nimport {\n ComputeProgramBuilder,\n type Program,\n RenderProgramBuilder,\n} from './programBuilder';\nimport type { WgslSettable } from './settableTrait';\nimport { TaskQueue } from './taskQueue';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n SetPlumAction,\n TypeGpuRuntime,\n} from './typegpuRuntime';\nimport { deriveVertexFormat } from './typegpuRuntime';\nimport type { AnyWgslData, WgslAllocatable } from './types';\nimport {\n type ExtractPlumValue,\n type Unsubscribe,\n type WgslPlum,\n isPlum,\n} from './wgslPlum';\nimport type { WgslSampler } from './wgslSampler';\nimport type {\n WgslAnyTexture,\n WgslAnyTextureView,\n WgslTextureExternal,\n} from './wgslTexture';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a runtime can interact via GPU buffers.\n */\nclass TypeGpuRuntimeImpl {\n private _entryToBufferMap = new Map<WgslAllocatable, GPUBuffer>();\n private _samplers = new WeakMap<WgslSampler, GPUSampler>();\n private _textures = new WeakMap<WgslAnyTexture, GPUTexture>();\n private _textureViews = new WeakMap<WgslAnyTextureView, GPUTextureView>();\n private _pipelineExecutors: PipelineExecutor<\n GPURenderPipeline | GPUComputePipeline\n >[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n // Used for reading GPU buffers ad hoc.\n private _readBuffer: GPUBuffer | null = null;\n private _taskQueue = new TaskQueue();\n private readonly _plumStore = new PlumStore();\n private readonly _allocSubscriptions = new Map<\n WgslAllocatable,\n Unsubscribe\n >();\n\n constructor(public readonly device: GPUDevice) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n dispose() {\n for (const unsub of this._allocSubscriptions.values()) {\n unsub();\n }\n this._allocSubscriptions.clear();\n\n for (const buffer of this._entryToBufferMap.values()) {\n buffer.destroy();\n }\n\n this._entryToBufferMap.clear();\n\n this._readBuffer?.destroy();\n }\n\n bufferFor(allocatable: WgslAllocatable) {\n let buffer = this._entryToBufferMap.get(allocatable);\n\n if (!buffer) {\n buffer = this.device.createBuffer({\n usage: allocatable.flags,\n size: roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n ),\n mappedAtCreation: allocatable.initial !== undefined,\n });\n\n if (!buffer) {\n throw new Error(`Failed to create buffer for ${allocatable}`);\n }\n\n if (allocatable.initial !== undefined) {\n const writer = new BufferWriter(buffer.getMappedRange());\n\n if (isPlum(allocatable.initial)) {\n const plum = allocatable.initial;\n\n allocatable.dataType.write(writer, this._plumStore.get(plum));\n\n this._allocSubscriptions.set(\n allocatable,\n this._plumStore.subscribe(plum, () => {\n this.writeBuffer(allocatable, this._plumStore.get(plum));\n }),\n );\n } else {\n allocatable.dataType.write(writer, allocatable.initial);\n }\n\n buffer.unmap();\n }\n\n this._entryToBufferMap.set(allocatable, buffer);\n }\n\n return buffer;\n }\n\n textureFor(view: WgslAnyTexture | WgslAnyTextureView): GPUTexture {\n let source: WgslAnyTexture;\n if ('texture' in view) {\n source = view.texture;\n } else {\n source = view;\n }\n\n let texture = this._textures.get(source);\n\n if (!texture) {\n const descriptor = {\n ...source.descriptor,\n usage: source.flags,\n } as GPUTextureDescriptor;\n texture = this.device.createTexture(descriptor);\n\n if (!texture) {\n throw new Error(`Failed to create texture for ${view}`);\n }\n this._textures.set(source, texture);\n }\n\n return texture;\n }\n\n viewFor(view: WgslAnyTextureView): GPUTextureView {\n let textureView = this._textureViews.get(view);\n if (!textureView) {\n textureView = this.textureFor(view.texture).createView(view.descriptor);\n this._textureViews.set(view, textureView);\n }\n return textureView;\n }\n\n externalTextureFor(texture: WgslTextureExternal): GPUExternalTexture {\n return this.device.importExternalTexture(texture.descriptor);\n }\n\n samplerFor(sampler: WgslSampler): GPUSampler {\n let gpuSampler = this._samplers.get(sampler);\n\n if (!gpuSampler) {\n gpuSampler = this.device.createSampler(sampler.descriptor);\n\n if (!gpuSampler) {\n throw new Error(`Failed to create sampler for ${sampler}`);\n }\n this._samplers.set(sampler, gpuSampler);\n }\n\n return gpuSampler;\n }\n\n async readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>> {\n return this._taskQueue.enqueue(async () => {\n // Flushing any commands to be encoded.\n this.flush();\n\n if (\n !this._readBuffer ||\n this._readBuffer.size < allocatable.dataType.size\n ) {\n // destroying the previous buffer\n this._readBuffer?.destroy();\n\n this._readBuffer = this.device.createBuffer({\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n size: allocatable.dataType.size,\n });\n }\n\n const buffer = this.bufferFor(allocatable);\n const commandEncoder = this.device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n buffer,\n 0,\n this._readBuffer,\n 0,\n allocatable.dataType.size,\n );\n\n this.device.queue.submit([commandEncoder.finish()]);\n await this.device.queue.onSubmittedWorkDone();\n await this._readBuffer.mapAsync(\n GPUMapMode.READ,\n 0,\n allocatable.dataType.size,\n );\n\n const res = allocatable.dataType.read(\n new BufferReader(this._readBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n this._readBuffer.unmap();\n\n return res;\n });\n }\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ) {\n const gpuBuffer = this.bufferFor(allocatable);\n\n const size = roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n );\n\n const hostBuffer = new ArrayBuffer(size);\n allocatable.dataType.write(new BufferWriter(hostBuffer), data);\n this.device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: SetPlumAction<ExtractPlumValue<TPlum>>,\n ) {\n type Value = ExtractPlumValue<TPlum>;\n\n if (typeof value === 'function') {\n const compute = value as (prev: Value) => Value;\n this._plumStore.set(plum, compute(this._plumStore.get(plum)));\n } else {\n this._plumStore.set(plum, value);\n }\n }\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: PlumListener<TValue>,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const [vertexProgram, fragmentProgram, vertexBuffers] =\n new RenderProgramBuilder(\n this,\n options.vertex.code,\n options.fragment.code,\n options.vertex.output,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n });\n\n const vertexBufferDescriptors = vertexBuffers.map((buffer, idx) => {\n if (!buffer.allocatable.vertexLayout) {\n throw new Error(\n `Buffer ${buffer.allocatable} does not have a vertex layout`,\n );\n }\n return {\n ...buffer.allocatable.vertexLayout,\n attributes: [\n {\n shaderLocation: idx,\n offset: 0,\n format: deriveVertexFormat(\n buffer.allocatable.dataType as SimpleWgslData<AnyWgslData>,\n ),\n },\n ],\n };\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupLayout,\n fragmentProgram.bindGroupLayout,\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers: vertexBufferDescriptors,\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment?.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const buffers = vertexBuffers.map(\n (buffer, idx) => [this.bufferFor(buffer.allocatable), idx] as const,\n );\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n vertexProgram,\n fragmentProgram,\n options.externalLayouts?.length ?? 0,\n buffers,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const program = new ComputeProgramBuilder(\n this,\n options.code,\n options.workgroupSize ?? [1],\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n });\n\n const shaderModule = this.device.createShaderModule({\n code: program.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n program.bindGroupLayout,\n ],\n });\n\n const computePipeline = this.device.createComputePipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n },\n });\n\n const executor = new ComputePipelineExecutor(\n this,\n computePipeline,\n [program],\n options.externalLayouts?.length ?? 0,\n );\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n flush() {\n if (!this._commandEncoder) {\n return;\n }\n\n this.device.queue.submit([this._commandEncoder.finish()]);\n this._commandEncoder = null;\n }\n}\n\nclass PipelineExecutor<T extends GPURenderPipeline | GPUComputePipeline> {\n constructor(\n protected _runtime: TypeGpuRuntime,\n public pipeline: T,\n public programs: Program[],\n public externalLayoutCount: number,\n protected label?: string,\n ) {}\n}\n\nclass RenderPipelineExecutor extends PipelineExecutor<GPURenderPipeline> {\n private _vertexProgram: Program;\n private _fragmentProgram: Program;\n private _usedVertexBuffers: Set<readonly [GPUBuffer, number]>;\n\n constructor(\n runtime: TypeGpuRuntime,\n pipeline: GPURenderPipeline,\n vertexProgram: Program,\n fragmentProgram: Program,\n externalLayoutCount: number,\n usedVertexBuffers: (readonly [GPUBuffer, number])[],\n ) {\n super(\n runtime,\n pipeline,\n [vertexProgram, fragmentProgram],\n externalLayoutCount,\n );\n this._vertexProgram = vertexProgram;\n this._fragmentProgram = fragmentProgram;\n this._usedVertexBuffers = new Set(usedVertexBuffers);\n }\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length,\n this._vertexProgram.bindGroup,\n );\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + 1,\n this._fragmentProgram.bindGroup,\n );\n\n for (const [buffer, index] of this._usedVertexBuffers) {\n passEncoder.setVertexBuffer(index, buffer);\n }\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor extends PipelineExecutor<GPUComputePipeline> {\n execute(options?: ComputePipelineExecutorOptions) {\n const { workgroups = [1, 1], externalBindGroups } = options ?? {};\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginComputePass({\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n this.programs.forEach((program, i) =>\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link createRuntime}.\n */\nexport type CreateRuntimeOptions = {\n adapter: GPURequestAdapterOptions | undefined;\n device: GPUDeviceDescriptor | undefined;\n};\n\n/**\n * @param options\n * @returns\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * createRuntime();\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 * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n *\n * @example\n * If a specific device should be used instead, it can be passed in as a parameter.\n * ```ts\n * const device: GPUDevice = ...;\n * createRuntime(device);\n * ```\n */\nexport async function createRuntime(\n options?: CreateRuntimeOptions | GPUDevice,\n): Promise<TypeGpuRuntime> {\n if (options instanceof GPUDevice) {\n return new TypeGpuRuntimeImpl(options);\n }\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(options?.adapter);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new TypeGpuRuntimeImpl(await adapter.requestDevice(options?.device));\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import type { WgslSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type WgslPlum,\n isExternalPlum,\n} from './wgslPlum';\n\nexport type PlumListener<T> = (newValue: T) => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<WgslPlum, number>;\n active?: PlumActiveState<T> | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState<T> = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<PlumListener<T>>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<WgslPlum, PlumState>();\n\n /**\n * Used to inspect the current state of a plum.\n * To be used mostly in unit tests.\n */\n inspect(plum: WgslPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: WgslPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n } as PlumState<T>;\n\n this._stateMap.set(plum, state as PlumState);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: WgslPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener(state.value);\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: WgslPlum<T>) {\n const dependencies = new Map<WgslPlum, number>();\n\n const getter = (<T>(dep: WgslPlum<T>) => {\n // registering dependency.\n if (!dependencies.has(dep)) {\n const depState = this._getState(dep);\n dependencies.set(dep, depState.version);\n }\n\n return this.get(dep);\n }) as Getter;\n\n return { value: plum.compute(getter), dependencies };\n }\n\n private _recompute<T>(plum: WgslPlum<T>): T {\n const state = this._getState(plum);\n\n if (state.active) {\n // Unsubscribing from old dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n }\n\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state.dependencies = dependencies;\n if (state.active) {\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n state.active.unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n }\n\n if (Object.is(state.value, value)) {\n return state.value;\n }\n\n state.value = value;\n state.version = isExternalPlum(plum) ? plum.version : state.version + 1;\n\n this._notifyListeners(plum);\n\n return state.value;\n }\n\n get<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n const state = this._getState(plum);\n\n if (state.active) {\n // Return memoized value, the dependencies are keeping it up to date.\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n let dirty = false;\n\n if (isExternalPlum(plum)) {\n plum.compute(null as unknown as Getter); // external plums do not use 'get'\n dirty = state.version !== plum.version;\n } else if (state.dependencies.size > 0) {\n dirty = [...state.dependencies.entries()].some(([dep, prevVersion]) => {\n this.get(dep); // allowing dependencies to recompute if necessary.\n const depState = this._getState(dep);\n\n return depState.version !== prevVersion;\n });\n }\n\n if (!dirty) {\n // No need to recompute\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n return this._recompute(plum) as ExtractPlumValue<TPlum>;\n }\n\n set<T>(plum: WgslPlum<T> & WgslSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe<T>(plum: WgslPlum<T>, listener: PlumListener<T>): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","export class TaskQueue<T> {\n private _queue: (() => Promise<void>)[] = [];\n private _pending = false;\n\n enqueue<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this._queue.push(async () => {\n try {\n resolve(await task());\n } catch (e) {\n reject(e);\n }\n });\n this._processQueue();\n });\n }\n\n private async _processQueue() {\n if (this._pending) {\n return;\n }\n this._pending = true;\n while (this._queue.length > 0) {\n const task = this._queue.shift();\n if (task) {\n await task();\n }\n }\n this._pending = false;\n }\n}\n"]}
@@ -1,8 +1,21 @@
1
- import { W as WgslSlot, a as WgslResolvable, b as Wgsl, I as InlineResolve, c as WgslPlum, E as ExtractPlumValue, d as WgslSettable, U as Unsubscribe, A as AnyWgslData, e as WgslAllocatable, B as BufferUsage, f as WgslBindable, g as Eventual, h as WgslFnArgument, R as ResolutionCtx, i as WgslValue, j as WgslIdentifier, k as WgslResolvableSlot, p as plum, l as plumFromEvent } from './types-gpN_64mT.cjs';
2
- export { t as AnyWgslPointer, q as EventualGetter, S as SlotValuePair, r as WgslData, s as WgslPointer, u as isPointer, m as isResolvable, o as isSlot, n as isWgsl } from './types-gpN_64mT.cjs';
3
- import { Parsed } from 'typed-binary';
4
- import { W as WgslStruct } from './struct-CpjQEnf9.cjs';
1
+ import { W as WgslResolvable, a as WgslSlot, E as Eventual, b as Wgsl, I as InlineResolve, c as WgslRenderResource, T as TextureUsage, S as StorageTextureParams, A as AnyWgslTexelFormat, d as SampledTextureParams, e as AnyWgslPrimitive, f as WgslRenderResourceType, g as StorageTextureAccess, R as ResolutionCtx, h as WgslPlum, i as ExtractPlumValue, j as WgslSettable, U as Unsubscribe, k as AnyWgslData, l as WgslAllocatable, B as BufferUsage, m as WgslBindable, n as WgslFnArgument, o as WgslValue, p as WgslIdentifier, q as WgslResolvableSlot, r as plum, s as plumFromEvent } from './types-ENDwr_p9.cjs';
2
+ export { O as AnyWgslPointer, Q as BuiltInPossibleTypes, X as Builtin, w as EventualGetter, x as SlotValuePair, M as WgslData, C as WgslDepthTextureType, F as WgslExternalTextureType, N as WgslPointer, y as WgslSamplerType, D as WgslStorageTextureType, z as WgslTypedTextureType, V as builtin, Y as getBuiltinInfo, Z as getUsedBuiltinsNamed, J as isDepthTextureType, L as isExternalTextureType, P as isPointer, t as isResolvable, G as isSamplerType, v as isSlot, K as isStorageTextureType, H as isTypedTextureType, u as isWgsl } from './types-ENDwr_p9.cjs';
3
+ import { Parsed, AnySchema } from 'typed-binary';
4
+ import { S as SimpleWgslData } from './std140-DRitCcmc.cjs';
5
5
 
6
+ /**
7
+ * An error that happens during resolution of WGSL code.
8
+ * Contains a trace of all ancestor resolvables in
9
+ * which this error originated.
10
+ *
11
+ * @category Errors
12
+ */
13
+ declare class ResolutionError extends Error {
14
+ readonly cause: unknown;
15
+ readonly trace: WgslResolvable[];
16
+ constructor(cause: unknown, trace: WgslResolvable[]);
17
+ appendToTrace(ancestor: WgslResolvable): ResolutionError;
18
+ }
6
19
  /**
7
20
  * @category Errors
8
21
  */
@@ -25,11 +38,65 @@ declare abstract class Callable<TArgs extends [...any[]], TReturn> extends Funct
25
38
  type ICallable<TArgs extends [...any[]], TReturn> = (...args: TArgs) => TReturn;
26
39
  type AsCallable<T, TArgs extends [...any[]], TReturn> = T & ICallable<TArgs, TReturn>;
27
40
 
41
+ type PlumListener<T> = (newValue: T) => unknown;
42
+
28
43
  interface WgslCode extends WgslResolvable {
29
44
  $name(label?: string | undefined): WgslCode;
45
+ with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslCode;
30
46
  }
47
+ type BoundWgslCode = Omit<WgslCode, '$name'>;
31
48
  declare function code(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslCode;
32
49
 
50
+ interface WgslSampler extends WgslRenderResource {
51
+ readonly descriptor: GPUSamplerDescriptor;
52
+ $name(label: string): WgslSampler;
53
+ }
54
+ declare function sampler(descriptor: GPUSamplerDescriptor): WgslSampler;
55
+
56
+ interface WgslAnyTextureView extends WgslRenderResource {
57
+ readonly descriptor: GPUTextureViewDescriptor;
58
+ readonly texture: WgslAnyTexture;
59
+ readonly dataType: AnyWgslPrimitive | AnyWgslTexelFormat;
60
+ readonly access: StorageTextureAccess | undefined;
61
+ }
62
+ interface WgslAnyTexture {
63
+ readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;
64
+ get flags(): GPUTextureUsageFlags;
65
+ }
66
+ interface WgslTexture<TAllows extends TextureUsage = never> {
67
+ readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;
68
+ get label(): string | undefined;
69
+ get flags(): GPUTextureUsageFlags;
70
+ $name(label: string): WgslTexture<TAllows>;
71
+ $allowSampled(): WgslTexture<TAllows | 'sampled'>;
72
+ $allowStorage(): WgslTexture<TAllows | 'storage'>;
73
+ asStorage(params: StorageTextureParams): 'storage' extends TAllows ? WgslTextureView<AnyWgslTexelFormat, 'storage'> : null;
74
+ asSampled(params: SampledTextureParams): 'sampled' extends TAllows ? WgslTextureView<typeof params.dataType, 'sampled'> : null;
75
+ }
76
+ interface WgslTextureView<TData extends AnyWgslPrimitive | AnyWgslTexelFormat, TUsage extends TextureUsage> extends WgslRenderResource {
77
+ readonly texture: WgslTexture<TUsage>;
78
+ readonly descriptor: Omit<GPUTextureViewDescriptor, 'usage'>;
79
+ readonly type: WgslRenderResourceType;
80
+ readonly dataType: TData;
81
+ readonly access: StorageTextureAccess | undefined;
82
+ $name(label: string): WgslTextureView<TData, TUsage>;
83
+ }
84
+ interface WgslTextureExternal extends WgslRenderResource {
85
+ readonly descriptor: GPUExternalTextureDescriptor;
86
+ }
87
+ declare function texture<TUsage extends TextureUsage = never>(descriptor: Omit<GPUTextureDescriptor, 'usage'>): WgslTexture<TUsage>;
88
+ declare function textureExternal(descriptor: GPUExternalTextureDescriptor): WgslTextureExternalImpl;
89
+ declare class WgslTextureExternalImpl implements WgslTextureExternal {
90
+ readonly descriptor: GPUExternalTextureDescriptor;
91
+ private _label;
92
+ readonly type = "texture_external";
93
+ constructor(descriptor: GPUExternalTextureDescriptor);
94
+ get label(): string | undefined;
95
+ $name(label: string | undefined): this;
96
+ resolve(ctx: ResolutionCtx): string;
97
+ }
98
+
99
+ type SetPlumAction<T> = T | ((prev: T) => T);
33
100
  interface TypeGpuRuntime {
34
101
  readonly device: GPUDevice;
35
102
  /**
@@ -38,11 +105,15 @@ interface TypeGpuRuntime {
38
105
  */
39
106
  readonly commandEncoder: GPUCommandEncoder;
40
107
  readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
41
- setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: ExtractPlumValue<TPlum>): void;
42
- onPlumChange<TValue>(plum: WgslPlum<TValue>, listener: () => unknown): Unsubscribe;
108
+ setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: SetPlumAction<ExtractPlumValue<TPlum>>): void;
109
+ onPlumChange<TValue>(plum: WgslPlum<TValue>, listener: PlumListener<TValue>): Unsubscribe;
43
110
  writeBuffer<TValue extends AnyWgslData>(allocatable: WgslAllocatable<TValue>, data: Parsed<TValue>): void;
44
111
  readBuffer<TData extends AnyWgslData>(allocatable: WgslAllocatable<TData>): Promise<Parsed<TData>>;
45
112
  bufferFor(allocatable: WgslAllocatable): GPUBuffer;
113
+ textureFor(view: WgslAnyTexture | WgslAnyTextureView): GPUTexture;
114
+ viewFor(view: WgslAnyTextureView): GPUTextureView;
115
+ externalTextureFor(texture: WgslTextureExternal): GPUExternalTexture;
116
+ samplerFor(sampler: WgslSampler): GPUSampler;
46
117
  dispose(): void;
47
118
  /**
48
119
  * Causes all commands enqueued by pipelines to be
@@ -54,28 +125,25 @@ interface TypeGpuRuntime {
54
125
  }
55
126
  interface RenderPipelineOptions {
56
127
  vertex: {
57
- args: Wgsl[];
58
- code: WgslCode;
59
- output: WgslStruct<Record<string, AnyWgslData>>;
60
- buffersLayouts?: Iterable<GPUVertexBufferLayout | null>;
128
+ code: WgslCode | BoundWgslCode;
129
+ output: {
130
+ [K in symbol]: string;
131
+ } & {
132
+ [K in string]: AnyWgslData;
133
+ };
61
134
  };
62
135
  fragment: {
63
- args: Wgsl[];
64
- code: WgslCode;
65
- output: Wgsl;
136
+ code: WgslCode | BoundWgslCode;
66
137
  target: Iterable<GPUColorTargetState | null>;
67
138
  };
68
139
  primitive: GPUPrimitiveState;
69
140
  externalLayouts?: GPUBindGroupLayout[];
70
- externalDeclarations?: Wgsl[];
71
141
  label?: string;
72
142
  }
73
143
  interface ComputePipelineOptions {
74
- workgroupSize?: [number, number?, number?];
75
- args?: Wgsl[];
76
- code: WgslCode;
144
+ code: WgslCode | BoundWgslCode;
145
+ workgroupSize?: readonly [number, number?, number?];
77
146
  externalLayouts?: GPUBindGroupLayout[];
78
- externalDeclarations?: Wgsl[];
79
147
  label?: string;
80
148
  }
81
149
  type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
@@ -84,18 +152,18 @@ type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
84
152
  firstVertex?: number;
85
153
  firstInstance?: number;
86
154
  externalBindGroups?: GPUBindGroup[];
87
- externalVertexBuffers?: GPUBuffer[];
88
155
  };
89
156
  interface RenderPipelineExecutor {
90
157
  execute(options: RenderPipelineExecutorOptions): void;
91
158
  }
92
159
  type ComputePipelineExecutorOptions = {
93
- workgroups?: [number, number?, number?];
160
+ workgroups?: readonly [number, number?, number?];
94
161
  externalBindGroups?: GPUBindGroup[];
95
162
  };
96
163
  interface ComputePipelineExecutor {
97
164
  execute(options?: ComputePipelineExecutorOptions): void;
98
165
  }
166
+ declare function deriveVertexFormat<TData extends SimpleWgslData<AnySchema>>(typeSchema: TData): GPUVertexFormat;
99
167
 
100
168
  interface NameRegistry {
101
169
  nameFor(item: WgslResolvable): string;
@@ -132,23 +200,27 @@ declare class ProgramBuilder {
132
200
  build(options: BuildOptions): Program;
133
201
  }
134
202
 
203
+ type VariableScope = 'private' | 'workgroup';
135
204
  interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {
136
205
  $name(label: string): WgslVar<TDataType>;
137
206
  }
138
207
 
139
- interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage> extends WgslBindable<TData, TUsage> {
208
+ interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage = BufferUsage> extends WgslBindable<TData, TUsage> {
140
209
  $name(label: string): WgslBufferUsage<TData, TUsage>;
141
210
  }
142
211
 
212
+ type UsageGuard<TUsage extends BufferUsage, TData extends AnyWgslData, TAllows> = TUsage extends TAllows ? WgslBufferUsage<TData, TUsage> : null;
143
213
  interface WgslBuffer<TData extends AnyWgslData, TAllows extends BufferUsage = never> extends WgslAllocatable<TData> {
144
214
  $name(label: string): WgslBuffer<TData, TAllows>;
145
215
  $allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;
146
- $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;
147
- $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;
216
+ $allowReadonly(): WgslBuffer<TData, TAllows | 'readonly'>;
217
+ $allowMutable(): WgslBuffer<TData, TAllows | 'mutable'>;
218
+ $allowVertex(stepMode: 'vertex' | 'instance'): WgslBuffer<TData, TAllows | 'vertex'>;
148
219
  $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;
149
- asUniform(): 'uniform' extends TAllows ? WgslBufferUsage<TData, 'uniform'> : null;
150
- asMutableStorage(): 'mutable_storage' extends TAllows ? WgslBufferUsage<TData, 'mutable_storage'> : null;
151
- asReadonlyStorage(): 'readonly_storage' extends TAllows ? WgslBufferUsage<TData, 'readonly_storage'> : null;
220
+ asUniform(): UsageGuard<'uniform', TData, TAllows>;
221
+ asMutable(): UsageGuard<'mutable', TData, TAllows>;
222
+ asReadonly(): UsageGuard<'readonly', TData, TAllows>;
223
+ asVertex(): UsageGuard<'vertex', TData, TAllows>;
152
224
  }
153
225
  declare function buffer<TData extends AnyWgslData, TUsage extends BufferUsage = never>(typeSchema: TData, initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined): WgslBuffer<TData, TUsage>;
154
226
 
@@ -161,12 +233,16 @@ interface WgslConst extends WgslResolvable {
161
233
  */
162
234
  declare function constant(expr: Wgsl): WgslConst;
163
235
 
236
+ interface WgslDeclare extends WgslResolvable {
237
+ }
238
+ declare function declare(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslDeclare;
239
+
164
240
  interface WgslFn$1 extends WgslResolvable {
165
241
  $name(label: string): WgslFn$1;
166
242
  with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;
167
243
  }
168
244
  type BoundWgslFn = Omit<WgslFn$1, '$name'>;
169
- declare function fn$1(label?: string): (strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]) => WgslFn$1;
245
+ declare function fn$1(strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]): WgslFn$1;
170
246
 
171
247
  interface WgslFn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends WgslResolvable, Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> {
172
248
  }
@@ -185,16 +261,19 @@ declare class WgslFunctionCall<TArgTypes extends [WgslFnArgument, ...WgslFnArgum
185
261
  private readonly args;
186
262
  constructor(usedFn: WgslFn<TArgTypes, TReturn>, args: SegmentsFromTypes<TArgTypes>);
187
263
  resolve(ctx: ResolutionCtx): string;
264
+ toString(): string;
188
265
  }
189
266
  declare class WgslFnImpl<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> implements WgslFn<TArgTypes, TReturn> {
190
267
  private argPairs;
191
268
  private returnType;
192
269
  private readonly body;
193
- private identifier;
270
+ private _label;
194
271
  constructor(argPairs: PairsFromTypes<TArgTypes>, returnType: TReturn | undefined, body: Wgsl);
272
+ get label(): string | undefined;
195
273
  $name(label: string): this;
196
274
  resolve(ctx: ResolutionCtx): string;
197
275
  _call(...args: SegmentsFromTypes<TArgTypes>): WgslFunctionCall<TArgTypes, TReturn>;
276
+ toString(): string;
198
277
  }
199
278
 
200
279
  declare function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;
@@ -209,7 +288,27 @@ declare const _default: typeof code & {
209
288
  plumFromEvent: typeof plumFromEvent;
210
289
  slot: typeof slot;
211
290
  constant: typeof constant;
212
- var: <TDataType extends AnyWgslData>(dataType: TDataType, initialValue?: Wgsl) => WgslVar<TDataType>;
291
+ declare: typeof declare;
292
+ var: <TDataType extends AnyWgslData>(dataType: TDataType, initialValue?: Wgsl, scope?: VariableScope) => WgslVar<TDataType>;
293
+ sampler: typeof sampler;
294
+ texture: typeof texture;
295
+ textureExternal: typeof textureExternal;
296
+ builtin: {
297
+ readonly vertexIndex: symbol;
298
+ readonly instanceIndex: symbol;
299
+ readonly position: symbol;
300
+ readonly clipDistances: symbol;
301
+ readonly frontFacing: symbol;
302
+ readonly fragDepth: symbol;
303
+ readonly sampleIndex: symbol;
304
+ readonly sampleMask: symbol;
305
+ readonly fragment: symbol;
306
+ readonly localInvocationId: symbol;
307
+ readonly localInvocationIndex: symbol;
308
+ readonly globalInvocationId: symbol;
309
+ readonly workgroupId: symbol;
310
+ readonly numWorkgroups: symbol;
311
+ };
213
312
  };
214
313
 
215
314
  /**
@@ -246,4 +345,4 @@ type CreateRuntimeOptions = {
246
345
  */
247
346
  declare function createRuntime(options?: CreateRuntimeOptions | GPUDevice): Promise<TypeGpuRuntime>;
248
347
 
249
- export { AnyWgslData, type AsCallable, BufferUsage, type ComputePipelineExecutor, type ComputePipelineExecutorOptions, type ComputePipelineOptions, type CreateRuntimeOptions, Eventual, type ICallable, InlineResolve, MissingSlotValueError, type Program, ProgramBuilder, RandomNameRegistry, RecursiveDataTypeError, type RenderPipelineExecutor, type RenderPipelineExecutorOptions, type RenderPipelineOptions, ResolutionCtx, StrictNameRegistry, type TypeGpuRuntime, Wgsl, WgslAllocatable, WgslBindable, type WgslBuffer, type WgslCode, type WgslConst, type WgslFn$1 as WgslFn, WgslFnArgument, type WgslFn as WgslFnExperimental, WgslPlum, WgslResolvable, WgslResolvableSlot, WgslSettable, WgslSlot, WgslValue, type WgslVar, createRuntime, _default as wgsl };
348
+ export { AnyWgslData, AnyWgslPrimitive, AnyWgslTexelFormat, type AsCallable, BufferUsage, type ComputePipelineExecutor, type ComputePipelineExecutorOptions, type ComputePipelineOptions, type CreateRuntimeOptions, Eventual, type ICallable, InlineResolve, MissingSlotValueError, type Program, ProgramBuilder, RandomNameRegistry, RecursiveDataTypeError, type RenderPipelineExecutor, type RenderPipelineExecutorOptions, type RenderPipelineOptions, ResolutionCtx, ResolutionError, SampledTextureParams, type SetPlumAction, StorageTextureAccess, StorageTextureParams, StrictNameRegistry, TextureUsage, type TypeGpuRuntime, Wgsl, WgslAllocatable, WgslBindable, type WgslBuffer, type WgslBufferUsage, type WgslCode, type WgslConst, type WgslFn$1 as WgslFn, WgslFnArgument, type WgslFn as WgslFnExperimental, WgslPlum, WgslRenderResource, WgslRenderResourceType, WgslResolvable, WgslResolvableSlot, type WgslSampler, WgslSettable, WgslSlot, type WgslTexture, type WgslTextureView, WgslValue, type WgslVar, createRuntime, deriveVertexFormat, _default as wgsl };