typegpu 0.0.0-alpha.3 → 0.0.0-alpha.4

Sign up to get free protection for your applications and to get access to all the features.
package/index.js CHANGED
@@ -1,29 +1,49 @@
1
- import{a as $,b as le,c as $e}from"./chunk-K6N2A55L.js";import{a as se,b as ne,c as ae,d as a,e as D,f as ie,g as oe,h as ue,i as o,j as m}from"./chunk-NTGWE7PR.js";var E=class extends Function{constructor(){super("...args","return this._bound._call(...args)");a(this,"_bound");return this._bound=this.bind(this),this._bound}},ge=E;var x=class{constructor(){a(this,"lastUniqueId",0);a(this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let r;e.label?(r=e.label.replaceAll(/\s/g,"_"),r=r.replaceAll(/[^\w\d]/g,"")):r="item",t=`${r}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},V=class{constructor(){a(this,"_usedNames",new Set);a(this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let r=0,s=e.label;for(;this._usedNames.has(s);)r++,s=`${e.label}_${r}`;return this._usedNames.add(s),this._assignedNames.set(e,s),s}};var Pe={uniform:"uniform",mutable_storage:"storage, read_write",readonly_storage:"storage, read"},C=class{constructor(e,t){this.names=e;this._bindingGroup=t;a(this,"_memoizedResolves",new WeakMap);a(this,"_nextFreeBindingIdx",0);a(this,"_usedBindables",new Set);a(this,"_declarations",[])}get usedBindables(){return this._usedBindables}get declarations(){return this._declarations}getOrInstantiate(e,t){var i;let r=(i=this._memoizedResolves.get(e))!=null?i:[];for(let u of r)if([...u.slotToValueMap.entries()].every(([g,c])=>t.readSlot(g)===c))return u.result;let s;try{s=e.resolve(t)}catch(u){throw u instanceof $?u.appendToTrace(e):new $(u,[e])}let l=new Map;for(let u of t.usedSlots)l.set(u,t.readSlot(u));return r.push({slotToValueMap:l,result:s}),this._memoizedResolves.set(e,r),s}reserveBindingEntry(e){return this._usedBindables.add(e),{group:this._bindingGroup,idx:this._nextFreeBindingIdx++}}addDeclaration(e){this._declarations.push(e)}},P=class{constructor({names:e,bindingGroup:t}){a(this,"_shared");a(this,"usedSlots",new Set);this._shared=new C(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new le(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!D(e))return String(e);let r=new F(this,this._shared,t),s=this._shared.getOrInstantiate(e,r);return`${[...this._shared.declarations].join(`
1
+ import{B as S,C as U,D as w,F as T,L as $e,M as mt,N as De,O as o,a as G,b as E,c as ve,d as a,e as K,f as we,g as dt,h as Y,i as Pe,j as _e,k as Re,l as gt,m as Se,n as pt,o as Ue,p as Ae,q as Be}from"./chunk-K2GYQABQ.js";var Q=class extends Function{constructor(){super("...args","return this._bound._call(...args)");a(this,"_bound");return this._bound=this.bind(this),this._bound}},Ve=Q;var rt={f32:"float32",vec2f:"float32x2",vec3f:"float32x3",vec4f:"float32x4",u32:"uint32",vec2u:"uint32x2",vec3u:"uint32x3",vec4u:"uint32x4",i32:"sint32",vec2i:"sint32x2",vec3i:"sint32x3",vec4i:"sint32x4"};function Ge(n){if(!("expressionCode"in n))throw new Error("Type schema must contain a 'code' field");let e=n.getUnderlyingTypeString(),t=rt[e];if(!t)throw new Error(`Unknown vertex format for type code: ${e}`);return t}var b=class{constructor(){a(this,"lastUniqueId",0);a(this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let r;e.label?(r=e.label.replaceAll(/\s/g,"_"),r=r.replaceAll(/[^\w\d]/g,"")):r="item",t=`${r}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},X=class{constructor(){a(this,"_usedNames",new Set);a(this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let r=0,s=e.label;for(;this._usedNames.has(s);)r++,s=`${e.label}_${r}`;return this._usedNames.add(s),this._assignedNames.set(e,s),s}};function Ee(n){return new H(n)}var H=class{constructor(e){this.descriptor=e;a(this,"_label");a(this,"_type");e.compare===void 0?this._type="sampler":this._type="sampler_comparison"}get label(){return this._label}get type(){return this._type}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}};function F(n){return n.type==="sampler"||n.type==="sampler_comparison"}function Oe(n){return new J(n)}function Me(n){return new Z(n)}var J=class{constructor(e){this.descriptor=e;a(this,"_flags",GPUTextureUsage.COPY_DST|GPUTextureUsage.COPY_SRC|GPUTextureUsage.RENDER_ATTACHMENT);a(this,"_allowedUsages",{sampled:null,storage:null});a(this,"_label")}get label(){return this._label}get flags(){return this._flags}$name(e){return this._label=e,this}$addFlags(e){return this._flags|=e,this}$allowSampled(){let e=this;return this._allowedUsages.sampled||(this._allowedUsages.sampled=new Map),this.$addFlags(GPUTextureUsage.TEXTURE_BINDING),e}$allowStorage(){let e=this;return this._allowedUsages.storage||(this._allowedUsages.storage=new Map),this.$addFlags(GPUTextureUsage.STORAGE_BINDING),e}getStorageIfAllowed(e){if(!this._allowedUsages.storage)return null;let t=Ce(e),r=this._allowedUsages.storage.get(t);if(r)return r;let s=Fe[this.descriptor.format];if(!s)throw new Error(`Unsupported texture format ${this.descriptor.format}`);let l=new C(e.type,this,s,e.descriptor,e.access);return this._allowedUsages.storage.set(t,l),l}getSampledIfAllowed(e){if(!this._allowedUsages.sampled)return null;let t=Ce(e),r=this._allowedUsages.sampled.get(t);if(r)return r;let s=new C(e.type,this,e.dataType,e.descriptor);return this._allowedUsages.sampled.set(t,s),s}asStorage(e){let t=this.getStorageIfAllowed(e);if(!Fe[this.descriptor.format])throw new Error(`Unsupported texture format ${this.descriptor.format}`);return t}asSampled(e){return this.getSampledIfAllowed(e)}},C=class{constructor(e,t,r,s={},l=void 0){this.type=e;this.texture=t;this.dataType=r;this.descriptor=s;this.access=l;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}},Z=class{constructor(e){this.descriptor=e;a(this,"_label");a(this,"type","texture_external")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}};function ke(n){return!("texture"in n)&&!F(n)}function O(n){return"texture"in n}var Fe={rgba8unorm:w,rgba8snorm:w,rgba8uint:S,rgba8sint:U,rgba16uint:S,rgba16sint:U,rgba16float:w,r32uint:S,r32sint:U,r32float:w,rg32uint:S,rg32sint:U,rg32float:w,rgba32uint:S,rgba32sint:U,rgba32float:w,bgra8unorm:w};function Ce(n){let e=Object.fromEntries(Object.entries(n).sort(([t],[r])=>t.localeCompare(r)));return JSON.stringify(e)}var st={uniform:"uniform",mutable:"storage, read_write",readonly:"storage, read"},ee=class{constructor(e,t){this.names=e;this._bindingGroup=t;a(this,"_memoizedResolves",new WeakMap);a(this,"_nextFreeBindingIdx",0);a(this,"_usedBindables",new Set);a(this,"_usedRenderResources",new Set);a(this,"_resourceToIndexMap",new WeakMap);a(this,"_usedBuiltins",new Set);a(this,"_declarations",[])}get usedBindables(){return this._usedBindables}get usedRenderResources(){return this._usedRenderResources}get declarations(){return this._declarations}get usedBuiltins(){return this._usedBuiltins}getOrInstantiate(e,t){var g;let r=(g=this._memoizedResolves.get(e))!=null?g:[];for(let i of r)if([...i.slotToValueMap.entries()].every(([p,c])=>t.readSlot(p)===c))return i.result;let s;try{s=e.resolve(t)}catch(i){throw i instanceof K?i.appendToTrace(e):new K(i,[e])}let l=new Map;for(let i of t.usedSlots)l.set(i,t.readSlot(i));return r.push({slotToValueMap:l,result:s}),this._memoizedResolves.set(e,r),s}reserveBindingEntry(e){this._usedBindables.add(e);let t=this._nextFreeBindingIdx++;return this._resourceToIndexMap.set(e,t),{group:this._bindingGroup,idx:t}}registerBindingNoEntry(e){this._usedBindables.add(e)}reserveRenderResourceEntry(e){this._usedRenderResources.add(e);let t=this._nextFreeBindingIdx++;return this._resourceToIndexMap.set(e,t),{group:this._bindingGroup,idx:t}}getBindingIndex(e){return this._resourceToIndexMap.get(e)}addDeclaration(e){this._declarations.push(e)}addBuiltin(e){this._usedBuiltins.add(e)}},P=class{constructor({names:e,bindingGroup:t}){a(this,"_shared");a(this,"usedSlots",new Set);this._shared=new ee(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}get usedRenderResources(){return this._shared.usedRenderResources}get usedBuiltins(){return this._shared.usedBuiltins}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addRenderResource(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBuiltin(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new we(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!Y(e))return String(e);let r=new te(this,this._shared,t),s=this._shared.getOrInstantiate(e,r);return`${[...this._shared.declarations].join(`
2
2
 
3
- `)}${s}`}},F=class n{constructor(e,t,r){this._parent=e;this._shared=t;this._slotValuePairs=r;a(this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){let{group:r,idx:s}=this._shared.reserveBindingEntry(e);this.addDeclaration(o`@group(${r}) @binding(${s}) var<${Pe[e.usage]}> ${t}: ${e.allocatable.dataType};`)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([r])=>r===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;oe(t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!D(e))return String(e);let r=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,r)}};var we={uniform:"uniform",mutable_storage:"storage",readonly_storage:"read-only-storage"},b=class{constructor(e,t){this.runtime=e;this.root=t}build(e){var u;let t=new P({names:(u=e.nameRegistry)!=null?u:new x,bindingGroup:e.bindingGroup}),r=t.resolve(this.root),s=Array.from(t.usedBindables),l=this.runtime.device.createBindGroupLayout({entries:s.map((d,g)=>({binding:g,visibility:e.shaderStage,buffer:{type:we[d.usage]}}))}),i=this.runtime.device.createBindGroup({layout:l,entries:s.map((d,g)=>({binding:g,resource:{buffer:this.runtime.bufferFor(d.allocatable)}}))});return{bindGroupLayout:l,bindGroup:i,code:r}}};function w(n,e){return new G(n,e)}var G=class{constructor(e,t){this.buffer=e;this.usage=t;a(this,"_label")}get label(){return this._label}get allocatable(){return this.buffer}$name(e){return this._label=e,this}resolve(e){let t=new m;return e.addBinding(this,t),e.resolve(t)}toString(){var e;return`${this.usage}:${(e=this._label)!=null?e:"<unnamed>"}`}};function de(n,e){return new M(n,e)}var M=class{constructor(e,t){this.dataType=e;this.initial=t;a(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);a(this,"_allowedUsages",{uniform:null,mutableStorage:null,readonlyStorage:null});a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}$allowUniform(){let e=this;return this.$addFlags(GPUBufferUsage.UNIFORM),this._allowedUsages.uniform||(this._allowedUsages.uniform=w(e,"uniform")),e}$allowReadonlyStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.readonlyStorage||(this._allowedUsages.readonlyStorage=w(e,"readonly_storage")),e}$allowMutableStorage(){let e=this;return this.$addFlags(GPUBufferUsage.STORAGE),this._allowedUsages.mutableStorage||(this._allowedUsages.mutableStorage=w(e,"mutable_storage")),e}$addFlags(e){return this.flags|=e,this}asUniform(){return this._allowedUsages.uniform}asMutableStorage(){return this._allowedUsages.mutableStorage}asReadonlyStorage(){return this._allowedUsages.readonlyStorage}toString(){var e;return`buffer:${(e=this._label)!=null?e:"<unnamed>"}`}};function pe(n){return new k(n)}var k=class{constructor(e){this.expr=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new m().$name(this._label);return e.addDeclaration(o`const ${t} = ${this.expr};`),e.resolve(t)}};function fe(n,...e){return new L(o(n,...e))}var L=class{constructor(e){this._declaration=e}resolve(e){return e.addDeclaration(o`${this._declaration}`),""}};function me(n,...e){return new O(o(n,...e))}var O=class{constructor(e){this.body=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new m().$name(this._label);return e.addDeclaration(o`fn ${t}${this.body}`.$name(this._label)),e.resolve(t)}with(e,t){return new I(this,[e,t])}toString(){var e;return`fn:${(e=this.label)!=null?e:"<unnamed>"}`}},I=class n{constructor(e,t){this._innerFn=e;this._slotValuePair=t}get label(){return this._innerFn.label}with(e,t){return new n(this,[e,t])}resolve(e){return e.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,s;let[e,t]=this._slotValuePair;return`fn:${(r=this.label)!=null?r:"<unnamed>"}[${(s=e.label)!=null?s:"<unnamed>"}=${t}]`}};function ce(n,e){let t=n.map(s=>[new m,s]),r=t.map(([s,l])=>s);return s=>{let l=s(...r);return new z(t,e,l)}}var N=class{constructor(e,t){this.usedFn=e;this.args=t}resolve(e){let t=this.args.map((r,s)=>{let l=s<this.args.length-1?", ":"";return o`${r}${l}`});return e.resolve(o`${this.usedFn}(${t})`.$name("internal"))}toString(){var e;return`fun:${(e=this.usedFn.label)!=null?e:"<unnamed>"}()`}},z=class extends ge{constructor(t,r,s){super();this.argPairs=t;this.returnType=r;this.body=s;a(this,"_label")}get label(){return this._label}$name(t){return this._label=t,this}resolve(t){let r=new m().$name(this._label),s=this.argPairs.map(([l,i],u)=>{let d=u<this.argPairs.length-1?", ":"";return ue(i)?o`${l}: ptr<${i.scope}, ${i.pointsTo}>${d}`:o`${l}: ${i}${d}`});return this.returnType!==void 0?t.addDeclaration(o`fn ${r}(${s}) -> ${this.returnType} {
3
+ `)}${s}`}getIndexFor(e){let t=this._shared.getBindingIndex(e);if(t===void 0)throw new Error("No index found for item");return t}},te=class n{constructor(e,t,r){this._parent=e;this._shared=t;this._slotValuePairs=r;a(this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){if(e.usage==="vertex"){this._shared.registerBindingNoEntry(e);return}let{group:r,idx:s}=this._shared.reserveBindingEntry(e);this.addDeclaration(o`@group(${r}) @binding(${s}) var<${st[e.usage]}> ${t}: ${e.allocatable.dataType};`)}addRenderResource(e,t){let{group:r,idx:s}=this._shared.reserveRenderResourceEntry(e);if(Re(e.type)||Ue(e.type)||Se(e.type)){this.addDeclaration(o`@group(${r}) @binding(${s}) var ${t}: ${e.type};`);return}if(O(e)){if(e.access!==void 0){this.addDeclaration(o`@group(${r}) @binding(${s}) var ${t}: ${e.type}<${e.texture.descriptor.format}, ${e.access}>;`);return}this.addDeclaration(o`@group(${r}) @binding(${s}) var ${t}: ${e.type}<${e.dataType}>;`);return}throw new Error(`Unsupported resource type: ${e.type}`)}addBuiltin(e){this._shared.addBuiltin(e)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([r])=>r===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;_e(t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!Y(e))return String(e);let r=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,r)}};var nt={uniform:"uniform",mutable:"storage",readonly:"read-only-storage"},_=class{constructor(e,t){this.runtime=e;this.root=t}build(e){var x;let t=new P({names:(x=e.nameRegistry)!=null?x:new b,bindingGroup:e.bindingGroup}),r=t.resolve(this.root),s=Array.from(t.usedBindables),l=Array.from(t.usedRenderResources),g=l.filter(F),i=l.filter(O),m=l.filter(ke),p=[];for(let d of i)d.access===void 0?p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,texture:{}}):p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,storageTexture:{format:d.texture.descriptor.format}});for(let d of m)p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,externalTexture:{}});for(let d of g)p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,sampler:{}});for(let d of s)d.usage!=="vertex"&&p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,buffer:{type:nt[d.usage]}});let c=[];for(let d of i)c.push({binding:t.getIndexFor(d),resource:this.runtime.viewFor(d)});for(let d of m)c.push({binding:t.getIndexFor(d),resource:this.runtime.externalTextureFor(d)});for(let d of g)c.push({binding:t.getIndexFor(d),resource:this.runtime.samplerFor(d)});for(let d of s)d.usage!=="vertex"&&c.push({binding:t.getIndexFor(d),resource:{buffer:this.runtime.bufferFor(d.allocatable)}});let f=this.runtime.device.createBindGroupLayout({entries:p}),y=this.runtime.device.createBindGroup({layout:f,entries:c});return{bindGroupLayout:f,bindGroup:y,code:r}}},M=class{constructor(e,t,r,s){this.runtime=e;this.vertexRoot=t;this.fragmentRoot=r;this.vertexOutputFormat=s}build(e){var xe,he,be,We;let t=Object.getOwnPropertySymbols(this.vertexOutputFormat).map(u=>{let h=this.vertexOutputFormat[u];if(typeof h!="string")throw new Error("Output names must be strings.");return{symbol:u,name:h}}),r=Object.fromEntries(t.map(({symbol:u,name:h})=>[u,h])),s=De(r),g=Object.keys(this.vertexOutputFormat).map((u,h)=>{let R=this.vertexOutputFormat[u];if(!R)throw new Error("Output names must be strings.");return{name:u,varInfo:R,index:h}}),i=[...s.map(u=>o`
4
+ @builtin(${u.builtin.name}) ${u.name}: ${u.builtin.type},
5
+ `),...g.map(({name:u,varInfo:h,index:R})=>o`
6
+ @location(${R}) ${u}: ${h},
7
+ `)],m=new P({names:(xe=e.nameRegistry)!=null?xe:new b,bindingGroup:e.bindingGroup});m.resolve(this.vertexRoot);let p=Array.from(m.usedBindables).filter(u=>u.usage==="vertex"),f=p.map(u=>({bindable:u,underlyingType:u.allocatable.dataType})).map((u,h)=>o`
8
+ @location(${h}) ${u.bindable} : ${u.underlyingType.getUnderlyingTypeString()},
9
+ `),d=[...Array.from(m.usedBuiltins).map(u=>o`
10
+ @builtin(${u.name}) ${u.identifier}: ${u.type},
11
+ `),...f],W=o`
12
+ struct VertexOutput {
13
+ ${i}
14
+ };
15
+
16
+ @vertex
17
+ fn main(${d}) -> VertexOutput {
18
+ ${this.vertexRoot}
19
+ var output: VertexOutput;
20
+ ${s.map(u=>o`
21
+ output.${u.name} = ${u.name};
22
+ `)}
23
+ ${g.map(({name:u})=>o`
24
+ output.${u} = ${u};
25
+ `)}
26
+ return output;
27
+ }
28
+ `,A=new P({names:(he=e.nameRegistry)!=null?he:new b,bindingGroup:e.bindingGroup});A.resolve(this.fragmentRoot);let D=Array.from(A.usedBuiltins).map(u=>o`
29
+ @builtin(${u.name}) ${u.identifier}: ${u.type},
30
+ `),V=g.map(({name:u,varInfo:h},R)=>o`
31
+ @location(${R}) ${u}: ${h},
32
+ `),v=[...D,...V],B=o`
33
+ @fragment
34
+ fn main(${v}) -> @location(0) vec4f {
35
+ ${this.fragmentRoot}
36
+ }
37
+ `,et=new _(this.runtime,W).build({bindingGroup:e.bindingGroup,shaderStage:GPUShaderStage.VERTEX,nameRegistry:(be=e.nameRegistry)!=null?be:new b}),tt=new _(this.runtime,B).build({bindingGroup:e.bindingGroup+1,shaderStage:GPUShaderStage.FRAGMENT,nameRegistry:(We=e.nameRegistry)!=null?We:new b});return[et,tt,p]}},k=class{constructor(e,t,r){this.runtime=e;this.computeRoot=t;this.workgroupSize=r}build(e){var m,p,c,f;let t=new P({names:(m=e.nameRegistry)!=null?m:new b,bindingGroup:e.bindingGroup});t.resolve(this.computeRoot);let s=Array.from(t.usedBuiltins).map(y=>o`
38
+ @builtin(${y.name}) ${y.identifier}: ${y.type},
39
+ `),l=`@workgroup_size(${this.workgroupSize[0]}, ${(p=this.workgroupSize[1])!=null?p:1}, ${(c=this.workgroupSize[2])!=null?c:1})`,g=o`
40
+ @compute ${l}
41
+ fn main(${s}) {
42
+ ${this.computeRoot}
43
+ }
44
+ `;return new _(this.runtime,g).build({bindingGroup:e.bindingGroup,shaderStage:GPUShaderStage.COMPUTE,nameRegistry:(f=e.nameRegistry)!=null?f:new b})}};function $(n,e){return new re(n,e)}var re=class{constructor(e,t){this.buffer=e;this.usage=t;a(this,"_label")}get label(){return this._label}get allocatable(){return this.buffer}$name(e){return this._label=e,this}resolve(e){let t=new T;return e.addBinding(this,t),e.resolve(t)}toString(){var e;return`${this.usage}:${(e=this._label)!=null?e:"<unnamed>"}`}};function Ie(n,e){return new se(n,e)}var se=class{constructor(e,t){this.dataType=e;this.initial=t;a(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);a(this,"vertexLayout",null);a(this,"_allowedUsages",{uniform:null,mutable:null,readonly:null,vertex:null});a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}$allowUniform(){this.$addFlags(GPUBufferUsage.UNIFORM);let e=this;return this._allowedUsages.uniform||(this._allowedUsages.uniform=$(e,"uniform")),e}$allowReadonly(){this.$addFlags(GPUBufferUsage.STORAGE);let e=this;return this._allowedUsages.readonly||(this._allowedUsages.readonly=$(e,"readonly")),e}$allowMutable(){this.$addFlags(GPUBufferUsage.STORAGE);let e=this;return this._allowedUsages.mutable||(this._allowedUsages.mutable=$(e,"mutable")),e}$allowVertex(e="vertex"){this.$addFlags(GPUBufferUsage.VERTEX);let t=this;if(!this.vertexLayout){if(!(this.dataType instanceof Be))throw new Error("Only simple data types can be used as vertex buffers");let r=this.dataType;r=r.getUnderlyingType(),this.vertexLayout={arrayStride:r.size,stepMode:e},this._allowedUsages.vertex=$(t,"vertex")}if(this.vertexLayout.stepMode!==e)throw new Error("Cannot change step mode of a vertex buffer");return t}$addFlags(e){return this.flags|=e,this}asUniform(){return this._allowedUsages.uniform}asMutable(){return this._allowedUsages.mutable}asReadonly(){return this._allowedUsages.readonly}asVertex(){return this._allowedUsages.vertex}toString(){var e;return`buffer:${(e=this._label)!=null?e:"<unnamed>"}`}};function Le(n){return new ne(n)}var ne=class{constructor(e){this.expr=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addDeclaration(o`const ${t} = ${this.expr};`),e.resolve(t)}};function Ne(n,...e){return new ae(o(n,...e))}var ae=class{constructor(e){this._declaration=e}resolve(e){return e.addDeclaration(o`${this._declaration}`),""}};function ze(n,...e){return new le(o(n,...e))}var le=class{constructor(e){this.body=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addDeclaration(o`fn ${t}${this.body}`.$name(this._label)),e.resolve(t)}with(e,t){return new ie(this,[e,t])}toString(){var e;return`fn:${(e=this.label)!=null?e:"<unnamed>"}`}},ie=class n{constructor(e,t){this._innerFn=e;this._slotValuePair=t}get label(){return this._innerFn.label}with(e,t){return new n(this,[e,t])}resolve(e){return e.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,s;let[e,t]=this._slotValuePair;return`fn:${(r=this.label)!=null?r:"<unnamed>"}[${(s=e.label)!=null?s:"<unnamed>"}=${t}]`}};function qe(n,e){let t=n.map(s=>[new T,s]),r=t.map(([s,l])=>s);return s=>{let l=s(...r);return new ue(t,e,l)}}var oe=class{constructor(e,t){this.usedFn=e;this.args=t}resolve(e){let t=this.args.map((r,s)=>{let l=s<this.args.length-1?", ":"";return o`${r}${l}`});return e.resolve(o`${this.usedFn}(${t})`.$name("internal"))}toString(){var e;return`fun:${(e=this.usedFn.label)!=null?e:"<unnamed>"}()`}},ue=class extends Ve{constructor(t,r,s){super();this.argPairs=t;this.returnType=r;this.body=s;a(this,"_label")}get label(){return this._label}$name(t){return this._label=t,this}resolve(t){let r=new T().$name(this._label),s=this.argPairs.map(([l,g],i)=>{let m=i<this.argPairs.length-1?", ":"";return Ae(g)?o`${l}: ptr<${g.scope}, ${g.pointsTo}>${m}`:o`${l}: ${g}${m}`});return this.returnType!==void 0?t.addDeclaration(o`fn ${r}(${s}) -> ${this.returnType} {
4
45
  ${this.body}
5
46
  }`):t.addDeclaration(o`fn ${r}(${s}) {
6
47
  ${this.body}
7
- }`),t.resolve(r)}_call(...t){return new N(this,t)}toString(){var t;return`fun:${(t=this._label)!=null?t:"<unnamed>"}`}};var Te=Symbol("This item can be set, owns its value (does not get value from an external source)");var he=Symbol("This plum's value is sourced from outside the runtime.");function S(n){return n[he]===!0}function ye(n){return typeof n=="function"?new j(n):new q(n)}function be(n,e){return new K(n,e)}function We(n){return n.__brand==="WgslPlum"}var Se,q=class{constructor(e){this._initial=e;a(this,"__brand","WgslPlum");a(this,Se,!0);a(this,"_label")}compute(e){return this._initial}$name(e){return this._label=e,this}get label(){return this._label}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};Se=Te;var j=class{constructor(e){this._compute=e;a(this,"__brand","WgslPlum");a(this,"_label")}$name(e){return this._label=e,this}get label(){return this._label}compute(e){return this._compute(e)}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}},Re,K=class{constructor(e,t){this._subscribe=e;this._getLatest=t;a(this,"__brand","WgslPlum");a(this,Re,!0);a(this,"_label");a(this,"_prev");a(this,"_version",0);this._prev=t()}$name(e){return this._label=e,this}get label(){return this._label}get version(){return this._version}subscribe(e){return this._subscribe(e)}compute(){let e=this._getLatest();return Object.is(e,this._prev)||(this._version++,this._prev=e),this._prev}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};Re=he;function ve(n){return new Q(n)}var Q=class{constructor(e=void 0){this.defaultValue=e;a(this,"__brand","WgslSlot");a(this,"label")}$name(e){return this.label=e,this}areEqual(e,t){return Object.is(e,t)}resolve(e){var r;let t=e.unwrap(this);if(!ie(t))throw new Error(`Cannot inject value of type ${typeof t} of slot '${(r=this.label)!=null?r:"<unnamed>"}' in code.`);return e.resolve(t)}toString(){var e;return`slot:${(e=this.label)!=null?e:"<unnamed>"}`}};var _e=(n,e)=>new Y(n,e,"private"),Y=class{constructor(e,t,r){this._dataType=e;this._initialValue=t;this.scope=r;a(this,"identifier",new m)}$name(e){return this.identifier.$name(e),this}resolve(e){return this._initialValue?e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`):e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType};`),e.resolve(this.identifier)}};var Ae=Object.assign(o,{code:o,fn:me,fun:ce,buffer:de,plum:ye,plumFromEvent:be,slot:ve,constant:pe,declare:fe,var:_e});import{BufferReader as Ue,BufferWriter as xe}from"typed-binary";var X=(n,e)=>{let t=e-1,r=~t;return n&t?(n&r)+e:n};var R=class{constructor(){a(this,"_stateMap",new WeakMap)}inspect(e){return this._stateMap.get(e)}_getState(e){let t=this._stateMap.get(e);if(!t){let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);t={value:r,dependencies:s,version:0},this._stateMap.set(e,t)}return t}_notifyListeners(e){let t=this._getState(e);if(!t.active)return;let r=[...t.active.listeners];for(let s of r)s()}_computeAndGatherDependencies(e){let t=new Map,r=s=>{if(!t.has(s)){let l=this._getState(s);t.set(s,l.version)}return this.get(s)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let l of t.active.unsubs)l();let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);if(t.dependencies=s,t.active)for(let[l]of t.dependencies)t.active.unsubs.add(this.subscribe(l,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=S(e)?e.version:t.version+1,this._notifyListeners(e)),t.value}get(e){let t=this._getState(e);if(t.active)return t.value;let r=!1;return S(e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([s,l])=>(this.get(s),this._getState(s).version!==l))),r?this._recompute(e):t.value}set(e,t){let r=this._getState(e);Object.is(r.value,t)||(r.value=t,r.version++,this._notifyListeners(e))}subscribe(e,t){let r=this._getState(e),s;if(!r.active){let l=new Set;r.active={listeners:new Set,unsubs:l};for(let[i]of r.dependencies)l.add(this.subscribe(i,()=>{this._recompute(e)}));S(e)&&(s=e.subscribe(()=>{this._recompute(e)}))}return r.active.listeners.add(t),()=>{if(r.active&&(r.active.listeners.delete(t),r.active.listeners.size===0)){for(let l of r.active.unsubs)l();s==null||s(),r.active=void 0}}}};var A=class{constructor(){a(this,"_queue",[]);a(this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(s){r(s)}}),this._processQueue()})}async _processQueue(){if(!this._pending){for(this._pending=!0;this._queue.length>0;){let e=this._queue.shift();e&&await e()}this._pending=!1}}};var U=class{constructor(e){this.device=e;a(this,"_entryToBufferMap",new Map);a(this,"_pipelineExecutors",[]);a(this,"_commandEncoder",null);a(this,"_readBuffer",null);a(this,"_taskQueue",new A);a(this,"_plumStore",new R);a(this,"_allocSubscriptions",new Map)}get commandEncoder(){return this._commandEncoder||(this._commandEncoder=this.device.createCommandEncoder()),this._commandEncoder}dispose(){var e;for(let t of this._allocSubscriptions.values())t();this._allocSubscriptions.clear();for(let t of this._entryToBufferMap.values())t.destroy();this._entryToBufferMap.clear(),(e=this._readBuffer)==null||e.destroy()}bufferFor(e){let t=this._entryToBufferMap.get(e);if(!t){if(t=this.device.createBuffer({usage:e.flags,size:X(e.dataType.size,e.dataType.byteAlignment),mappedAtCreation:e.initial!==void 0}),!t)throw new Error(`Failed to create buffer for ${e}`);if(e.initial!==void 0){let r=new xe(t.getMappedRange());if(We(e.initial)){let s=e.initial;e.dataType.write(r,this._plumStore.get(s)),this._allocSubscriptions.set(e,this._plumStore.subscribe(s,()=>{this.writeBuffer(e,this._plumStore.get(s))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var l;this.flush(),(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((l=this._readBuffer)==null||l.destroy(),this._readBuffer=this.device.createBuffer({usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,size:e.dataType.size}));let t=this.bufferFor(e),r=this.device.createCommandEncoder();r.copyBufferToBuffer(t,0,this._readBuffer,0,e.dataType.size),this.device.queue.submit([r.finish()]),await this.device.queue.onSubmittedWorkDone(),await this._readBuffer.mapAsync(GPUMapMode.READ,0,e.dataType.size);let s=e.dataType.read(new Ue(this._readBuffer.getMappedRange()));return this._readBuffer.unmap(),s})}writeBuffer(e,t){let r=this.bufferFor(e),s=X(e.dataType.size,e.dataType.byteAlignment),l=new ArrayBuffer(s);e.dataType.write(new xe(l),t),this.device.queue.writeBuffer(r,0,l,0,s)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var g,c,T,h,y,p,f,_,v,Z,ee,te,re;let t=new b(this,o`
8
- @vertex fn main_vertex(${e.vertex.args.flatMap(W=>[W,", "])}) -> ${e.vertex.output} {
9
- ${e.vertex.code}
10
- }
11
-
12
- ${(c=(g=e.externalDeclarations)==null?void 0:g.flatMap(W=>[W,`
13
- `]))!=null?c:""}
14
- `).build({bindingGroup:((T=e.externalLayouts)!=null?T:[]).length,shaderStage:GPUShaderStage.VERTEX}),r=new b(this,o`
15
- @fragment fn main_frag(${e.fragment.args.flatMap(W=>[W,", "])}) -> ${e.fragment.output} {
16
- ${e.fragment.code}
17
- }
18
-
19
- ${(y=(h=e.externalDeclarations)==null?void 0:h.flatMap(W=>[W,`
20
- `]))!=null?y:""}
21
- `).build({bindingGroup:((p=e.externalLayouts)!=null?p:[]).length+1,shaderStage:GPUShaderStage.FRAGMENT}),s=this.device.createShaderModule({code:t.code}),l=this.device.createShaderModule({code:r.code}),i=this.device.createPipelineLayout({label:(f=e.label)!=null?f:"",bindGroupLayouts:[...(_=e.externalLayouts)!=null?_:[],t.bindGroupLayout,r.bindGroupLayout]}),u=this.device.createRenderPipeline({label:(v=e.label)!=null?v:"",layout:i,vertex:{module:s,buffers:(Z=e.vertex.buffersLayouts)!=null?Z:[]},fragment:{module:l,targets:(ee=e.fragment.target)!=null?ee:[]},primitive:e.primitive}),d=new H(this,u,[t,r],(re=(te=e.externalLayouts)==null?void 0:te.length)!=null?re:0);return this._pipelineExecutors.push(d),d}makeComputePipeline(e){var g,c,T,h,y,p,f,_;let{args:t=[],workgroupSize:r=[1,1]}=e,s=new b(this,o`
22
- @compute @workgroup_size(${r.join(", ")}) fn main_compute(${t.flatMap(v=>[v,", "])}) {
23
- ${e.code}
24
- }
25
-
26
- ${(c=(g=e.externalDeclarations)==null?void 0:g.flatMap(v=>[v,`
27
- `]))!=null?c:""}
28
- `).build({bindingGroup:((T=e.externalLayouts)!=null?T:[]).length,shaderStage:GPUShaderStage.COMPUTE}),l=this.device.createShaderModule({code:s.code}),i=this.device.createPipelineLayout({label:(h=e.label)!=null?h:"",bindGroupLayouts:[...(y=e.externalLayouts)!=null?y:[],s.bindGroupLayout]}),u=this.device.createComputePipeline({label:(p=e.label)!=null?p:"",layout:i,compute:{module:l}}),d=new J(this,u,[s],(_=(f=e.externalLayouts)==null?void 0:f.length)!=null?_:0);return this._pipelineExecutors.push(d),d}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},B=class{constructor(e,t,r,s,l){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=s;this.label=l}},H=class extends B{execute(e){var T,h,y;let c=e,{vertexCount:t,instanceCount:r,firstVertex:s,firstInstance:l,externalBindGroups:i,externalVertexBuffers:u}=c,d=ae(c,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers"]);if(((T=i==null?void 0:i.length)!=null?T:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(h=i==null?void 0:i.length)!=null?h:0}`);let g=this._runtime.commandEncoder.beginRenderPass(ne(se({},d),{label:(y=this.label)!=null?y:""}));g.setPipeline(this.pipeline),(i!=null?i:[]).forEach((p,f)=>g.setBindGroup(f,p)),(u!=null?u:[]).forEach((p,f)=>g.setVertexBuffer(f,p)),this.programs.forEach((p,f)=>{g.setBindGroup((i!=null?i:[]).length+f,p.bindGroup)}),g.draw(t,r,s,l),g.end()}},J=class extends B{execute(e){var l,i,u;let{workgroups:t=[1,1],externalBindGroups:r}=e!=null?e:{};if(((l=r==null?void 0:r.length)!=null?l:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(i=r==null?void 0:r.length)!=null?i:0}`);let s=this._runtime.commandEncoder.beginComputePass({label:(u=this.label)!=null?u:""});s.setPipeline(this.pipeline),(r!=null?r:[]).forEach((d,g)=>s.setBindGroup(g,d)),this.programs.forEach((d,g)=>s.setBindGroup((r!=null?r:[]).length+g,d.bindGroup)),s.dispatchWorkgroups(...t),s.end()}};async function Be(n){if(n instanceof GPUDevice)return new U(n);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(n==null?void 0:n.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new U(await e.requestDevice(n==null?void 0:n.device))}export{le as MissingSlotValueError,b as ProgramBuilder,x as RandomNameRegistry,$e as RecursiveDataTypeError,$ as ResolutionError,V as StrictNameRegistry,Be as createRuntime,ue as isPointer,D as isResolvable,oe as isSlot,ie as isWgsl,Ae as wgsl};
48
+ }`),t.resolve(r)}_call(...t){return new oe(this,t)}toString(){var t;return`fun:${(t=this._label)!=null?t:"<unnamed>"}`}};var je=Symbol("This item can be set, owns its value (does not get value from an external source)");var Ke=Symbol("This plum's value is sourced from outside the runtime.");function I(n){return n[Ke]===!0}function Ye(n){return typeof n=="function"?new ge(n):new de(n)}function Qe(n,e){return new pe(n,e)}function Xe(n){return n.__brand==="WgslPlum"}var at,de=class{constructor(e){this._initial=e;a(this,"__brand","WgslPlum");a(this,at,!0);a(this,"_label")}compute(e){return this._initial}$name(e){return this._label=e,this}get label(){return this._label}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};at=je;var ge=class{constructor(e){this._compute=e;a(this,"__brand","WgslPlum");a(this,"_label")}$name(e){return this._label=e,this}get label(){return this._label}compute(e){return this._compute(e)}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}},lt,pe=class{constructor(e,t){this._subscribe=e;this._getLatest=t;a(this,"__brand","WgslPlum");a(this,lt,!0);a(this,"_label");a(this,"_prev");a(this,"_version",0);this._prev=t()}$name(e){return this._label=e,this}get label(){return this._label}get version(){return this._version}subscribe(e){return this._subscribe(e)}compute(){let e=this._getLatest();return Object.is(e,this._prev)||(this._version++,this._prev=e),this._prev}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};lt=Ke;function He(n){return new me(n)}var me=class{constructor(e=void 0){this.defaultValue=e;a(this,"__brand","WgslSlot");a(this,"label")}$name(e){return this.label=e,this}areEqual(e,t){return Object.is(e,t)}resolve(e){var r;let t=e.unwrap(this);if(!Pe(t))throw new Error(`Cannot inject value of type ${typeof t} of slot '${(r=this.label)!=null?r:"<unnamed>"}' in code.`);return e.resolve(t)}toString(){var e;return`slot:${(e=this.label)!=null?e:"<unnamed>"}`}};var Je=(n,e,t="private")=>new ce(n,e,t),ce=class{constructor(e,t,r){this._dataType=e;this._initialValue=t;this.scope=r;a(this,"identifier",new T)}$name(e){return this.identifier.$name(e),this}resolve(e){return this._initialValue?e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`):e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType};`),e.resolve(this.identifier)}};var it=Object.assign(o,{code:o,fn:ze,fun:qe,buffer:Ie,plum:Ye,plumFromEvent:Qe,slot:He,constant:Le,declare:Ne,var:Je,sampler:Ee,texture:Oe,textureExternal:Me,builtin:$e});import{BufferReader as ot,BufferWriter as Ze}from"typed-binary";var fe=(n,e)=>{let t=e-1,r=~t;return n&t?(n&r)+e:n};var L=class{constructor(){a(this,"_stateMap",new WeakMap)}inspect(e){return this._stateMap.get(e)}_getState(e){let t=this._stateMap.get(e);if(!t){let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);t={value:r,dependencies:s,version:0},this._stateMap.set(e,t)}return t}_notifyListeners(e){let t=this._getState(e);if(!t.active)return;let r=[...t.active.listeners];for(let s of r)s(t.value)}_computeAndGatherDependencies(e){let t=new Map,r=s=>{if(!t.has(s)){let l=this._getState(s);t.set(s,l.version)}return this.get(s)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let l of t.active.unsubs)l();let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);if(t.dependencies=s,t.active)for(let[l]of t.dependencies)t.active.unsubs.add(this.subscribe(l,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=I(e)?e.version:t.version+1,this._notifyListeners(e)),t.value}get(e){let t=this._getState(e);if(t.active)return t.value;let r=!1;return I(e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([s,l])=>(this.get(s),this._getState(s).version!==l))),r?this._recompute(e):t.value}set(e,t){let r=this._getState(e);Object.is(r.value,t)||(r.value=t,r.version++,this._notifyListeners(e))}subscribe(e,t){let r=this._getState(e),s;if(!r.active){let l=new Set;r.active={listeners:new Set,unsubs:l};for(let[g]of r.dependencies)l.add(this.subscribe(g,()=>{this._recompute(e)}));I(e)&&(s=e.subscribe(()=>{this._recompute(e)}))}return r.active.listeners.add(t),()=>{if(r.active&&(r.active.listeners.delete(t),r.active.listeners.size===0)){for(let l of r.active.unsubs)l();s==null||s(),r.active=void 0}}}};var N=class{constructor(){a(this,"_queue",[]);a(this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(s){r(s)}}),this._processQueue()})}async _processQueue(){if(!this._pending){for(this._pending=!0;this._queue.length>0;){let e=this._queue.shift();e&&await e()}this._pending=!1}}};var z=class{constructor(e){this.device=e;a(this,"_entryToBufferMap",new Map);a(this,"_samplers",new WeakMap);a(this,"_textures",new WeakMap);a(this,"_textureViews",new WeakMap);a(this,"_pipelineExecutors",[]);a(this,"_commandEncoder",null);a(this,"_readBuffer",null);a(this,"_taskQueue",new N);a(this,"_plumStore",new L);a(this,"_allocSubscriptions",new Map)}get commandEncoder(){return this._commandEncoder||(this._commandEncoder=this.device.createCommandEncoder()),this._commandEncoder}dispose(){var e;for(let t of this._allocSubscriptions.values())t();this._allocSubscriptions.clear();for(let t of this._entryToBufferMap.values())t.destroy();this._entryToBufferMap.clear(),(e=this._readBuffer)==null||e.destroy()}bufferFor(e){let t=this._entryToBufferMap.get(e);if(!t){if(t=this.device.createBuffer({usage:e.flags,size:fe(e.dataType.size,e.dataType.byteAlignment),mappedAtCreation:e.initial!==void 0}),!t)throw new Error(`Failed to create buffer for ${e}`);if(e.initial!==void 0){let r=new Ze(t.getMappedRange());if(Xe(e.initial)){let s=e.initial;e.dataType.write(r,this._plumStore.get(s)),this._allocSubscriptions.set(e,this._plumStore.subscribe(s,()=>{this.writeBuffer(e,this._plumStore.get(s))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}textureFor(e){let t;"texture"in e?t=e.texture:t=e;let r=this._textures.get(t);if(!r){let s=E(G({},t.descriptor),{usage:t.flags});if(r=this.device.createTexture(s),!r)throw new Error(`Failed to create texture for ${e}`);this._textures.set(t,r)}return r}viewFor(e){let t=this._textureViews.get(e);return t||(t=this.textureFor(e.texture).createView(e.descriptor),this._textureViews.set(e,t)),t}externalTextureFor(e){return this.device.importExternalTexture(e.descriptor)}samplerFor(e){let t=this._samplers.get(e);if(!t){if(t=this.device.createSampler(e.descriptor),!t)throw new Error(`Failed to create sampler for ${e}`);this._samplers.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var l;this.flush(),(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((l=this._readBuffer)==null||l.destroy(),this._readBuffer=this.device.createBuffer({usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,size:e.dataType.size}));let t=this.bufferFor(e),r=this.device.createCommandEncoder();r.copyBufferToBuffer(t,0,this._readBuffer,0,e.dataType.size),this.device.queue.submit([r.finish()]),await this.device.queue.onSubmittedWorkDone(),await this._readBuffer.mapAsync(GPUMapMode.READ,0,e.dataType.size);let s=e.dataType.read(new ot(this._readBuffer.getMappedRange()));return this._readBuffer.unmap(),s})}writeBuffer(e,t){let r=this.bufferFor(e),s=fe(e.dataType.size,e.dataType.byteAlignment),l=new ArrayBuffer(s);e.dataType.write(new Ze(l),t),this.device.queue.writeBuffer(r,0,l,0,s)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){if(typeof t=="function"){let r=t;this._plumStore.set(e,r(this._plumStore.get(e)))}else this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var y,x,d,W,A,j,D,V;let[t,r,s]=new M(this,e.vertex.code,e.fragment.code,e.vertex.output).build({bindingGroup:((y=e.externalLayouts)!=null?y:[]).length}),l=s.map((v,B)=>{if(!v.allocatable.vertexLayout)throw new Error(`Buffer ${v.allocatable} does not have a vertex layout`);return E(G({},v.allocatable.vertexLayout),{attributes:[{shaderLocation:B,offset:0,format:Ge(v.allocatable.dataType)}]})}),g=this.device.createShaderModule({code:t.code}),i=this.device.createShaderModule({code:r.code}),m=this.device.createPipelineLayout({label:(x=e.label)!=null?x:"",bindGroupLayouts:[...(d=e.externalLayouts)!=null?d:[],t.bindGroupLayout,r.bindGroupLayout]}),p=this.device.createRenderPipeline({label:(W=e.label)!=null?W:"",layout:m,vertex:{module:g,buffers:l},fragment:{module:i,targets:(j=(A=e.fragment)==null?void 0:A.target)!=null?j:[]},primitive:e.primitive}),c=s.map((v,B)=>[this.bufferFor(v.allocatable),B]),f=new Te(this,p,t,r,(V=(D=e.externalLayouts)==null?void 0:D.length)!=null?V:0,c);return this._pipelineExecutors.push(f),f}makeComputePipeline(e){var i,m,p,c,f,y,x;let t=new k(this,e.code,(i=e.workgroupSize)!=null?i:[1]).build({bindingGroup:((m=e.externalLayouts)!=null?m:[]).length}),r=this.device.createShaderModule({code:t.code}),s=this.device.createPipelineLayout({label:(p=e.label)!=null?p:"",bindGroupLayouts:[...(c=e.externalLayouts)!=null?c:[],t.bindGroupLayout]}),l=this.device.createComputePipeline({label:(f=e.label)!=null?f:"",layout:s,compute:{module:r}}),g=new ye(this,l,[t],(x=(y=e.externalLayouts)==null?void 0:y.length)!=null?x:0);return this._pipelineExecutors.push(g),g}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},q=class{constructor(e,t,r,s,l){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=s;this.label=l}},Te=class extends q{constructor(t,r,s,l,g,i){super(t,r,[s,l],g);a(this,"_vertexProgram");a(this,"_fragmentProgram");a(this,"_usedVertexBuffers");this._vertexProgram=s,this._fragmentProgram=l,this._usedVertexBuffers=new Set(i)}execute(t){var f,y,x;let c=t,{vertexCount:r,instanceCount:s,firstVertex:l,firstInstance:g,externalBindGroups:i}=c,m=ve(c,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups"]);if(((f=i==null?void 0:i.length)!=null?f:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(y=i==null?void 0:i.length)!=null?y:0}`);let p=this._runtime.commandEncoder.beginRenderPass(E(G({},m),{label:(x=this.label)!=null?x:""}));p.setPipeline(this.pipeline),(i!=null?i:[]).forEach((d,W)=>p.setBindGroup(W,d)),p.setBindGroup((i!=null?i:[]).length,this._vertexProgram.bindGroup),p.setBindGroup((i!=null?i:[]).length+1,this._fragmentProgram.bindGroup);for(let[d,W]of this._usedVertexBuffers)p.setVertexBuffer(W,d);p.draw(r,s,l,g),p.end()}},ye=class extends q{execute(e){var l,g,i;let{workgroups:t=[1,1],externalBindGroups:r}=e!=null?e:{};if(((l=r==null?void 0:r.length)!=null?l:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(g=r==null?void 0:r.length)!=null?g:0}`);let s=this._runtime.commandEncoder.beginComputePass({label:(i=this.label)!=null?i:""});s.setPipeline(this.pipeline),(r!=null?r:[]).forEach((m,p)=>s.setBindGroup(p,m)),this.programs.forEach((m,p)=>s.setBindGroup((r!=null?r:[]).length+p,m.bindGroup)),s.dispatchWorkgroups(...t),s.end()}};async function ut(n){if(n instanceof GPUDevice)return new z(n);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(n==null?void 0:n.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new z(await e.requestDevice(n==null?void 0:n.device))}export{we as MissingSlotValueError,_ as ProgramBuilder,b as RandomNameRegistry,dt as RecursiveDataTypeError,K as ResolutionError,X as StrictNameRegistry,$e as builtin,ut as createRuntime,Ge as deriveVertexFormat,mt as getBuiltinInfo,De as getUsedBuiltinsNamed,Se as isDepthTextureType,Ue as isExternalTextureType,Ae as isPointer,Y as isResolvable,Re as isSamplerType,_e as isSlot,pt as isStorageTextureType,gt as isTypedTextureType,Pe as isWgsl,it as wgsl};
29
49
  //# sourceMappingURL=index.js.map