typegpu 0.0.0-alpha.3 → 0.0.0-alpha.5
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +29 -0
- package/chunk-337KOXP7.js +2 -0
- package/chunk-337KOXP7.js.map +1 -0
- package/chunk-6WFXH2OR.js +8 -0
- package/chunk-6WFXH2OR.js.map +1 -0
- package/chunk-G6QA55EY.cjs +8 -0
- package/chunk-G6QA55EY.cjs.map +1 -0
- package/chunk-S55XYV7U.cjs +2 -0
- package/chunk-S55XYV7U.cjs.map +1 -0
- package/data/index.cjs +1 -9
- package/data/index.cjs.map +1 -1
- package/data/index.d.cts +41 -46
- package/data/index.d.ts +41 -46
- package/data/index.js +1 -9
- package/data/index.js.map +1 -1
- package/index.cjs +1 -28
- package/index.cjs.map +1 -1
- package/index.d.cts +54 -250
- package/index.d.ts +54 -250
- package/index.js +1 -28
- package/index.js.map +1 -1
- package/macro/index.cjs +3 -3
- package/macro/index.cjs.map +1 -1
- package/macro/index.d.cts +1 -1
- package/macro/index.d.ts +1 -1
- package/macro/index.js +2 -2
- package/macro/index.js.map +1 -1
- package/package.json +15 -14
- package/types-DU0c7BuW.d.cts +207 -0
- package/types-DU0c7BuW.d.ts +207 -0
- package/.DS_Store +0 -0
- package/chunk-G3WAZR24.cjs +0 -4
- package/chunk-G3WAZR24.cjs.map +0 -1
- package/chunk-JYXJ5NFX.cjs +0 -2
- package/chunk-JYXJ5NFX.cjs.map +0 -1
- package/chunk-K6N2A55L.js +0 -4
- package/chunk-K6N2A55L.js.map +0 -1
- package/chunk-NTGWE7PR.js +0 -2
- package/chunk-NTGWE7PR.js.map +0 -1
- package/struct-ER9XI7ad.d.cts +0 -9
- package/struct-udnQvwHG.d.ts +0 -9
- package/types-DeF6xFAt.d.cts +0 -148
- package/types-DeF6xFAt.d.ts +0 -148
package/index.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/callable.ts","../src/nameRegistry.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","RandomNameRegistry","item","name","label","StrictNameRegistry","assignedName","index","unusedName","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","itemCtx","_a","instances","instance","slot","expectedValue","result","err","ResolutionError","slotToValueMap","usedSlot","_bindable","declaration","ResolutionCtxImpl","bindingGroup","_declaration","_identifier","MissingSlotValueError","eventual","slotValueOverrides","isResolvable","ScopedResolutionCtx","_ScopedResolutionCtx","_parent","_shared","_slotValuePairs","bindable","identifier","group","idx","code","token","slotToValuePair","boundSlot","maybeSlot","isSlot","usageToBindingTypeMap","ProgramBuilder","runtime","root","options","ctx","codeString","usedBindables","bindGroupLayout","bindGroup","bufferUsage","buffer","usage","WgslBufferUsageImpl","WgslIdentifier","typeSchema","initial","WgslBufferImpl","dataType","enrichedThis","flags","constant","expr","WgslConstImpl","declare","strings","params","WgslDeclareImpl","fn","WgslFnImpl","body","value","BoundWgslFnImpl","_BoundWgslFnImpl","_innerFn","_slotValuePair","_b","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","a","b","isWgsl","variable","initialValue","WgslVarImpl","_dataType","_initialValue","scope","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","commandEncoder","res","data","gpuBuffer","size","hostBuffer","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","vertexProgram","arg","fragmentProgram","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","workgroupSize","program","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers","descriptor","__objRest","passEncoder","__spreadProps","__spreadValues","i","workgroups","createRuntime","adapter"],"mappings":"uKACA,IAAeA,EAAf,cAAmE,QAAS,CAG1E,aAAc,CAUZ,MAAM,UAAW,mCAAmC,EAZtDC,EAAA,eAeE,YAAK,OAAS,KAAK,KAAK,IAAI,EAGrB,KAAK,MACd,CAGF,EAWOC,GAAQF,EC7BR,IAAMG,EAAN,KAAiD,CAAjD,cACLF,EAAA,KAAQ,eAAe,GACvBA,EAAA,KAAQ,QAAQ,IAAI,SAEpB,QAAQG,EAAsB,CAC5B,IAAIC,EAAO,KAAK,MAAM,IAAID,CAAI,EAE9B,GAAIC,IAAS,OAAW,CAEtB,IAAIC,EACAF,EAAK,OACPE,EAAQF,EAAK,MAAM,WAAW,MAAO,GAAG,EACxCE,EAAQA,EAAM,WAAW,WAAY,EAAE,GAEvCA,EAAQ,OAEVD,EAAO,GAAGC,CAAK,IAAI,KAAK,cAAc,GACtC,KAAK,MAAM,IAAIF,EAAMC,CAAI,CAC3B,CAEA,OAAOA,CACT,CACF,EAEaE,EAAN,KAAiD,CAAjD,cAKLN,EAAA,KAAiB,aAAa,IAAI,KAElCA,EAAA,KAAiB,iBAAiB,IAAI,SAEtC,QAAQG,EAA8B,CACpC,IAAMI,EAAe,KAAK,eAAe,IAAIJ,CAAI,EACjD,GAAII,IAAiB,OACnB,OAAOA,EAGT,GAAIJ,EAAK,QAAU,OACjB,MAAM,IAAI,MAAM,qDAAqD,EAGvE,IAAIK,EAAQ,EACRC,EAAaN,EAAK,MACtB,KAAO,KAAK,WAAW,IAAIM,CAAU,GACnCD,IACAC,EAAa,GAAGN,EAAK,KAAK,IAAIK,CAAK,GAGrC,YAAK,WAAW,IAAIC,CAAU,EAC9B,KAAK,eAAe,IAAIN,EAAMM,CAAU,EACjCA,CACT,CACF,ECpCA,IAAMC,GAAqD,CACzD,QAAS,UACT,gBAAiB,sBACjB,iBAAkB,eACpB,EAEMC,EAAN,KAA4B,CAY1B,YACkBC,EACCC,EACjB,CAFgB,WAAAD,EACC,mBAAAC,EAbnBb,EAAA,KAAiB,oBAAoB,IAAI,SAOzCA,EAAA,KAAQ,sBAAsB,GAC9BA,EAAA,KAAiB,iBAAiB,IAAI,KACtCA,EAAA,KAAiB,gBAA0B,CAAC,EAKzC,CAEH,IAAI,eAAwC,CAC1C,OAAO,KAAK,cACd,CAEA,IAAI,cAAiC,CACnC,OAAO,KAAK,aACd,CAOA,iBAAiBG,EAAsBW,EAAsC,CA5D/E,IAAAC,EA8DI,IAAMC,GAAYD,EAAA,KAAK,kBAAkB,IAAIZ,CAAI,IAA/B,KAAAY,EAAoC,CAAC,EAEvD,QAAWE,KAAYD,EAGrB,GAFuB,CAAC,GAAGC,EAAS,eAAe,QAAQ,CAAC,EAG3C,MACb,CAAC,CAACC,EAAMC,CAAa,IAAML,EAAQ,SAASI,CAAI,IAAMC,CACxD,EAEA,OAAOF,EAAS,OAKpB,IAAIG,EACJ,GAAI,CACFA,EAASjB,EAAK,QAAQW,CAAO,CAC/B,OAASO,EAAK,CACZ,MAAIA,aAAeC,EACXD,EAAI,cAAclB,CAAI,EAGxB,IAAImB,EAAgBD,EAAK,CAAClB,CAAI,CAAC,CACvC,CAGA,IAAMoB,EAAiB,IAAI,IAC3B,QAAWC,KAAYV,EAAQ,UAC7BS,EAAe,IAAIC,EAAUV,EAAQ,SAASU,CAAQ,CAAC,EAGzD,OAAAR,EAAU,KAAK,CAAE,eAAAO,EAAgB,OAAAH,CAAO,CAAC,EACzC,KAAK,kBAAkB,IAAIjB,EAAMa,CAAS,EAEnCI,CACT,CAEA,oBAAoBK,EAAyB,CAC3C,YAAK,eAAe,IAAIA,CAAS,EAE1B,CAAE,MAAO,KAAK,cAAe,IAAK,KAAK,qBAAsB,CACtE,CAEA,eAAeC,EAAqB,CAClC,KAAK,cAAc,KAAKA,CAAW,CACrC,CACF,EAEaC,EAAN,KAAiD,CAKtD,YAAY,CAAE,MAAAf,EAAO,aAAAgB,CAAa,EAA6B,CAJ/D5B,EAAA,KAAiB,WAEjBA,EAAA,iBAAY,IAAI,KAGd,KAAK,QAAU,IAAIW,EAAsBC,EAAOgB,GAAA,KAAAA,EAAgB,CAAC,CACnE,CAEA,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAQ,aACtB,CAEA,eAAeC,EAA8B,CAC3C,MAAM,IAAI,MAAM,qDAAqD,CACvE,CAEA,WAAWJ,EAAyBK,EAAmC,CACrE,MAAM,IAAI,MAAM,qDAAqD,CACvE,CAEA,QAAQ3B,EAA8B,CACpC,OAAO,KAAK,QAAQ,MAAM,QAAQA,CAAI,CACxC,CAEA,SAAYe,EAAsB,CAChC,GAAIA,EAAK,eAAiB,OACxB,MAAM,IAAIa,GAAsBb,CAAI,EAGtC,OAAOA,EAAK,YACd,CAEA,OAAUc,EAA0B,CAClC,MAAM,IAAI,MAAM,qDAAqD,CACvE,CAEA,QAAQ7B,EAAY8B,EAA+C,CAAC,EAAG,CACrE,GAAI,CAACC,EAAa/B,CAAI,EACpB,OAAO,OAAOA,CAAI,EAGpB,IAAMW,EAAU,IAAIqB,EAClB,KACA,KAAK,QACLF,CACF,EAEMb,EAAS,KAAK,QAAQ,iBAAiBjB,EAAMW,CAAO,EAE1D,MAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,YAAY,EAAE,KAAK;AAAA;AAAA,CAAM,CAAC,GAAGM,CAAM,EAChE,CACF,EAEMe,EAAN,MAAMC,CAA6C,CAGjD,YACmBC,EACAC,EACAC,EACjB,CAHiB,aAAAF,EACA,aAAAC,EACA,qBAAAC,EALnBvC,EAAA,iBAAY,IAAI,IAMb,CAEH,eAAe0B,EAAmC,CAChD,KAAK,QAAQ,eAAe,KAAK,QAAQA,CAAW,CAAC,CACvD,CAEA,WAAWc,EAAwBC,EAAkC,CACnE,GAAM,CAAE,MAAAC,EAAO,IAAAC,CAAI,EAAI,KAAK,QAAQ,oBAAoBH,CAAQ,EAEhE,KAAK,eACHI,WAAcF,CAAK,cAAcC,CAAG,SAASjC,GAAsB8B,EAAS,KAAK,CAAC,KAAKC,CAAU,KAAKD,EAAS,YAAY,QAAQ,GACrI,CACF,CAEA,QAAQK,EAA+B,CACrC,OAAO,KAAK,QAAQ,MAAM,QAAQA,CAAK,CACzC,CAEA,SAAY3B,EAAsB,CAChC,IAAM4B,EAAkB,KAAK,gBAAgB,KAC3C,CAAC,CAACC,CAAS,IAAMA,IAAc7B,CACjC,EAEA,OAAK4B,GAQL,KAAK,UAAU,IAAI5B,CAAI,EAChB4B,EAAgB,CAAC,IAPtB,KAAK,UAAU,IAAI5B,CAAI,EAEhB,KAAK,QAAQ,SAASA,CAAI,EAMrC,CAEA,OAAUc,EAA0B,CAClC,IAAIgB,EAAYhB,EAGhB,KAAOiB,GAAOD,CAAS,GACrBA,EAAY,KAAK,SAASA,CAAS,EAGrC,OAAOA,CACT,CAEA,QACE7C,EACA8B,EAA+C,CAAC,EACxC,CACR,GAAI,CAACC,EAAa/B,CAAI,EACpB,OAAO,OAAOA,CAAI,EAGpB,IAAMW,EAAU,IAAIsB,EAClB,KACA,KAAK,QACLH,CACF,EAEA,OAAO,KAAK,QAAQ,iBAAiB9B,EAAMW,CAAO,CACpD,CACF,ECzNA,IAAMoC,GAAmE,CACvE,QAAS,UACT,gBAAiB,UACjB,iBAAkB,mBACpB,EAEqBC,EAArB,KAAoC,CAClC,YACUC,EACAC,EACR,CAFQ,aAAAD,EACA,UAAAC,CACP,CAEH,MAAMC,EAAgC,CA7BxC,IAAAvC,EA8BI,IAAMwC,EAAM,IAAI5B,EAAkB,CAChC,OAAOZ,EAAAuC,EAAQ,eAAR,KAAAvC,EAAwB,IAAIb,EACnC,aAAcoD,EAAQ,YACxB,CAAC,EAGKE,EAAaD,EAAI,QAAQ,KAAK,IAAI,EAClCE,EAAgB,MAAM,KAAKF,EAAI,aAAa,EAE5CG,EAAkB,KAAK,QAAQ,OAAO,sBAAsB,CAChE,QAASD,EAAc,IAAI,CAACjB,EAAUG,KAAS,CAC7C,QAASA,EACT,WAAYW,EAAQ,YACpB,OAAQ,CACN,KAAMJ,GAAsBV,EAAS,KAAK,CAC5C,CACF,EAAE,CACJ,CAAC,EAEKmB,EAAY,KAAK,QAAQ,OAAO,gBAAgB,CACpD,OAAQD,EACR,QAASD,EAAc,IAAI,CAACjB,EAAUG,KAAS,CAC7C,QAASA,EACT,SAAU,CACR,OAAQ,KAAK,QAAQ,UAAUH,EAAS,WAAW,CACrD,CACF,EAAE,CACJ,CAAC,EAED,MAAO,CACL,gBAAAkB,EACA,UAAAC,EACA,KAAMH,CACR,CACF,CACF,EC7CO,SAASI,EAIdC,EACAC,EACgC,CAChC,OAAO,IAAIC,EAAoBF,EAAQC,CAAK,CAC9C,CAMA,IAAMC,EAAN,KAEA,CAGE,YACkBF,EACAC,EAChB,CAFgB,YAAAD,EACA,WAAAC,EAJlB9D,EAAA,KAAQ,SAKL,CAEH,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,MACd,CAEA,MAAMK,EAA2B,CAC/B,YAAK,OAASA,EACP,IACT,CAEA,QAAQkD,EAA4B,CAClC,IAAMd,EAAa,IAAIuB,EAEvB,OAAAT,EAAI,WAAW,KAAMd,CAAU,EAExBc,EAAI,QAAQd,CAAU,CAC/B,CAEA,UAAmB,CAjErB,IAAA1B,EAkEI,MAAO,GAAG,KAAK,KAAK,KAAIA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EACpD,CACF,ECpCO,SAAS8C,GAIdI,EACAC,EAC2B,CAC3B,OAAO,IAAIC,EAA8BF,EAAYC,CAAO,CAC9D,CAMA,IAAMC,EAAN,KAIA,CAmBE,YACkBC,EACAF,EAChB,CAFgB,cAAAE,EACA,aAAAF,EApBlBlE,EAAA,KAAO,QACL,eAAe,SAAW,eAAe,UAE3CA,EAAA,KAAQ,iBAOJ,CACF,QAAS,KACT,eAAgB,KAChB,gBAAiB,IACnB,GAEAA,EAAA,KAAQ,SAKL,CAEH,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMK,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,eAAgB,CACd,IAAMgE,EAAe,KACrB,YAAK,UAAU,eAAe,OAAO,EAChC,KAAK,eAAe,UACvB,KAAK,eAAe,QAAUT,EAAYS,EAAc,SAAS,GAE5DA,CACT,CAEA,uBAAwB,CACtB,IAAMA,EAAe,KAIrB,YAAK,UAAU,eAAe,OAAO,EAChC,KAAK,eAAe,kBACvB,KAAK,eAAe,gBAAkBT,EACpCS,EACA,kBACF,GAEKA,CACT,CAEA,sBAAuB,CACrB,IAAMA,EAAe,KACrB,YAAK,UAAU,eAAe,OAAO,EAChC,KAAK,eAAe,iBACvB,KAAK,eAAe,eAAiBT,EACnCS,EACA,iBACF,GAEKA,CACT,CAGA,UAAUC,EAA4B,CACpC,YAAK,OAASA,EACP,IACT,CAEA,WAAY,CACV,OAAO,KAAK,eAAe,OAG7B,CAEA,kBAAmB,CACjB,OAAO,KAAK,eACT,cAGL,CAEA,mBAAoB,CAClB,OAAO,KAAK,eACT,eAGL,CAEA,UAAmB,CAjJrB,IAAAvD,EAkJI,MAAO,WAAUA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC7C,CACF,ECpIO,SAASwD,GAASC,EAAuB,CAC9C,OAAO,IAAIC,EAAcD,CAAI,CAC/B,CAMA,IAAMC,EAAN,KAAyC,CAGvC,YAA6BD,EAAY,CAAZ,UAAAA,EAF7BxE,EAAA,KAAQ,SAEkC,CAE1C,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMK,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,QAAQkD,EAA4B,CAClC,IAAMd,EAAa,IAAIuB,EAAe,EAAE,MAAM,KAAK,MAAM,EAEzD,OAAAT,EAAI,eAAeX,UAAaH,CAAU,MAAM,KAAK,IAAI,GAAG,EAErDc,EAAI,QAAQd,CAAU,CAC/B,CACF,EC/BO,SAASiC,GACdC,KACGC,EACU,CACb,OAAO,IAAIC,EAAgBjC,EAAK+B,EAAS,GAAGC,CAAM,CAAC,CACrD,CAMA,IAAMC,EAAN,KAA6C,CAC3C,YAA6BhD,EAAoB,CAApB,kBAAAA,CAAqB,CAElD,QAAQ0B,EAA4B,CAClC,OAAAA,EAAI,eAAeX,IAAO,KAAK,YAAY,EAAE,EACtC,EACT,CACF,ECRO,SAASkC,GACdH,KACGC,EACK,CACR,OAAO,IAAIG,EAAWnC,EAAK+B,EAAS,GAAGC,CAAM,CAAC,CAChD,CAMA,IAAMG,EAAN,KAAmC,CAGjC,YAA6BC,EAAY,CAAZ,UAAAA,EAF7BhF,EAAA,KAAQ,SAEkC,CAE1C,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMK,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,QAAQkD,EAA4B,CAClC,IAAMd,EAAa,IAAIuB,EAAe,EAAE,MAAM,KAAK,MAAM,EAEzD,OAAAT,EAAI,eAAeX,OAAUH,CAAU,GAAG,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM,CAAC,EAEjEc,EAAI,QAAQd,CAAU,CAC/B,CAEA,KAAQvB,EAAmB+D,EAAuB,CAChD,OAAO,IAAIC,EAAgB,KAAM,CAAChE,EAAM+D,CAAK,CAAC,CAChD,CAEA,UAAmB,CA7DrB,IAAAlE,EA8DI,MAAO,OAAMA,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,EACxC,CACF,EAEMmE,EAAN,MAAMC,CAA0C,CAC9C,YACmBC,EACAC,EACjB,CAFiB,cAAAD,EACA,oBAAAC,CAChB,CAEH,IAAI,OAAQ,CACV,OAAO,KAAK,SAAS,KACvB,CAEA,KAAanE,EAAwB+D,EAAsC,CACzE,OAAO,IAAIE,EAAgB,KAAM,CAACjE,EAAM+D,CAAK,CAAC,CAChD,CAEA,QAAQ1B,EAA4B,CAClC,OAAOA,EAAI,QAAQ,KAAK,SAAU,CAAC,KAAK,cAAc,CAAC,CACzD,CAEA,UAAmB,CApFrB,IAAAxC,EAAAuE,EAqFI,GAAM,CAACpE,EAAM+D,CAAK,EAAI,KAAK,eAC3B,MAAO,OAAMlE,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,KAAIuE,EAAApE,EAAK,QAAL,KAAAoE,EAAc,WAAW,IAAIL,CAAK,GAC9E,CACF,EC9DO,SAASH,GAGdS,EAAqBC,EAAsB,CAC3C,IAAMC,EAAWF,EAAS,IACvBG,GAAY,CAAC,IAAI1B,EAAkB0B,CAAO,CAC7C,EAEMC,EAAYF,EAAS,IACzB,CAAC,CAACG,EAAUF,CAAO,IACjBE,CACJ,EAGA,OAAQC,GAAgD,CACtD,IAAMb,EAAOa,EAAa,GAAIF,CAAwB,EAQtD,OANmB,IAAIZ,EACrBU,EACAD,EACAR,CACF,CAOF,CACF,CAkBA,IAAMc,EAAN,KAIA,CACE,YACUC,EACSC,EACjB,CAFQ,YAAAD,EACS,UAAAC,CAChB,CAEH,QAAQzC,EAA4B,CAClC,IAAM0C,EAAW,KAAK,KAAK,IAAI,CAACC,EAAYvD,IAAQ,CAClD,IAAMwD,EAAQxD,EAAM,KAAK,KAAK,OAAS,EAAI,KAAO,GAClD,OAAOC,IAAOsD,CAAU,GAAGC,CAAK,EAClC,CAAC,EAED,OAAO5C,EAAI,QAAQX,IAAO,KAAK,MAAM,IAAIqD,CAAQ,IAAI,MAAM,UAAU,CAAC,CACxE,CAEA,UAAmB,CA5FrB,IAAAlF,EA6FI,MAAO,QAAOA,EAAA,KAAK,OAAO,QAAZ,KAAAA,EAAqB,WAAW,IAChD,CACF,EAEMgE,EAAN,cAKU9E,EAKV,CAGE,YACUwF,EACAD,EACSR,EACjB,CACA,MAAM,EAJE,cAAAS,EACA,gBAAAD,EACS,UAAAR,EALnBhF,EAAA,KAAQ,SAQR,CAEA,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMK,EAAe,CACnB,YAAK,OAASA,EACP,IACT,CAEA,QAAQkD,EAA4B,CAClC,IAAMd,EAAa,IAAIuB,EAAe,EAAE,MAAM,KAAK,MAAM,EAEnDiC,EAAW,KAAK,SAAS,IAAI,CAAC,CAACG,EAAOV,CAAO,EAAG/C,IAAQ,CAC5D,IAAMwD,EAAQxD,EAAM,KAAK,SAAS,OAAS,EAAI,KAAO,GAEtD,OAAI0D,GAAUX,CAAO,EACZ9C,IAAOwD,CAAK,SAASV,EAAQ,KAAK,KAAKA,EAAQ,QAAQ,IAAIS,CAAK,GAGlEvD,IAAOwD,CAAK,KAAKV,CAAO,GAAGS,CAAK,EACzC,CAAC,EAED,OAAI,KAAK,aAAe,OACtB5C,EAAI,eAAeX,OAAUH,CAAU,IAAIwD,CAAQ,QAAQ,KAAK,UAAU;AAAA,UACtE,KAAK,IAAI;AAAA,QACX,EAEF1C,EAAI,eAAeX,OAAUH,CAAU,IAAIwD,CAAQ;AAAA,UAC/C,KAAK,IAAI;AAAA,QACX,EAGG1C,EAAI,QAAQd,CAAU,CAC/B,CAEA,SACKuD,EACmC,CACtC,OAAO,IAAIF,EAAiB,KAAME,CAAI,CACxC,CAEA,UAAmB,CA/JrB,IAAAjF,EAgKI,MAAO,QAAOA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC1C,CACF,EClKO,IAAMuF,GAAoB,OAC/B,mFACF,ECuBO,IAAMC,GAAwB,OACnC,wDACF,EAQO,SAASC,EACdvB,EAC2B,CAC3B,OAAQA,EAA2BsB,EAAqB,IAAM,EAChE,CAsCO,SAASE,GACdC,EAC4C,CAC5C,OAAI,OAAOA,GAAqB,WACvB,IAAIC,EAAoBD,CAAsC,EAGhE,IAAIE,EAAmBF,CAAgB,CAChD,CAEO,SAASG,GACdC,EACAC,EACgC,CAChC,OAAO,IAAIC,EAAqBF,EAAWC,CAAS,CACtD,CAEO,SAASE,GAAUhC,EAAoD,CAC5E,OAAQA,EAAmB,UAAY,UACzC,CAhGA,IAAAlE,GAsGM6F,EAAN,KAA2E,CAMzE,YAA6BM,EAAkB,CAAlB,cAAAA,EAL7BlH,EAAA,KAAS,UAAU,YACnBA,EAAA,KAAUe,GAAqB,IAE/Bf,EAAA,KAAQ,SAEwC,CAEhD,QAAQmH,EAAc,CACpB,OAAO,KAAK,QACd,CAEA,MAAM9G,EAAqB,CACzB,YAAK,OAASA,EACP,IACT,CAEA,IAAI,OAA4B,CAC9B,OAAO,KAAK,MACd,CAEA,UAAmB,CA3HrB,IAAAU,EA4HI,MAAO,SAAQA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC3C,CACF,EAtBYA,GAAAuF,GAwBZ,IAAMK,EAAN,KAA8D,CAI5D,YAA6BS,EAAmC,CAAnC,cAAAA,EAH7BpH,EAAA,KAAS,UAAU,YACnBA,EAAA,KAAQ,SAEyD,CAEjE,MAAMK,EAAqB,CACzB,YAAK,OAASA,EACP,IACT,CAEA,IAAI,OAA4B,CAC9B,OAAO,KAAK,MACd,CAEA,QAAQgH,EAAqB,CAC3B,OAAO,KAAK,SAASA,CAAG,CAC1B,CAEA,UAAmB,CAnJrB,IAAAtG,EAoJI,MAAO,SAAQA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC3C,CACF,EAtJAA,GAwJMiG,EAAN,KAEA,CAQE,YACmBM,EACAC,EACjB,CAFiB,gBAAAD,EACA,gBAAAC,EATnBvH,EAAA,KAAS,UAAU,YACnBA,EAAA,KAAUe,GAAyB,IAEnCf,EAAA,KAAQ,UACRA,EAAA,KAAQ,SACRA,EAAA,KAAQ,WAAW,GAMjB,KAAK,MAAQuH,EAAW,CAC1B,CAEA,MAAMlH,EAAqB,CACzB,YAAK,OAASA,EACP,IACT,CAEA,IAAI,OAA4B,CAC9B,OAAO,KAAK,MACd,CAEA,IAAI,SAAkB,CACpB,OAAO,KAAK,QACd,CAEA,UAAUmH,EAAsC,CAC9C,OAAO,KAAK,WAAWA,CAAQ,CACjC,CAEA,SAAkB,CAChB,IAAMC,EAAS,KAAK,WAAW,EAE/B,OAAK,OAAO,GAAGA,EAAQ,KAAK,KAAK,IAC/B,KAAK,WACL,KAAK,MAAQA,GAGR,KAAK,KACd,CAEA,UAAmB,CArMrB,IAAA1G,EAsMI,MAAO,SAAQA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC3C,CACF,EA5CYA,GAAAwF,GC3IL,SAASrF,GAAQwG,EAA+B,CACrD,OAAO,IAAIC,EAAaD,CAAY,CACtC,CAMA,IAAMC,EAAN,KAA6D,CAI3D,YAAmBD,EAA8B,OAAW,CAAzC,kBAAAA,EAHnB1H,EAAA,KAAS,UAAU,YACnBA,EAAA,KAAO,QAEsD,CAEtD,MAAMK,EAAe,CAC1B,YAAK,MAAQA,EACN,IACT,CAEA,SAASuH,EAAMC,EAAe,CAC5B,OAAO,OAAO,GAAGD,EAAGC,CAAC,CACvB,CAEA,QAAQtE,EAA4B,CAxCtC,IAAAxC,EAyCI,IAAMkE,EAAQ1B,EAAI,OAAO,IAAI,EAE7B,GAAI,CAACuE,GAAO7C,CAAK,EACf,MAAM,IAAI,MACR,+BAA+B,OAAOA,CAAK,cAAalE,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,YACnF,EAGF,OAAOwC,EAAI,QAAQ0B,CAAK,CAC1B,CAEA,UAAmB,CApDrB,IAAAlE,EAqDI,MAAO,SAAQA,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,EAC1C,CACF,ECtCO,IAAMgH,GAAW,CACtB3D,EACA4D,IACuB,IAAIC,EAAY7D,EAAU4D,EAAc,SAAS,EAMpEC,EAAN,KAA+E,CAG7E,YACmBC,EACAC,EACDC,EAChB,CAHiB,eAAAF,EACA,mBAAAC,EACD,WAAAC,EALlBpI,EAAA,KAAO,aAAa,IAAIgE,EAMrB,CAEH,MAAM3D,EAAe,CACnB,YAAK,WAAW,MAAMA,CAAK,EACpB,IACT,CAEA,QAAQkD,EAA4B,CAClC,OAAI,KAAK,cACPA,EAAI,eACFX,QAAW,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS,MAAM,KAAK,aAAa,GACtF,EAEAW,EAAI,eACFX,QAAW,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS,GAC9D,EAGKW,EAAI,QAAQ,KAAK,UAAU,CACpC,CACF,EC3CA,IAAO8E,GAAQ,OAAO,OAAOzF,EAAM,CACjC,KAAAA,EACA,GAAAkC,GACA,IAAAA,GACA,OAAAjB,GACA,KAAA4C,GACA,cAAAI,GACA,KAAA3F,GACA,SAAAqD,GACA,QAAAG,GACA,IAAKqD,EACP,CAAC,ECrBD,OAAS,gBAAAO,GAAc,gBAAAC,OAAiC,eCIjD,IAAMC,EAAU,CAACvD,EAAewD,IAAmB,CACxD,IAAMC,EAAUD,EAAS,EACnBE,EAAa,CAACD,EACpB,OAAQzD,EAAQyD,GAA0BzD,EAAQ0D,GAAcF,EAA/BxD,CACnC,EC6BO,IAAM2D,EAAN,KAAgB,CAAhB,cACL5I,EAAA,KAAiB,YAAY,IAAI,SAMjC,QAAQyG,EAAuC,CAC7C,OAAO,KAAK,UAAU,IAAIA,CAAI,CAChC,CAEQ,UAAaA,EAAiC,CACpD,IAAIoC,EAAQ,KAAK,UAAU,IAAIpC,CAAI,EAEnC,GAAI,CAACoC,EAAO,CACV,GAAM,CAAE,MAAA5D,EAAO,aAAA6D,CAAa,EAAI,KAAK,8BAA8BrC,CAAI,EAEvEoC,EAAQ,CACN,MAAA5D,EACA,aAAA6D,EACA,QAAS,CACX,EACA,KAAK,UAAU,IAAIrC,EAAMoC,CAAK,CAChC,CAEA,OAAOA,CACT,CAEQ,iBAAoBpC,EAAyB,CACnD,IAAMoC,EAAQ,KAAK,UAAUpC,CAAI,EAEjC,GAAI,CAACoC,EAAM,OACT,OAIF,IAAME,EAAY,CAAC,GAAGF,EAAM,OAAO,SAAS,EAE5C,QAAWrB,KAAYuB,EACrBvB,EAAS,CAEb,CAEQ,8BAAiCf,EAAmB,CAC1D,IAAMqC,EAAe,IAAI,IAEnBE,EAAcC,GAAqB,CAEvC,GAAI,CAACH,EAAa,IAAIG,CAAG,EAAG,CAC1B,IAAMC,EAAW,KAAK,UAAUD,CAAG,EACnCH,EAAa,IAAIG,EAAKC,EAAS,OAAO,CACxC,CAEA,OAAO,KAAK,IAAID,CAAG,CACrB,EAEA,MAAO,CAAE,MAAOxC,EAAK,QAAQuC,CAAM,EAAG,aAAAF,CAAa,CACrD,CAEQ,WAAcrC,EAAsB,CAC1C,IAAMoC,EAAQ,KAAK,UAAUpC,CAAI,EAEjC,GAAIoC,EAAM,OAER,QAAWM,KAASN,EAAM,OAAO,OAC/BM,EAAM,EAIV,GAAM,CAAE,MAAAlE,EAAO,aAAA6D,CAAa,EAAI,KAAK,8BAA8BrC,CAAI,EAGvE,GADAoC,EAAM,aAAeC,EACjBD,EAAM,OAER,OAAW,CAACI,CAAG,IAAKJ,EAAM,aACxBA,EAAM,OAAO,OAAO,IAClB,KAAK,UAAUI,EAAK,IAAM,CACxB,KAAK,WAAWxC,CAAI,CACtB,CAAC,CACH,EAIJ,OAAI,OAAO,GAAGoC,EAAM,MAAO5D,CAAK,IAIhC4D,EAAM,MAAQ5D,EACd4D,EAAM,QAAUrC,EAAeC,CAAI,EAAIA,EAAK,QAAUoC,EAAM,QAAU,EAEtE,KAAK,iBAAiBpC,CAAI,GAEnBoC,EAAM,KACf,CAEA,IAA4BpC,EAAsC,CAChE,IAAMoC,EAAQ,KAAK,UAAUpC,CAAI,EAEjC,GAAIoC,EAAM,OAER,OAAOA,EAAM,MAGf,IAAIO,EAAQ,GAcZ,OAZI5C,EAAeC,CAAI,GACrBA,EAAK,QAAQ,IAAyB,EACtC2C,EAAQP,EAAM,UAAYpC,EAAK,SACtBoC,EAAM,aAAa,KAAO,IACnCO,EAAQ,CAAC,GAAGP,EAAM,aAAa,QAAQ,CAAC,EAAE,KAAK,CAAC,CAACI,EAAKI,CAAW,KAC/D,KAAK,IAAIJ,CAAG,EACK,KAAK,UAAUA,CAAG,EAEnB,UAAYI,EAC7B,GAGED,EAKE,KAAK,WAAW3C,CAAI,EAHlBoC,EAAM,KAIjB,CAEA,IAAOpC,EAAkCxB,EAAgB,CACvD,IAAM4D,EAAQ,KAAK,UAAUpC,CAAI,EAE7B,OAAO,GAAGoC,EAAM,MAAO5D,CAAK,IAKhC4D,EAAM,MAAQ5D,EACd4D,EAAM,UAEN,KAAK,iBAAiBpC,CAAI,EAC5B,CAEA,UAAUA,EAAgBe,EAAiC,CACzD,IAAMqB,EAAQ,KAAK,UAAUpC,CAAI,EAE7B6C,EAEJ,GAAI,CAACT,EAAM,OAAQ,CACjB,IAAMU,EAAS,IAAI,IACnBV,EAAM,OAAS,CACb,UAAW,IAAI,IACf,OAAAU,CACF,EAEA,OAAW,CAACN,CAAG,IAAKJ,EAAM,aACxBU,EAAO,IACL,KAAK,UAAUN,EAAK,IAAM,CACxB,KAAK,WAAWxC,CAAI,CACtB,CAAC,CACH,EAGED,EAAeC,CAAI,IACrB6C,EAAgB7C,EAAK,UAAU,IAAM,CACnC,KAAK,WAAWA,CAAI,CACtB,CAAC,EAEL,CAEA,OAAAoC,EAAM,OAAO,UAAU,IAAIrB,CAAQ,EAE5B,IAAM,CACX,GAAKqB,EAAM,SAIXA,EAAM,OAAO,UAAU,OAAOrB,CAAQ,EAElCqB,EAAM,OAAO,UAAU,OAAS,GAAG,CAErC,QAAWM,KAASN,EAAM,OAAO,OAC/BM,EAAM,EAERG,GAAA,MAAAA,IAGAT,EAAM,OAAS,MACjB,CACF,CACF,CACF,EChOO,IAAMW,EAAN,KAAmB,CAAnB,cACLxJ,EAAA,KAAQ,SAAkC,CAAC,GAC3CA,EAAA,KAAQ,WAAW,IAEnB,QAAWyJ,EAAoC,CAC7C,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,KAAK,OAAO,KAAK,SAAY,CAC3B,GAAI,CACFD,EAAQ,MAAMD,EAAK,CAAC,CACtB,OAASG,EAAG,CACVD,EAAOC,CAAC,CACV,CACF,CAAC,EACD,KAAK,cAAc,CACrB,CAAC,CACH,CAEA,MAAc,eAAgB,CAC5B,GAAI,MAAK,SAIT,KADA,KAAK,SAAW,GACT,KAAK,OAAO,OAAS,GAAG,CAC7B,IAAMH,EAAO,KAAK,OAAO,MAAM,EAC3BA,GACF,MAAMA,EAAK,CAEf,CACA,KAAK,SAAW,GAClB,CACF,EHJA,IAAMI,EAAN,KAAyB,CAgBvB,YAA4BC,EAAmB,CAAnB,YAAAA,EAf5B9J,EAAA,KAAQ,oBAAoB,IAAI,KAChCA,EAAA,KAAQ,qBAEF,CAAC,GACPA,EAAA,KAAQ,kBAA4C,MAGpDA,EAAA,KAAQ,cAAgC,MACxCA,EAAA,KAAQ,aAAa,IAAIwJ,GACzBxJ,EAAA,KAAiB,aAAa,IAAI4I,GAClC5I,EAAA,KAAiB,sBAAsB,IAAI,IAKK,CAEhD,IAAI,gBAAiB,CACnB,OAAK,KAAK,kBACR,KAAK,gBAAkB,KAAK,OAAO,qBAAqB,GAGnD,KAAK,eACd,CAEA,SAAU,CApDZ,IAAAe,EAqDI,QAAWoI,KAAS,KAAK,oBAAoB,OAAO,EAClDA,EAAM,EAER,KAAK,oBAAoB,MAAM,EAE/B,QAAWtF,KAAU,KAAK,kBAAkB,OAAO,EACjDA,EAAO,QAAQ,EAGjB,KAAK,kBAAkB,MAAM,GAE7B9C,EAAA,KAAK,cAAL,MAAAA,EAAkB,SACpB,CAEA,UAAUgJ,EAA8B,CACtC,IAAIlG,EAAS,KAAK,kBAAkB,IAAIkG,CAAW,EAEnD,GAAI,CAAClG,EAAQ,CAUX,GATAA,EAAS,KAAK,OAAO,aAAa,CAChC,MAAOkG,EAAY,MACnB,KAAMvB,EACJuB,EAAY,SAAS,KACrBA,EAAY,SAAS,aACvB,EACA,iBAAkBA,EAAY,UAAY,MAC5C,CAAC,EAEG,CAAClG,EACH,MAAM,IAAI,MAAM,+BAA+BkG,CAAW,EAAE,EAG9D,GAAIA,EAAY,UAAY,OAAW,CACrC,IAAMC,EAAS,IAAIzB,GAAa1E,EAAO,eAAe,CAAC,EAEvD,GAAIoD,GAAO8C,EAAY,OAAO,EAAG,CAC/B,IAAMtD,EAAOsD,EAAY,QAEzBA,EAAY,SAAS,MAAMC,EAAQ,KAAK,WAAW,IAAIvD,CAAI,CAAC,EAE5D,KAAK,oBAAoB,IACvBsD,EACA,KAAK,WAAW,UAAUtD,EAAM,IAAM,CACpC,KAAK,YAAYsD,EAAa,KAAK,WAAW,IAAItD,CAAI,CAAC,CACzD,CAAC,CACH,CACF,MACEsD,EAAY,SAAS,MAAMC,EAAQD,EAAY,OAAO,EAGxDlG,EAAO,MAAM,CACf,CAEA,KAAK,kBAAkB,IAAIkG,EAAalG,CAAM,CAChD,CAEA,OAAOA,CACT,CAEA,MAAM,WACJkG,EACwB,CACxB,OAAO,KAAK,WAAW,QAAQ,SAAY,CAlH/C,IAAAhJ,EAoHM,KAAK,MAAM,GAGT,CAAC,KAAK,aACN,KAAK,YAAY,KAAOgJ,EAAY,SAAS,SAG7ChJ,EAAA,KAAK,cAAL,MAAAA,EAAkB,UAElB,KAAK,YAAc,KAAK,OAAO,aAAa,CAC1C,MAAO,eAAe,SAAW,eAAe,SAChD,KAAMgJ,EAAY,SAAS,IAC7B,CAAC,GAGH,IAAMlG,EAAS,KAAK,UAAUkG,CAAW,EACnCE,EAAiB,KAAK,OAAO,qBAAqB,EACxDA,EAAe,mBACbpG,EACA,EACA,KAAK,YACL,EACAkG,EAAY,SAAS,IACvB,EAEA,KAAK,OAAO,MAAM,OAAO,CAACE,EAAe,OAAO,CAAC,CAAC,EAClD,MAAM,KAAK,OAAO,MAAM,oBAAoB,EAC5C,MAAM,KAAK,YAAY,SACrB,WAAW,KACX,EACAF,EAAY,SAAS,IACvB,EAEA,IAAMG,EAAMH,EAAY,SAAS,KAC/B,IAAIzB,GAAa,KAAK,YAAY,eAAe,CAAC,CACpD,EAEA,YAAK,YAAY,MAAM,EAEhB4B,CACT,CAAC,CACH,CAEA,YACEH,EACAI,EACA,CACA,IAAMC,EAAY,KAAK,UAAUL,CAAW,EAEtCM,EAAO7B,EACXuB,EAAY,SAAS,KACrBA,EAAY,SAAS,aACvB,EAEMO,EAAa,IAAI,YAAYD,CAAI,EACvCN,EAAY,SAAS,MAAM,IAAIxB,GAAa+B,CAAU,EAAGH,CAAI,EAC7D,KAAK,OAAO,MAAM,YAAYC,EAAW,EAAGE,EAAY,EAAGD,CAAI,CACjE,CAEA,SAAiC5D,EAAsC,CACrE,OAAO,KAAK,WAAW,IAAIA,CAAI,CACjC,CAEA,QACEA,EACAxB,EACA,CACA,KAAK,WAAW,IAAIwB,EAAMxB,CAAK,CACjC,CAEA,aACEwB,EACAe,EACa,CACb,OAAO,KAAK,WAAW,UAAUf,EAAMe,CAAQ,CACjD,CAEA,mBAAmBlE,EAAwD,CAjM7E,IAAAvC,EAAAuE,EAAAiF,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GAkMI,IAAMC,EAAgB,IAAI/H,EACxB,KACAP;AAAA,iCAC2BU,EAAQ,OAAO,KAAK,QAAS6H,GAAQ,CAACA,EAAK,IAAI,CAAC,CAAC,QAAQ7H,EAAQ,OAAO,MAAM;AAAA,YACnGA,EAAQ,OAAO,IAAI;AAAA;AAAA;AAAA,WAGrBgC,GAAAvE,EAAAuC,EAAQ,uBAAR,YAAAvC,EAA8B,QAASoK,GAAQ,CAACA,EAAK;AAAA,CAAI,KAAzD,KAAA7F,EAA+D,EAAE;AAAA,OAEvE,EAAE,MAAM,CACN,eAAeiF,EAAAjH,EAAQ,kBAAR,KAAAiH,EAA2B,CAAC,GAAG,OAC9C,YAAa,eAAe,MAC9B,CAAC,EAEKa,EAAkB,IAAIjI,EAC1B,KACAP;AAAA,iCAC2BU,EAAQ,SAAS,KAAK,QAAS6H,GAAQ,CAACA,EAAK,IAAI,CAAC,CAAC,QAAQ7H,EAAQ,SAAS,MAAM;AAAA,YACvGA,EAAQ,SAAS,IAAI;AAAA;AAAA;AAAA,WAGvBmH,GAAAD,EAAAlH,EAAQ,uBAAR,YAAAkH,EAA8B,QAASW,GAAQ,CAACA,EAAK;AAAA,CAAI,KAAzD,KAAAV,EAA+D,EAAE;AAAA,OAEvE,EAAE,MAAM,CACN,eAAeC,EAAApH,EAAQ,kBAAR,KAAAoH,EAA2B,CAAC,GAAG,OAAS,EACvD,YAAa,eAAe,QAC9B,CAAC,EAEKW,EAAqB,KAAK,OAAO,mBAAmB,CACxD,KAAMH,EAAc,IACtB,CAAC,EAEKI,EAAuB,KAAK,OAAO,mBAAmB,CAC1D,KAAMF,EAAgB,IACxB,CAAC,EAEKG,EAAiB,KAAK,OAAO,qBAAqB,CACtD,OAAOZ,EAAArH,EAAQ,QAAR,KAAAqH,EAAiB,GACxB,iBAAkB,CAChB,IAAIC,EAAAtH,EAAQ,kBAAR,KAAAsH,EAA2B,CAAC,EAChCM,EAAc,gBACdE,EAAgB,eAClB,CACF,CAAC,EAEKI,EAAiB,KAAK,OAAO,qBAAqB,CACtD,OAAOX,EAAAvH,EAAQ,QAAR,KAAAuH,EAAiB,GACxB,OAAQU,EACR,OAAQ,CACN,OAAQF,EACR,SAASP,EAAAxH,EAAQ,OAAO,iBAAf,KAAAwH,EAAiC,CAAC,CAC7C,EACA,SAAU,CACR,OAAQQ,EACR,SAASP,GAAAzH,EAAQ,SAAS,SAAjB,KAAAyH,GAA2B,CAAC,CACvC,EACA,UAAWzH,EAAQ,SACrB,CAAC,EAEKmI,EAAW,IAAIC,EACnB,KACAF,EACA,CAACN,EAAeE,CAAe,GAC/BH,IAAAD,GAAA1H,EAAQ,kBAAR,YAAA0H,GAAyB,SAAzB,KAAAC,GAAmC,CACrC,EAEA,YAAK,mBAAmB,KAAKQ,CAAQ,EAC9BA,CACT,CAEA,oBACEnI,EACyB,CA1Q7B,IAAAvC,EAAAuE,EAAAiF,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA2QI,GAAM,CAAE,KAAA5E,EAAO,CAAC,EAAG,cAAA2F,EAAgB,CAAC,EAAG,CAAC,CAAE,EAAIrI,EAExCsI,EAAU,IAAIzI,EAClB,KACAP;AAAA,mCAC6B+I,EAAc,KAAK,IAAI,CAAC,qBAAqB3F,EAAK,QAASmF,GAAQ,CAACA,EAAK,IAAI,CAAC,CAAC;AAAA,YACtG7H,EAAQ,IAAI;AAAA;AAAA;AAAA,WAGdgC,GAAAvE,EAAAuC,EAAQ,uBAAR,YAAAvC,EAA8B,QAASoK,GAAQ,CAACA,EAAK;AAAA,CAAI,KAAzD,KAAA7F,EAA+D,EAAE;AAAA,OAEvE,EAAE,MAAM,CACN,eAAeiF,EAAAjH,EAAQ,kBAAR,KAAAiH,EAA2B,CAAC,GAAG,OAC9C,YAAa,eAAe,OAC9B,CAAC,EAEKsB,EAAe,KAAK,OAAO,mBAAmB,CAClD,KAAMD,EAAQ,IAChB,CAAC,EAEKL,EAAiB,KAAK,OAAO,qBAAqB,CACtD,OAAOf,EAAAlH,EAAQ,QAAR,KAAAkH,EAAiB,GACxB,iBAAkB,CAChB,IAAIC,EAAAnH,EAAQ,kBAAR,KAAAmH,EAA2B,CAAC,EAChCmB,EAAQ,eACV,CACF,CAAC,EAEKE,EAAkB,KAAK,OAAO,sBAAsB,CACxD,OAAOpB,EAAApH,EAAQ,QAAR,KAAAoH,EAAiB,GACxB,OAAQa,EACR,QAAS,CACP,OAAQM,CACV,CACF,CAAC,EAEKJ,EAAW,IAAIM,EACnB,KACAD,EACA,CAACF,CAAO,GACRhB,GAAAD,EAAArH,EAAQ,kBAAR,YAAAqH,EAAyB,SAAzB,KAAAC,EAAmC,CACrC,EACA,YAAK,mBAAmB,KAAKa,CAAQ,EAC9BA,CACT,CAEA,OAAQ,CACD,KAAK,kBAIV,KAAK,OAAO,MAAM,OAAO,CAAC,KAAK,gBAAgB,OAAO,CAAC,CAAC,EACxD,KAAK,gBAAkB,KACzB,CACF,EAEMO,EAAN,KAAyE,CACvE,YACYC,EACHC,EACAC,EACAC,EACG/L,EACV,CALU,cAAA4L,EACH,cAAAC,EACA,cAAAC,EACA,yBAAAC,EACG,WAAA/L,CACT,CACL,EAEMqL,EAAN,cAAqCM,CAAoC,CACvE,QAAQ1I,EAAwC,CA9UlD,IAAAgC,EAAAiF,EAAAC,EA+UI,IAQIzJ,EAAAuC,EAPF,aAAA+I,EACA,cAAAC,EACA,YAAAC,EACA,cAAAC,EACA,mBAAAC,EACA,sBAAAC,CArVN,EAuVQ3L,EADC4L,EAAAC,GACD7L,EADC,CANH,cACA,gBACA,cACA,gBACA,qBACA,0BAIF,KAAKuE,EAAAmH,GAAA,YAAAA,EAAoB,SAApB,KAAAnH,EAA8B,KAAO,KAAK,oBAC7C,MAAM,IAAI,MACR,kGAAkG,KAAK,mBAAmB,WAAUiF,EAAAkC,GAAA,YAAAA,EAAoB,SAApB,KAAAlC,EAA8B,CAAC,EACrK,EAGF,IAAMsC,EAAc,KAAK,SAAS,eAAe,gBAAgBC,GAAAC,GAAA,GAC5DJ,GAD4D,CAE/D,OAAOnC,EAAA,KAAK,QAAL,KAAAA,EAAc,EACvB,EAAC,EACDqC,EAAY,YAAY,KAAK,QAAQ,GAEpCJ,GAAA,KAAAA,EAAsB,CAAC,GAAG,QAAQ,CAAC/J,EAAOlC,IACzCqM,EAAY,aAAarM,EAAOkC,CAAK,CACvC,GAECgK,GAAA,KAAAA,EAAyB,CAAC,GAAG,QAAQ,CAAChK,EAAOlC,IAC5CqM,EAAY,gBAAgBrM,EAAOkC,CAAK,CAC1C,EAEA,KAAK,SAAS,QAAQ,CAACkJ,EAASoB,IAAM,CACpCH,EAAY,cACTJ,GAAA,KAAAA,EAAsB,CAAC,GAAG,OAASO,EACpCpB,EAAQ,SACV,CACF,CAAC,EAEDiB,EAAY,KAAKR,EAAaC,EAAeC,EAAaC,CAAa,EACvEK,EAAY,IAAI,CAClB,CACF,EAEMd,EAAN,cAAsCC,CAAqC,CACzE,QAAQ1I,EAA0C,CA1XpD,IAAAvC,EAAAuE,EAAAiF,EA2XI,GAAM,CAAE,WAAA0C,EAAa,CAAC,EAAG,CAAC,EAAG,mBAAAR,CAAmB,EAAInJ,GAAA,KAAAA,EAAW,CAAC,EAEhE,KAAKvC,EAAA0L,GAAA,YAAAA,EAAoB,SAApB,KAAA1L,EAA8B,KAAO,KAAK,oBAC7C,MAAM,IAAI,MACR,kGAAkG,KAAK,mBAAmB,WAAUuE,EAAAmH,GAAA,YAAAA,EAAoB,SAApB,KAAAnH,EAA8B,CAAC,EACrK,EAGF,IAAMuH,EAAc,KAAK,SAAS,eAAe,iBAAiB,CAChE,OAAOtC,EAAA,KAAK,QAAL,KAAAA,EAAc,EACvB,CAAC,EACDsC,EAAY,YAAY,KAAK,QAAQ,GAEpCJ,GAAA,KAAAA,EAAsB,CAAC,GAAG,QAAQ,CAAC/J,EAAOlC,IACzCqM,EAAY,aAAarM,EAAOkC,CAAK,CACvC,EAEA,KAAK,SAAS,QAAQ,CAACkJ,EAASoB,IAC9BH,EAAY,cACTJ,GAAA,KAAAA,EAAsB,CAAC,GAAG,OAASO,EACpCpB,EAAQ,SACV,CACF,EACAiB,EAAY,mBAAmB,GAAGI,CAAU,EAC5CJ,EAAY,IAAI,CAClB,CACF,EAmCA,eAAsBK,GACpB5J,EACyB,CACzB,GAAIA,aAAmB,UACrB,OAAO,IAAIuG,EAAmBvG,CAAO,EAGvC,GAAI,CAAC,UAAU,IACb,MAAM,IAAI,MAAM,0CAA0C,EAG5D,IAAM6J,EAAU,MAAM,UAAU,IAAI,eAAe7J,GAAA,YAAAA,EAAS,OAAO,EAEnE,GAAI,CAAC6J,EACH,MAAM,IAAI,MAAM,iCAAiC,EAGnD,OAAO,IAAItD,EAAmB,MAAMsD,EAAQ,cAAc7J,GAAA,YAAAA,EAAS,MAAM,CAAC,CAC5E","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 { 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 { MissingSlotValueError, ResolutionError } from './errors';\nimport type { NameRegistry } from './nameRegistry';\nimport {\n type BufferUsage,\n type Eventual,\n type ResolutionCtx,\n type SlotValuePair,\n type Wgsl,\n type WgslBindable,\n type WgslResolvable,\n type WgslSlot,\n isResolvable,\n isSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport type { WgslIdentifier } from './wgslIdentifier';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n};\n\ntype SlotToValueMap = Map<WgslSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<BufferUsage, string> = {\n uniform: 'uniform',\n mutable_storage: 'storage, read_write',\n readonly_storage: '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 _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 declarations(): Iterable<string> {\n return this._declarations;\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\n return { group: this._bindingGroup, idx: this._nextFreeBindingIdx++ };\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\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 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 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\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 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 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 NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport type { TypeGpuRuntime } from './typegpuRuntime';\nimport type { BufferUsage, WgslResolvable } from './types';\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<BufferUsage, GPUBufferBindingType> = {\n uniform: 'uniform',\n mutable_storage: 'storage',\n readonly_storage: '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\n const bindGroupLayout = this.runtime.device.createBindGroupLayout({\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n visibility: options.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[bindable.usage],\n },\n })),\n });\n\n const bindGroup = this.runtime.device.createBindGroup({\n layout: bindGroupLayout,\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n resource: {\n buffer: this.runtime.bufferFor(bindable.allocatable),\n },\n })),\n });\n\n return {\n bindGroupLayout,\n bindGroup,\n code: codeString,\n };\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,\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 { Parsed } from 'typed-binary';\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\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 $allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;\n $allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;\n $addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;\n\n asUniform(): 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n\n asMutableStorage(): 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n\n asReadonlyStorage(): 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\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 private _allowedUsages: {\n uniform: WgslBufferUsage<TData, TAllows | 'uniform'> | null;\n mutableStorage: WgslBufferUsage<TData, TAllows | 'mutable_storage'> | null;\n readonlyStorage: WgslBufferUsage<\n TData,\n TAllows | 'readonly_storage'\n > | null;\n } = {\n uniform: null,\n mutableStorage: null,\n readonlyStorage: 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 const enrichedThis = this as WgslBuffer<TData, TAllows | 'uniform'>;\n this.$addFlags(GPUBufferUsage.UNIFORM);\n if (!this._allowedUsages.uniform) {\n this._allowedUsages.uniform = bufferUsage(enrichedThis, 'uniform');\n }\n return enrichedThis;\n }\n\n $allowReadonlyStorage() {\n const enrichedThis = this as WgslBuffer<\n TData,\n TAllows | 'readonly_storage'\n >;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.readonlyStorage) {\n this._allowedUsages.readonlyStorage = bufferUsage(\n enrichedThis,\n 'readonly_storage',\n );\n }\n return enrichedThis;\n }\n\n $allowMutableStorage() {\n const enrichedThis = this as WgslBuffer<TData, TAllows | 'mutable_storage'>;\n this.$addFlags(GPUBufferUsage.STORAGE);\n if (!this._allowedUsages.mutableStorage) {\n this._allowedUsages.mutableStorage = bufferUsage(\n enrichedThis,\n 'mutable_storage',\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 'uniform' extends TAllows\n ? WgslBufferUsage<TData, 'uniform'>\n : null;\n }\n\n asMutableStorage() {\n return this._allowedUsages\n .mutableStorage as 'mutable_storage' extends TAllows\n ? WgslBufferUsage<TData, 'mutable_storage'>\n : null;\n }\n\n asReadonlyStorage() {\n return this._allowedUsages\n .readonlyStorage as 'readonly_storage' extends TAllows\n ? WgslBufferUsage<TData, 'readonly_storage'>\n : null;\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';\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): WgslVar<TDataType> => new WgslVarImpl(dataType, initialValue, 'private');\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 { 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 { slot } from './wgslSlot';\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});\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport { roundUp } from './mathUtils';\nimport { PlumStore } from './plumStore';\nimport ProgramBuilder, { type Program } from './programBuilder';\nimport type { WgslSettable } from './settableTrait';\nimport { TaskQueue } from './taskQueue';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n TypeGpuRuntime,\n} from './typegpuRuntime';\nimport type { AnyWgslData, WgslAllocatable } from './types';\nimport { code } from './wgslCode';\nimport {\n type ExtractPlumValue,\n type Unsubscribe,\n type WgslPlum,\n isPlum,\n} from './wgslPlum';\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 _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 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: ExtractPlumValue<TPlum>,\n ) {\n this._plumStore.set(plum, value);\n }\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: () => unknown,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const vertexProgram = new ProgramBuilder(\n this,\n code`\n @vertex fn main_vertex(${options.vertex.args.flatMap((arg) => [arg, ', '])}) -> ${options.vertex.output} {\n ${options.vertex.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.VERTEX,\n });\n\n const fragmentProgram = new ProgramBuilder(\n this,\n code`\n @fragment fn main_frag(${options.fragment.args.flatMap((arg) => [arg, ', '])}) -> ${options.fragment.output} {\n ${options.fragment.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\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: options.vertex.buffersLayouts ?? [],\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n [vertexProgram, fragmentProgram],\n options.externalLayouts?.length ?? 0,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const { args = [], workgroupSize = [1, 1] } = options;\n\n const program = new ProgramBuilder(\n this,\n code`\n @compute @workgroup_size(${workgroupSize.join(', ')}) fn main_compute(${args.flatMap((arg) => [arg, ', '])}) {\n ${options.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.COMPUTE,\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 execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n externalVertexBuffers,\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 (externalVertexBuffers ?? []).forEach((group, index) =>\n passEncoder.setVertexBuffer(index, group),\n );\n\n this.programs.forEach((program, i) => {\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n );\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\ntype Listener = () => 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 | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<Listener>;\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 };\n this._stateMap.set(plum, state);\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();\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(plum: WgslPlum, listener: Listener): 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
|
+
{"version":3,"sources":["../src/tgpuBufferUtils.ts","../src/wgslBuffer.ts","../src/wgslBufferUsage.ts","../src/tgpu.ts","../src/data/vectorOps.ts","../src/std.ts","../src/index.ts"],"names":["BufferReader","BufferWriter","write","buffer","data","gpuBuffer","device","mapped","size","roundUp","hostBuffer","read","res","stagingBuffer","commandEncoder","bufferUsage","usage","TgpuBufferUsageImpl","ctx","identifier","TgpuIdentifier","_a","typeSchema","initialOrBuffer","TgpuBufferImpl","dataType","__publicField","isGPUBuffer","writer","label","stepMode","SimpleTgpuData","TgpuArrayImpl","flags","capitalizeFirstLetter","string","asUsage","_","asUniform","asReadonly","asMutable","asVertex","tgpu","lengthVec2","v","lengthVec3","lengthVec4","VectorOps","a","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","s","lhs","rhs","len","std","vector","src_default"],"mappings":"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","sourcesContent":["import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport { roundUp } from './mathUtils';\nimport type { AnyTgpuData } from './types';\nimport type { TgpuBuffer, Unmanaged } from './wgslBuffer';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n data: Parsed<TData>,\n): void {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n buffer.dataType.write(new BufferWriter(mapped), data);\n return;\n }\n\n const size = roundUp(buffer.dataType.size, buffer.dataType.byteAlignment);\n const hostBuffer = new ArrayBuffer(size);\n buffer.dataType.write(new BufferWriter(hostBuffer), data);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n): Promise<Parsed<TData>> {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n return res;\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: buffer.dataType.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer,\n 0,\n stagingBuffer,\n 0,\n buffer.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, buffer.dataType.size);\n\n const res = buffer.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n}\n","import { BufferWriter, type Parsed } from 'typed-binary';\nimport { SimpleTgpuData, TgpuArrayImpl } from './data';\nimport {\n type AnyTgpuData,\n type BufferUsage,\n type TgpuAllocatable,\n type TgpuNamable,\n isGPUBuffer,\n} from './types';\nimport { type TgpuBufferUsage, bufferUsage } from './wgslBufferUsage';\nimport type { TgpuPlum } from './wgslPlum';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Unmanaged {\n readonly device: GPUDevice;\n readonly buffer: GPUBuffer;\n}\n\nexport interface AllowUniform {\n uniformAllowed: true;\n}\nexport interface AllowReadonly {\n readonlyAllowed: true;\n}\nexport interface AllowMutable {\n mutableAllowed: true;\n}\nexport interface AllowVertex {\n vertexAllowed: true;\n}\n\ntype AllowedUsages<TData extends AnyTgpuData> = {\n uniform: TgpuBufferUsage<TData, 'uniform'> | null;\n mutable: TgpuBufferUsage<TData, 'mutable'> | null;\n readonly: TgpuBufferUsage<TData, 'readonly'> | null;\n vertex: TgpuBufferUsage<TData, 'vertex'> | null;\n};\n\nexport interface TgpuBuffer<TData extends AnyTgpuData>\n extends TgpuAllocatable<TData>,\n TgpuNamable {\n $allowUniform(): this & AllowUniform;\n $allowReadonly(): this & AllowReadonly;\n $allowMutable(): this & AllowMutable;\n $allowVertex(stepMode: 'vertex' | 'instance'): this & AllowVertex;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this & Unmanaged;\n\n _usages: AllowedUsages<TData>;\n readonly label: string | undefined;\n}\n\nexport function buffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\nexport function buffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\nexport function buffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(typeSchema, initialOrBuffer);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n\n _usages: AllowedUsages<TData> = {\n uniform: null,\n mutable: null,\n readonly: null,\n vertex: null,\n };\n\n public vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'> | null = null;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n constructor(\n public readonly dataType: TData,\n public readonly initialOrBuffer?:\n | Parsed<TData>\n | TgpuPlum<Parsed<TData>>\n | GPUBuffer\n | undefined,\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._buffer = initialOrBuffer;\n } else {\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n if (!this._device) {\n throw new Error(\n 'To use this property, make the buffer unmanaged by passing a GPUDevice to $device',\n );\n }\n if (!this._buffer) {\n this._buffer = this._device.createBuffer({\n size: this.dataType.size,\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n });\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n this.dataType.write(writer, this.initial);\n this._buffer.unmap();\n }\n }\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer is managed by TypeGPU and cannot be used directly',\n );\n }\n return this._device;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $allowUniform() {\n this.$addFlags(GPUBufferUsage.UNIFORM);\n if (!this._usages.uniform) {\n this._usages.uniform = bufferUsage(this, 'uniform');\n }\n\n return this as this & AllowUniform;\n }\n\n $allowReadonly() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n if (!this._usages.readonly) {\n this._usages.readonly = bufferUsage(this, 'readonly');\n }\n\n return this as this & AllowReadonly;\n }\n\n $allowMutable() {\n this.$addFlags(GPUBufferUsage.STORAGE);\n\n if (!this._usages.mutable) {\n this._usages.mutable = bufferUsage(this, 'mutable');\n }\n\n return this as this & AllowMutable;\n }\n\n $allowVertex(stepMode: 'vertex' | 'instance' = 'vertex') {\n this.$addFlags(GPUBufferUsage.VERTEX);\n\n if (!this.vertexLayout) {\n if (this.dataType instanceof SimpleTgpuData) {\n this.vertexLayout = {\n arrayStride: this.dataType.size,\n stepMode,\n };\n\n this._usages.vertex = bufferUsage(this, 'vertex');\n } else if (this.dataType instanceof TgpuArrayImpl) {\n this.vertexLayout = {\n arrayStride: this.dataType.elementType.size,\n stepMode,\n };\n\n this._usages.vertex = bufferUsage(this, 'vertex');\n } else {\n throw new Error('Only simple data types can be used as vertex buffers');\n }\n }\n\n if (this.vertexLayout.stepMode !== stepMode) {\n throw new Error('Cannot change step mode of a vertex buffer');\n }\n\n return this as this & AllowVertex;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n $device(device: GPUDevice) {\n this._device = device;\n return this;\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n\nfunction capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nfunction asUsage<\n TUsage extends BufferUsage,\n TType extends AllowVertex | AllowUniform | AllowReadonly | AllowMutable,\n>(usage: TUsage, _: TType) {\n return <TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & TType,\n ): TgpuBufferUsage<TData, TUsage> => {\n if (buffer._usages[usage] === null) {\n throw new Error(\n `Cannot pass ${buffer} to as${capitalizeFirstLetter(usage)} function, as the buffer does not allow ${usage} usage. To allow it, use $allow${capitalizeFirstLetter(usage)} TgpuBuffer method.`,\n );\n }\n return buffer._usages[usage] as TgpuBufferUsage<TData, TUsage>;\n };\n}\n\nexport const asUniform = asUsage('uniform', {\n uniformAllowed: true,\n} as AllowUniform);\nexport const asReadonly = asUsage('readonly', {\n readonlyAllowed: true,\n} as AllowReadonly);\nexport const asMutable = asUsage('mutable', {\n mutableAllowed: true,\n} as AllowMutable);\nexport const asVertex = asUsage('vertex', {\n vertexAllowed: true,\n} as AllowVertex);\n","import type {\n AnyTgpuData,\n BufferUsage,\n ResolutionCtx,\n TgpuBindable,\n} from './types';\nimport type { TgpuBuffer } from './wgslBuffer';\nimport { TgpuIdentifier } from './wgslIdentifier';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBufferUsage<\n TData extends AnyTgpuData,\n TUsage extends BufferUsage = BufferUsage,\n> extends TgpuBindable<TData, TUsage> {}\n\nexport function bufferUsage<\n TData extends AnyTgpuData,\n TUsage extends BufferUsage,\n>(buffer: TgpuBuffer<TData>, usage: TUsage): TgpuBufferUsage<TData, TUsage> {\n return new TgpuBufferUsageImpl(buffer, usage);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferUsageImpl<TData extends AnyTgpuData, TUsage extends BufferUsage>\n implements TgpuBufferUsage<TData, TUsage>\n{\n constructor(\n public readonly buffer: TgpuBuffer<TData>,\n public readonly usage: TUsage,\n ) {}\n\n get label() {\n return this.buffer.label;\n }\n\n get allocatable() {\n return this.buffer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new TgpuIdentifier().$name(this.label);\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 { read, write } from './tgpuBufferUtils';\nimport { buffer } from './wgslBuffer';\n\nexport const tgpu = {\n createBuffer: buffer,\n read,\n write,\n};\n","import {\n type VecKind,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n type vecBase,\n} from './vector';\n\nconst lengthVec2 = (v: vec2f | vec2i | vec2u) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: vec3f | vec3i | vec3u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: vec4f | vec4i | vec4u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nexport const VectorOps = {\n length: {\n vec2f: lengthVec2,\n vec2i: lengthVec2,\n vec2u: lengthVec2,\n vec3f: lengthVec3,\n vec3i: lengthVec3,\n vec3u: lengthVec3,\n vec4f: lengthVec4,\n vec4i: lengthVec4,\n vec4u: lengthVec4,\n } as Record<VecKind, (v: vecBase) => number>,\n\n add: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x + b.x, a.y + b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x + b.x, a.y + b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x + b.x, a.y + b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x + b.x, a.y + b.y, a.z + b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n sub: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x - b.x, a.y - b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x - b.x, a.y - b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x - b.x, a.y - b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x - b.x, a.y - b.y, a.z - b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n mul: {\n vec2f: (s: number, v: vec2f) => vec2f(s * v.x, s * v.y),\n vec2i: (s: number, v: vec2i) => vec2i(s * v.x, s * v.y),\n vec2u: (s: number, v: vec2u) => vec2u(s * v.x, s * v.y),\n\n vec3f: (s: number, v: vec3f) => vec3f(s * v.x, s * v.y, s * v.z),\n vec3i: (s: number, v: vec3i) => vec3i(s * v.x, s * v.y, s * v.z),\n vec3u: (s: number, v: vec3u) => vec3u(s * v.x, s * v.y, s * v.z),\n\n vec4f: (s: number, v: vec4f) => vec4f(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4i: (s: number, v: vec4i) => vec4i(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4u: (s: number, v: vec4u) => vec4u(s * v.x, s * v.y, s * v.z, s * v.w),\n } as Record<VecKind, <T extends vecBase>(s: number, v: T) => T>,\n\n dot: {\n vec2f: (lhs: vec2f, rhs: vec2f) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2i: (lhs: vec2i, rhs: vec2i) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2u: (lhs: vec2u, rhs: vec2u) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec3f: (lhs: vec3f, rhs: vec3f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3i: (lhs: vec3i, rhs: vec3i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3u: (lhs: vec3u, rhs: vec3u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec4f: (lhs: vec4f, rhs: vec4f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4i: (lhs: vec4i, rhs: vec4i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4u: (lhs: vec4u, rhs: vec4u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: vec2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2i: (v: vec2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: vec2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: vec3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: vec3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: vec3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: vec4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: vec4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: vec4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vecBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: vec3f, b: vec3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3i: (a: vec3i, b: vec3i) => {\n return vec3i(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3u: (a: vec3u, b: vec3u) => {\n return vec3u(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3i' | 'vec3u',\n <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T\n >,\n};\n","import type { vec3f, vec3i, vec3u, vecBase } from './data';\nimport { VectorOps } from './data/vectorOps';\n\nexport const std = {\n add: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.add[lhs.kind](lhs, rhs),\n sub: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.sub[lhs.kind](lhs, rhs),\n mul: <T extends vecBase>(s: number, v: T): T => VectorOps.mul[v.kind](s, v),\n dot: <T extends vecBase>(lhs: T, rhs: T): number =>\n VectorOps.dot[lhs.kind](lhs, rhs),\n normalize: <T extends vecBase>(v: T): T => VectorOps.normalize[v.kind](v),\n cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T): T =>\n VectorOps.cross[a.kind](a, b),\n fract: (a: number): number => a - Math.floor(a),\n length: <T extends vecBase>(vector: T): number =>\n VectorOps.length[vector.kind](vector),\n sin: Math.sin,\n cos: Math.cos,\n};\n","/**\n * @module typegpu\n */\n\nimport { tgpu } from './tgpu';\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n TexelFormat,\n} from './types';\nexport { std } from './std';\n\nexport type { TgpuBuffer } from './wgslBuffer';\n\nexport default tgpu;\n"]}
|
package/index.d.cts
CHANGED
@@ -1,272 +1,76 @@
|
|
1
|
-
import { W as WgslResolvable, a as WgslSlot, b as WgslPlum, E as ExtractPlumValue, c as WgslSettable, U as Unsubscribe, A as AnyWgslData, d as WgslAllocatable, e as Wgsl, B as BufferUsage, f as WgslBindable, g as Eventual, I as InlineResolve, h as WgslFnArgument, R as ResolutionCtx, i as WgslValue, j as WgslIdentifier, k as WgslResolvableSlot, p as plum, l as plumFromEvent } from './types-DeF6xFAt.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-DeF6xFAt.cjs';
|
3
1
|
import { Parsed } from 'typed-binary';
|
4
|
-
import {
|
2
|
+
import { A as AnyTgpuData, B as BufferUsage, T as TgpuBindable, a as TgpuAllocatable, b as TgpuNamable, c as TgpuPlum, v as vecBase, d as vec3f, e as vec3i, f as vec3u } from './types-DU0c7BuW.cjs';
|
3
|
+
export { h as TexelFormat, g as TgpuData } from './types-DU0c7BuW.cjs';
|
5
4
|
|
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
|
-
}
|
19
|
-
/**
|
20
|
-
* @category Errors
|
21
|
-
*/
|
22
|
-
declare class MissingSlotValueError extends Error {
|
23
|
-
readonly slot: WgslSlot<unknown>;
|
24
|
-
constructor(slot: WgslSlot<unknown>);
|
25
|
-
}
|
26
|
-
/**
|
27
|
-
* @category Errors
|
28
|
-
*/
|
29
|
-
declare class RecursiveDataTypeError extends Error {
|
30
|
-
constructor();
|
5
|
+
interface TgpuBufferUsage<TData extends AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuBindable<TData, TUsage> {
|
31
6
|
}
|
32
7
|
|
33
|
-
|
34
|
-
_bound: Callable<TArgs, TReturn>;
|
35
|
-
constructor();
|
36
|
-
abstract _call(...args: TArgs): TReturn;
|
37
|
-
}
|
38
|
-
type ICallable<TArgs extends [...any[]], TReturn> = (...args: TArgs) => TReturn;
|
39
|
-
type AsCallable<T, TArgs extends [...any[]], TReturn> = T & ICallable<TArgs, TReturn>;
|
40
|
-
|
41
|
-
interface TypeGpuRuntime {
|
8
|
+
interface Unmanaged {
|
42
9
|
readonly device: GPUDevice;
|
43
|
-
|
44
|
-
* The current command encoder. This property will
|
45
|
-
* hold the same value until `flush()` is called.
|
46
|
-
*/
|
47
|
-
readonly commandEncoder: GPUCommandEncoder;
|
48
|
-
readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
|
49
|
-
setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: ExtractPlumValue<TPlum>): void;
|
50
|
-
onPlumChange<TValue>(plum: WgslPlum<TValue>, listener: () => unknown): Unsubscribe;
|
51
|
-
writeBuffer<TValue extends AnyWgslData>(allocatable: WgslAllocatable<TValue>, data: Parsed<TValue>): void;
|
52
|
-
readBuffer<TData extends AnyWgslData>(allocatable: WgslAllocatable<TData>): Promise<Parsed<TData>>;
|
53
|
-
bufferFor(allocatable: WgslAllocatable): GPUBuffer;
|
54
|
-
dispose(): void;
|
55
|
-
/**
|
56
|
-
* Causes all commands enqueued by pipelines to be
|
57
|
-
* submitted to the GPU.
|
58
|
-
*/
|
59
|
-
flush(): void;
|
60
|
-
makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;
|
61
|
-
makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;
|
62
|
-
}
|
63
|
-
interface RenderPipelineOptions {
|
64
|
-
vertex: {
|
65
|
-
args: Wgsl[];
|
66
|
-
code: Wgsl;
|
67
|
-
output: WgslStruct<Record<string, AnyWgslData>>;
|
68
|
-
buffersLayouts?: Iterable<GPUVertexBufferLayout | null>;
|
69
|
-
};
|
70
|
-
fragment: {
|
71
|
-
args: Wgsl[];
|
72
|
-
code: Wgsl;
|
73
|
-
output: Wgsl;
|
74
|
-
target: Iterable<GPUColorTargetState | null>;
|
75
|
-
};
|
76
|
-
primitive: GPUPrimitiveState;
|
77
|
-
externalLayouts?: GPUBindGroupLayout[];
|
78
|
-
externalDeclarations?: Wgsl[];
|
79
|
-
label?: string;
|
80
|
-
}
|
81
|
-
interface ComputePipelineOptions {
|
82
|
-
workgroupSize?: readonly [number, number?, number?];
|
83
|
-
args?: Wgsl[];
|
84
|
-
code: Wgsl;
|
85
|
-
externalLayouts?: GPUBindGroupLayout[];
|
86
|
-
externalDeclarations?: Wgsl[];
|
87
|
-
label?: string;
|
88
|
-
}
|
89
|
-
type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
|
90
|
-
vertexCount: number;
|
91
|
-
instanceCount?: number;
|
92
|
-
firstVertex?: number;
|
93
|
-
firstInstance?: number;
|
94
|
-
externalBindGroups?: GPUBindGroup[];
|
95
|
-
externalVertexBuffers?: GPUBuffer[];
|
96
|
-
};
|
97
|
-
interface RenderPipelineExecutor {
|
98
|
-
execute(options: RenderPipelineExecutorOptions): void;
|
10
|
+
readonly buffer: GPUBuffer;
|
99
11
|
}
|
100
|
-
|
101
|
-
|
102
|
-
externalBindGroups?: GPUBindGroup[];
|
103
|
-
};
|
104
|
-
interface ComputePipelineExecutor {
|
105
|
-
execute(options?: ComputePipelineExecutorOptions): void;
|
12
|
+
interface AllowUniform {
|
13
|
+
uniformAllowed: true;
|
106
14
|
}
|
107
|
-
|
108
|
-
|
109
|
-
nameFor(item: WgslResolvable): string;
|
15
|
+
interface AllowReadonly {
|
16
|
+
readonlyAllowed: true;
|
110
17
|
}
|
111
|
-
|
112
|
-
|
113
|
-
private names;
|
114
|
-
nameFor(item: WgslResolvable): string;
|
18
|
+
interface AllowMutable {
|
19
|
+
mutableAllowed: true;
|
115
20
|
}
|
116
|
-
|
117
|
-
|
118
|
-
* Allows to provide a good fallback for instances of the
|
119
|
-
* same function that are bound to different slot values.
|
120
|
-
*/
|
121
|
-
private readonly _usedNames;
|
122
|
-
private readonly _assignedNames;
|
123
|
-
nameFor(item: WgslResolvable): string;
|
21
|
+
interface AllowVertex {
|
22
|
+
vertexAllowed: true;
|
124
23
|
}
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
readonly
|
129
|
-
|
24
|
+
type AllowedUsages<TData extends AnyTgpuData> = {
|
25
|
+
uniform: TgpuBufferUsage<TData, 'uniform'> | null;
|
26
|
+
mutable: TgpuBufferUsage<TData, 'mutable'> | null;
|
27
|
+
readonly: TgpuBufferUsage<TData, 'readonly'> | null;
|
28
|
+
vertex: TgpuBufferUsage<TData, 'vertex'> | null;
|
130
29
|
};
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
30
|
+
interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuAllocatable<TData>, TgpuNamable {
|
31
|
+
$allowUniform(): this & AllowUniform;
|
32
|
+
$allowReadonly(): this & AllowReadonly;
|
33
|
+
$allowMutable(): this & AllowMutable;
|
34
|
+
$allowVertex(stepMode: 'vertex' | 'instance'): this & AllowVertex;
|
35
|
+
$addFlags(flags: GPUBufferUsageFlags): this;
|
36
|
+
$device(device: GPUDevice): this & Unmanaged;
|
37
|
+
_usages: AllowedUsages<TData>;
|
38
|
+
readonly label: string | undefined;
|
39
|
+
}
|
40
|
+
declare function buffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
|
41
|
+
declare function buffer<TData extends AnyTgpuData>(typeSchema: TData, gpuBuffer: GPUBuffer): TgpuBuffer<TData>;
|
42
|
+
|
43
|
+
declare function write<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged, data: Parsed<TData>): void;
|
44
|
+
declare function read<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged): Promise<Parsed<TData>>;
|
45
|
+
|
46
|
+
declare const tgpu: {
|
47
|
+
createBuffer: typeof buffer;
|
48
|
+
read: typeof read;
|
49
|
+
write: typeof write;
|
135
50
|
};
|
136
|
-
declare class ProgramBuilder {
|
137
|
-
private runtime;
|
138
|
-
private root;
|
139
|
-
constructor(runtime: TypeGpuRuntime, root: WgslResolvable);
|
140
|
-
build(options: BuildOptions): Program;
|
141
|
-
}
|
142
|
-
|
143
|
-
interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {
|
144
|
-
$name(label: string): WgslVar<TDataType>;
|
145
|
-
}
|
146
|
-
|
147
|
-
interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage> extends WgslBindable<TData, TUsage> {
|
148
|
-
$name(label: string): WgslBufferUsage<TData, TUsage>;
|
149
|
-
}
|
150
|
-
|
151
|
-
interface WgslBuffer<TData extends AnyWgslData, TAllows extends BufferUsage = never> extends WgslAllocatable<TData> {
|
152
|
-
$name(label: string): WgslBuffer<TData, TAllows>;
|
153
|
-
$allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;
|
154
|
-
$allowReadonlyStorage(): WgslBuffer<TData, TAllows | 'readonly_storage'>;
|
155
|
-
$allowMutableStorage(): WgslBuffer<TData, TAllows | 'mutable_storage'>;
|
156
|
-
$addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;
|
157
|
-
asUniform(): 'uniform' extends TAllows ? WgslBufferUsage<TData, 'uniform'> : null;
|
158
|
-
asMutableStorage(): 'mutable_storage' extends TAllows ? WgslBufferUsage<TData, 'mutable_storage'> : null;
|
159
|
-
asReadonlyStorage(): 'readonly_storage' extends TAllows ? WgslBufferUsage<TData, 'readonly_storage'> : null;
|
160
|
-
}
|
161
|
-
declare function buffer<TData extends AnyWgslData, TUsage extends BufferUsage = never>(typeSchema: TData, initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined): WgslBuffer<TData, TUsage>;
|
162
|
-
|
163
|
-
interface WgslCode extends WgslResolvable {
|
164
|
-
$name(label?: string | undefined): WgslCode;
|
165
|
-
with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslCode;
|
166
|
-
}
|
167
|
-
type BoundWgslCode = Omit<WgslCode, '$name'>;
|
168
|
-
declare function code(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslCode;
|
169
51
|
|
170
|
-
interface WgslConst extends WgslResolvable {
|
171
|
-
$name(label: string): WgslConst;
|
172
|
-
}
|
173
52
|
/**
|
174
|
-
*
|
175
|
-
* to the passed in expression.
|
53
|
+
* @category Errors
|
176
54
|
*/
|
177
|
-
declare
|
178
|
-
|
179
|
-
interface WgslDeclare extends WgslResolvable {
|
180
|
-
}
|
181
|
-
declare function declare(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslDeclare;
|
182
|
-
|
183
|
-
interface WgslFn$1 extends WgslResolvable {
|
184
|
-
$name(label: string): WgslFn$1;
|
185
|
-
with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;
|
186
|
-
}
|
187
|
-
type BoundWgslFn = Omit<WgslFn$1, '$name'>;
|
188
|
-
declare function fn$1(strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]): WgslFn$1;
|
189
|
-
|
190
|
-
interface WgslFn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends WgslResolvable, Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> {
|
191
|
-
}
|
192
|
-
declare function fn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined>(argTypes: TArgTypes, returnType?: TReturn): (bodyProducer: (...args: ValuesFromTypes<TArgTypes>) => Wgsl) => AsCallable<WgslFnImpl<TArgTypes, TReturn>, SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes>>;
|
193
|
-
type ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {
|
194
|
-
[K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;
|
195
|
-
};
|
196
|
-
type PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {
|
197
|
-
[K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];
|
198
|
-
};
|
199
|
-
type SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {
|
200
|
-
[K in keyof TArgTypes]: Wgsl;
|
201
|
-
};
|
202
|
-
declare class WgslFunctionCall<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> implements WgslResolvable {
|
203
|
-
private usedFn;
|
204
|
-
private readonly args;
|
205
|
-
constructor(usedFn: WgslFn<TArgTypes, TReturn>, args: SegmentsFromTypes<TArgTypes>);
|
206
|
-
resolve(ctx: ResolutionCtx): string;
|
207
|
-
toString(): string;
|
208
|
-
}
|
209
|
-
declare class WgslFnImpl<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> implements WgslFn<TArgTypes, TReturn> {
|
210
|
-
private argPairs;
|
211
|
-
private returnType;
|
212
|
-
private readonly body;
|
213
|
-
private _label;
|
214
|
-
constructor(argPairs: PairsFromTypes<TArgTypes>, returnType: TReturn | undefined, body: Wgsl);
|
215
|
-
get label(): string | undefined;
|
216
|
-
$name(label: string): this;
|
217
|
-
resolve(ctx: ResolutionCtx): string;
|
218
|
-
_call(...args: SegmentsFromTypes<TArgTypes>): WgslFunctionCall<TArgTypes, TReturn>;
|
219
|
-
toString(): string;
|
55
|
+
declare class RecursiveDataTypeError extends Error {
|
56
|
+
constructor();
|
220
57
|
}
|
221
58
|
|
222
|
-
declare
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
constant: typeof constant;
|
234
|
-
declare: typeof declare;
|
235
|
-
var: <TDataType extends AnyWgslData>(dataType: TDataType, initialValue?: Wgsl) => WgslVar<TDataType>;
|
59
|
+
declare const std: {
|
60
|
+
add: <T extends vecBase>(lhs: T, rhs: T) => T;
|
61
|
+
sub: <T extends vecBase>(lhs: T, rhs: T) => T;
|
62
|
+
mul: <T extends vecBase>(s: number, v: T) => T;
|
63
|
+
dot: <T extends vecBase>(lhs: T, rhs: T) => number;
|
64
|
+
normalize: <T extends vecBase>(v: T) => T;
|
65
|
+
cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T;
|
66
|
+
fract: (a: number) => number;
|
67
|
+
length: <T extends vecBase>(vector: T) => number;
|
68
|
+
sin: (x: number) => number;
|
69
|
+
cos: (x: number) => number;
|
236
70
|
};
|
237
71
|
|
238
72
|
/**
|
239
|
-
*
|
240
|
-
*/
|
241
|
-
type CreateRuntimeOptions = {
|
242
|
-
adapter: GPURequestAdapterOptions | undefined;
|
243
|
-
device: GPUDeviceDescriptor | undefined;
|
244
|
-
};
|
245
|
-
/**
|
246
|
-
* @param options
|
247
|
-
* @returns
|
248
|
-
*
|
249
|
-
* @example
|
250
|
-
* When given no options, the function will ask the browser for a suitable GPU device.
|
251
|
-
* ```ts
|
252
|
-
* createRuntime();
|
253
|
-
* ```
|
254
|
-
*
|
255
|
-
* @example
|
256
|
-
* If there are specific options that should be used when requesting a device, you can pass those in.
|
257
|
-
* ```ts
|
258
|
-
* const adapterOptions: GPURequestAdapterOptions = ...;
|
259
|
-
* const deviceDescriptor: GPUDeviceDescriptor = ...;
|
260
|
-
* createRuntime({ adapter: adapterOptions, device: deviceDescriptor });
|
261
|
-
* ```
|
262
|
-
*
|
263
|
-
* @example
|
264
|
-
* If a specific device should be used instead, it can be passed in as a parameter.
|
265
|
-
* ```ts
|
266
|
-
* const device: GPUDevice = ...;
|
267
|
-
* createRuntime(device);
|
268
|
-
* ```
|
73
|
+
* @module typegpu
|
269
74
|
*/
|
270
|
-
declare function createRuntime(options?: CreateRuntimeOptions | GPUDevice): Promise<TypeGpuRuntime>;
|
271
75
|
|
272
|
-
export {
|
76
|
+
export { AnyTgpuData, RecursiveDataTypeError, type TgpuBuffer, tgpu as default, std };
|