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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. package/README.md +29 -0
  2. package/chunk-7HTWRNOH.cjs +12 -0
  3. package/chunk-7HTWRNOH.cjs.map +1 -0
  4. package/chunk-K2GYQABQ.js +12 -0
  5. package/chunk-K2GYQABQ.js.map +1 -0
  6. package/data/index.cjs +2 -0
  7. package/data/index.cjs.map +1 -0
  8. package/data/index.d.cts +38 -0
  9. package/data/index.d.ts +38 -0
  10. package/data/index.js +2 -0
  11. package/data/index.js.map +1 -0
  12. package/index.cjs +49 -0
  13. package/index.cjs.map +1 -0
  14. package/{dist/index.d.cts → index.d.cts} +129 -30
  15. package/{dist/index.d.ts → index.d.ts} +129 -30
  16. package/index.js +49 -0
  17. package/index.js.map +1 -0
  18. package/macro/index.cjs +8 -0
  19. package/{dist/macro → macro}/index.d.cts +1 -1
  20. package/{dist/macro → macro}/index.d.ts +1 -1
  21. package/{dist/macro → macro}/index.js +1 -1
  22. package/package.json +30 -37
  23. package/std140-Cv7GDE9w.d.ts +26 -0
  24. package/std140-DRitCcmc.d.cts +26 -0
  25. package/types-ENDwr_p9.d.cts +243 -0
  26. package/types-ENDwr_p9.d.ts +243 -0
  27. package/dist/chunk-3VCFA6WZ.cjs +0 -2
  28. package/dist/chunk-3VCFA6WZ.cjs.map +0 -1
  29. package/dist/chunk-G3U6RTMF.cjs +0 -2
  30. package/dist/chunk-G3U6RTMF.cjs.map +0 -1
  31. package/dist/chunk-GHP25GEO.js +0 -2
  32. package/dist/chunk-GHP25GEO.js.map +0 -1
  33. package/dist/chunk-XGSMOADT.js +0 -2
  34. package/dist/chunk-XGSMOADT.js.map +0 -1
  35. package/dist/data/index.cjs +0 -10
  36. package/dist/data/index.cjs.map +0 -1
  37. package/dist/data/index.d.cts +0 -84
  38. package/dist/data/index.d.ts +0 -84
  39. package/dist/data/index.js +0 -10
  40. package/dist/data/index.js.map +0 -1
  41. package/dist/index.cjs +0 -29
  42. package/dist/index.cjs.map +0 -1
  43. package/dist/index.js +0 -29
  44. package/dist/index.js.map +0 -1
  45. package/dist/macro/index.cjs +0 -8
  46. package/dist/struct-CpjQEnf9.d.cts +0 -9
  47. package/dist/struct-HAlb4aG-.d.ts +0 -9
  48. package/dist/types-gpN_64mT.d.cts +0 -148
  49. package/dist/types-gpN_64mT.d.ts +0 -148
  50. /package/{dist/macro → macro}/index.cjs.map +0 -0
  51. /package/{dist/macro → macro}/index.js.map +0 -0
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ <div align="center">
2
+
3
+ ![TypeGPU (light mode)](/apps/typegpu-docs/public/typegpu-logo-light.svg#gh-light-mode-only)
4
+ ![TypeGPU (dark mode)](/apps/typegpu-docs/public/typegpu-logo-dark.svg#gh-dark-mode-only)
5
+
6
+ [Website](https://docs.swmansion.com/typegpu) — [Live Examples](https://docs.swmansion.com/typegpu/examples) — [Documentation](https://docs.swmansion.com/typegpu/guides/getting-started)
7
+
8
+ </div>
9
+
10
+ TypeScript library simplifying the WebGPU API and WGSL with zero-cost abstractions, type-safe data transfer and dependency injection.
11
+
12
+ ## Documentation
13
+
14
+ We created a set of guides and tutorials to get you up and running fast. Check out our [Official Docs](https://docs.swmansion.com/typegpu/guides/getting-started)!
15
+
16
+ ## Live Examples
17
+
18
+ To show the flexibility and simplicity of **TypeGPU**, we provide the [Live Examples](https://docs.swmansion.com/typegpu/examples) platform. It allows you to change the example
19
+ code in real-time!
20
+
21
+ ## What's next?
22
+
23
+ - [Join the Software Mansion Community Discord](https://discord.swmansion.com) to chat about TypeGPU or other Software Mansion libraries.
24
+
25
+ ## TypeGPU is created by Software Mansion
26
+
27
+ [![swm](https://logo.swmansion.com/logo?color=white&variant=desktop&width=150&tag=react-native-reanimated-github 'Software Mansion')](https://swmansion.com)
28
+
29
+ Since 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues. We can help you build your next dream product – [Hire us](https://swmansion.com/contact/projects?utm_source=reanimated&utm_medium=readme).
@@ -0,0 +1,12 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }var E=Object.defineProperty,M=Object.defineProperties;var k=Object.getOwnPropertyDescriptors;var f=Object.getOwnPropertySymbols;var D=Object.prototype.hasOwnProperty,B=Object.prototype.propertyIsEnumerable;var x=(t,n,e)=>n in t?E(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e,ee= exports.a =(t,n)=>{for(var e in n||(n={}))D.call(n,e)&&x(t,e,n[e]);if(f)for(var e of f(n))B.call(n,e)&&x(t,e,n[e]);return t},te= exports.b =(t,n)=>M(t,k(n));var re=(t,n)=>{var e={};for(var r in t)D.call(t,r)&&n.indexOf(r)<0&&(e[r]=t[r]);if(t!=null&&f)for(var r of f(t))n.indexOf(r)<0&&B.call(t,r)&&(e[r]=t[r]);return e};var s=(t,n,e)=>(x(t,typeof n!="symbol"?n+"":n,e),e);var _typedbinary = require('typed-binary'); var a = _interopRequireWildcard(_typedbinary); var P = _interopRequireWildcard(_typedbinary); var $ = _interopRequireWildcard(_typedbinary);var R=class t extends Error{constructor(e,r){let i=r.map(p=>`- ${p}`);i.length>20&&(i=[...i.slice(0,11),"...",...i.slice(-10)]);super(`Resolution of the following tree failed:
2
+ ${i.join(`
3
+ `)}`);this.cause=e;this.trace=r;Object.setPrototypeOf(this,t.prototype)}appendToTrace(e){let r=[e,...this.trace];return new t(this.cause,r)}},A= exports.f =class t extends Error{constructor(e){super(`Missing value for '${e}'`);this.slot=e;Object.setPrototypeOf(this,t.prototype)}},d= exports.g =class t extends Error{constructor(){super("Recursive types are not supported in WGSL"),Object.setPrototypeOf(this,t.prototype)}};function C(t,n){let e="size"in t?t.size:t.currentByteOffset,r=n-1,i=e&r;"skipBytes"in t?t.skipBytes(n-i&r):t.add(n-i&r)}var m=C;var o=class extends _typedbinary.Schema{constructor({schema:e,byteAlignment:r,code:i}){super();s(this,"size");s(this,"byteAlignment");s(this,"expressionCode");s(this,"_innerSchema");this._innerSchema=e,this.byteAlignment=r,this.expressionCode=i,this.size=this.measure(_typedbinary.MaxValue).size}resolveReferences(){throw new d}write(e,r){m(e,this.byteAlignment),this._innerSchema.write(e,r)}read(e){return m(e,this.byteAlignment),this._innerSchema.read(e)}measure(e,r=new _typedbinary.Measurer){return m(r,this.byteAlignment),this._innerSchema.measure(e,r),r}getUnderlyingTypeString(){if(typeof this.expressionCode=="string")return this.expressionCode;if("elementSchema"in this._innerSchema)return this._innerSchema.elementSchema.getUnderlyingTypeString();throw new Error("Unexpected type used as vertex buffer element")}getUnderlyingType(){return"elementSchema"in this._innerSchema?this._innerSchema.elementSchema.getUnderlyingType():this}resolve(e){return e.resolve(this.expressionCode)}};var ce=new o({schema:a.bool,byteAlignment:4,code:"bool"}),c= exports.s =new o({schema:a.u32,byteAlignment:4,code:"u32"}),de= exports.t =new o({schema:a.i32,byteAlignment:4,code:"i32"}),T= exports.u =new o({schema:a.f32,byteAlignment:4,code:"f32"}),ye= exports.v =new o({schema:a.tupleOf([a.u32,a.u32]),byteAlignment:8,code:"vec2u"}),ge= exports.w =new o({schema:a.tupleOf([a.i32,a.i32]),byteAlignment:8,code:"vec2i"}),fe= exports.x =new o({schema:a.tupleOf([a.f32,a.f32]),byteAlignment:8,code:"vec2f"}),g= exports.y =new o({schema:a.tupleOf([a.u32,a.u32,a.u32]),byteAlignment:16,code:"vec3u"}),xe= exports.z =new o({schema:a.tupleOf([a.i32,a.i32,a.i32]),byteAlignment:16,code:"vec3i"}),Te= exports.A =new o({schema:a.tupleOf([a.f32,a.f32,a.f32]),byteAlignment:16,code:"vec3f"}),be= exports.B =new o({schema:a.tupleOf([a.u32,a.u32,a.u32,a.u32]),byteAlignment:16,code:"vec4u"}),he= exports.C =new o({schema:a.tupleOf([a.i32,a.i32,a.i32,a.i32]),byteAlignment:16,code:"vec4i"}),b= exports.D =new o({schema:a.tupleOf([a.f32,a.f32,a.f32,a.f32]),byteAlignment:16,code:"vec4f"}),We= exports.E =new o({schema:a.arrayOf(a.f32,16),byteAlignment:16,code:"mat4x4f"});function h(t){return!!t&&(typeof t=="object"||typeof t=="function")&&"resolve"in t}function Se(t){return typeof t=="number"||typeof t=="boolean"||typeof t=="string"||h(t)}function ve(t){return t.__brand==="WgslSlot"}function we(t){return t==="sampler"||t==="sampler_comparison"}function Ie(t){return["texture_1d","texture_2d","texture_2d_array","texture_3d","texture_cube","texture_cube_array","texture_multisampled_2d"].includes(t)}function De(t){return["texture_depth_2d","texture_depth_2d_array","texture_depth_cube","texture_depth_cube_array","texture_depth_multisampled_2d"].includes(t)}function Be(t){return["texture_storage_1d","texture_storage_2d","texture_storage_2d_array","texture_storage_3d"].includes(t)}function Re(t){return t==="texture_external"}function Ae(t){return"pointsTo"in t}var l=class{constructor(){s(this,"label")}$name(n){return this.label=n,this}resolve(n){return n.nameFor(this)}toString(){var n;return`id:${(n=this.label)!=null?n:"<unnamed>"}`}};var u={vertexIndex:Symbol("builtin_vertexIndex"),instanceIndex:Symbol("builtin_instanceIndex"),position:Symbol("builtin_position"),clipDistances:Symbol("builtin_clipDistances"),frontFacing:Symbol("builtin_frontFacing"),fragDepth:Symbol("builtin_fragDepth"),sampleIndex:Symbol("builtin_sampleIndex"),sampleMask:Symbol("builtin_sampleMask"),fragment:Symbol("builtin_fragment"),localInvocationId:Symbol("builtin_localInvocationId"),localInvocationIndex:Symbol("builtin_localInvocationIndex"),globalInvocationId:Symbol("builtin_globalInvocationId"),workgroupId:Symbol("builtin_workgroupId"),numWorkgroups:Symbol("builtin_numWorkgroups")},U={[u.vertexIndex]:{name:"vertex_index",stage:"vertex",direction:"input",type:c,identifier:new l().$name("vertex_index")},[u.instanceIndex]:{name:"instance_index",stage:"vertex",direction:"input",type:c,identifier:new l().$name("instance_index")},[u.position]:{name:"position",stage:"vertex",direction:"output",type:b,identifier:new l().$name("position")},[u.clipDistances]:{name:"clip_distances",stage:"vertex",direction:"output",type:new o({schema:P.arrayOf(c,8),byteAlignment:16,code:"array<u32, 8>"}),identifier:new l().$name("clip_distances")},[u.frontFacing]:{name:"front_facing",stage:"fragment",direction:"input",type:T,identifier:new l().$name("front_facing")},[u.fragDepth]:{name:"frag_depth",stage:"fragment",direction:"output",type:T,identifier:new l().$name("frag_depth")},[u.sampleIndex]:{name:"sample_index",stage:"fragment",direction:"input",type:c,identifier:new l().$name("sample_index")},[u.sampleMask]:{name:"sample_mask",stage:"fragment",direction:"input",type:c,identifier:new l().$name("sample_mask")},[u.fragment]:{name:"fragment",stage:"fragment",direction:"input",type:b,identifier:new l().$name("fragment")},[u.localInvocationId]:{name:"local_invocation_id",stage:"compute",direction:"input",type:g,identifier:new l().$name("local_invocation_id")},[u.localInvocationIndex]:{name:"local_invocation_index",stage:"compute",direction:"input",type:c,identifier:new l().$name("local_invocation_index")},[u.globalInvocationId]:{name:"global_invocation_id",stage:"compute",direction:"input",type:g,identifier:new l().$name("global_invocation_id")},[u.workgroupId]:{name:"workgroup_id",stage:"compute",direction:"input",type:g,identifier:new l().$name("workgroup_id")},[u.numWorkgroups]:{name:"num_workgroups",stage:"compute",direction:"input",type:g,identifier:new l().$name("num_workgroups")}};function V(t){let n=U[t];if(!n)throw new Error("Symbol is not a member of builtin");return n}function Ee(t){return Object.getOwnPropertySymbols(t).map(e=>{let r=U[e];if(!r)throw new Error("Symbol is not a member of builtin");let i=t[e];if(!i)throw new Error("Name is not provided");return{name:i,builtin:r}})}function y(t,...n){let e=t.flatMap((r,i)=>{let p=n[i];return p===void 0?[r]:Array.isArray(p)?[r,...p]:[r,p]});return new W(e)}var W=class{constructor(n){this.segments=n;s(this,"_label")}get label(){return this._label}$name(n){return this._label=n,this}resolve(n){let e="";for(let r of this.segments)if(typeof r=="function"){let i=r(p=>n.unwrap(p));e+=n.resolve(i)}else if(h(r))e+=n.resolve(r);else if(typeof r=="symbol"){let i=V(r);n.addBuiltin(i),e+=n.resolve(i.identifier)}else e+=String(r);return e}with(n,e){return new _(this,[n,e])}toString(){var n;return`code:${(n=this._label)!=null?n:"<unnamed>"}`}},_=class t{constructor(n,e){this._innerFn=n;this._slotValuePair=e}get label(){return this._innerFn.label}with(n,e){return new t(this,[n,e])}resolve(n){return n.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,i;let[n,e]=this._slotValuePair;return`code:${(r=this.label)!=null?r:"<unnamed>"}[${(i=n.label)!=null?i:"<unnamed>"}=${e}]`}};var S=class extends _typedbinary.Schema{constructor(e,r){super();this._elementType=e;this.capacity=r;s(this,"_label");s(this,"byteAlignment");s(this,"size");this.byteAlignment=Math.max(4,this._elementType.byteAlignment),this.size=this.measure(_typedbinary.MaxValue).size}$name(e){return this._label=e,this}resolveReferences(){throw new d}write(e,r){if(r.length>this.capacity)throw new (0, _typedbinary.ValidationError)(`Tried to write too many values, ${r.length} > ${this.capacity}`);m(e,this.byteAlignment),c.write(e,r.length),m(e,this._elementType.byteAlignment);let i=e.currentByteOffset;for(let p of r)this._elementType.write(e,p);e.seekTo(i+this.capacity*this._elementType.size)}read(e){let r=[];m(e,this.byteAlignment);let i=c.read(e);m(e,this._elementType.byteAlignment);let p=e.currentByteOffset;for(let I=0;I<i;++I)r.push(this._elementType.read(e));return e.seekTo(p+this.capacity*this._elementType.size),r}measure(e,r=new _typedbinary.Measurer){return m(r,this.byteAlignment),c.measure(_typedbinary.MaxValue,r),m(r,this._elementType.byteAlignment),r.add(this._elementType.size*this.capacity),r}resolve(e){let r=new l().$name(this._label);return e.addDeclaration(y`
4
+ struct ${r} {
5
+ count: u32,
6
+ values: array<${this._elementType}, ${this.capacity}>,
7
+ }`),e.resolve(r)}},Je= exports.G =(t,n)=>new S(t,n);var rt=t=>new v(t),v=class extends _typedbinary.Schema{constructor(e){super();this._properties=e;s(this,"_label");s(this,"_innerSchema");s(this,"byteAlignment");s(this,"size");this._innerSchema=_typedbinary.object.call(void 0, e),this.byteAlignment=Object.values(e).map(r=>r.byteAlignment).reduce((r,i)=>r>i?r:i),this.size=this.measure(_typedbinary.MaxValue).size}$name(e){return this._label=e,this}resolveReferences(){throw new d}write(e,r){this._innerSchema.write(e,r)}read(e){return this._innerSchema.read(e)}measure(e,r=new _typedbinary.Measurer){return m(r,this.byteAlignment),this._innerSchema.measure(e,r),r}resolve(e){let r=new l().$name(this._label);return e.addDeclaration(y`
8
+ struct ${r} {
9
+ ${Object.entries(this._properties).map(([i,p])=>y`${i}: ${p},\n`)}
10
+ }
11
+ `),e.resolve(r)}};var ot=(t,n)=>new o({schema:$.arrayOf(t,n),byteAlignment:t.byteAlignment,code:y`array<${t}, ${n}>`});function Q(t){return{scope:"function",pointsTo:t}}function Z(t){return new w(t)}var w=class extends _typedbinary.Schema{constructor(e){super();this.innerData=e;s(this,"size");s(this,"byteAlignment");this.size=this.innerData.size,this.byteAlignment=this.innerData.byteAlignment}resolveReferences(){throw new d}write(e,r){this.innerData.write(e,r)}read(e){return this.innerData.read(e)}measure(e,r=new _typedbinary.Measurer){return this.innerData.measure(e,r)}resolve(e){return`atomic<${e.resolve(this.innerData)}>`}};exports.a = ee; exports.b = te; exports.c = re; exports.d = s; exports.e = R; exports.f = A; exports.g = d; exports.h = h; exports.i = Se; exports.j = ve; exports.k = we; exports.l = Ie; exports.m = De; exports.n = Be; exports.o = Re; exports.p = Ae; exports.q = o; exports.r = ce; exports.s = c; exports.t = de; exports.u = T; exports.v = ye; exports.w = ge; exports.x = fe; exports.y = g; exports.z = xe; exports.A = Te; exports.B = be; exports.C = he; exports.D = b; exports.E = We; exports.F = l; exports.G = Je; exports.H = rt; exports.I = ot; exports.J = Q; exports.K = Z; exports.L = u; exports.M = V; exports.N = Ee; exports.O = y;
12
+ //# sourceMappingURL=chunk-7HTWRNOH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/std140.ts","../src/errors.ts","../src/data/alignIO.ts","../src/data/numeric.ts","../src/data/dynamicArray.ts","../src/types.ts","../src/wgslBuiltin.ts","../src/wgslIdentifier.ts","../src/wgslCode.ts","../src/data/struct.ts","../src/data/array.ts","../src/data/pointer.ts","../src/data/atomic.ts"],"names":["MaxValue","Measurer","Schema","ResolutionError","_ResolutionError","cause","trace","entries","ancestor","newTrace","MissingSlotValueError","_MissingSlotValueError","slot","RecursiveDataTypeError","_RecursiveDataTypeError","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","SimpleWgslData","schema","byteAlignment","code","__publicField","output","value","input","measurer","ctx","TB","bool","u32","i32","f32","vec2u","vec2i","vec2f","vec3u","vec3i","vec3f","vec4u","vec4i","vec4f","mat4f","ValidationError","isResolvable","isWgsl","isSlot","isSamplerType","type","isTypedTextureType","isDepthTextureType","isStorageTextureType","isExternalTextureType","isPointer","WgslIdentifier","label","_a","builtin","builtinSymbolToObj","getBuiltinInfo","s","getUsedBuiltinsNamed","o","name","strings","params","segments","string","idx","param","WgslCodeImpl","result","eventual","BoundWgslCodeImpl","_BoundWgslCodeImpl","_innerFn","_slotValuePair","_b","DynamicArrayDataType","_elementType","capacity","values","startOffset","array","len","i","_values","identifier","dynamicArrayOf","elementType","object","struct","properties","WgslStructImpl","_properties","prop","a","b","key","field","arrayOf","size","ptr","pointsTo","atomic","data","AtomicImpl","innerData"],"mappings":"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","sourcesContent":["/*\n * Typed-binary types that adhere to the `std140` layout rules.\n */\n\nimport {\n type AnySchema,\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, Wgsl, WgslData } from '../types';\nimport alignIO from './alignIO';\n\nexport class SimpleWgslData<TSchema extends AnySchema>\n extends Schema<Unwrap<TSchema>>\n implements WgslData<Unwrap<TSchema>>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly expressionCode: Wgsl;\n\n private readonly _innerSchema: TSchema;\n\n /**\n * byteAlignment has to be a power of 2\n */\n constructor({\n schema,\n byteAlignment,\n code,\n }: {\n schema: TSchema;\n byteAlignment: number;\n code: Wgsl;\n }) {\n super();\n\n this._innerSchema = schema;\n this.byteAlignment = byteAlignment;\n this.expressionCode = code;\n this.size = this.measure(MaxValue).size;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n alignIO(output, this.byteAlignment);\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n alignIO(input, this.byteAlignment);\n return this._innerSchema.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n\n this._innerSchema.measure(value, measurer);\n\n return measurer;\n }\n\n getUnderlyingTypeString(): string {\n if (typeof this.expressionCode === 'string') {\n return this.expressionCode;\n }\n if ('elementSchema' in this._innerSchema) {\n const underlyingType = this._innerSchema\n .elementSchema as SimpleWgslData<AnySchema>;\n return underlyingType.getUnderlyingTypeString();\n }\n throw new Error('Unexpected type used as vertex buffer element');\n }\n\n getUnderlyingType(): SimpleWgslData<AnySchema> {\n if ('elementSchema' in this._innerSchema) {\n const underlyingType = this._innerSchema\n .elementSchema as SimpleWgslData<AnySchema>;\n return underlyingType.getUnderlyingType();\n }\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this.expressionCode);\n }\n}\n","import type { WgslResolvable, WgslSlot } from './types';\n\n/**\n * An error that happens during resolution of WGSL code.\n * Contains a trace of all ancestor resolvables in\n * which this error originated.\n *\n * @category Errors\n */\nexport class ResolutionError extends Error {\n constructor(\n public readonly cause: unknown,\n public readonly trace: WgslResolvable[],\n ) {\n let entries = trace.map((ancestor) => `- ${ancestor}`);\n\n // Showing only the root and leaf nodes.\n if (entries.length > 20) {\n entries = [...entries.slice(0, 11), '...', ...entries.slice(-10)];\n }\n\n super(`Resolution of the following tree failed: \\n${entries.join('\\n')}`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ResolutionError.prototype);\n }\n\n appendToTrace(ancestor: WgslResolvable): ResolutionError {\n const newTrace = [ancestor, ...this.trace];\n\n return new ResolutionError(this.cause, newTrace);\n }\n}\n\n/**\n * @category Errors\n */\nexport class MissingSlotValueError extends Error {\n constructor(public readonly slot: WgslSlot<unknown>) {\n super(`Missing value for '${slot}'`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingSlotValueError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class RecursiveDataTypeError extends Error {\n constructor() {\n super('Recursive types are not supported in WGSL');\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, RecursiveDataTypeError.prototype);\n }\n}\n","import type { IMeasurer, ISerialInput, ISerialOutput } from 'typed-binary';\n\n/**\n * @param io the IO to align\n * @param baseAlignment must be power of 2\n */\nfunction alignIO(\n io: ISerialInput | ISerialOutput | IMeasurer,\n baseAlignment: number,\n) {\n const currentPos = 'size' in io ? io.size : io.currentByteOffset;\n\n const bitMask = baseAlignment - 1;\n const offset = currentPos & bitMask;\n\n if ('skipBytes' in io) {\n io.skipBytes((baseAlignment - offset) & bitMask);\n } else {\n io.add((baseAlignment - offset) & bitMask);\n }\n}\n\nexport default alignIO;\n","import * as TB from 'typed-binary';\nimport type { WgslData } from '../types';\nimport { SimpleWgslData } from './std140';\n\nexport type Bool = WgslData<boolean>;\nexport const bool: Bool = new SimpleWgslData({\n schema: TB.bool,\n byteAlignment: 4,\n code: 'bool',\n});\nexport type U32 = WgslData<number>;\nexport const u32: U32 = new SimpleWgslData({\n schema: TB.u32,\n byteAlignment: 4,\n code: 'u32',\n});\nexport type I32 = WgslData<number>;\nexport const i32: I32 = new SimpleWgslData({\n schema: TB.i32,\n byteAlignment: 4,\n code: 'i32',\n});\nexport type F32 = WgslData<number>;\nexport const f32: F32 = new SimpleWgslData({\n schema: TB.f32,\n byteAlignment: 4,\n code: 'f32',\n});\n\nexport type Vec2u = WgslData<[number, number]>;\nexport const vec2u: Vec2u = new SimpleWgslData({\n schema: TB.tupleOf([TB.u32, TB.u32]),\n byteAlignment: 8,\n code: 'vec2u',\n});\n\nexport type Vec2i = WgslData<[number, number]>;\nexport const vec2i: Vec2i = new SimpleWgslData({\n schema: TB.tupleOf([TB.i32, TB.i32]),\n byteAlignment: 8,\n code: 'vec2i',\n});\nexport type Vec2f = WgslData<[number, number]>;\nexport const vec2f: Vec2f = new SimpleWgslData({\n schema: TB.tupleOf([TB.f32, TB.f32]),\n byteAlignment: 8,\n code: 'vec2f',\n});\nexport type Vec3u = WgslData<[number, number, number]>;\nexport const vec3u: Vec3u = new SimpleWgslData({\n schema: TB.tupleOf([TB.u32, TB.u32, TB.u32]),\n byteAlignment: 16,\n code: 'vec3u',\n});\nexport type Vec3i = WgslData<[number, number, number]>;\nexport const vec3i: Vec3i = new SimpleWgslData({\n schema: TB.tupleOf([TB.i32, TB.i32, TB.i32]),\n byteAlignment: 16,\n code: 'vec3i',\n});\nexport type Vec3f = WgslData<[number, number, number]>;\nexport const vec3f: Vec3f = new SimpleWgslData({\n schema: TB.tupleOf([TB.f32, TB.f32, TB.f32]),\n byteAlignment: 16,\n code: 'vec3f',\n});\nexport type Vec4u = WgslData<[number, number, number, number]>;\nexport const vec4u: Vec4u = new SimpleWgslData({\n schema: TB.tupleOf([TB.u32, TB.u32, TB.u32, TB.u32]),\n byteAlignment: 16,\n code: 'vec4u',\n});\nexport type Vec4i = WgslData<[number, number, number, number]>;\nexport const vec4i: Vec4i = new SimpleWgslData({\n schema: TB.tupleOf([TB.i32, TB.i32, TB.i32, TB.i32]),\n byteAlignment: 16,\n code: 'vec4i',\n});\nexport type Vec4f = WgslData<[number, number, number, number]>;\nexport const vec4f: Vec4f = new SimpleWgslData({\n schema: TB.tupleOf([TB.f32, TB.f32, TB.f32, TB.f32]),\n byteAlignment: 16,\n code: 'vec4f',\n});\n\n/**\n * Array of column vectors\n */\nexport type Mat4f = WgslData<number[]>;\nexport const mat4f: Mat4f = new SimpleWgslData({\n schema: TB.arrayOf(TB.f32, 16),\n byteAlignment: 16,\n code: 'mat4x4f',\n});\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n ValidationError,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { AnyWgslData, ResolutionCtx, WgslData } from '../types';\nimport { code } from '../wgslCode';\nimport { WgslIdentifier } from '../wgslIdentifier';\nimport alignIO from './alignIO';\nimport { u32 } from './numeric';\n\nclass DynamicArrayDataType<TElement extends WgslData<unknown>>\n extends Schema<Unwrap<TElement>[]>\n implements WgslData<Unwrap<TElement>[]>\n{\n private _label: string | undefined;\n\n public readonly byteAlignment: number;\n public readonly size: number;\n\n constructor(\n private readonly _elementType: TElement,\n public readonly capacity: number,\n ) {\n super();\n\n this.byteAlignment = Math.max(\n 4 /* u32 base alignment */,\n this._elementType.byteAlignment,\n );\n\n this.size = this.measure(MaxValue).size;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, values: ParseUnwrapped<TElement>[]): void {\n if (values.length > this.capacity) {\n throw new ValidationError(\n `Tried to write too many values, ${values.length} > ${this.capacity}`,\n );\n }\n\n alignIO(output, this.byteAlignment); // aligning to the start\n u32.write(output, values.length);\n alignIO(output, this._elementType.byteAlignment); // aligning to the start of the array\n const startOffset = output.currentByteOffset;\n for (const value of values) {\n this._elementType.write(output, value);\n }\n output.seekTo(startOffset + this.capacity * this._elementType.size);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TElement>[] {\n const array: ParseUnwrapped<TElement>[] = [];\n\n alignIO(input, this.byteAlignment); // aligning to the start\n const len = u32.read(input);\n alignIO(input, this._elementType.byteAlignment); // aligning to the start of the array\n const startOffset = input.currentByteOffset;\n for (let i = 0; i < len; ++i) {\n array.push(this._elementType.read(input) as ParseUnwrapped<TElement>);\n }\n input.seekTo(startOffset + this.capacity * this._elementType.size);\n\n return array;\n }\n\n measure(\n _values: ParseUnwrapped<TElement>[] | typeof MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment); // aligning to the start\n\n // Length encoding\n u32.measure(MaxValue, measurer);\n\n // Aligning to the start of the array\n alignIO(measurer, this._elementType.byteAlignment);\n\n // Values encoding\n measurer.add(this._elementType.size * this.capacity);\n\n return measurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`\n struct ${identifier} {\n count: u32,\n values: array<${this._elementType}, ${this.capacity}>,\n }`);\n\n return ctx.resolve(identifier);\n }\n}\n\nexport const dynamicArrayOf = <TSchema extends AnyWgslData>(\n elementType: TSchema,\n capacity: number,\n) => new DynamicArrayDataType(elementType, capacity);\n\nexport default DynamicArrayDataType;\n","import type { ISchema, Parsed } from 'typed-binary';\nimport type { F32, I32, U32, Vec4f, Vec4i, Vec4u } from './data';\nimport type { Builtin } from './wgslBuiltin';\nimport type { WgslIdentifier } from './wgslIdentifier';\nimport type { WgslPlum } from './wgslPlum';\n\nexport type Wgsl = string | number | WgslResolvable | symbol | boolean;\n\n/**\n * Passed into each resolvable item. All sibling items share a resolution ctx,\n * and a new resolution ctx is made when going down each level in the tree.\n */\nexport interface ResolutionCtx {\n /**\n * Slots that were used by items resolved by this context.\n */\n readonly usedSlots: Iterable<WgslSlot<unknown>>;\n\n addDeclaration(item: WgslResolvable): void;\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void;\n addRenderResource(\n resource: WgslRenderResource,\n identifier: WgslIdentifier,\n ): void;\n addBuiltin(builtin: Builtin): void;\n nameFor(token: WgslResolvable): string;\n /**\n * Unwraps all layers of slot indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;\n}\n\nexport interface WgslResolvable {\n readonly label?: string | undefined;\n\n resolve(ctx: ResolutionCtx): string;\n}\n\nexport function isResolvable(value: unknown): value is WgslResolvable {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'resolve' in value\n );\n}\n\nexport function isWgsl(value: unknown): value is Wgsl {\n return (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isResolvable(value)\n );\n}\n\nexport interface WgslSlot<T> {\n readonly __brand: 'WgslSlot';\n\n readonly defaultValue: T | undefined;\n\n readonly label?: string | undefined;\n\n $name(label: string): WgslSlot<T>;\n\n /**\n * Used to determine if code generated using either value `a` or `b` in place\n * of the slot will be equivalent. Defaults to `Object.is`.\n */\n areEqual(a: T, b: T): boolean;\n}\n\nexport function isSlot<T>(value: unknown | WgslSlot<T>): value is WgslSlot<T> {\n return (value as WgslSlot<T>).__brand === 'WgslSlot';\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | WgslSlot<T>;\n\nexport type EventualGetter = <T>(value: Eventual<T>) => T;\n\nexport type InlineResolve = (get: EventualGetter) => Wgsl;\n\nexport interface WgslResolvableSlot<T extends Wgsl>\n extends WgslResolvable,\n WgslSlot<T> {\n $name(label: string): WgslResolvableSlot<T>;\n}\n\nexport type SlotValuePair<T> = [WgslSlot<T>, T];\n\nexport interface WgslAllocatable<TData extends AnyWgslData = AnyWgslData> {\n /**\n * The data type this allocatable was constructed with.\n * It informs the size and format of data in both JS and\n * binary.\n */\n readonly dataType: TData;\n vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'> | null;\n readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined;\n readonly flags: GPUBufferUsageFlags;\n get label(): string | undefined;\n}\n\nexport interface WgslBindable<\n TData extends AnyWgslData = AnyWgslData,\n TUsage extends BufferUsage = BufferUsage,\n> extends WgslResolvable {\n readonly allocatable: WgslAllocatable<TData>;\n readonly usage: TUsage;\n}\n\nexport type WgslSamplerType = 'sampler' | 'sampler_comparison';\nexport type WgslTypedTextureType =\n | 'texture_1d'\n | 'texture_2d'\n | 'texture_2d_array'\n | 'texture_3d'\n | 'texture_cube'\n | 'texture_cube_array'\n | 'texture_multisampled_2d';\nexport type WgslDepthTextureType =\n | 'texture_depth_2d'\n | 'texture_depth_2d_array'\n | 'texture_depth_cube'\n | 'texture_depth_cube_array'\n | 'texture_depth_multisampled_2d';\nexport type WgslStorageTextureType =\n | 'texture_storage_1d'\n | 'texture_storage_2d'\n | 'texture_storage_2d_array'\n | 'texture_storage_3d';\nexport type WgslExternalTextureType = 'texture_external';\n\nexport type WgslRenderResourceType =\n | WgslSamplerType\n | WgslTypedTextureType\n | WgslDepthTextureType\n | WgslStorageTextureType\n | WgslExternalTextureType;\n\nexport interface WgslRenderResource extends WgslResolvable {\n readonly type: WgslRenderResourceType;\n}\n\nexport type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';\nexport type TextureUsage = 'sampled' | 'storage';\nexport type StorageTextureAccess = 'read' | 'write' | 'read_write';\n\nexport type StorageTextureParams = {\n type: WgslStorageTextureType;\n access: StorageTextureAccess;\n descriptor?: GPUTextureViewDescriptor;\n};\nexport type SampledTextureParams = {\n type: WgslTypedTextureType;\n dataType: AnyWgslPrimitive;\n descriptor?: GPUTextureViewDescriptor;\n};\n\nexport function isSamplerType(\n type: WgslRenderResourceType,\n): type is WgslSamplerType {\n return type === 'sampler' || type === 'sampler_comparison';\n}\n\nexport function isTypedTextureType(\n type: WgslRenderResourceType,\n): type is WgslTypedTextureType {\n return [\n 'texture_1d',\n 'texture_2d',\n 'texture_2d_array',\n 'texture_3d',\n 'texture_cube',\n 'texture_cube_array',\n 'texture_multisampled_2d',\n ].includes(type);\n}\n\nexport function isDepthTextureType(\n type: WgslRenderResourceType,\n): type is WgslDepthTextureType {\n return [\n 'texture_depth_2d',\n 'texture_depth_2d_array',\n 'texture_depth_cube',\n 'texture_depth_cube_array',\n 'texture_depth_multisampled_2d',\n ].includes(type);\n}\n\nexport function isStorageTextureType(\n type: WgslRenderResourceType,\n): type is WgslStorageTextureType {\n return [\n 'texture_storage_1d',\n 'texture_storage_2d',\n 'texture_storage_2d_array',\n 'texture_storage_3d',\n ].includes(type);\n}\n\nexport function isExternalTextureType(\n type: WgslRenderResourceType,\n): type is WgslExternalTextureType {\n return type === 'texture_external';\n}\n\nexport interface WgslData<TInner> extends ISchema<TInner>, WgslResolvable {\n readonly byteAlignment: number;\n readonly size: number;\n}\n\nexport type AnyWgslData = WgslData<unknown>;\nexport type AnyWgslPrimitive = U32 | I32 | F32;\nexport type AnyWgslTexelFormat = Vec4u | Vec4i | Vec4f;\n\nexport interface WgslPointer<\n TScope extends 'function',\n TInner extends AnyWgslData,\n> {\n readonly scope: TScope;\n readonly pointsTo: TInner;\n}\n\n/**\n * A virtual representation of a WGSL value.\n */\nexport type WgslValue<TDataType> = {\n readonly __dataType: TDataType;\n};\n\nexport type AnyWgslPointer = WgslPointer<'function', AnyWgslData>;\n\nexport type WgslFnArgument = AnyWgslPointer | AnyWgslData;\n\nexport function isPointer(\n value: AnyWgslPointer | AnyWgslData,\n): value is AnyWgslPointer {\n return 'pointsTo' in value;\n}\n","import * as TB from 'typed-binary';\nimport type { F32, U32, Vec3u, Vec4f } from './data';\nimport { SimpleWgslData, f32, u32, vec3u, vec4f } from './data';\nimport type { WgslData } from './types';\nimport { WgslIdentifier } from './wgslIdentifier';\n\nexport type BuiltInPossibleTypes =\n | U32\n | F32\n | Vec3u\n | Vec4f\n | WgslData<TB.Unwrap<U32>[]>;\n\nexport const builtin = {\n vertexIndex: Symbol('builtin_vertexIndex'),\n instanceIndex: Symbol('builtin_instanceIndex'),\n position: Symbol('builtin_position'),\n clipDistances: Symbol('builtin_clipDistances'),\n frontFacing: Symbol('builtin_frontFacing'),\n fragDepth: Symbol('builtin_fragDepth'),\n sampleIndex: Symbol('builtin_sampleIndex'),\n sampleMask: Symbol('builtin_sampleMask'),\n fragment: Symbol('builtin_fragment'),\n localInvocationId: Symbol('builtin_localInvocationId'),\n localInvocationIndex: Symbol('builtin_localInvocationIndex'),\n globalInvocationId: Symbol('builtin_globalInvocationId'),\n workgroupId: Symbol('builtin_workgroupId'),\n numWorkgroups: Symbol('builtin_numWorkgroups'),\n} as const;\n\nexport interface Builtin {\n name: string;\n stage: 'vertex' | 'fragment' | 'compute';\n direction: 'input' | 'output';\n type: BuiltInPossibleTypes;\n identifier: WgslIdentifier;\n}\n\nconst builtinSymbolToObj: Record<symbol, Builtin> = {\n [builtin.vertexIndex]: {\n name: 'vertex_index',\n stage: 'vertex',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('vertex_index'),\n },\n [builtin.instanceIndex]: {\n name: 'instance_index',\n stage: 'vertex',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('instance_index'),\n },\n [builtin.position]: {\n name: 'position',\n stage: 'vertex',\n direction: 'output',\n type: vec4f,\n identifier: new WgslIdentifier().$name('position'),\n },\n [builtin.clipDistances]: {\n name: 'clip_distances',\n stage: 'vertex',\n direction: 'output',\n type: new SimpleWgslData({\n schema: TB.arrayOf(u32, 8),\n byteAlignment: 16,\n code: 'array<u32, 8>',\n }),\n identifier: new WgslIdentifier().$name('clip_distances'),\n },\n [builtin.frontFacing]: {\n name: 'front_facing',\n stage: 'fragment',\n direction: 'input',\n type: f32,\n identifier: new WgslIdentifier().$name('front_facing'),\n },\n [builtin.fragDepth]: {\n name: 'frag_depth',\n stage: 'fragment',\n direction: 'output',\n type: f32,\n identifier: new WgslIdentifier().$name('frag_depth'),\n },\n [builtin.sampleIndex]: {\n name: 'sample_index',\n stage: 'fragment',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('sample_index'),\n },\n [builtin.sampleMask]: {\n name: 'sample_mask',\n stage: 'fragment',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('sample_mask'),\n },\n [builtin.fragment]: {\n name: 'fragment',\n stage: 'fragment',\n direction: 'input',\n type: vec4f,\n identifier: new WgslIdentifier().$name('fragment'),\n },\n [builtin.localInvocationId]: {\n name: 'local_invocation_id',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('local_invocation_id'),\n },\n [builtin.localInvocationIndex]: {\n name: 'local_invocation_index',\n stage: 'compute',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('local_invocation_index'),\n },\n [builtin.globalInvocationId]: {\n name: 'global_invocation_id',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('global_invocation_id'),\n },\n [builtin.workgroupId]: {\n name: 'workgroup_id',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('workgroup_id'),\n },\n [builtin.numWorkgroups]: {\n name: 'num_workgroups',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('num_workgroups'),\n },\n};\n\nexport function getBuiltinInfo(s: symbol): Builtin {\n const builtin = builtinSymbolToObj[s];\n if (!builtin) {\n throw new Error('Symbol is not a member of builtin');\n }\n return builtin;\n}\n\nexport function getUsedBuiltinsNamed(\n o: Record<symbol, string>,\n): { name: string; builtin: Builtin }[] {\n const res = Object.getOwnPropertySymbols(o).map((s) => {\n const builtin = builtinSymbolToObj[s];\n if (!builtin) {\n throw new Error('Symbol is not a member of builtin');\n }\n const name = o[s];\n if (!name) {\n throw new Error('Name is not provided');\n }\n return { name: name, builtin: builtin };\n });\n return res;\n}\n","import type { ResolutionCtx, WgslResolvable } from './types';\n\n/**\n * Helpful when creating new Resolvable types. For internal use.\n */\nexport class WgslIdentifier implements WgslResolvable {\n label?: string | undefined;\n\n $name(label: string | undefined) {\n this.label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.nameFor(this);\n }\n\n toString(): string {\n return `id:${this.label ?? '<unnamed>'}`;\n }\n}\n","import {\n type Eventual,\n type InlineResolve,\n type ResolutionCtx,\n type SlotValuePair,\n type Wgsl,\n type WgslResolvable,\n type WgslSlot,\n isResolvable,\n} from './types';\nimport { getBuiltinInfo } from './wgslBuiltin';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslCode extends WgslResolvable {\n $name(label?: string | undefined): WgslCode;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslCode;\n}\n\nexport type BoundWgslCode = Omit<WgslCode, '$name'>;\n\nexport function code(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): WgslCode {\n const segments: (Wgsl | InlineResolve)[] = strings.flatMap((string, idx) => {\n const param = params[idx];\n if (param === undefined) {\n return [string];\n }\n\n return Array.isArray(param) ? [string, ...param] : [string, param];\n });\n\n return new WgslCodeImpl(segments);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslCodeImpl implements WgslCode {\n private _label: string | undefined;\n\n constructor(public readonly segments: (Wgsl | InlineResolve)[]) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx) {\n let code = '';\n\n for (const s of this.segments) {\n if (typeof s === 'function') {\n const result = s((eventual) => ctx.unwrap(eventual));\n code += ctx.resolve(result);\n } else if (isResolvable(s)) {\n code += ctx.resolve(s);\n } else if (typeof s === 'symbol') {\n const builtin = getBuiltinInfo(s);\n ctx.addBuiltin(builtin);\n code += ctx.resolve(builtin.identifier);\n } else {\n code += String(s);\n }\n }\n\n return code;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslCode {\n return new BoundWgslCodeImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `code:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslCodeImpl<T> implements BoundWgslCode {\n constructor(\n private readonly _innerFn: BoundWgslCode,\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>): BoundWgslCode {\n return new BoundWgslCodeImpl(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 `code:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import {\n type IMeasurer,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type UnwrapRecord,\n object,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { AnyWgslData, ResolutionCtx, WgslData } from '../types';\nimport { code } from '../wgslCode';\nimport { WgslIdentifier } from '../wgslIdentifier';\nimport alignIO from './alignIO';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslStruct<TProps extends Record<string, AnyWgslData>>\n extends ISchema<UnwrapRecord<TProps>>,\n WgslData<UnwrapRecord<TProps>> {\n $name(label: string): this;\n}\n\nexport const struct = <TProps extends Record<string, AnyWgslData>>(\n properties: TProps,\n): WgslStruct<TProps> => new WgslStructImpl(properties);\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslStructImpl<TProps extends Record<string, AnyWgslData>>\n extends Schema<UnwrapRecord<TProps>>\n implements WgslData<UnwrapRecord<TProps>>\n{\n private _label: string | undefined;\n private _innerSchema: ISchema<UnwrapRecord<TProps>>;\n\n public readonly byteAlignment: number;\n public readonly size: number;\n\n constructor(private readonly _properties: TProps) {\n super();\n\n this._innerSchema = object(_properties);\n\n this.byteAlignment = Object.values(_properties)\n .map((prop) => prop.byteAlignment)\n .reduce((a, b) => (a > b ? a : b));\n\n this.size = this.measure(MaxValue).size;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<UnwrapRecord<TProps>>): void {\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n return this._innerSchema.read(input);\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n this._innerSchema.measure(value, measurer);\n return measurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`\n struct ${identifier} {\n ${Object.entries(this._properties).map(([key, field]) => code`${key}: ${field},\\n`)}\n }\n `);\n\n return ctx.resolve(identifier);\n }\n}\n","import * as TB from 'typed-binary';\nimport type { AnyWgslData, WgslData } from '../types';\nimport { code } from '../wgslCode';\nimport { SimpleWgslData } from './std140';\n\nexport type WgslArray<TElement extends AnyWgslData> = WgslData<\n TB.Unwrap<TElement>[]\n>;\n\nexport const arrayOf = <TElement extends AnyWgslData>(\n elementType: TElement,\n size: number,\n): WgslArray<TElement> =>\n new SimpleWgslData({\n schema: TB.arrayOf(elementType, size),\n byteAlignment: elementType.byteAlignment,\n code: code`array<${elementType}, ${size}>`,\n });\n","import type { AnyWgslData, WgslPointer } from '../types';\n\nexport function ptr<TDataType extends AnyWgslData>(\n pointsTo: TDataType,\n): WgslPointer<'function', TDataType> {\n return {\n scope: 'function',\n pointsTo,\n };\n}\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, WgslData } from '../types';\nimport type { I32, U32 } from './numeric';\n\nexport function atomic<TSchema extends U32 | I32>(\n data: TSchema,\n): Atomic<TSchema> {\n return new AtomicImpl(data);\n}\n\nexport interface Atomic<TSchema extends U32 | I32>\n extends WgslData<Unwrap<TSchema>> {}\n\nclass AtomicImpl<TSchema extends U32 | I32>\n extends Schema<Unwrap<TSchema>>\n implements Atomic<TSchema>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n\n constructor(private readonly innerData: TSchema) {\n super();\n this.size = this.innerData.size;\n this.byteAlignment = this.innerData.byteAlignment;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this.innerData.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this.innerData.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return this.innerData.measure(value, measurer);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return `atomic<${ctx.resolve(this.innerData)}>`;\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ var E=Object.defineProperty,M=Object.defineProperties;var k=Object.getOwnPropertyDescriptors;var f=Object.getOwnPropertySymbols;var D=Object.prototype.hasOwnProperty,B=Object.prototype.propertyIsEnumerable;var x=(t,n,e)=>n in t?E(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e,ee=(t,n)=>{for(var e in n||(n={}))D.call(n,e)&&x(t,e,n[e]);if(f)for(var e of f(n))B.call(n,e)&&x(t,e,n[e]);return t},te=(t,n)=>M(t,k(n));var re=(t,n)=>{var e={};for(var r in t)D.call(t,r)&&n.indexOf(r)<0&&(e[r]=t[r]);if(t!=null&&f)for(var r of f(t))n.indexOf(r)<0&&B.call(t,r)&&(e[r]=t[r]);return e};var s=(t,n,e)=>(x(t,typeof n!="symbol"?n+"":n,e),e);import{MaxValue as z,Measurer as F,Schema as j}from"typed-binary";var R=class t extends Error{constructor(e,r){let i=r.map(p=>`- ${p}`);i.length>20&&(i=[...i.slice(0,11),"...",...i.slice(-10)]);super(`Resolution of the following tree failed:
2
+ ${i.join(`
3
+ `)}`);this.cause=e;this.trace=r;Object.setPrototypeOf(this,t.prototype)}appendToTrace(e){let r=[e,...this.trace];return new t(this.cause,r)}},A=class t extends Error{constructor(e){super(`Missing value for '${e}'`);this.slot=e;Object.setPrototypeOf(this,t.prototype)}},d=class t extends Error{constructor(){super("Recursive types are not supported in WGSL"),Object.setPrototypeOf(this,t.prototype)}};function C(t,n){let e="size"in t?t.size:t.currentByteOffset,r=n-1,i=e&r;"skipBytes"in t?t.skipBytes(n-i&r):t.add(n-i&r)}var m=C;var o=class extends j{constructor({schema:e,byteAlignment:r,code:i}){super();s(this,"size");s(this,"byteAlignment");s(this,"expressionCode");s(this,"_innerSchema");this._innerSchema=e,this.byteAlignment=r,this.expressionCode=i,this.size=this.measure(z).size}resolveReferences(){throw new d}write(e,r){m(e,this.byteAlignment),this._innerSchema.write(e,r)}read(e){return m(e,this.byteAlignment),this._innerSchema.read(e)}measure(e,r=new F){return m(r,this.byteAlignment),this._innerSchema.measure(e,r),r}getUnderlyingTypeString(){if(typeof this.expressionCode=="string")return this.expressionCode;if("elementSchema"in this._innerSchema)return this._innerSchema.elementSchema.getUnderlyingTypeString();throw new Error("Unexpected type used as vertex buffer element")}getUnderlyingType(){return"elementSchema"in this._innerSchema?this._innerSchema.elementSchema.getUnderlyingType():this}resolve(e){return e.resolve(this.expressionCode)}};import*as a from"typed-binary";var ce=new o({schema:a.bool,byteAlignment:4,code:"bool"}),c=new o({schema:a.u32,byteAlignment:4,code:"u32"}),de=new o({schema:a.i32,byteAlignment:4,code:"i32"}),T=new o({schema:a.f32,byteAlignment:4,code:"f32"}),ye=new o({schema:a.tupleOf([a.u32,a.u32]),byteAlignment:8,code:"vec2u"}),ge=new o({schema:a.tupleOf([a.i32,a.i32]),byteAlignment:8,code:"vec2i"}),fe=new o({schema:a.tupleOf([a.f32,a.f32]),byteAlignment:8,code:"vec2f"}),g=new o({schema:a.tupleOf([a.u32,a.u32,a.u32]),byteAlignment:16,code:"vec3u"}),xe=new o({schema:a.tupleOf([a.i32,a.i32,a.i32]),byteAlignment:16,code:"vec3i"}),Te=new o({schema:a.tupleOf([a.f32,a.f32,a.f32]),byteAlignment:16,code:"vec3f"}),be=new o({schema:a.tupleOf([a.u32,a.u32,a.u32,a.u32]),byteAlignment:16,code:"vec4u"}),he=new o({schema:a.tupleOf([a.i32,a.i32,a.i32,a.i32]),byteAlignment:16,code:"vec4i"}),b=new o({schema:a.tupleOf([a.f32,a.f32,a.f32,a.f32]),byteAlignment:16,code:"vec4f"}),We=new o({schema:a.arrayOf(a.f32,16),byteAlignment:16,code:"mat4x4f"});import{MaxValue as O,Measurer as G,Schema as L,ValidationError as N}from"typed-binary";function h(t){return!!t&&(typeof t=="object"||typeof t=="function")&&"resolve"in t}function Se(t){return typeof t=="number"||typeof t=="boolean"||typeof t=="string"||h(t)}function ve(t){return t.__brand==="WgslSlot"}function we(t){return t==="sampler"||t==="sampler_comparison"}function Ie(t){return["texture_1d","texture_2d","texture_2d_array","texture_3d","texture_cube","texture_cube_array","texture_multisampled_2d"].includes(t)}function De(t){return["texture_depth_2d","texture_depth_2d_array","texture_depth_cube","texture_depth_cube_array","texture_depth_multisampled_2d"].includes(t)}function Be(t){return["texture_storage_1d","texture_storage_2d","texture_storage_2d_array","texture_storage_3d"].includes(t)}function Re(t){return t==="texture_external"}function Ae(t){return"pointsTo"in t}import*as P from"typed-binary";var l=class{constructor(){s(this,"label")}$name(n){return this.label=n,this}resolve(n){return n.nameFor(this)}toString(){var n;return`id:${(n=this.label)!=null?n:"<unnamed>"}`}};var u={vertexIndex:Symbol("builtin_vertexIndex"),instanceIndex:Symbol("builtin_instanceIndex"),position:Symbol("builtin_position"),clipDistances:Symbol("builtin_clipDistances"),frontFacing:Symbol("builtin_frontFacing"),fragDepth:Symbol("builtin_fragDepth"),sampleIndex:Symbol("builtin_sampleIndex"),sampleMask:Symbol("builtin_sampleMask"),fragment:Symbol("builtin_fragment"),localInvocationId:Symbol("builtin_localInvocationId"),localInvocationIndex:Symbol("builtin_localInvocationIndex"),globalInvocationId:Symbol("builtin_globalInvocationId"),workgroupId:Symbol("builtin_workgroupId"),numWorkgroups:Symbol("builtin_numWorkgroups")},U={[u.vertexIndex]:{name:"vertex_index",stage:"vertex",direction:"input",type:c,identifier:new l().$name("vertex_index")},[u.instanceIndex]:{name:"instance_index",stage:"vertex",direction:"input",type:c,identifier:new l().$name("instance_index")},[u.position]:{name:"position",stage:"vertex",direction:"output",type:b,identifier:new l().$name("position")},[u.clipDistances]:{name:"clip_distances",stage:"vertex",direction:"output",type:new o({schema:P.arrayOf(c,8),byteAlignment:16,code:"array<u32, 8>"}),identifier:new l().$name("clip_distances")},[u.frontFacing]:{name:"front_facing",stage:"fragment",direction:"input",type:T,identifier:new l().$name("front_facing")},[u.fragDepth]:{name:"frag_depth",stage:"fragment",direction:"output",type:T,identifier:new l().$name("frag_depth")},[u.sampleIndex]:{name:"sample_index",stage:"fragment",direction:"input",type:c,identifier:new l().$name("sample_index")},[u.sampleMask]:{name:"sample_mask",stage:"fragment",direction:"input",type:c,identifier:new l().$name("sample_mask")},[u.fragment]:{name:"fragment",stage:"fragment",direction:"input",type:b,identifier:new l().$name("fragment")},[u.localInvocationId]:{name:"local_invocation_id",stage:"compute",direction:"input",type:g,identifier:new l().$name("local_invocation_id")},[u.localInvocationIndex]:{name:"local_invocation_index",stage:"compute",direction:"input",type:c,identifier:new l().$name("local_invocation_index")},[u.globalInvocationId]:{name:"global_invocation_id",stage:"compute",direction:"input",type:g,identifier:new l().$name("global_invocation_id")},[u.workgroupId]:{name:"workgroup_id",stage:"compute",direction:"input",type:g,identifier:new l().$name("workgroup_id")},[u.numWorkgroups]:{name:"num_workgroups",stage:"compute",direction:"input",type:g,identifier:new l().$name("num_workgroups")}};function V(t){let n=U[t];if(!n)throw new Error("Symbol is not a member of builtin");return n}function Ee(t){return Object.getOwnPropertySymbols(t).map(e=>{let r=U[e];if(!r)throw new Error("Symbol is not a member of builtin");let i=t[e];if(!i)throw new Error("Name is not provided");return{name:i,builtin:r}})}function y(t,...n){let e=t.flatMap((r,i)=>{let p=n[i];return p===void 0?[r]:Array.isArray(p)?[r,...p]:[r,p]});return new W(e)}var W=class{constructor(n){this.segments=n;s(this,"_label")}get label(){return this._label}$name(n){return this._label=n,this}resolve(n){let e="";for(let r of this.segments)if(typeof r=="function"){let i=r(p=>n.unwrap(p));e+=n.resolve(i)}else if(h(r))e+=n.resolve(r);else if(typeof r=="symbol"){let i=V(r);n.addBuiltin(i),e+=n.resolve(i.identifier)}else e+=String(r);return e}with(n,e){return new _(this,[n,e])}toString(){var n;return`code:${(n=this._label)!=null?n:"<unnamed>"}`}},_=class t{constructor(n,e){this._innerFn=n;this._slotValuePair=e}get label(){return this._innerFn.label}with(n,e){return new t(this,[n,e])}resolve(n){return n.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,i;let[n,e]=this._slotValuePair;return`code:${(r=this.label)!=null?r:"<unnamed>"}[${(i=n.label)!=null?i:"<unnamed>"}=${e}]`}};var S=class extends L{constructor(e,r){super();this._elementType=e;this.capacity=r;s(this,"_label");s(this,"byteAlignment");s(this,"size");this.byteAlignment=Math.max(4,this._elementType.byteAlignment),this.size=this.measure(O).size}$name(e){return this._label=e,this}resolveReferences(){throw new d}write(e,r){if(r.length>this.capacity)throw new N(`Tried to write too many values, ${r.length} > ${this.capacity}`);m(e,this.byteAlignment),c.write(e,r.length),m(e,this._elementType.byteAlignment);let i=e.currentByteOffset;for(let p of r)this._elementType.write(e,p);e.seekTo(i+this.capacity*this._elementType.size)}read(e){let r=[];m(e,this.byteAlignment);let i=c.read(e);m(e,this._elementType.byteAlignment);let p=e.currentByteOffset;for(let I=0;I<i;++I)r.push(this._elementType.read(e));return e.seekTo(p+this.capacity*this._elementType.size),r}measure(e,r=new G){return m(r,this.byteAlignment),c.measure(O,r),m(r,this._elementType.byteAlignment),r.add(this._elementType.size*this.capacity),r}resolve(e){let r=new l().$name(this._label);return e.addDeclaration(y`
4
+ struct ${r} {
5
+ count: u32,
6
+ values: array<${this._elementType}, ${this.capacity}>,
7
+ }`),e.resolve(r)}},Je=(t,n)=>new S(t,n);import{MaxValue as q,Measurer as H,Schema as J,object as K}from"typed-binary";var rt=t=>new v(t),v=class extends J{constructor(e){super();this._properties=e;s(this,"_label");s(this,"_innerSchema");s(this,"byteAlignment");s(this,"size");this._innerSchema=K(e),this.byteAlignment=Object.values(e).map(r=>r.byteAlignment).reduce((r,i)=>r>i?r:i),this.size=this.measure(q).size}$name(e){return this._label=e,this}resolveReferences(){throw new d}write(e,r){this._innerSchema.write(e,r)}read(e){return this._innerSchema.read(e)}measure(e,r=new H){return m(r,this.byteAlignment),this._innerSchema.measure(e,r),r}resolve(e){let r=new l().$name(this._label);return e.addDeclaration(y`
8
+ struct ${r} {
9
+ ${Object.entries(this._properties).map(([i,p])=>y`${i}: ${p},\n`)}
10
+ }
11
+ `),e.resolve(r)}};import*as $ from"typed-binary";var ot=(t,n)=>new o({schema:$.arrayOf(t,n),byteAlignment:t.byteAlignment,code:y`array<${t}, ${n}>`});function Q(t){return{scope:"function",pointsTo:t}}import{Measurer as X,Schema as Y}from"typed-binary";function Z(t){return new w(t)}var w=class extends Y{constructor(e){super();this.innerData=e;s(this,"size");s(this,"byteAlignment");this.size=this.innerData.size,this.byteAlignment=this.innerData.byteAlignment}resolveReferences(){throw new d}write(e,r){this.innerData.write(e,r)}read(e){return this.innerData.read(e)}measure(e,r=new X){return this.innerData.measure(e,r)}resolve(e){return`atomic<${e.resolve(this.innerData)}>`}};export{ee as a,te as b,re as c,s as d,R as e,A as f,d as g,h,Se as i,ve as j,we as k,Ie as l,De as m,Be as n,Re as o,Ae as p,o as q,ce as r,c as s,de as t,T as u,ye as v,ge as w,fe as x,g as y,xe as z,Te as A,be as B,he as C,b as D,We as E,l as F,Je as G,rt as H,ot as I,Q as J,Z as K,u as L,V as M,Ee as N,y as O};
12
+ //# sourceMappingURL=chunk-K2GYQABQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/std140.ts","../src/errors.ts","../src/data/alignIO.ts","../src/data/numeric.ts","../src/data/dynamicArray.ts","../src/types.ts","../src/wgslBuiltin.ts","../src/wgslIdentifier.ts","../src/wgslCode.ts","../src/data/struct.ts","../src/data/array.ts","../src/data/pointer.ts","../src/data/atomic.ts"],"sourcesContent":["/*\n * Typed-binary types that adhere to the `std140` layout rules.\n */\n\nimport {\n type AnySchema,\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, Wgsl, WgslData } from '../types';\nimport alignIO from './alignIO';\n\nexport class SimpleWgslData<TSchema extends AnySchema>\n extends Schema<Unwrap<TSchema>>\n implements WgslData<Unwrap<TSchema>>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly expressionCode: Wgsl;\n\n private readonly _innerSchema: TSchema;\n\n /**\n * byteAlignment has to be a power of 2\n */\n constructor({\n schema,\n byteAlignment,\n code,\n }: {\n schema: TSchema;\n byteAlignment: number;\n code: Wgsl;\n }) {\n super();\n\n this._innerSchema = schema;\n this.byteAlignment = byteAlignment;\n this.expressionCode = code;\n this.size = this.measure(MaxValue).size;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n alignIO(output, this.byteAlignment);\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n alignIO(input, this.byteAlignment);\n return this._innerSchema.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n\n this._innerSchema.measure(value, measurer);\n\n return measurer;\n }\n\n getUnderlyingTypeString(): string {\n if (typeof this.expressionCode === 'string') {\n return this.expressionCode;\n }\n if ('elementSchema' in this._innerSchema) {\n const underlyingType = this._innerSchema\n .elementSchema as SimpleWgslData<AnySchema>;\n return underlyingType.getUnderlyingTypeString();\n }\n throw new Error('Unexpected type used as vertex buffer element');\n }\n\n getUnderlyingType(): SimpleWgslData<AnySchema> {\n if ('elementSchema' in this._innerSchema) {\n const underlyingType = this._innerSchema\n .elementSchema as SimpleWgslData<AnySchema>;\n return underlyingType.getUnderlyingType();\n }\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this.expressionCode);\n }\n}\n","import type { WgslResolvable, WgslSlot } from './types';\n\n/**\n * An error that happens during resolution of WGSL code.\n * Contains a trace of all ancestor resolvables in\n * which this error originated.\n *\n * @category Errors\n */\nexport class ResolutionError extends Error {\n constructor(\n public readonly cause: unknown,\n public readonly trace: WgslResolvable[],\n ) {\n let entries = trace.map((ancestor) => `- ${ancestor}`);\n\n // Showing only the root and leaf nodes.\n if (entries.length > 20) {\n entries = [...entries.slice(0, 11), '...', ...entries.slice(-10)];\n }\n\n super(`Resolution of the following tree failed: \\n${entries.join('\\n')}`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ResolutionError.prototype);\n }\n\n appendToTrace(ancestor: WgslResolvable): ResolutionError {\n const newTrace = [ancestor, ...this.trace];\n\n return new ResolutionError(this.cause, newTrace);\n }\n}\n\n/**\n * @category Errors\n */\nexport class MissingSlotValueError extends Error {\n constructor(public readonly slot: WgslSlot<unknown>) {\n super(`Missing value for '${slot}'`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingSlotValueError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class RecursiveDataTypeError extends Error {\n constructor() {\n super('Recursive types are not supported in WGSL');\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, RecursiveDataTypeError.prototype);\n }\n}\n","import type { IMeasurer, ISerialInput, ISerialOutput } from 'typed-binary';\n\n/**\n * @param io the IO to align\n * @param baseAlignment must be power of 2\n */\nfunction alignIO(\n io: ISerialInput | ISerialOutput | IMeasurer,\n baseAlignment: number,\n) {\n const currentPos = 'size' in io ? io.size : io.currentByteOffset;\n\n const bitMask = baseAlignment - 1;\n const offset = currentPos & bitMask;\n\n if ('skipBytes' in io) {\n io.skipBytes((baseAlignment - offset) & bitMask);\n } else {\n io.add((baseAlignment - offset) & bitMask);\n }\n}\n\nexport default alignIO;\n","import * as TB from 'typed-binary';\nimport type { WgslData } from '../types';\nimport { SimpleWgslData } from './std140';\n\nexport type Bool = WgslData<boolean>;\nexport const bool: Bool = new SimpleWgslData({\n schema: TB.bool,\n byteAlignment: 4,\n code: 'bool',\n});\nexport type U32 = WgslData<number>;\nexport const u32: U32 = new SimpleWgslData({\n schema: TB.u32,\n byteAlignment: 4,\n code: 'u32',\n});\nexport type I32 = WgslData<number>;\nexport const i32: I32 = new SimpleWgslData({\n schema: TB.i32,\n byteAlignment: 4,\n code: 'i32',\n});\nexport type F32 = WgslData<number>;\nexport const f32: F32 = new SimpleWgslData({\n schema: TB.f32,\n byteAlignment: 4,\n code: 'f32',\n});\n\nexport type Vec2u = WgslData<[number, number]>;\nexport const vec2u: Vec2u = new SimpleWgslData({\n schema: TB.tupleOf([TB.u32, TB.u32]),\n byteAlignment: 8,\n code: 'vec2u',\n});\n\nexport type Vec2i = WgslData<[number, number]>;\nexport const vec2i: Vec2i = new SimpleWgslData({\n schema: TB.tupleOf([TB.i32, TB.i32]),\n byteAlignment: 8,\n code: 'vec2i',\n});\nexport type Vec2f = WgslData<[number, number]>;\nexport const vec2f: Vec2f = new SimpleWgslData({\n schema: TB.tupleOf([TB.f32, TB.f32]),\n byteAlignment: 8,\n code: 'vec2f',\n});\nexport type Vec3u = WgslData<[number, number, number]>;\nexport const vec3u: Vec3u = new SimpleWgslData({\n schema: TB.tupleOf([TB.u32, TB.u32, TB.u32]),\n byteAlignment: 16,\n code: 'vec3u',\n});\nexport type Vec3i = WgslData<[number, number, number]>;\nexport const vec3i: Vec3i = new SimpleWgslData({\n schema: TB.tupleOf([TB.i32, TB.i32, TB.i32]),\n byteAlignment: 16,\n code: 'vec3i',\n});\nexport type Vec3f = WgslData<[number, number, number]>;\nexport const vec3f: Vec3f = new SimpleWgslData({\n schema: TB.tupleOf([TB.f32, TB.f32, TB.f32]),\n byteAlignment: 16,\n code: 'vec3f',\n});\nexport type Vec4u = WgslData<[number, number, number, number]>;\nexport const vec4u: Vec4u = new SimpleWgslData({\n schema: TB.tupleOf([TB.u32, TB.u32, TB.u32, TB.u32]),\n byteAlignment: 16,\n code: 'vec4u',\n});\nexport type Vec4i = WgslData<[number, number, number, number]>;\nexport const vec4i: Vec4i = new SimpleWgslData({\n schema: TB.tupleOf([TB.i32, TB.i32, TB.i32, TB.i32]),\n byteAlignment: 16,\n code: 'vec4i',\n});\nexport type Vec4f = WgslData<[number, number, number, number]>;\nexport const vec4f: Vec4f = new SimpleWgslData({\n schema: TB.tupleOf([TB.f32, TB.f32, TB.f32, TB.f32]),\n byteAlignment: 16,\n code: 'vec4f',\n});\n\n/**\n * Array of column vectors\n */\nexport type Mat4f = WgslData<number[]>;\nexport const mat4f: Mat4f = new SimpleWgslData({\n schema: TB.arrayOf(TB.f32, 16),\n byteAlignment: 16,\n code: 'mat4x4f',\n});\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n ValidationError,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { AnyWgslData, ResolutionCtx, WgslData } from '../types';\nimport { code } from '../wgslCode';\nimport { WgslIdentifier } from '../wgslIdentifier';\nimport alignIO from './alignIO';\nimport { u32 } from './numeric';\n\nclass DynamicArrayDataType<TElement extends WgslData<unknown>>\n extends Schema<Unwrap<TElement>[]>\n implements WgslData<Unwrap<TElement>[]>\n{\n private _label: string | undefined;\n\n public readonly byteAlignment: number;\n public readonly size: number;\n\n constructor(\n private readonly _elementType: TElement,\n public readonly capacity: number,\n ) {\n super();\n\n this.byteAlignment = Math.max(\n 4 /* u32 base alignment */,\n this._elementType.byteAlignment,\n );\n\n this.size = this.measure(MaxValue).size;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, values: ParseUnwrapped<TElement>[]): void {\n if (values.length > this.capacity) {\n throw new ValidationError(\n `Tried to write too many values, ${values.length} > ${this.capacity}`,\n );\n }\n\n alignIO(output, this.byteAlignment); // aligning to the start\n u32.write(output, values.length);\n alignIO(output, this._elementType.byteAlignment); // aligning to the start of the array\n const startOffset = output.currentByteOffset;\n for (const value of values) {\n this._elementType.write(output, value);\n }\n output.seekTo(startOffset + this.capacity * this._elementType.size);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TElement>[] {\n const array: ParseUnwrapped<TElement>[] = [];\n\n alignIO(input, this.byteAlignment); // aligning to the start\n const len = u32.read(input);\n alignIO(input, this._elementType.byteAlignment); // aligning to the start of the array\n const startOffset = input.currentByteOffset;\n for (let i = 0; i < len; ++i) {\n array.push(this._elementType.read(input) as ParseUnwrapped<TElement>);\n }\n input.seekTo(startOffset + this.capacity * this._elementType.size);\n\n return array;\n }\n\n measure(\n _values: ParseUnwrapped<TElement>[] | typeof MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment); // aligning to the start\n\n // Length encoding\n u32.measure(MaxValue, measurer);\n\n // Aligning to the start of the array\n alignIO(measurer, this._elementType.byteAlignment);\n\n // Values encoding\n measurer.add(this._elementType.size * this.capacity);\n\n return measurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`\n struct ${identifier} {\n count: u32,\n values: array<${this._elementType}, ${this.capacity}>,\n }`);\n\n return ctx.resolve(identifier);\n }\n}\n\nexport const dynamicArrayOf = <TSchema extends AnyWgslData>(\n elementType: TSchema,\n capacity: number,\n) => new DynamicArrayDataType(elementType, capacity);\n\nexport default DynamicArrayDataType;\n","import type { ISchema, Parsed } from 'typed-binary';\nimport type { F32, I32, U32, Vec4f, Vec4i, Vec4u } from './data';\nimport type { Builtin } from './wgslBuiltin';\nimport type { WgslIdentifier } from './wgslIdentifier';\nimport type { WgslPlum } from './wgslPlum';\n\nexport type Wgsl = string | number | WgslResolvable | symbol | boolean;\n\n/**\n * Passed into each resolvable item. All sibling items share a resolution ctx,\n * and a new resolution ctx is made when going down each level in the tree.\n */\nexport interface ResolutionCtx {\n /**\n * Slots that were used by items resolved by this context.\n */\n readonly usedSlots: Iterable<WgslSlot<unknown>>;\n\n addDeclaration(item: WgslResolvable): void;\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void;\n addRenderResource(\n resource: WgslRenderResource,\n identifier: WgslIdentifier,\n ): void;\n addBuiltin(builtin: Builtin): void;\n nameFor(token: WgslResolvable): string;\n /**\n * Unwraps all layers of slot indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;\n}\n\nexport interface WgslResolvable {\n readonly label?: string | undefined;\n\n resolve(ctx: ResolutionCtx): string;\n}\n\nexport function isResolvable(value: unknown): value is WgslResolvable {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'resolve' in value\n );\n}\n\nexport function isWgsl(value: unknown): value is Wgsl {\n return (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isResolvable(value)\n );\n}\n\nexport interface WgslSlot<T> {\n readonly __brand: 'WgslSlot';\n\n readonly defaultValue: T | undefined;\n\n readonly label?: string | undefined;\n\n $name(label: string): WgslSlot<T>;\n\n /**\n * Used to determine if code generated using either value `a` or `b` in place\n * of the slot will be equivalent. Defaults to `Object.is`.\n */\n areEqual(a: T, b: T): boolean;\n}\n\nexport function isSlot<T>(value: unknown | WgslSlot<T>): value is WgslSlot<T> {\n return (value as WgslSlot<T>).__brand === 'WgslSlot';\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | WgslSlot<T>;\n\nexport type EventualGetter = <T>(value: Eventual<T>) => T;\n\nexport type InlineResolve = (get: EventualGetter) => Wgsl;\n\nexport interface WgslResolvableSlot<T extends Wgsl>\n extends WgslResolvable,\n WgslSlot<T> {\n $name(label: string): WgslResolvableSlot<T>;\n}\n\nexport type SlotValuePair<T> = [WgslSlot<T>, T];\n\nexport interface WgslAllocatable<TData extends AnyWgslData = AnyWgslData> {\n /**\n * The data type this allocatable was constructed with.\n * It informs the size and format of data in both JS and\n * binary.\n */\n readonly dataType: TData;\n vertexLayout: Omit<GPUVertexBufferLayout, 'attributes'> | null;\n readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined;\n readonly flags: GPUBufferUsageFlags;\n get label(): string | undefined;\n}\n\nexport interface WgslBindable<\n TData extends AnyWgslData = AnyWgslData,\n TUsage extends BufferUsage = BufferUsage,\n> extends WgslResolvable {\n readonly allocatable: WgslAllocatable<TData>;\n readonly usage: TUsage;\n}\n\nexport type WgslSamplerType = 'sampler' | 'sampler_comparison';\nexport type WgslTypedTextureType =\n | 'texture_1d'\n | 'texture_2d'\n | 'texture_2d_array'\n | 'texture_3d'\n | 'texture_cube'\n | 'texture_cube_array'\n | 'texture_multisampled_2d';\nexport type WgslDepthTextureType =\n | 'texture_depth_2d'\n | 'texture_depth_2d_array'\n | 'texture_depth_cube'\n | 'texture_depth_cube_array'\n | 'texture_depth_multisampled_2d';\nexport type WgslStorageTextureType =\n | 'texture_storage_1d'\n | 'texture_storage_2d'\n | 'texture_storage_2d_array'\n | 'texture_storage_3d';\nexport type WgslExternalTextureType = 'texture_external';\n\nexport type WgslRenderResourceType =\n | WgslSamplerType\n | WgslTypedTextureType\n | WgslDepthTextureType\n | WgslStorageTextureType\n | WgslExternalTextureType;\n\nexport interface WgslRenderResource extends WgslResolvable {\n readonly type: WgslRenderResourceType;\n}\n\nexport type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';\nexport type TextureUsage = 'sampled' | 'storage';\nexport type StorageTextureAccess = 'read' | 'write' | 'read_write';\n\nexport type StorageTextureParams = {\n type: WgslStorageTextureType;\n access: StorageTextureAccess;\n descriptor?: GPUTextureViewDescriptor;\n};\nexport type SampledTextureParams = {\n type: WgslTypedTextureType;\n dataType: AnyWgslPrimitive;\n descriptor?: GPUTextureViewDescriptor;\n};\n\nexport function isSamplerType(\n type: WgslRenderResourceType,\n): type is WgslSamplerType {\n return type === 'sampler' || type === 'sampler_comparison';\n}\n\nexport function isTypedTextureType(\n type: WgslRenderResourceType,\n): type is WgslTypedTextureType {\n return [\n 'texture_1d',\n 'texture_2d',\n 'texture_2d_array',\n 'texture_3d',\n 'texture_cube',\n 'texture_cube_array',\n 'texture_multisampled_2d',\n ].includes(type);\n}\n\nexport function isDepthTextureType(\n type: WgslRenderResourceType,\n): type is WgslDepthTextureType {\n return [\n 'texture_depth_2d',\n 'texture_depth_2d_array',\n 'texture_depth_cube',\n 'texture_depth_cube_array',\n 'texture_depth_multisampled_2d',\n ].includes(type);\n}\n\nexport function isStorageTextureType(\n type: WgslRenderResourceType,\n): type is WgslStorageTextureType {\n return [\n 'texture_storage_1d',\n 'texture_storage_2d',\n 'texture_storage_2d_array',\n 'texture_storage_3d',\n ].includes(type);\n}\n\nexport function isExternalTextureType(\n type: WgslRenderResourceType,\n): type is WgslExternalTextureType {\n return type === 'texture_external';\n}\n\nexport interface WgslData<TInner> extends ISchema<TInner>, WgslResolvable {\n readonly byteAlignment: number;\n readonly size: number;\n}\n\nexport type AnyWgslData = WgslData<unknown>;\nexport type AnyWgslPrimitive = U32 | I32 | F32;\nexport type AnyWgslTexelFormat = Vec4u | Vec4i | Vec4f;\n\nexport interface WgslPointer<\n TScope extends 'function',\n TInner extends AnyWgslData,\n> {\n readonly scope: TScope;\n readonly pointsTo: TInner;\n}\n\n/**\n * A virtual representation of a WGSL value.\n */\nexport type WgslValue<TDataType> = {\n readonly __dataType: TDataType;\n};\n\nexport type AnyWgslPointer = WgslPointer<'function', AnyWgslData>;\n\nexport type WgslFnArgument = AnyWgslPointer | AnyWgslData;\n\nexport function isPointer(\n value: AnyWgslPointer | AnyWgslData,\n): value is AnyWgslPointer {\n return 'pointsTo' in value;\n}\n","import * as TB from 'typed-binary';\nimport type { F32, U32, Vec3u, Vec4f } from './data';\nimport { SimpleWgslData, f32, u32, vec3u, vec4f } from './data';\nimport type { WgslData } from './types';\nimport { WgslIdentifier } from './wgslIdentifier';\n\nexport type BuiltInPossibleTypes =\n | U32\n | F32\n | Vec3u\n | Vec4f\n | WgslData<TB.Unwrap<U32>[]>;\n\nexport const builtin = {\n vertexIndex: Symbol('builtin_vertexIndex'),\n instanceIndex: Symbol('builtin_instanceIndex'),\n position: Symbol('builtin_position'),\n clipDistances: Symbol('builtin_clipDistances'),\n frontFacing: Symbol('builtin_frontFacing'),\n fragDepth: Symbol('builtin_fragDepth'),\n sampleIndex: Symbol('builtin_sampleIndex'),\n sampleMask: Symbol('builtin_sampleMask'),\n fragment: Symbol('builtin_fragment'),\n localInvocationId: Symbol('builtin_localInvocationId'),\n localInvocationIndex: Symbol('builtin_localInvocationIndex'),\n globalInvocationId: Symbol('builtin_globalInvocationId'),\n workgroupId: Symbol('builtin_workgroupId'),\n numWorkgroups: Symbol('builtin_numWorkgroups'),\n} as const;\n\nexport interface Builtin {\n name: string;\n stage: 'vertex' | 'fragment' | 'compute';\n direction: 'input' | 'output';\n type: BuiltInPossibleTypes;\n identifier: WgslIdentifier;\n}\n\nconst builtinSymbolToObj: Record<symbol, Builtin> = {\n [builtin.vertexIndex]: {\n name: 'vertex_index',\n stage: 'vertex',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('vertex_index'),\n },\n [builtin.instanceIndex]: {\n name: 'instance_index',\n stage: 'vertex',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('instance_index'),\n },\n [builtin.position]: {\n name: 'position',\n stage: 'vertex',\n direction: 'output',\n type: vec4f,\n identifier: new WgslIdentifier().$name('position'),\n },\n [builtin.clipDistances]: {\n name: 'clip_distances',\n stage: 'vertex',\n direction: 'output',\n type: new SimpleWgslData({\n schema: TB.arrayOf(u32, 8),\n byteAlignment: 16,\n code: 'array<u32, 8>',\n }),\n identifier: new WgslIdentifier().$name('clip_distances'),\n },\n [builtin.frontFacing]: {\n name: 'front_facing',\n stage: 'fragment',\n direction: 'input',\n type: f32,\n identifier: new WgslIdentifier().$name('front_facing'),\n },\n [builtin.fragDepth]: {\n name: 'frag_depth',\n stage: 'fragment',\n direction: 'output',\n type: f32,\n identifier: new WgslIdentifier().$name('frag_depth'),\n },\n [builtin.sampleIndex]: {\n name: 'sample_index',\n stage: 'fragment',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('sample_index'),\n },\n [builtin.sampleMask]: {\n name: 'sample_mask',\n stage: 'fragment',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('sample_mask'),\n },\n [builtin.fragment]: {\n name: 'fragment',\n stage: 'fragment',\n direction: 'input',\n type: vec4f,\n identifier: new WgslIdentifier().$name('fragment'),\n },\n [builtin.localInvocationId]: {\n name: 'local_invocation_id',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('local_invocation_id'),\n },\n [builtin.localInvocationIndex]: {\n name: 'local_invocation_index',\n stage: 'compute',\n direction: 'input',\n type: u32,\n identifier: new WgslIdentifier().$name('local_invocation_index'),\n },\n [builtin.globalInvocationId]: {\n name: 'global_invocation_id',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('global_invocation_id'),\n },\n [builtin.workgroupId]: {\n name: 'workgroup_id',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('workgroup_id'),\n },\n [builtin.numWorkgroups]: {\n name: 'num_workgroups',\n stage: 'compute',\n direction: 'input',\n type: vec3u,\n identifier: new WgslIdentifier().$name('num_workgroups'),\n },\n};\n\nexport function getBuiltinInfo(s: symbol): Builtin {\n const builtin = builtinSymbolToObj[s];\n if (!builtin) {\n throw new Error('Symbol is not a member of builtin');\n }\n return builtin;\n}\n\nexport function getUsedBuiltinsNamed(\n o: Record<symbol, string>,\n): { name: string; builtin: Builtin }[] {\n const res = Object.getOwnPropertySymbols(o).map((s) => {\n const builtin = builtinSymbolToObj[s];\n if (!builtin) {\n throw new Error('Symbol is not a member of builtin');\n }\n const name = o[s];\n if (!name) {\n throw new Error('Name is not provided');\n }\n return { name: name, builtin: builtin };\n });\n return res;\n}\n","import type { ResolutionCtx, WgslResolvable } from './types';\n\n/**\n * Helpful when creating new Resolvable types. For internal use.\n */\nexport class WgslIdentifier implements WgslResolvable {\n label?: string | undefined;\n\n $name(label: string | undefined) {\n this.label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.nameFor(this);\n }\n\n toString(): string {\n return `id:${this.label ?? '<unnamed>'}`;\n }\n}\n","import {\n type Eventual,\n type InlineResolve,\n type ResolutionCtx,\n type SlotValuePair,\n type Wgsl,\n type WgslResolvable,\n type WgslSlot,\n isResolvable,\n} from './types';\nimport { getBuiltinInfo } from './wgslBuiltin';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslCode extends WgslResolvable {\n $name(label?: string | undefined): WgslCode;\n\n with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslCode;\n}\n\nexport type BoundWgslCode = Omit<WgslCode, '$name'>;\n\nexport function code(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): WgslCode {\n const segments: (Wgsl | InlineResolve)[] = strings.flatMap((string, idx) => {\n const param = params[idx];\n if (param === undefined) {\n return [string];\n }\n\n return Array.isArray(param) ? [string, ...param] : [string, param];\n });\n\n return new WgslCodeImpl(segments);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslCodeImpl implements WgslCode {\n private _label: string | undefined;\n\n constructor(public readonly segments: (Wgsl | InlineResolve)[]) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx) {\n let code = '';\n\n for (const s of this.segments) {\n if (typeof s === 'function') {\n const result = s((eventual) => ctx.unwrap(eventual));\n code += ctx.resolve(result);\n } else if (isResolvable(s)) {\n code += ctx.resolve(s);\n } else if (typeof s === 'symbol') {\n const builtin = getBuiltinInfo(s);\n ctx.addBuiltin(builtin);\n code += ctx.resolve(builtin.identifier);\n } else {\n code += String(s);\n }\n }\n\n return code;\n }\n\n with<TValue>(slot: WgslSlot<TValue>, value: Eventual<TValue>): BoundWgslCode {\n return new BoundWgslCodeImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `code:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundWgslCodeImpl<T> implements BoundWgslCode {\n constructor(\n private readonly _innerFn: BoundWgslCode,\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>): BoundWgslCode {\n return new BoundWgslCodeImpl(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 `code:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import {\n type IMeasurer,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type UnwrapRecord,\n object,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { AnyWgslData, ResolutionCtx, WgslData } from '../types';\nimport { code } from '../wgslCode';\nimport { WgslIdentifier } from '../wgslIdentifier';\nimport alignIO from './alignIO';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslStruct<TProps extends Record<string, AnyWgslData>>\n extends ISchema<UnwrapRecord<TProps>>,\n WgslData<UnwrapRecord<TProps>> {\n $name(label: string): this;\n}\n\nexport const struct = <TProps extends Record<string, AnyWgslData>>(\n properties: TProps,\n): WgslStruct<TProps> => new WgslStructImpl(properties);\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslStructImpl<TProps extends Record<string, AnyWgslData>>\n extends Schema<UnwrapRecord<TProps>>\n implements WgslData<UnwrapRecord<TProps>>\n{\n private _label: string | undefined;\n private _innerSchema: ISchema<UnwrapRecord<TProps>>;\n\n public readonly byteAlignment: number;\n public readonly size: number;\n\n constructor(private readonly _properties: TProps) {\n super();\n\n this._innerSchema = object(_properties);\n\n this.byteAlignment = Object.values(_properties)\n .map((prop) => prop.byteAlignment)\n .reduce((a, b) => (a > b ? a : b));\n\n this.size = this.measure(MaxValue).size;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<UnwrapRecord<TProps>>): void {\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n return this._innerSchema.read(input);\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n this._innerSchema.measure(value, measurer);\n return measurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const identifier = new WgslIdentifier().$name(this._label);\n\n ctx.addDeclaration(code`\n struct ${identifier} {\n ${Object.entries(this._properties).map(([key, field]) => code`${key}: ${field},\\n`)}\n }\n `);\n\n return ctx.resolve(identifier);\n }\n}\n","import * as TB from 'typed-binary';\nimport type { AnyWgslData, WgslData } from '../types';\nimport { code } from '../wgslCode';\nimport { SimpleWgslData } from './std140';\n\nexport type WgslArray<TElement extends AnyWgslData> = WgslData<\n TB.Unwrap<TElement>[]\n>;\n\nexport const arrayOf = <TElement extends AnyWgslData>(\n elementType: TElement,\n size: number,\n): WgslArray<TElement> =>\n new SimpleWgslData({\n schema: TB.arrayOf(elementType, size),\n byteAlignment: elementType.byteAlignment,\n code: code`array<${elementType}, ${size}>`,\n });\n","import type { AnyWgslData, WgslPointer } from '../types';\n\nexport function ptr<TDataType extends AnyWgslData>(\n pointsTo: TDataType,\n): WgslPointer<'function', TDataType> {\n return {\n scope: 'function',\n pointsTo,\n };\n}\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, WgslData } from '../types';\nimport type { I32, U32 } from './numeric';\n\nexport function atomic<TSchema extends U32 | I32>(\n data: TSchema,\n): Atomic<TSchema> {\n return new AtomicImpl(data);\n}\n\nexport interface Atomic<TSchema extends U32 | I32>\n extends WgslData<Unwrap<TSchema>> {}\n\nclass AtomicImpl<TSchema extends U32 | I32>\n extends Schema<Unwrap<TSchema>>\n implements Atomic<TSchema>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n\n constructor(private readonly innerData: TSchema) {\n super();\n this.size = this.innerData.size;\n this.byteAlignment = this.innerData.byteAlignment;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this.innerData.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this.innerData.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return this.innerData.measure(value, measurer);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return `atomic<${ctx.resolve(this.innerData)}>`;\n }\n}\n"],"mappings":"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","names":["MaxValue","Measurer","Schema","ResolutionError","_ResolutionError","cause","trace","entries","ancestor","newTrace","MissingSlotValueError","_MissingSlotValueError","slot","RecursiveDataTypeError","_RecursiveDataTypeError","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","SimpleWgslData","Schema","schema","byteAlignment","code","__publicField","MaxValue","RecursiveDataTypeError","output","value","alignIO_default","input","measurer","Measurer","ctx","TB","bool","SimpleWgslData","u32","i32","f32","vec2u","vec2i","vec2f","vec3u","vec3i","vec3f","vec4u","vec4i","vec4f","mat4f","MaxValue","Measurer","Schema","ValidationError","isResolvable","value","isWgsl","isSlot","isSamplerType","type","isTypedTextureType","isDepthTextureType","isStorageTextureType","isExternalTextureType","isPointer","TB","WgslIdentifier","__publicField","label","ctx","_a","builtin","builtinSymbolToObj","u32","WgslIdentifier","vec4f","SimpleWgslData","f32","vec3u","getBuiltinInfo","s","getUsedBuiltinsNamed","o","name","code","strings","params","segments","string","idx","param","WgslCodeImpl","__publicField","label","ctx","s","result","eventual","isResolvable","builtin","getBuiltinInfo","slot","value","BoundWgslCodeImpl","_a","_BoundWgslCodeImpl","_innerFn","_slotValuePair","_b","DynamicArrayDataType","Schema","_elementType","capacity","__publicField","MaxValue","label","RecursiveDataTypeError","output","values","ValidationError","alignIO_default","u32","startOffset","value","input","array","len","i","_values","measurer","Measurer","ctx","identifier","WgslIdentifier","code","dynamicArrayOf","elementType","MaxValue","Measurer","Schema","object","struct","properties","WgslStructImpl","Schema","_properties","__publicField","object","prop","a","b","MaxValue","label","RecursiveDataTypeError","output","value","input","measurer","Measurer","alignIO_default","ctx","identifier","WgslIdentifier","code","key","field","TB","arrayOf","elementType","size","SimpleWgslData","code","ptr","pointsTo","Measurer","Schema","atomic","data","AtomicImpl","Schema","innerData","__publicField","RecursiveDataTypeError","output","value","input","measurer","Measurer","ctx"]}
package/data/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk7HTWRNOHcjs = require('../chunk-7HTWRNOH.cjs');exports.SimpleWgslData = _chunk7HTWRNOHcjs.q; exports.arrayOf = _chunk7HTWRNOHcjs.I; exports.atomic = _chunk7HTWRNOHcjs.K; exports.bool = _chunk7HTWRNOHcjs.r; exports.dynamicArrayOf = _chunk7HTWRNOHcjs.G; exports.f32 = _chunk7HTWRNOHcjs.u; exports.i32 = _chunk7HTWRNOHcjs.t; exports.mat4f = _chunk7HTWRNOHcjs.E; exports.ptr = _chunk7HTWRNOHcjs.J; exports.struct = _chunk7HTWRNOHcjs.H; exports.u32 = _chunk7HTWRNOHcjs.s; exports.vec2f = _chunk7HTWRNOHcjs.x; exports.vec2i = _chunk7HTWRNOHcjs.w; exports.vec2u = _chunk7HTWRNOHcjs.v; exports.vec3f = _chunk7HTWRNOHcjs.A; exports.vec3i = _chunk7HTWRNOHcjs.z; exports.vec3u = _chunk7HTWRNOHcjs.y; exports.vec4f = _chunk7HTWRNOHcjs.D; exports.vec4i = _chunk7HTWRNOHcjs.C; exports.vec4u = _chunk7HTWRNOHcjs.B;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ export { S as SimpleWgslData } from '../std140-DRitCcmc.cjs';
2
+ import { k as AnyWgslData, M as WgslData, R as ResolutionCtx, N as WgslPointer, _ as U32, $ as I32 } from '../types-ENDwr_p9.cjs';
3
+ export { a0 as Bool, a4 as F32, ao as Mat4f, aa as Vec2f, a8 as Vec2i, a6 as Vec2u, ag as Vec3f, ae as Vec3i, ac as Vec3u, am as Vec4f, ak as Vec4i, ai as Vec4u, a1 as bool, a5 as f32, a3 as i32, ap as mat4f, a2 as u32, ab as vec2f, a9 as vec2i, a7 as vec2u, ah as vec3f, af as vec3i, ad as vec3u, an as vec4f, al as vec4i, aj as vec4u } from '../types-ENDwr_p9.cjs';
4
+ import * as TB from 'typed-binary';
5
+ import { Schema, Unwrap, ISerialOutput, ParseUnwrapped, ISerialInput, MaxValue, IMeasurer, ISchema, UnwrapRecord } from 'typed-binary';
6
+ export { Parsed, Unwrap } from 'typed-binary';
7
+
8
+ declare class DynamicArrayDataType<TElement extends WgslData<unknown>> extends Schema<Unwrap<TElement>[]> implements WgslData<Unwrap<TElement>[]> {
9
+ private readonly _elementType;
10
+ readonly capacity: number;
11
+ private _label;
12
+ readonly byteAlignment: number;
13
+ readonly size: number;
14
+ constructor(_elementType: TElement, capacity: number);
15
+ $name(label: string): this;
16
+ resolveReferences(): void;
17
+ write(output: ISerialOutput, values: ParseUnwrapped<TElement>[]): void;
18
+ read(input: ISerialInput): ParseUnwrapped<TElement>[];
19
+ measure(_values: ParseUnwrapped<TElement>[] | typeof MaxValue, measurer?: IMeasurer): IMeasurer;
20
+ resolve(ctx: ResolutionCtx): string;
21
+ }
22
+ declare const dynamicArrayOf: <TSchema extends AnyWgslData>(elementType: TSchema, capacity: number) => DynamicArrayDataType<TSchema>;
23
+
24
+ interface WgslStruct<TProps extends Record<string, AnyWgslData>> extends ISchema<UnwrapRecord<TProps>>, WgslData<UnwrapRecord<TProps>> {
25
+ $name(label: string): this;
26
+ }
27
+ declare const struct: <TProps extends Record<string, AnyWgslData>>(properties: TProps) => WgslStruct<TProps>;
28
+
29
+ type WgslArray<TElement extends AnyWgslData> = WgslData<TB.Unwrap<TElement>[]>;
30
+ declare const arrayOf: <TElement extends AnyWgslData>(elementType: TElement, size: number) => WgslArray<TElement>;
31
+
32
+ declare function ptr<TDataType extends AnyWgslData>(pointsTo: TDataType): WgslPointer<'function', TDataType>;
33
+
34
+ declare function atomic<TSchema extends U32 | I32>(data: TSchema): Atomic<TSchema>;
35
+ interface Atomic<TSchema extends U32 | I32> extends WgslData<Unwrap<TSchema>> {
36
+ }
37
+
38
+ export { I32, U32, type WgslArray, type WgslStruct, arrayOf, atomic, dynamicArrayOf, ptr, struct };
@@ -0,0 +1,38 @@
1
+ export { S as SimpleWgslData } from '../std140-Cv7GDE9w.js';
2
+ import { k as AnyWgslData, M as WgslData, R as ResolutionCtx, N as WgslPointer, _ as U32, $ as I32 } from '../types-ENDwr_p9.js';
3
+ export { a0 as Bool, a4 as F32, ao as Mat4f, aa as Vec2f, a8 as Vec2i, a6 as Vec2u, ag as Vec3f, ae as Vec3i, ac as Vec3u, am as Vec4f, ak as Vec4i, ai as Vec4u, a1 as bool, a5 as f32, a3 as i32, ap as mat4f, a2 as u32, ab as vec2f, a9 as vec2i, a7 as vec2u, ah as vec3f, af as vec3i, ad as vec3u, an as vec4f, al as vec4i, aj as vec4u } from '../types-ENDwr_p9.js';
4
+ import * as TB from 'typed-binary';
5
+ import { Schema, Unwrap, ISerialOutput, ParseUnwrapped, ISerialInput, MaxValue, IMeasurer, ISchema, UnwrapRecord } from 'typed-binary';
6
+ export { Parsed, Unwrap } from 'typed-binary';
7
+
8
+ declare class DynamicArrayDataType<TElement extends WgslData<unknown>> extends Schema<Unwrap<TElement>[]> implements WgslData<Unwrap<TElement>[]> {
9
+ private readonly _elementType;
10
+ readonly capacity: number;
11
+ private _label;
12
+ readonly byteAlignment: number;
13
+ readonly size: number;
14
+ constructor(_elementType: TElement, capacity: number);
15
+ $name(label: string): this;
16
+ resolveReferences(): void;
17
+ write(output: ISerialOutput, values: ParseUnwrapped<TElement>[]): void;
18
+ read(input: ISerialInput): ParseUnwrapped<TElement>[];
19
+ measure(_values: ParseUnwrapped<TElement>[] | typeof MaxValue, measurer?: IMeasurer): IMeasurer;
20
+ resolve(ctx: ResolutionCtx): string;
21
+ }
22
+ declare const dynamicArrayOf: <TSchema extends AnyWgslData>(elementType: TSchema, capacity: number) => DynamicArrayDataType<TSchema>;
23
+
24
+ interface WgslStruct<TProps extends Record<string, AnyWgslData>> extends ISchema<UnwrapRecord<TProps>>, WgslData<UnwrapRecord<TProps>> {
25
+ $name(label: string): this;
26
+ }
27
+ declare const struct: <TProps extends Record<string, AnyWgslData>>(properties: TProps) => WgslStruct<TProps>;
28
+
29
+ type WgslArray<TElement extends AnyWgslData> = WgslData<TB.Unwrap<TElement>[]>;
30
+ declare const arrayOf: <TElement extends AnyWgslData>(elementType: TElement, size: number) => WgslArray<TElement>;
31
+
32
+ declare function ptr<TDataType extends AnyWgslData>(pointsTo: TDataType): WgslPointer<'function', TDataType>;
33
+
34
+ declare function atomic<TSchema extends U32 | I32>(data: TSchema): Atomic<TSchema>;
35
+ interface Atomic<TSchema extends U32 | I32> extends WgslData<Unwrap<TSchema>> {
36
+ }
37
+
38
+ export { I32, U32, type WgslArray, type WgslStruct, arrayOf, atomic, dynamicArrayOf, ptr, struct };
package/data/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{A as k,B as l,C as m,D as n,E as o,G as p,H as q,I as r,J as s,K as t,q as a,r as b,s as c,t as d,u as e,v as f,w as g,x as h,y as i,z as j}from"../chunk-K2GYQABQ.js";export{a as SimpleWgslData,r as arrayOf,t as atomic,b as bool,p as dynamicArrayOf,e as f32,d as i32,o as mat4f,s as ptr,q as struct,c as u32,h as vec2f,g as vec2i,f as vec2u,k as vec3f,j as vec3i,i as vec3u,n as vec4f,m as vec4i,l as vec4u};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/index.cjs ADDED
@@ -0,0 +1,49 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk7HTWRNOHcjs = require('./chunk-7HTWRNOH.cjs');var Q=class extends Function{constructor(){super("...args","return this._bound._call(...args)");_chunk7HTWRNOHcjs.d.call(void 0, this,"_bound");return this._bound=this.bind(this),this._bound}},Ve=Q;var rt={f32:"float32",vec2f:"float32x2",vec3f:"float32x3",vec4f:"float32x4",u32:"uint32",vec2u:"uint32x2",vec3u:"uint32x3",vec4u:"uint32x4",i32:"sint32",vec2i:"sint32x2",vec3i:"sint32x3",vec4i:"sint32x4"};function Ge(n){if(!("expressionCode"in n))throw new Error("Type schema must contain a 'code' field");let e=n.getUnderlyingTypeString(),t=rt[e];if(!t)throw new Error(`Unknown vertex format for type code: ${e}`);return t}var b=class{constructor(){_chunk7HTWRNOHcjs.d.call(void 0, this,"lastUniqueId",0);_chunk7HTWRNOHcjs.d.call(void 0, this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let r;e.label?(r=e.label.replaceAll(/\s/g,"_"),r=r.replaceAll(/[^\w\d]/g,"")):r="item",t=`${r}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},X= exports.StrictNameRegistry =class{constructor(){_chunk7HTWRNOHcjs.d.call(void 0, this,"_usedNames",new Set);_chunk7HTWRNOHcjs.d.call(void 0, this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let r=0,s=e.label;for(;this._usedNames.has(s);)r++,s=`${e.label}_${r}`;return this._usedNames.add(s),this._assignedNames.set(e,s),s}};function Ee(n){return new H(n)}var H=class{constructor(e){this.descriptor=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"_label");_chunk7HTWRNOHcjs.d.call(void 0, this,"_type");e.compare===void 0?this._type="sampler":this._type="sampler_comparison"}get label(){return this._label}get type(){return this._type}$name(e){return this._label=e,this}resolve(e){let t=new (0, _chunk7HTWRNOHcjs.F)().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}};function F(n){return n.type==="sampler"||n.type==="sampler_comparison"}function Oe(n){return new J(n)}function Me(n){return new Z(n)}var J=class{constructor(e){this.descriptor=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"_flags",GPUTextureUsage.COPY_DST|GPUTextureUsage.COPY_SRC|GPUTextureUsage.RENDER_ATTACHMENT);_chunk7HTWRNOHcjs.d.call(void 0, this,"_allowedUsages",{sampled:null,storage:null});_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}get label(){return this._label}get flags(){return this._flags}$name(e){return this._label=e,this}$addFlags(e){return this._flags|=e,this}$allowSampled(){let e=this;return this._allowedUsages.sampled||(this._allowedUsages.sampled=new Map),this.$addFlags(GPUTextureUsage.TEXTURE_BINDING),e}$allowStorage(){let e=this;return this._allowedUsages.storage||(this._allowedUsages.storage=new Map),this.$addFlags(GPUTextureUsage.STORAGE_BINDING),e}getStorageIfAllowed(e){if(!this._allowedUsages.storage)return null;let t=Ce(e),r=this._allowedUsages.storage.get(t);if(r)return r;let s=Fe[this.descriptor.format];if(!s)throw new Error(`Unsupported texture format ${this.descriptor.format}`);let l=new C(e.type,this,s,e.descriptor,e.access);return this._allowedUsages.storage.set(t,l),l}getSampledIfAllowed(e){if(!this._allowedUsages.sampled)return null;let t=Ce(e),r=this._allowedUsages.sampled.get(t);if(r)return r;let s=new C(e.type,this,e.dataType,e.descriptor);return this._allowedUsages.sampled.set(t,s),s}asStorage(e){let t=this.getStorageIfAllowed(e);if(!Fe[this.descriptor.format])throw new Error(`Unsupported texture format ${this.descriptor.format}`);return t}asSampled(e){return this.getSampledIfAllowed(e)}},C=class{constructor(e,t,r,s={},l=void 0){this.type=e;this.texture=t;this.dataType=r;this.descriptor=s;this.access=l;_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new (0, _chunk7HTWRNOHcjs.F)().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}},Z=class{constructor(e){this.descriptor=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"_label");_chunk7HTWRNOHcjs.d.call(void 0, this,"type","texture_external")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new (0, _chunk7HTWRNOHcjs.F)().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}};function ke(n){return!("texture"in n)&&!F(n)}function O(n){return"texture"in n}var Fe={rgba8unorm:_chunk7HTWRNOHcjs.D,rgba8snorm:_chunk7HTWRNOHcjs.D,rgba8uint:_chunk7HTWRNOHcjs.B,rgba8sint:_chunk7HTWRNOHcjs.C,rgba16uint:_chunk7HTWRNOHcjs.B,rgba16sint:_chunk7HTWRNOHcjs.C,rgba16float:_chunk7HTWRNOHcjs.D,r32uint:_chunk7HTWRNOHcjs.B,r32sint:_chunk7HTWRNOHcjs.C,r32float:_chunk7HTWRNOHcjs.D,rg32uint:_chunk7HTWRNOHcjs.B,rg32sint:_chunk7HTWRNOHcjs.C,rg32float:_chunk7HTWRNOHcjs.D,rgba32uint:_chunk7HTWRNOHcjs.B,rgba32sint:_chunk7HTWRNOHcjs.C,rgba32float:_chunk7HTWRNOHcjs.D,bgra8unorm:_chunk7HTWRNOHcjs.D};function Ce(n){let e=Object.fromEntries(Object.entries(n).sort(([t],[r])=>t.localeCompare(r)));return JSON.stringify(e)}var st={uniform:"uniform",mutable:"storage, read_write",readonly:"storage, read"},ee=class{constructor(e,t){this.names=e;this._bindingGroup=t;_chunk7HTWRNOHcjs.d.call(void 0, this,"_memoizedResolves",new WeakMap);_chunk7HTWRNOHcjs.d.call(void 0, this,"_nextFreeBindingIdx",0);_chunk7HTWRNOHcjs.d.call(void 0, this,"_usedBindables",new Set);_chunk7HTWRNOHcjs.d.call(void 0, this,"_usedRenderResources",new Set);_chunk7HTWRNOHcjs.d.call(void 0, this,"_resourceToIndexMap",new WeakMap);_chunk7HTWRNOHcjs.d.call(void 0, this,"_usedBuiltins",new Set);_chunk7HTWRNOHcjs.d.call(void 0, this,"_declarations",[])}get usedBindables(){return this._usedBindables}get usedRenderResources(){return this._usedRenderResources}get declarations(){return this._declarations}get usedBuiltins(){return this._usedBuiltins}getOrInstantiate(e,t){var g;let r=(g=this._memoizedResolves.get(e))!=null?g:[];for(let i of r)if([...i.slotToValueMap.entries()].every(([p,c])=>t.readSlot(p)===c))return i.result;let s;try{s=e.resolve(t)}catch(i){throw i instanceof _chunk7HTWRNOHcjs.e?i.appendToTrace(e):new (0, _chunk7HTWRNOHcjs.e)(i,[e])}let l=new Map;for(let i of t.usedSlots)l.set(i,t.readSlot(i));return r.push({slotToValueMap:l,result:s}),this._memoizedResolves.set(e,r),s}reserveBindingEntry(e){this._usedBindables.add(e);let t=this._nextFreeBindingIdx++;return this._resourceToIndexMap.set(e,t),{group:this._bindingGroup,idx:t}}registerBindingNoEntry(e){this._usedBindables.add(e)}reserveRenderResourceEntry(e){this._usedRenderResources.add(e);let t=this._nextFreeBindingIdx++;return this._resourceToIndexMap.set(e,t),{group:this._bindingGroup,idx:t}}getBindingIndex(e){return this._resourceToIndexMap.get(e)}addDeclaration(e){this._declarations.push(e)}addBuiltin(e){this._usedBuiltins.add(e)}},P=class{constructor({names:e,bindingGroup:t}){_chunk7HTWRNOHcjs.d.call(void 0, this,"_shared");_chunk7HTWRNOHcjs.d.call(void 0, this,"usedSlots",new Set);this._shared=new ee(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}get usedRenderResources(){return this._shared.usedRenderResources}get usedBuiltins(){return this._shared.usedBuiltins}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addRenderResource(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBuiltin(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new (0, _chunk7HTWRNOHcjs.f)(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!_chunk7HTWRNOHcjs.h.call(void 0, e))return String(e);let r=new te(this,this._shared,t),s=this._shared.getOrInstantiate(e,r);return`${[...this._shared.declarations].join(`
2
+
3
+ `)}${s}`}getIndexFor(e){let t=this._shared.getBindingIndex(e);if(t===void 0)throw new Error("No index found for item");return t}},te=class n{constructor(e,t,r){this._parent=e;this._shared=t;this._slotValuePairs=r;_chunk7HTWRNOHcjs.d.call(void 0, this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){if(e.usage==="vertex"){this._shared.registerBindingNoEntry(e);return}let{group:r,idx:s}=this._shared.reserveBindingEntry(e);this.addDeclaration(_chunk7HTWRNOHcjs.O`@group(${r}) @binding(${s}) var<${st[e.usage]}> ${t}: ${e.allocatable.dataType};`)}addRenderResource(e,t){let{group:r,idx:s}=this._shared.reserveRenderResourceEntry(e);if(_chunk7HTWRNOHcjs.k.call(void 0, e.type)||_chunk7HTWRNOHcjs.o.call(void 0, e.type)||_chunk7HTWRNOHcjs.m.call(void 0, e.type)){this.addDeclaration(_chunk7HTWRNOHcjs.O`@group(${r}) @binding(${s}) var ${t}: ${e.type};`);return}if(O(e)){if(e.access!==void 0){this.addDeclaration(_chunk7HTWRNOHcjs.O`@group(${r}) @binding(${s}) var ${t}: ${e.type}<${e.texture.descriptor.format}, ${e.access}>;`);return}this.addDeclaration(_chunk7HTWRNOHcjs.O`@group(${r}) @binding(${s}) var ${t}: ${e.type}<${e.dataType}>;`);return}throw new Error(`Unsupported resource type: ${e.type}`)}addBuiltin(e){this._shared.addBuiltin(e)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([r])=>r===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;_chunk7HTWRNOHcjs.j.call(void 0, t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!_chunk7HTWRNOHcjs.h.call(void 0, e))return String(e);let r=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,r)}};var nt={uniform:"uniform",mutable:"storage",readonly:"read-only-storage"},_= exports.ProgramBuilder =class{constructor(e,t){this.runtime=e;this.root=t}build(e){var x;let t=new P({names:(x=e.nameRegistry)!=null?x:new b,bindingGroup:e.bindingGroup}),r=t.resolve(this.root),s=Array.from(t.usedBindables),l=Array.from(t.usedRenderResources),g=l.filter(F),i=l.filter(O),m=l.filter(ke),p=[];for(let d of i)d.access===void 0?p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,texture:{}}):p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,storageTexture:{format:d.texture.descriptor.format}});for(let d of m)p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,externalTexture:{}});for(let d of g)p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,sampler:{}});for(let d of s)d.usage!=="vertex"&&p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,buffer:{type:nt[d.usage]}});let c=[];for(let d of i)c.push({binding:t.getIndexFor(d),resource:this.runtime.viewFor(d)});for(let d of m)c.push({binding:t.getIndexFor(d),resource:this.runtime.externalTextureFor(d)});for(let d of g)c.push({binding:t.getIndexFor(d),resource:this.runtime.samplerFor(d)});for(let d of s)d.usage!=="vertex"&&c.push({binding:t.getIndexFor(d),resource:{buffer:this.runtime.bufferFor(d.allocatable)}});let f=this.runtime.device.createBindGroupLayout({entries:p}),y=this.runtime.device.createBindGroup({layout:f,entries:c});return{bindGroupLayout:f,bindGroup:y,code:r}}},M=class{constructor(e,t,r,s){this.runtime=e;this.vertexRoot=t;this.fragmentRoot=r;this.vertexOutputFormat=s}build(e){var xe,he,be,We;let t=Object.getOwnPropertySymbols(this.vertexOutputFormat).map(u=>{let h=this.vertexOutputFormat[u];if(typeof h!="string")throw new Error("Output names must be strings.");return{symbol:u,name:h}}),r=Object.fromEntries(t.map(({symbol:u,name:h})=>[u,h])),s=_chunk7HTWRNOHcjs.N.call(void 0, r),g=Object.keys(this.vertexOutputFormat).map((u,h)=>{let R=this.vertexOutputFormat[u];if(!R)throw new Error("Output names must be strings.");return{name:u,varInfo:R,index:h}}),i=[...s.map(u=>_chunk7HTWRNOHcjs.O`
4
+ @builtin(${u.builtin.name}) ${u.name}: ${u.builtin.type},
5
+ `),...g.map(({name:u,varInfo:h,index:R})=>_chunk7HTWRNOHcjs.O`
6
+ @location(${R}) ${u}: ${h},
7
+ `)],m=new P({names:(xe=e.nameRegistry)!=null?xe:new b,bindingGroup:e.bindingGroup});m.resolve(this.vertexRoot);let p=Array.from(m.usedBindables).filter(u=>u.usage==="vertex"),f=p.map(u=>({bindable:u,underlyingType:u.allocatable.dataType})).map((u,h)=>_chunk7HTWRNOHcjs.O`
8
+ @location(${h}) ${u.bindable} : ${u.underlyingType.getUnderlyingTypeString()},
9
+ `),d=[...Array.from(m.usedBuiltins).map(u=>_chunk7HTWRNOHcjs.O`
10
+ @builtin(${u.name}) ${u.identifier}: ${u.type},
11
+ `),...f],W=_chunk7HTWRNOHcjs.O`
12
+ struct VertexOutput {
13
+ ${i}
14
+ };
15
+
16
+ @vertex
17
+ fn main(${d}) -> VertexOutput {
18
+ ${this.vertexRoot}
19
+ var output: VertexOutput;
20
+ ${s.map(u=>_chunk7HTWRNOHcjs.O`
21
+ output.${u.name} = ${u.name};
22
+ `)}
23
+ ${g.map(({name:u})=>_chunk7HTWRNOHcjs.O`
24
+ output.${u} = ${u};
25
+ `)}
26
+ return output;
27
+ }
28
+ `,A=new P({names:(he=e.nameRegistry)!=null?he:new b,bindingGroup:e.bindingGroup});A.resolve(this.fragmentRoot);let D=Array.from(A.usedBuiltins).map(u=>_chunk7HTWRNOHcjs.O`
29
+ @builtin(${u.name}) ${u.identifier}: ${u.type},
30
+ `),V=g.map(({name:u,varInfo:h},R)=>_chunk7HTWRNOHcjs.O`
31
+ @location(${R}) ${u}: ${h},
32
+ `),v=[...D,...V],B=_chunk7HTWRNOHcjs.O`
33
+ @fragment
34
+ fn main(${v}) -> @location(0) vec4f {
35
+ ${this.fragmentRoot}
36
+ }
37
+ `,et=new _(this.runtime,W).build({bindingGroup:e.bindingGroup,shaderStage:GPUShaderStage.VERTEX,nameRegistry:(be=e.nameRegistry)!=null?be:new b}),tt=new _(this.runtime,B).build({bindingGroup:e.bindingGroup+1,shaderStage:GPUShaderStage.FRAGMENT,nameRegistry:(We=e.nameRegistry)!=null?We:new b});return[et,tt,p]}},k=class{constructor(e,t,r){this.runtime=e;this.computeRoot=t;this.workgroupSize=r}build(e){var m,p,c,f;let t=new P({names:(m=e.nameRegistry)!=null?m:new b,bindingGroup:e.bindingGroup});t.resolve(this.computeRoot);let s=Array.from(t.usedBuiltins).map(y=>_chunk7HTWRNOHcjs.O`
38
+ @builtin(${y.name}) ${y.identifier}: ${y.type},
39
+ `),l=`@workgroup_size(${this.workgroupSize[0]}, ${(p=this.workgroupSize[1])!=null?p:1}, ${(c=this.workgroupSize[2])!=null?c:1})`,g=_chunk7HTWRNOHcjs.O`
40
+ @compute ${l}
41
+ fn main(${s}) {
42
+ ${this.computeRoot}
43
+ }
44
+ `;return new _(this.runtime,g).build({bindingGroup:e.bindingGroup,shaderStage:GPUShaderStage.COMPUTE,nameRegistry:(f=e.nameRegistry)!=null?f:new b})}};function $(n,e){return new re(n,e)}var re=class{constructor(e,t){this.buffer=e;this.usage=t;_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}get label(){return this._label}get allocatable(){return this.buffer}$name(e){return this._label=e,this}resolve(e){let t=new _chunk7HTWRNOHcjs.F;return e.addBinding(this,t),e.resolve(t)}toString(){var e;return`${this.usage}:${(e=this._label)!=null?e:"<unnamed>"}`}};function Ie(n,e){return new se(n,e)}var se=class{constructor(e,t){this.dataType=e;this.initial=t;_chunk7HTWRNOHcjs.d.call(void 0, this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);_chunk7HTWRNOHcjs.d.call(void 0, this,"vertexLayout",null);_chunk7HTWRNOHcjs.d.call(void 0, this,"_allowedUsages",{uniform:null,mutable:null,readonly:null,vertex:null});_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}$allowUniform(){this.$addFlags(GPUBufferUsage.UNIFORM);let e=this;return this._allowedUsages.uniform||(this._allowedUsages.uniform=$(e,"uniform")),e}$allowReadonly(){this.$addFlags(GPUBufferUsage.STORAGE);let e=this;return this._allowedUsages.readonly||(this._allowedUsages.readonly=$(e,"readonly")),e}$allowMutable(){this.$addFlags(GPUBufferUsage.STORAGE);let e=this;return this._allowedUsages.mutable||(this._allowedUsages.mutable=$(e,"mutable")),e}$allowVertex(e="vertex"){this.$addFlags(GPUBufferUsage.VERTEX);let t=this;if(!this.vertexLayout){if(!(this.dataType instanceof _chunk7HTWRNOHcjs.q))throw new Error("Only simple data types can be used as vertex buffers");let r=this.dataType;r=r.getUnderlyingType(),this.vertexLayout={arrayStride:r.size,stepMode:e},this._allowedUsages.vertex=$(t,"vertex")}if(this.vertexLayout.stepMode!==e)throw new Error("Cannot change step mode of a vertex buffer");return t}$addFlags(e){return this.flags|=e,this}asUniform(){return this._allowedUsages.uniform}asMutable(){return this._allowedUsages.mutable}asReadonly(){return this._allowedUsages.readonly}asVertex(){return this._allowedUsages.vertex}toString(){var e;return`buffer:${(e=this._label)!=null?e:"<unnamed>"}`}};function Le(n){return new ne(n)}var ne=class{constructor(e){this.expr=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new (0, _chunk7HTWRNOHcjs.F)().$name(this._label);return e.addDeclaration(_chunk7HTWRNOHcjs.O`const ${t} = ${this.expr};`),e.resolve(t)}};function Ne(n,...e){return new ae(_chunk7HTWRNOHcjs.O.call(void 0, n,...e))}var ae=class{constructor(e){this._declaration=e}resolve(e){return e.addDeclaration(_chunk7HTWRNOHcjs.O`${this._declaration}`),""}};function ze(n,...e){return new le(_chunk7HTWRNOHcjs.O.call(void 0, n,...e))}var le=class{constructor(e){this.body=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new (0, _chunk7HTWRNOHcjs.F)().$name(this._label);return e.addDeclaration(_chunk7HTWRNOHcjs.O`fn ${t}${this.body}`.$name(this._label)),e.resolve(t)}with(e,t){return new ie(this,[e,t])}toString(){var e;return`fn:${(e=this.label)!=null?e:"<unnamed>"}`}},ie=class n{constructor(e,t){this._innerFn=e;this._slotValuePair=t}get label(){return this._innerFn.label}with(e,t){return new n(this,[e,t])}resolve(e){return e.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,s;let[e,t]=this._slotValuePair;return`fn:${(r=this.label)!=null?r:"<unnamed>"}[${(s=e.label)!=null?s:"<unnamed>"}=${t}]`}};function qe(n,e){let t=n.map(s=>[new _chunk7HTWRNOHcjs.F,s]),r=t.map(([s,l])=>s);return s=>{let l=s(...r);return new ue(t,e,l)}}var oe=class{constructor(e,t){this.usedFn=e;this.args=t}resolve(e){let t=this.args.map((r,s)=>{let l=s<this.args.length-1?", ":"";return _chunk7HTWRNOHcjs.O`${r}${l}`});return e.resolve(_chunk7HTWRNOHcjs.O`${this.usedFn}(${t})`.$name("internal"))}toString(){var e;return`fun:${(e=this.usedFn.label)!=null?e:"<unnamed>"}()`}},ue=class extends Ve{constructor(t,r,s){super();this.argPairs=t;this.returnType=r;this.body=s;_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}get label(){return this._label}$name(t){return this._label=t,this}resolve(t){let r=new (0, _chunk7HTWRNOHcjs.F)().$name(this._label),s=this.argPairs.map(([l,g],i)=>{let m=i<this.argPairs.length-1?", ":"";return _chunk7HTWRNOHcjs.p.call(void 0, g)?_chunk7HTWRNOHcjs.O`${l}: ptr<${g.scope}, ${g.pointsTo}>${m}`:_chunk7HTWRNOHcjs.O`${l}: ${g}${m}`});return this.returnType!==void 0?t.addDeclaration(_chunk7HTWRNOHcjs.O`fn ${r}(${s}) -> ${this.returnType} {
45
+ ${this.body}
46
+ }`):t.addDeclaration(_chunk7HTWRNOHcjs.O`fn ${r}(${s}) {
47
+ ${this.body}
48
+ }`),t.resolve(r)}_call(...t){return new oe(this,t)}toString(){var t;return`fun:${(t=this._label)!=null?t:"<unnamed>"}`}};var je=Symbol("This item can be set, owns its value (does not get value from an external source)");var Ke=Symbol("This plum's value is sourced from outside the runtime.");function I(n){return n[Ke]===!0}function Ye(n){return typeof n=="function"?new ge(n):new de(n)}function Qe(n,e){return new pe(n,e)}function Xe(n){return n.__brand==="WgslPlum"}var at,de=class{constructor(e){this._initial=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"__brand","WgslPlum");_chunk7HTWRNOHcjs.d.call(void 0, this,at,!0);_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}compute(e){return this._initial}$name(e){return this._label=e,this}get label(){return this._label}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};at=je;var ge=class{constructor(e){this._compute=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"__brand","WgslPlum");_chunk7HTWRNOHcjs.d.call(void 0, this,"_label")}$name(e){return this._label=e,this}get label(){return this._label}compute(e){return this._compute(e)}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}},lt,pe=class{constructor(e,t){this._subscribe=e;this._getLatest=t;_chunk7HTWRNOHcjs.d.call(void 0, this,"__brand","WgslPlum");_chunk7HTWRNOHcjs.d.call(void 0, this,lt,!0);_chunk7HTWRNOHcjs.d.call(void 0, this,"_label");_chunk7HTWRNOHcjs.d.call(void 0, this,"_prev");_chunk7HTWRNOHcjs.d.call(void 0, this,"_version",0);this._prev=t()}$name(e){return this._label=e,this}get label(){return this._label}get version(){return this._version}subscribe(e){return this._subscribe(e)}compute(){let e=this._getLatest();return Object.is(e,this._prev)||(this._version++,this._prev=e),this._prev}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};lt=Ke;function He(n){return new me(n)}var me=class{constructor(e=void 0){this.defaultValue=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"__brand","WgslSlot");_chunk7HTWRNOHcjs.d.call(void 0, this,"label")}$name(e){return this.label=e,this}areEqual(e,t){return Object.is(e,t)}resolve(e){var r;let t=e.unwrap(this);if(!_chunk7HTWRNOHcjs.i.call(void 0, t))throw new Error(`Cannot inject value of type ${typeof t} of slot '${(r=this.label)!=null?r:"<unnamed>"}' in code.`);return e.resolve(t)}toString(){var e;return`slot:${(e=this.label)!=null?e:"<unnamed>"}`}};var Je=(n,e,t="private")=>new ce(n,e,t),ce=class{constructor(e,t,r){this._dataType=e;this._initialValue=t;this.scope=r;_chunk7HTWRNOHcjs.d.call(void 0, this,"identifier",new _chunk7HTWRNOHcjs.F)}$name(e){return this.identifier.$name(e),this}resolve(e){return this._initialValue?e.addDeclaration(_chunk7HTWRNOHcjs.O`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`):e.addDeclaration(_chunk7HTWRNOHcjs.O`var<${this.scope}> ${this.identifier}: ${this._dataType};`),e.resolve(this.identifier)}};var it=Object.assign(_chunk7HTWRNOHcjs.O,{code:_chunk7HTWRNOHcjs.O,fn:ze,fun:qe,buffer:Ie,plum:Ye,plumFromEvent:Qe,slot:He,constant:Le,declare:Ne,var:Je,sampler:Ee,texture:Oe,textureExternal:Me,builtin:_chunk7HTWRNOHcjs.L});var _typedbinary = require('typed-binary');var fe=(n,e)=>{let t=e-1,r=~t;return n&t?(n&r)+e:n};var L=class{constructor(){_chunk7HTWRNOHcjs.d.call(void 0, this,"_stateMap",new WeakMap)}inspect(e){return this._stateMap.get(e)}_getState(e){let t=this._stateMap.get(e);if(!t){let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);t={value:r,dependencies:s,version:0},this._stateMap.set(e,t)}return t}_notifyListeners(e){let t=this._getState(e);if(!t.active)return;let r=[...t.active.listeners];for(let s of r)s(t.value)}_computeAndGatherDependencies(e){let t=new Map,r=s=>{if(!t.has(s)){let l=this._getState(s);t.set(s,l.version)}return this.get(s)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let l of t.active.unsubs)l();let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);if(t.dependencies=s,t.active)for(let[l]of t.dependencies)t.active.unsubs.add(this.subscribe(l,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=I(e)?e.version:t.version+1,this._notifyListeners(e)),t.value}get(e){let t=this._getState(e);if(t.active)return t.value;let r=!1;return I(e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([s,l])=>(this.get(s),this._getState(s).version!==l))),r?this._recompute(e):t.value}set(e,t){let r=this._getState(e);Object.is(r.value,t)||(r.value=t,r.version++,this._notifyListeners(e))}subscribe(e,t){let r=this._getState(e),s;if(!r.active){let l=new Set;r.active={listeners:new Set,unsubs:l};for(let[g]of r.dependencies)l.add(this.subscribe(g,()=>{this._recompute(e)}));I(e)&&(s=e.subscribe(()=>{this._recompute(e)}))}return r.active.listeners.add(t),()=>{if(r.active&&(r.active.listeners.delete(t),r.active.listeners.size===0)){for(let l of r.active.unsubs)l();s==null||s(),r.active=void 0}}}};var N=class{constructor(){_chunk7HTWRNOHcjs.d.call(void 0, this,"_queue",[]);_chunk7HTWRNOHcjs.d.call(void 0, this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(s){r(s)}}),this._processQueue()})}async _processQueue(){if(!this._pending){for(this._pending=!0;this._queue.length>0;){let e=this._queue.shift();e&&await e()}this._pending=!1}}};var z=class{constructor(e){this.device=e;_chunk7HTWRNOHcjs.d.call(void 0, this,"_entryToBufferMap",new Map);_chunk7HTWRNOHcjs.d.call(void 0, this,"_samplers",new WeakMap);_chunk7HTWRNOHcjs.d.call(void 0, this,"_textures",new WeakMap);_chunk7HTWRNOHcjs.d.call(void 0, this,"_textureViews",new WeakMap);_chunk7HTWRNOHcjs.d.call(void 0, this,"_pipelineExecutors",[]);_chunk7HTWRNOHcjs.d.call(void 0, this,"_commandEncoder",null);_chunk7HTWRNOHcjs.d.call(void 0, this,"_readBuffer",null);_chunk7HTWRNOHcjs.d.call(void 0, this,"_taskQueue",new N);_chunk7HTWRNOHcjs.d.call(void 0, this,"_plumStore",new L);_chunk7HTWRNOHcjs.d.call(void 0, this,"_allocSubscriptions",new Map)}get commandEncoder(){return this._commandEncoder||(this._commandEncoder=this.device.createCommandEncoder()),this._commandEncoder}dispose(){var e;for(let t of this._allocSubscriptions.values())t();this._allocSubscriptions.clear();for(let t of this._entryToBufferMap.values())t.destroy();this._entryToBufferMap.clear(),(e=this._readBuffer)==null||e.destroy()}bufferFor(e){let t=this._entryToBufferMap.get(e);if(!t){if(t=this.device.createBuffer({usage:e.flags,size:fe(e.dataType.size,e.dataType.byteAlignment),mappedAtCreation:e.initial!==void 0}),!t)throw new Error(`Failed to create buffer for ${e}`);if(e.initial!==void 0){let r=new (0, _typedbinary.BufferWriter)(t.getMappedRange());if(Xe(e.initial)){let s=e.initial;e.dataType.write(r,this._plumStore.get(s)),this._allocSubscriptions.set(e,this._plumStore.subscribe(s,()=>{this.writeBuffer(e,this._plumStore.get(s))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}textureFor(e){let t;"texture"in e?t=e.texture:t=e;let r=this._textures.get(t);if(!r){let s=_chunk7HTWRNOHcjs.b.call(void 0, _chunk7HTWRNOHcjs.a.call(void 0, {},t.descriptor),{usage:t.flags});if(r=this.device.createTexture(s),!r)throw new Error(`Failed to create texture for ${e}`);this._textures.set(t,r)}return r}viewFor(e){let t=this._textureViews.get(e);return t||(t=this.textureFor(e.texture).createView(e.descriptor),this._textureViews.set(e,t)),t}externalTextureFor(e){return this.device.importExternalTexture(e.descriptor)}samplerFor(e){let t=this._samplers.get(e);if(!t){if(t=this.device.createSampler(e.descriptor),!t)throw new Error(`Failed to create sampler for ${e}`);this._samplers.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var l;this.flush(),(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((l=this._readBuffer)==null||l.destroy(),this._readBuffer=this.device.createBuffer({usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,size:e.dataType.size}));let t=this.bufferFor(e),r=this.device.createCommandEncoder();r.copyBufferToBuffer(t,0,this._readBuffer,0,e.dataType.size),this.device.queue.submit([r.finish()]),await this.device.queue.onSubmittedWorkDone(),await this._readBuffer.mapAsync(GPUMapMode.READ,0,e.dataType.size);let s=e.dataType.read(new (0, _typedbinary.BufferReader)(this._readBuffer.getMappedRange()));return this._readBuffer.unmap(),s})}writeBuffer(e,t){let r=this.bufferFor(e),s=fe(e.dataType.size,e.dataType.byteAlignment),l=new ArrayBuffer(s);e.dataType.write(new (0, _typedbinary.BufferWriter)(l),t),this.device.queue.writeBuffer(r,0,l,0,s)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){if(typeof t=="function"){let r=t;this._plumStore.set(e,r(this._plumStore.get(e)))}else this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var y,x,d,W,A,j,D,V;let[t,r,s]=new M(this,e.vertex.code,e.fragment.code,e.vertex.output).build({bindingGroup:((y=e.externalLayouts)!=null?y:[]).length}),l=s.map((v,B)=>{if(!v.allocatable.vertexLayout)throw new Error(`Buffer ${v.allocatable} does not have a vertex layout`);return _chunk7HTWRNOHcjs.b.call(void 0, _chunk7HTWRNOHcjs.a.call(void 0, {},v.allocatable.vertexLayout),{attributes:[{shaderLocation:B,offset:0,format:Ge(v.allocatable.dataType)}]})}),g=this.device.createShaderModule({code:t.code}),i=this.device.createShaderModule({code:r.code}),m=this.device.createPipelineLayout({label:(x=e.label)!=null?x:"",bindGroupLayouts:[...(d=e.externalLayouts)!=null?d:[],t.bindGroupLayout,r.bindGroupLayout]}),p=this.device.createRenderPipeline({label:(W=e.label)!=null?W:"",layout:m,vertex:{module:g,buffers:l},fragment:{module:i,targets:(j=(A=e.fragment)==null?void 0:A.target)!=null?j:[]},primitive:e.primitive}),c=s.map((v,B)=>[this.bufferFor(v.allocatable),B]),f=new Te(this,p,t,r,(V=(D=e.externalLayouts)==null?void 0:D.length)!=null?V:0,c);return this._pipelineExecutors.push(f),f}makeComputePipeline(e){var i,m,p,c,f,y,x;let t=new k(this,e.code,(i=e.workgroupSize)!=null?i:[1]).build({bindingGroup:((m=e.externalLayouts)!=null?m:[]).length}),r=this.device.createShaderModule({code:t.code}),s=this.device.createPipelineLayout({label:(p=e.label)!=null?p:"",bindGroupLayouts:[...(c=e.externalLayouts)!=null?c:[],t.bindGroupLayout]}),l=this.device.createComputePipeline({label:(f=e.label)!=null?f:"",layout:s,compute:{module:r}}),g=new ye(this,l,[t],(x=(y=e.externalLayouts)==null?void 0:y.length)!=null?x:0);return this._pipelineExecutors.push(g),g}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},q=class{constructor(e,t,r,s,l){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=s;this.label=l}},Te=class extends q{constructor(t,r,s,l,g,i){super(t,r,[s,l],g);_chunk7HTWRNOHcjs.d.call(void 0, this,"_vertexProgram");_chunk7HTWRNOHcjs.d.call(void 0, this,"_fragmentProgram");_chunk7HTWRNOHcjs.d.call(void 0, this,"_usedVertexBuffers");this._vertexProgram=s,this._fragmentProgram=l,this._usedVertexBuffers=new Set(i)}execute(t){var f,y,x;let c=t,{vertexCount:r,instanceCount:s,firstVertex:l,firstInstance:g,externalBindGroups:i}=c,m=_chunk7HTWRNOHcjs.c.call(void 0, c,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups"]);if(((f=i==null?void 0:i.length)!=null?f:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(y=i==null?void 0:i.length)!=null?y:0}`);let p=this._runtime.commandEncoder.beginRenderPass(_chunk7HTWRNOHcjs.b.call(void 0, _chunk7HTWRNOHcjs.a.call(void 0, {},m),{label:(x=this.label)!=null?x:""}));p.setPipeline(this.pipeline),(i!=null?i:[]).forEach((d,W)=>p.setBindGroup(W,d)),p.setBindGroup((i!=null?i:[]).length,this._vertexProgram.bindGroup),p.setBindGroup((i!=null?i:[]).length+1,this._fragmentProgram.bindGroup);for(let[d,W]of this._usedVertexBuffers)p.setVertexBuffer(W,d);p.draw(r,s,l,g),p.end()}},ye=class extends q{execute(e){var l,g,i;let{workgroups:t=[1,1],externalBindGroups:r}=e!=null?e:{};if(((l=r==null?void 0:r.length)!=null?l:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(g=r==null?void 0:r.length)!=null?g:0}`);let s=this._runtime.commandEncoder.beginComputePass({label:(i=this.label)!=null?i:""});s.setPipeline(this.pipeline),(r!=null?r:[]).forEach((m,p)=>s.setBindGroup(p,m)),this.programs.forEach((m,p)=>s.setBindGroup((r!=null?r:[]).length+p,m.bindGroup)),s.dispatchWorkgroups(...t),s.end()}};async function ut(n){if(n instanceof GPUDevice)return new z(n);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(n==null?void 0:n.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new z(await e.requestDevice(n==null?void 0:n.device))}exports.MissingSlotValueError = _chunk7HTWRNOHcjs.f; exports.ProgramBuilder = _; exports.RandomNameRegistry = b; exports.RecursiveDataTypeError = _chunk7HTWRNOHcjs.g; exports.ResolutionError = _chunk7HTWRNOHcjs.e; exports.StrictNameRegistry = X; exports.builtin = _chunk7HTWRNOHcjs.L; exports.createRuntime = ut; exports.deriveVertexFormat = Ge; exports.getBuiltinInfo = _chunk7HTWRNOHcjs.M; exports.getUsedBuiltinsNamed = _chunk7HTWRNOHcjs.N; exports.isDepthTextureType = _chunk7HTWRNOHcjs.m; exports.isExternalTextureType = _chunk7HTWRNOHcjs.o; exports.isPointer = _chunk7HTWRNOHcjs.p; exports.isResolvable = _chunk7HTWRNOHcjs.h; exports.isSamplerType = _chunk7HTWRNOHcjs.k; exports.isSlot = _chunk7HTWRNOHcjs.j; exports.isStorageTextureType = _chunk7HTWRNOHcjs.n; exports.isTypedTextureType = _chunk7HTWRNOHcjs.l; exports.isWgsl = _chunk7HTWRNOHcjs.i; exports.wgsl = it;
49
+ //# sourceMappingURL=index.cjs.map