typegpu 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. package/README.md +29 -0
  2. package/chunk-34O2K2PT.js +2 -0
  3. package/chunk-34O2K2PT.js.map +1 -0
  4. package/chunk-T3YCU4G4.cjs +2 -0
  5. package/chunk-T3YCU4G4.cjs.map +1 -0
  6. package/data/index.cjs +8 -0
  7. package/data/index.cjs.map +1 -0
  8. package/data/index.d.cts +109 -0
  9. package/data/index.d.ts +109 -0
  10. package/data/index.js +8 -0
  11. package/data/index.js.map +1 -0
  12. package/index.cjs +2 -0
  13. package/index.cjs.map +1 -0
  14. package/index.d.cts +72 -0
  15. package/index.d.ts +72 -0
  16. package/index.js +2 -0
  17. package/index.js.map +1 -0
  18. package/package.json +28 -37
  19. package/types-D2gslu2F.d.cts +202 -0
  20. package/types-D2gslu2F.d.ts +202 -0
  21. package/dist/chunk-5ZQTJALJ.cjs +0 -4
  22. package/dist/chunk-5ZQTJALJ.cjs.map +0 -1
  23. package/dist/chunk-AS7UPXZ3.cjs +0 -2
  24. package/dist/chunk-AS7UPXZ3.cjs.map +0 -1
  25. package/dist/chunk-G3U6RTMF.cjs +0 -2
  26. package/dist/chunk-G3U6RTMF.cjs.map +0 -1
  27. package/dist/chunk-JJZKRDXD.js +0 -4
  28. package/dist/chunk-JJZKRDXD.js.map +0 -1
  29. package/dist/chunk-KBVQVOLY.cjs +0 -2
  30. package/dist/chunk-KBVQVOLY.cjs.map +0 -1
  31. package/dist/chunk-OZ2XZ4ZA.js +0 -2
  32. package/dist/chunk-OZ2XZ4ZA.js.map +0 -1
  33. package/dist/chunk-TVPC7ZME.js +0 -2
  34. package/dist/chunk-TVPC7ZME.js.map +0 -1
  35. package/dist/chunk-XGSMOADT.js +0 -2
  36. package/dist/chunk-XGSMOADT.js.map +0 -1
  37. package/dist/data/index.cjs +0 -10
  38. package/dist/data/index.cjs.map +0 -1
  39. package/dist/data/index.d.cts +0 -84
  40. package/dist/data/index.d.ts +0 -84
  41. package/dist/data/index.js +0 -10
  42. package/dist/data/index.js.map +0 -1
  43. package/dist/index.cjs +0 -6
  44. package/dist/index.cjs.map +0 -1
  45. package/dist/index.d.cts +0 -145
  46. package/dist/index.d.ts +0 -145
  47. package/dist/index.js +0 -6
  48. package/dist/index.js.map +0 -1
  49. package/dist/macro/index.cjs +0 -8
  50. package/dist/macro/index.cjs.map +0 -1
  51. package/dist/macro/index.d.cts +0 -7
  52. package/dist/macro/index.d.ts +0 -7
  53. package/dist/macro/index.js +0 -8
  54. package/dist/macro/index.js.map +0 -1
  55. package/dist/struct-CFmatz6R.d.ts +0 -9
  56. package/dist/struct-CRg8uhjj.d.cts +0 -9
  57. package/dist/typegpuRuntime-BZwyf0k_.d.ts +0 -77
  58. package/dist/typegpuRuntime-Dg50sa5T.d.cts +0 -77
  59. package/dist/types-Dgp6OHLq.d.cts +0 -148
  60. package/dist/types-Dgp6OHLq.d.ts +0 -148
  61. package/dist/web/index.cjs +0 -23
  62. package/dist/web/index.cjs.map +0 -1
  63. package/dist/web/index.d.cts +0 -40
  64. package/dist/web/index.d.ts +0 -40
  65. package/dist/web/index.js +0 -23
  66. package/dist/web/index.js.map +0 -1
@@ -1,148 +0,0 @@
1
- import { Parsed, ISchema } from 'typed-binary';
2
-
3
- /**
4
- * Helpful when creating new Resolvable types. For internal use.
5
- */
6
- declare class WgslIdentifier implements WgslResolvable {
7
- label?: string | undefined;
8
- $name(label: string | undefined): this;
9
- resolve(ctx: ResolutionCtx): string;
10
- toString(): string;
11
- }
12
-
13
- declare const WgslSettableTrait: unique symbol;
14
- interface WgslSettable {
15
- readonly [WgslSettableTrait]: true;
16
- }
17
-
18
- type Getter = <T>(plum: WgslPlum<T>) => T;
19
- type Unsubscribe = () => unknown;
20
- type ExtractPlumValue<T> = T extends WgslPlum<infer TValue> ? TValue : never;
21
- interface WgslPlum<TValue = unknown> {
22
- readonly __brand: 'WgslPlum';
23
- $name(label: string): this;
24
- /**
25
- * Computes the value of this plum. Circumvents the store
26
- * memoization, so use with care.
27
- */
28
- compute(get: Getter): TValue;
29
- }
30
- declare const WgslExternalPlumTrait: unique symbol;
31
- interface WgslExternalPlum {
32
- readonly [WgslExternalPlumTrait]: true;
33
- readonly version: number;
34
- subscribe(listener: () => unknown): Unsubscribe;
35
- }
36
- /**
37
- * Creates a computed plum. Its value depends on the plums read using `get`
38
- * inside the `compute` function, so cannot be set imperatively.
39
- *
40
- * @param compute A pure function that describes this plum's value.
41
- */
42
- declare function plum<T extends Wgsl>(compute: (get: Getter) => T): WgslPlum<T> & WgslResolvable;
43
- /**
44
- * Creates a computed plum. Its value depends on the plums read using `get`
45
- * inside the `compute` function, so cannot be set imperatively.
46
- *
47
- * @param compute A pure function that describes this plum's value.
48
- */
49
- declare function plum<T>(compute: (get: Getter) => T): WgslPlum<T>;
50
- /**
51
- * Creates a plum with an initial value of `initial`.
52
- * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.
53
- *
54
- * @param initial The initial value of this plum.
55
- */
56
- declare function plum<T extends Wgsl>(initial: T): WgslPlum<T> & WgslSettable & WgslResolvable;
57
- /**
58
- * Creates a plum with an initial value of `initial`.
59
- * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.
60
- *
61
- * @param initial The initial value of this plum.
62
- */
63
- declare function plum<T>(initial: T): WgslPlum<T> & WgslSettable;
64
- declare function plumFromEvent<T>(subscribe: (listener: () => unknown) => Unsubscribe, getLatest: () => T): WgslPlum<T> & WgslExternalPlum;
65
-
66
- type Wgsl = string | boolean | number | WgslResolvable;
67
- /**
68
- * Passed into each resolvable item. All sibling items share a resolution ctx,
69
- * and a new resolution ctx is made when going down each level in the tree.
70
- */
71
- interface ResolutionCtx {
72
- /**
73
- * Slots that were used by items resolved by this context.
74
- */
75
- readonly usedSlots: Iterable<WgslSlot<unknown>>;
76
- addDeclaration(item: WgslResolvable): void;
77
- addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void;
78
- nameFor(token: WgslResolvable): string;
79
- /**
80
- * Unwraps all layers of slot indirection and returns the concrete value if available.
81
- * @throws {MissingSlotValueError}
82
- */
83
- unwrap<T>(eventual: Eventual<T>): T;
84
- resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
85
- }
86
- interface WgslResolvable {
87
- readonly label?: string | undefined;
88
- resolve(ctx: ResolutionCtx): string;
89
- }
90
- declare function isResolvable(value: unknown): value is WgslResolvable;
91
- declare function isWgsl(value: unknown): value is Wgsl;
92
- interface WgslSlot<T> {
93
- readonly __brand: 'WgslSlot';
94
- readonly defaultValue: T | undefined;
95
- readonly label?: string | undefined;
96
- $name(label: string): WgslSlot<T>;
97
- /**
98
- * Used to determine if code generated using either value `a` or `b` in place
99
- * of the slot will be equivalent. Defaults to `Object.is`.
100
- */
101
- areEqual(a: T, b: T): boolean;
102
- }
103
- declare function isSlot<T>(value: unknown | WgslSlot<T>): value is WgslSlot<T>;
104
- /**
105
- * Represents a value that is available at resolution time.
106
- */
107
- type Eventual<T> = T | WgslSlot<T>;
108
- type EventualGetter = <T>(value: Eventual<T>) => T;
109
- type InlineResolve = (get: EventualGetter) => Wgsl;
110
- interface WgslResolvableSlot<T extends Wgsl> extends WgslResolvable, WgslSlot<T> {
111
- $name(label: string): WgslResolvableSlot<T>;
112
- }
113
- type SlotValuePair<T> = [WgslSlot<T>, T];
114
- interface WgslAllocatable<TData extends AnyWgslData = AnyWgslData> {
115
- /**
116
- * The data type this allocatable was constructed with.
117
- * It informs the size and format of data in both JS and
118
- * binary.
119
- */
120
- readonly dataType: TData;
121
- readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined;
122
- readonly flags: GPUBufferUsageFlags;
123
- }
124
- interface WgslBindable<TData extends AnyWgslData = AnyWgslData, TUsage extends BufferUsage = BufferUsage> extends WgslResolvable {
125
- readonly allocatable: WgslAllocatable<TData>;
126
- readonly usage: TUsage;
127
- }
128
- type BufferUsage = 'uniform' | 'readonly_storage' | 'mutable_storage';
129
- interface WgslData<TInner> extends ISchema<TInner>, WgslResolvable {
130
- readonly byteAlignment: number;
131
- readonly size: number;
132
- }
133
- type AnyWgslData = WgslData<unknown>;
134
- interface WgslPointer<TScope extends 'function', TInner extends AnyWgslData> {
135
- readonly scope: TScope;
136
- readonly pointsTo: TInner;
137
- }
138
- /**
139
- * A virtual representation of a WGSL value.
140
- */
141
- type WgslValue<TDataType> = {
142
- readonly __dataType: TDataType;
143
- };
144
- type AnyWgslPointer = WgslPointer<'function', AnyWgslData>;
145
- type WgslFnArgument = AnyWgslPointer | AnyWgslData;
146
- declare function isPointer(value: AnyWgslPointer | AnyWgslData): value is AnyWgslPointer;
147
-
148
- export { type AnyWgslData as A, type BufferUsage as B, type Eventual as E, type InlineResolve as I, type ResolutionCtx as R, type SlotValuePair as S, type Unsubscribe as U, type WgslSlot as W, type WgslResolvable as a, type WgslBindable as b, type WgslAllocatable as c, type WgslPlum as d, type Wgsl as e, type WgslFnArgument as f, type WgslValue as g, WgslIdentifier as h, type WgslResolvableSlot as i, plumFromEvent as j, type WgslSettable as k, isResolvable as l, isWgsl as m, isSlot as n, type EventualGetter as o, plum as p, type WgslData as q, type WgslPointer as r, type AnyWgslPointer as s, isPointer as t, type ExtractPlumValue as u };
@@ -1,23 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk5ZQTJALJcjs = require('../chunk-5ZQTJALJ.cjs');require('../chunk-G3U6RTMF.cjs');var _chunkAS7UPXZ3cjs = require('../chunk-AS7UPXZ3.cjs');var _typedbinary = require('typed-binary');var E=(a,e)=>{let t=e-1,r=~t;return a&t?(a&r)+e:a};var _=class{constructor(){_chunkAS7UPXZ3cjs.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:i}=this._computeAndGatherDependencies(e);t={value:r,dependencies:i,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 i of r)i()}_computeAndGatherDependencies(e){let t=new Map,r=i=>{if(!t.has(i)){let n=this._getState(i);t.set(i,n.version)}return this.get(i)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let n of t.active.unsubs)n();let{value:r,dependencies:i}=this._computeAndGatherDependencies(e);if(t.dependencies=i,t.active)for(let[n]of t.dependencies)t.active.unsubs.add(this.subscribe(n,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=_chunk5ZQTJALJcjs.d.call(void 0, 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 _chunk5ZQTJALJcjs.d.call(void 0, e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([i,n])=>(this.get(i),this._getState(i).version!==n))),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),i;if(!r.active){let n=new Set;r.active={listeners:new Set,unsubs:n};for(let[s]of r.dependencies)n.add(this.subscribe(s,()=>{this._recompute(e)}));_chunk5ZQTJALJcjs.d.call(void 0, e)&&(i=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 n of r.active.unsubs)n();i==null||i(),r.active=void 0}}}};var T=class{constructor(){_chunkAS7UPXZ3cjs.d.call(void 0, this,"_queue",[]);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(i){r(i)}}),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 w=class{constructor(e){this.device=e;_chunkAS7UPXZ3cjs.d.call(void 0, this,"_entryToBufferMap",new Map);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_pipelineExecutors",[]);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_commandEncoder",null);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_readBuffer",null);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_taskQueue",new T);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_plumStore",new _);_chunkAS7UPXZ3cjs.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:E(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(_chunk5ZQTJALJcjs.g.call(void 0, e.initial)){let i=e.initial;e.dataType.write(r,this._plumStore.get(i)),this._allocSubscriptions.set(e,this._plumStore.subscribe(i,()=>{this.writeBuffer(e,this._plumStore.get(i))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var s;(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((s=this._readBuffer)==null||s.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 i=this._readBuffer.getMappedRange().slice(0),n=e.dataType.read(new (0, _typedbinary.BufferReader)(i));return this._readBuffer.unmap(),n})}writeBuffer(e,t){let r=this.bufferFor(e),i=E(e.dataType.size,e.dataType.byteAlignment),n=new ArrayBuffer(i);e.dataType.write(new (0, _typedbinary.BufferWriter)(n),t),this.device.queue.writeBuffer(r,0,n,0,i)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var u,f,m,h,g,p,c,U,W,G,C,L,R;let t=new (0, _chunk5ZQTJALJcjs.c)(this,_chunkAS7UPXZ3cjs.i`
2
- @vertex fn main_vertex(${e.vertex.args.flatMap(P=>[P,", "])}) -> ${e.vertex.output} {
3
- ${e.vertex.code}
4
- }
5
-
6
- ${(f=(u=e.externalDeclarations)==null?void 0:u.flatMap(P=>[P,`
7
- `]))!=null?f:""}
8
- `).build({bindingGroup:((m=e.externalLayouts)!=null?m:[]).length,shaderStage:GPUShaderStage.VERTEX}),r=new (0, _chunk5ZQTJALJcjs.c)(this,_chunkAS7UPXZ3cjs.i`
9
- @fragment fn main_frag(${e.fragment.args.flatMap(P=>[P,", "])}) -> ${e.fragment.output} {
10
- ${e.fragment.code}
11
- }
12
-
13
- ${(g=(h=e.externalDeclarations)==null?void 0:h.flatMap(P=>[P,`
14
- `]))!=null?g:""}
15
- `).build({bindingGroup:((p=e.externalLayouts)!=null?p:[]).length+1,shaderStage:GPUShaderStage.FRAGMENT}),i=this.device.createShaderModule({code:t.code}),n=this.device.createShaderModule({code:r.code}),s=this.device.createPipelineLayout({label:(c=e.label)!=null?c:"",bindGroupLayouts:[...(U=e.externalLayouts)!=null?U:[],t.bindGroupLayout,r.bindGroupLayout]}),d=this.device.createRenderPipeline({label:(W=e.label)!=null?W:"",layout:s,vertex:{module:i,buffers:(G=e.vertex.buffersLayouts)!=null?G:[]},fragment:{module:n,targets:(C=e.fragment.target)!=null?C:[]},primitive:e.primitive}),l=new x(this,d,[t,r],(R=(L=e.externalLayouts)==null?void 0:L.length)!=null?R:0);return this._pipelineExecutors.push(l),l}makeComputePipeline(e){var d,l,u,f,m,h,g,p;let t=new (0, _chunk5ZQTJALJcjs.c)(this,_chunkAS7UPXZ3cjs.i`
16
- @compute @workgroup_size(${e.workgroupSize.join(", ")}) fn main_compute(${e.args.flatMap(c=>[c,", "])}) {
17
- ${e.code}
18
- }
19
-
20
- ${(l=(d=e.externalDeclarations)==null?void 0:d.flatMap(c=>[c,`
21
- `]))!=null?l:""}
22
- `).build({bindingGroup:((u=e.externalLayouts)!=null?u:[]).length,shaderStage:GPUShaderStage.COMPUTE}),r=this.device.createShaderModule({code:t.code}),i=this.device.createPipelineLayout({label:(f=e.label)!=null?f:"",bindGroupLayouts:[...(m=e.externalLayouts)!=null?m:[],t.bindGroupLayout]}),n=this.device.createComputePipeline({label:(h=e.label)!=null?h:"",layout:i,compute:{module:r}}),s=new M(this,n,[t],(p=(g=e.externalLayouts)==null?void 0:g.length)!=null?p:0);return this._pipelineExecutors.push(s),s}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},S=class{constructor(e,t,r,i,n){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=i;this.label=n}},x=class extends S{execute(e){var m,h,g;let f=e,{vertexCount:t,instanceCount:r,firstVertex:i,firstInstance:n,externalBindGroups:s,externalVertexBuffers:d}=f,l=_chunkAS7UPXZ3cjs.c.call(void 0, f,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers"]);if(((m=s==null?void 0:s.length)!=null?m:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(h=s==null?void 0:s.length)!=null?h:0}`);let u=this._runtime.commandEncoder.beginRenderPass(_chunkAS7UPXZ3cjs.b.call(void 0, _chunkAS7UPXZ3cjs.a.call(void 0, {},l),{label:(g=this.label)!=null?g:""}));u.setPipeline(this.pipeline),(s!=null?s:[]).forEach((p,c)=>u.setBindGroup(c,p)),(d!=null?d:[]).forEach((p,c)=>u.setVertexBuffer(c,p)),this.programs.forEach((p,c)=>{u.setBindGroup((s!=null?s:[]).length+c,p.bindGroup)}),u.draw(t,r,i,n),u.end()}},M=class extends S{execute(e){var n,s,d;let{workgroups:t,externalBindGroups:r}=e;if(((n=r==null?void 0:r.length)!=null?n:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(s=r==null?void 0:r.length)!=null?s:0}`);let i=this._runtime.commandEncoder.beginComputePass({label:(d=this.label)!=null?d:""});i.setPipeline(this.pipeline),(r!=null?r:[]).forEach((l,u)=>i.setBindGroup(u,l)),this.programs.forEach((l,u)=>i.setBindGroup((r!=null?r:[]).length+u,l.bindGroup)),i.dispatchWorkgroups(...t),i.end()}};async function V(a){if(a instanceof GPUDevice)return new w(a);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(a==null?void 0:a.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new w(await e.requestDevice(a==null?void 0:a.device))}exports.createRuntime = V;
23
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/web/webWigsillRuntime.ts","../../src/mathUtils.ts","../../src/plumStore.ts","../../src/taskQueue.ts"],"names":["BufferReader","BufferWriter","roundUp","value","modulo","bitMask","invBitMask","PlumStore","__publicField","plum","state","dependencies","listeners","listener","getter","dep","depState","unsub","isExternalPlum","dirty","prevVersion","externalUnsub","unsubs","TaskQueue","task","resolve","reject","e","WebWigsillRuntime","device","_a","buffer","allocatable","writer","isPlum","commandEncoder","mappedBuffer","res","data","gpuBuffer","size","hostBuffer","options","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","vertexProgram","ProgramBuilder","code","arg","fragmentProgram","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","program","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","label","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers","descriptor","__objRest","passEncoder","__spreadProps","__spreadValues","group","index","i","workgroups","createRuntime","adapter"],"mappings":"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","sourcesContent":["import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport { PlumStore } from '../plumStore';\nimport ProgramBuilder, { type Program } from '../programBuilder';\nimport type { WgslSettable } from '../settableTrait';\nimport { TaskQueue } from '../taskQueue';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n TypeGpuRuntime,\n} from '../typegpuRuntime';\nimport type { AnyWgslData, WgslAllocatable } from '../types';\nimport { code } from '../wgslCode';\nimport {\n type ExtractPlumValue,\n type Unsubscribe,\n type WgslPlum,\n isPlum,\n} from '../wgslPlum';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a runtime can interact via GPU buffers.\n */\nclass WebWigsillRuntime {\n private _entryToBufferMap = new Map<WgslAllocatable, GPUBuffer>();\n private _pipelineExecutors: PipelineExecutor<\n GPURenderPipeline | GPUComputePipeline\n >[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n // Used for reading GPU buffers ad hoc.\n private _readBuffer: GPUBuffer | null = null;\n private _taskQueue = new TaskQueue();\n private readonly _plumStore = new PlumStore();\n private readonly _allocSubscriptions = new Map<\n WgslAllocatable,\n Unsubscribe\n >();\n\n constructor(public readonly device: GPUDevice) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n dispose() {\n for (const unsub of this._allocSubscriptions.values()) {\n unsub();\n }\n this._allocSubscriptions.clear();\n\n for (const buffer of this._entryToBufferMap.values()) {\n buffer.destroy();\n }\n\n this._entryToBufferMap.clear();\n\n this._readBuffer?.destroy();\n }\n\n bufferFor(allocatable: WgslAllocatable) {\n let buffer = this._entryToBufferMap.get(allocatable);\n\n if (!buffer) {\n buffer = this.device.createBuffer({\n usage: allocatable.flags,\n size: roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n ),\n mappedAtCreation: allocatable.initial !== undefined,\n });\n\n if (!buffer) {\n throw new Error(`Failed to create buffer for ${allocatable}`);\n }\n\n if (allocatable.initial !== undefined) {\n const writer = new BufferWriter(buffer.getMappedRange());\n\n if (isPlum(allocatable.initial)) {\n const plum = allocatable.initial;\n\n allocatable.dataType.write(writer, this._plumStore.get(plum));\n\n this._allocSubscriptions.set(\n allocatable,\n this._plumStore.subscribe(plum, () => {\n this.writeBuffer(allocatable, this._plumStore.get(plum));\n }),\n );\n } else {\n allocatable.dataType.write(writer, allocatable.initial);\n }\n\n buffer.unmap();\n }\n\n this._entryToBufferMap.set(allocatable, buffer);\n }\n\n return buffer;\n }\n\n async readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>> {\n return this._taskQueue.enqueue(async () => {\n if (\n !this._readBuffer ||\n this._readBuffer.size < allocatable.dataType.size\n ) {\n // destroying the previous buffer\n this._readBuffer?.destroy();\n\n this._readBuffer = this.device.createBuffer({\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n size: allocatable.dataType.size,\n });\n }\n\n const buffer = this.bufferFor(allocatable);\n const commandEncoder = this.device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n buffer,\n 0,\n this._readBuffer,\n 0,\n allocatable.dataType.size,\n );\n this.device.queue.submit([commandEncoder.finish()]);\n await this.device.queue.onSubmittedWorkDone();\n await this._readBuffer.mapAsync(\n GPUMapMode.READ,\n 0,\n allocatable.dataType.size,\n );\n const mappedBuffer = this._readBuffer.getMappedRange().slice(0);\n\n const res = allocatable.dataType.read(\n new BufferReader(mappedBuffer),\n ) as Parsed<TData>;\n\n this._readBuffer.unmap();\n\n return res;\n });\n }\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ) {\n const gpuBuffer = this.bufferFor(allocatable);\n\n const size = roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n );\n\n const hostBuffer = new ArrayBuffer(size);\n allocatable.dataType.write(new BufferWriter(hostBuffer), data);\n this.device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: ExtractPlumValue<TPlum>,\n ) {\n this._plumStore.set(plum, value);\n }\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: () => unknown,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const vertexProgram = new ProgramBuilder(\n this,\n code`\n @vertex fn main_vertex(${options.vertex.args.flatMap((arg) => [arg, ', '])}) -> ${options.vertex.output} {\n ${options.vertex.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.VERTEX,\n });\n\n const fragmentProgram = new ProgramBuilder(\n this,\n code`\n @fragment fn main_frag(${options.fragment.args.flatMap((arg) => [arg, ', '])}) -> ${options.fragment.output} {\n ${options.fragment.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupLayout,\n fragmentProgram.bindGroupLayout,\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers: options.vertex.buffersLayouts ?? [],\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n [vertexProgram, fragmentProgram],\n options.externalLayouts?.length ?? 0,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const program = new ProgramBuilder(\n this,\n code`\n @compute @workgroup_size(${options.workgroupSize.join(', ')}) fn main_compute(${options.args.flatMap((arg) => [arg, ', '])}) {\n ${options.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.COMPUTE,\n });\n\n const shaderModule = this.device.createShaderModule({\n code: program.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n program.bindGroupLayout,\n ],\n });\n\n const computePipeline = this.device.createComputePipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n },\n });\n\n const executor = new ComputePipelineExecutor(\n this,\n computePipeline,\n [program],\n options.externalLayouts?.length ?? 0,\n );\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n flush() {\n if (!this._commandEncoder) {\n return;\n }\n\n this.device.queue.submit([this._commandEncoder.finish()]);\n this._commandEncoder = null;\n }\n}\n\nclass PipelineExecutor<T extends GPURenderPipeline | GPUComputePipeline> {\n constructor(\n protected _runtime: TypeGpuRuntime,\n public pipeline: T,\n public programs: Program[],\n public externalLayoutCount: number,\n protected label?: string,\n ) {}\n}\n\nclass RenderPipelineExecutor extends PipelineExecutor<GPURenderPipeline> {\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n externalVertexBuffers,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n (externalVertexBuffers ?? []).forEach((group, index) =>\n passEncoder.setVertexBuffer(index, group),\n );\n\n this.programs.forEach((program, i) => {\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n );\n });\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor extends PipelineExecutor<GPUComputePipeline> {\n execute(options: ComputePipelineExecutorOptions) {\n const { workgroups, externalBindGroups } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginComputePass({\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n this.programs.forEach((program, i) =>\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link createRuntime}.\n */\nexport type CreateRuntimeOptions = {\n adapter: GPURequestAdapterOptions | undefined;\n device: GPUDeviceDescriptor | undefined;\n};\n\n/**\n * @param options\n * @returns\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * createRuntime();\n * ```\n *\n * @example\n * If there are specific options that should be used when requesting a device, you can pass those in.\n * ```ts\n * const adapterOptions: GPURequestAdapterOptions = ...;\n * const deviceDescriptor: GPUDeviceDescriptor = ...;\n * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n *\n * @example\n * If a specific device should be used instead, it can be passed in as a parameter.\n * ```ts\n * const device: GPUDevice = ...;\n * createRuntime(device);\n * ```\n */\nexport async function createRuntime(\n options?: CreateRuntimeOptions | GPUDevice,\n): Promise<TypeGpuRuntime> {\n if (options instanceof GPUDevice) {\n return new WebWigsillRuntime(options);\n }\n\n if (!navigator.gpu) {\n throw new Error('WebGPU is not supported by this browser.');\n }\n\n const adapter = await navigator.gpu.requestAdapter(options?.adapter);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new WebWigsillRuntime(await adapter.requestDevice(options?.device));\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import type { WgslSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type WgslPlum,\n isExternalPlum,\n} from './wgslPlum';\n\ntype Listener = () => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<WgslPlum, number>;\n active?: PlumActiveState | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<Listener>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<WgslPlum, PlumState>();\n\n /**\n * Used to inspect the current state of a plum.\n * To be used mostly in unit tests.\n */\n inspect(plum: WgslPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: WgslPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n };\n this._stateMap.set(plum, state);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: WgslPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener();\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: WgslPlum<T>) {\n const dependencies = new Map<WgslPlum, number>();\n\n const getter = (<T>(dep: WgslPlum<T>) => {\n // registering dependency.\n if (!dependencies.has(dep)) {\n const depState = this._getState(dep);\n dependencies.set(dep, depState.version);\n }\n\n return this.get(dep);\n }) as Getter;\n\n return { value: plum.compute(getter), dependencies };\n }\n\n private _recompute<T>(plum: WgslPlum<T>): T {\n const state = this._getState(plum);\n\n if (state.active) {\n // Unsubscribing from old dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n }\n\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state.dependencies = dependencies;\n if (state.active) {\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n state.active.unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n }\n\n if (Object.is(state.value, value)) {\n return state.value;\n }\n\n state.value = value;\n state.version = isExternalPlum(plum) ? plum.version : state.version + 1;\n\n this._notifyListeners(plum);\n\n return state.value;\n }\n\n get<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n const state = this._getState(plum);\n\n if (state.active) {\n // Return memoized value, the dependencies are keeping it up to date.\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n let dirty = false;\n\n if (isExternalPlum(plum)) {\n plum.compute(null as unknown as Getter); // external plums do not use 'get'\n dirty = state.version !== plum.version;\n } else if (state.dependencies.size > 0) {\n dirty = [...state.dependencies.entries()].some(([dep, prevVersion]) => {\n this.get(dep); // allowing dependencies to recompute if necessary.\n const depState = this._getState(dep);\n\n return depState.version !== prevVersion;\n });\n }\n\n if (!dirty) {\n // No need to recompute\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n return this._recompute(plum) as ExtractPlumValue<TPlum>;\n }\n\n set<T>(plum: WgslPlum<T> & WgslSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe(plum: WgslPlum, listener: Listener): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","export class TaskQueue<T> {\n private _queue: (() => Promise<void>)[] = [];\n private _pending = false;\n\n enqueue<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this._queue.push(async () => {\n try {\n resolve(await task());\n } catch (e) {\n reject(e);\n }\n });\n this._processQueue();\n });\n }\n\n private async _processQueue() {\n if (this._pending) {\n return;\n }\n this._pending = true;\n while (this._queue.length > 0) {\n const task = this._queue.shift();\n if (task) {\n await task();\n }\n }\n this._pending = false;\n }\n}\n"]}
@@ -1,40 +0,0 @@
1
- import { T as TypeGpuRuntime } from '../typegpuRuntime-Dg50sa5T.cjs';
2
- import 'typed-binary';
3
- import '../types-Dgp6OHLq.cjs';
4
- import '../struct-CRg8uhjj.cjs';
5
-
6
- /**
7
- * Options passed into {@link createRuntime}.
8
- */
9
- type CreateRuntimeOptions = {
10
- adapter: GPURequestAdapterOptions | undefined;
11
- device: GPUDeviceDescriptor | undefined;
12
- };
13
- /**
14
- * @param options
15
- * @returns
16
- *
17
- * @example
18
- * When given no options, the function will ask the browser for a suitable GPU device.
19
- * ```ts
20
- * createRuntime();
21
- * ```
22
- *
23
- * @example
24
- * If there are specific options that should be used when requesting a device, you can pass those in.
25
- * ```ts
26
- * const adapterOptions: GPURequestAdapterOptions = ...;
27
- * const deviceDescriptor: GPUDeviceDescriptor = ...;
28
- * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });
29
- * ```
30
- *
31
- * @example
32
- * If a specific device should be used instead, it can be passed in as a parameter.
33
- * ```ts
34
- * const device: GPUDevice = ...;
35
- * createRuntime(device);
36
- * ```
37
- */
38
- declare function createRuntime(options?: CreateRuntimeOptions | GPUDevice): Promise<TypeGpuRuntime>;
39
-
40
- export { type CreateRuntimeOptions, createRuntime };
@@ -1,40 +0,0 @@
1
- import { T as TypeGpuRuntime } from '../typegpuRuntime-BZwyf0k_.js';
2
- import 'typed-binary';
3
- import '../types-Dgp6OHLq.js';
4
- import '../struct-CFmatz6R.js';
5
-
6
- /**
7
- * Options passed into {@link createRuntime}.
8
- */
9
- type CreateRuntimeOptions = {
10
- adapter: GPURequestAdapterOptions | undefined;
11
- device: GPUDeviceDescriptor | undefined;
12
- };
13
- /**
14
- * @param options
15
- * @returns
16
- *
17
- * @example
18
- * When given no options, the function will ask the browser for a suitable GPU device.
19
- * ```ts
20
- * createRuntime();
21
- * ```
22
- *
23
- * @example
24
- * If there are specific options that should be used when requesting a device, you can pass those in.
25
- * ```ts
26
- * const adapterOptions: GPURequestAdapterOptions = ...;
27
- * const deviceDescriptor: GPUDeviceDescriptor = ...;
28
- * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });
29
- * ```
30
- *
31
- * @example
32
- * If a specific device should be used instead, it can be passed in as a parameter.
33
- * ```ts
34
- * const device: GPUDevice = ...;
35
- * createRuntime(device);
36
- * ```
37
- */
38
- declare function createRuntime(options?: CreateRuntimeOptions | GPUDevice): Promise<TypeGpuRuntime>;
39
-
40
- export { type CreateRuntimeOptions, createRuntime };
package/dist/web/index.js DELETED
@@ -1,23 +0,0 @@
1
- import{c as y,d as b,g as k}from"../chunk-JJZKRDXD.js";import"../chunk-XGSMOADT.js";import{a as A,b as B,c as D,d as o,i as v}from"../chunk-TVPC7ZME.js";import{BufferReader as O,BufferWriter as $}from"typed-binary";var E=(a,e)=>{let t=e-1,r=~t;return a&t?(a&r)+e:a};var _=class{constructor(){o(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:i}=this._computeAndGatherDependencies(e);t={value:r,dependencies:i,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 i of r)i()}_computeAndGatherDependencies(e){let t=new Map,r=i=>{if(!t.has(i)){let n=this._getState(i);t.set(i,n.version)}return this.get(i)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let n of t.active.unsubs)n();let{value:r,dependencies:i}=this._computeAndGatherDependencies(e);if(t.dependencies=i,t.active)for(let[n]of t.dependencies)t.active.unsubs.add(this.subscribe(n,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=b(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 b(e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([i,n])=>(this.get(i),this._getState(i).version!==n))),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),i;if(!r.active){let n=new Set;r.active={listeners:new Set,unsubs:n};for(let[s]of r.dependencies)n.add(this.subscribe(s,()=>{this._recompute(e)}));b(e)&&(i=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 n of r.active.unsubs)n();i==null||i(),r.active=void 0}}}};var T=class{constructor(){o(this,"_queue",[]);o(this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(i){r(i)}}),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 w=class{constructor(e){this.device=e;o(this,"_entryToBufferMap",new Map);o(this,"_pipelineExecutors",[]);o(this,"_commandEncoder",null);o(this,"_readBuffer",null);o(this,"_taskQueue",new T);o(this,"_plumStore",new _);o(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:E(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 $(t.getMappedRange());if(k(e.initial)){let i=e.initial;e.dataType.write(r,this._plumStore.get(i)),this._allocSubscriptions.set(e,this._plumStore.subscribe(i,()=>{this.writeBuffer(e,this._plumStore.get(i))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var s;(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((s=this._readBuffer)==null||s.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 i=this._readBuffer.getMappedRange().slice(0),n=e.dataType.read(new O(i));return this._readBuffer.unmap(),n})}writeBuffer(e,t){let r=this.bufferFor(e),i=E(e.dataType.size,e.dataType.byteAlignment),n=new ArrayBuffer(i);e.dataType.write(new $(n),t),this.device.queue.writeBuffer(r,0,n,0,i)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var u,f,m,h,g,p,c,U,W,G,C,L,R;let t=new y(this,v`
2
- @vertex fn main_vertex(${e.vertex.args.flatMap(P=>[P,", "])}) -> ${e.vertex.output} {
3
- ${e.vertex.code}
4
- }
5
-
6
- ${(f=(u=e.externalDeclarations)==null?void 0:u.flatMap(P=>[P,`
7
- `]))!=null?f:""}
8
- `).build({bindingGroup:((m=e.externalLayouts)!=null?m:[]).length,shaderStage:GPUShaderStage.VERTEX}),r=new y(this,v`
9
- @fragment fn main_frag(${e.fragment.args.flatMap(P=>[P,", "])}) -> ${e.fragment.output} {
10
- ${e.fragment.code}
11
- }
12
-
13
- ${(g=(h=e.externalDeclarations)==null?void 0:h.flatMap(P=>[P,`
14
- `]))!=null?g:""}
15
- `).build({bindingGroup:((p=e.externalLayouts)!=null?p:[]).length+1,shaderStage:GPUShaderStage.FRAGMENT}),i=this.device.createShaderModule({code:t.code}),n=this.device.createShaderModule({code:r.code}),s=this.device.createPipelineLayout({label:(c=e.label)!=null?c:"",bindGroupLayouts:[...(U=e.externalLayouts)!=null?U:[],t.bindGroupLayout,r.bindGroupLayout]}),d=this.device.createRenderPipeline({label:(W=e.label)!=null?W:"",layout:s,vertex:{module:i,buffers:(G=e.vertex.buffersLayouts)!=null?G:[]},fragment:{module:n,targets:(C=e.fragment.target)!=null?C:[]},primitive:e.primitive}),l=new x(this,d,[t,r],(R=(L=e.externalLayouts)==null?void 0:L.length)!=null?R:0);return this._pipelineExecutors.push(l),l}makeComputePipeline(e){var d,l,u,f,m,h,g,p;let t=new y(this,v`
16
- @compute @workgroup_size(${e.workgroupSize.join(", ")}) fn main_compute(${e.args.flatMap(c=>[c,", "])}) {
17
- ${e.code}
18
- }
19
-
20
- ${(l=(d=e.externalDeclarations)==null?void 0:d.flatMap(c=>[c,`
21
- `]))!=null?l:""}
22
- `).build({bindingGroup:((u=e.externalLayouts)!=null?u:[]).length,shaderStage:GPUShaderStage.COMPUTE}),r=this.device.createShaderModule({code:t.code}),i=this.device.createPipelineLayout({label:(f=e.label)!=null?f:"",bindGroupLayouts:[...(m=e.externalLayouts)!=null?m:[],t.bindGroupLayout]}),n=this.device.createComputePipeline({label:(h=e.label)!=null?h:"",layout:i,compute:{module:r}}),s=new M(this,n,[t],(p=(g=e.externalLayouts)==null?void 0:g.length)!=null?p:0);return this._pipelineExecutors.push(s),s}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},S=class{constructor(e,t,r,i,n){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=i;this.label=n}},x=class extends S{execute(e){var m,h,g;let f=e,{vertexCount:t,instanceCount:r,firstVertex:i,firstInstance:n,externalBindGroups:s,externalVertexBuffers:d}=f,l=D(f,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers"]);if(((m=s==null?void 0:s.length)!=null?m:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(h=s==null?void 0:s.length)!=null?h:0}`);let u=this._runtime.commandEncoder.beginRenderPass(B(A({},l),{label:(g=this.label)!=null?g:""}));u.setPipeline(this.pipeline),(s!=null?s:[]).forEach((p,c)=>u.setBindGroup(c,p)),(d!=null?d:[]).forEach((p,c)=>u.setVertexBuffer(c,p)),this.programs.forEach((p,c)=>{u.setBindGroup((s!=null?s:[]).length+c,p.bindGroup)}),u.draw(t,r,i,n),u.end()}},M=class extends S{execute(e){var n,s,d;let{workgroups:t,externalBindGroups:r}=e;if(((n=r==null?void 0:r.length)!=null?n:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(s=r==null?void 0:r.length)!=null?s:0}`);let i=this._runtime.commandEncoder.beginComputePass({label:(d=this.label)!=null?d:""});i.setPipeline(this.pipeline),(r!=null?r:[]).forEach((l,u)=>i.setBindGroup(u,l)),this.programs.forEach((l,u)=>i.setBindGroup((r!=null?r:[]).length+u,l.bindGroup)),i.dispatchWorkgroups(...t),i.end()}};async function V(a){if(a instanceof GPUDevice)return new w(a);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(a==null?void 0:a.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new w(await e.requestDevice(a==null?void 0:a.device))}export{V as createRuntime};
23
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/web/webWigsillRuntime.ts","../../src/mathUtils.ts","../../src/plumStore.ts","../../src/taskQueue.ts"],"sourcesContent":["import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport { PlumStore } from '../plumStore';\nimport ProgramBuilder, { type Program } from '../programBuilder';\nimport type { WgslSettable } from '../settableTrait';\nimport { TaskQueue } from '../taskQueue';\nimport type {\n ComputePipelineExecutorOptions,\n ComputePipelineOptions,\n RenderPipelineExecutorOptions,\n RenderPipelineOptions,\n TypeGpuRuntime,\n} from '../typegpuRuntime';\nimport type { AnyWgslData, WgslAllocatable } from '../types';\nimport { code } from '../wgslCode';\nimport {\n type ExtractPlumValue,\n type Unsubscribe,\n type WgslPlum,\n isPlum,\n} from '../wgslPlum';\n\n/**\n * Holds all data that is necessary to facilitate CPU and GPU communication.\n * Programs that share a runtime can interact via GPU buffers.\n */\nclass WebWigsillRuntime {\n private _entryToBufferMap = new Map<WgslAllocatable, GPUBuffer>();\n private _pipelineExecutors: PipelineExecutor<\n GPURenderPipeline | GPUComputePipeline\n >[] = [];\n private _commandEncoder: GPUCommandEncoder | null = null;\n\n // Used for reading GPU buffers ad hoc.\n private _readBuffer: GPUBuffer | null = null;\n private _taskQueue = new TaskQueue();\n private readonly _plumStore = new PlumStore();\n private readonly _allocSubscriptions = new Map<\n WgslAllocatable,\n Unsubscribe\n >();\n\n constructor(public readonly device: GPUDevice) {}\n\n get commandEncoder() {\n if (!this._commandEncoder) {\n this._commandEncoder = this.device.createCommandEncoder();\n }\n\n return this._commandEncoder;\n }\n\n dispose() {\n for (const unsub of this._allocSubscriptions.values()) {\n unsub();\n }\n this._allocSubscriptions.clear();\n\n for (const buffer of this._entryToBufferMap.values()) {\n buffer.destroy();\n }\n\n this._entryToBufferMap.clear();\n\n this._readBuffer?.destroy();\n }\n\n bufferFor(allocatable: WgslAllocatable) {\n let buffer = this._entryToBufferMap.get(allocatable);\n\n if (!buffer) {\n buffer = this.device.createBuffer({\n usage: allocatable.flags,\n size: roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n ),\n mappedAtCreation: allocatable.initial !== undefined,\n });\n\n if (!buffer) {\n throw new Error(`Failed to create buffer for ${allocatable}`);\n }\n\n if (allocatable.initial !== undefined) {\n const writer = new BufferWriter(buffer.getMappedRange());\n\n if (isPlum(allocatable.initial)) {\n const plum = allocatable.initial;\n\n allocatable.dataType.write(writer, this._plumStore.get(plum));\n\n this._allocSubscriptions.set(\n allocatable,\n this._plumStore.subscribe(plum, () => {\n this.writeBuffer(allocatable, this._plumStore.get(plum));\n }),\n );\n } else {\n allocatable.dataType.write(writer, allocatable.initial);\n }\n\n buffer.unmap();\n }\n\n this._entryToBufferMap.set(allocatable, buffer);\n }\n\n return buffer;\n }\n\n async readBuffer<TData extends AnyWgslData>(\n allocatable: WgslAllocatable<TData>,\n ): Promise<Parsed<TData>> {\n return this._taskQueue.enqueue(async () => {\n if (\n !this._readBuffer ||\n this._readBuffer.size < allocatable.dataType.size\n ) {\n // destroying the previous buffer\n this._readBuffer?.destroy();\n\n this._readBuffer = this.device.createBuffer({\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n size: allocatable.dataType.size,\n });\n }\n\n const buffer = this.bufferFor(allocatable);\n const commandEncoder = this.device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n buffer,\n 0,\n this._readBuffer,\n 0,\n allocatable.dataType.size,\n );\n this.device.queue.submit([commandEncoder.finish()]);\n await this.device.queue.onSubmittedWorkDone();\n await this._readBuffer.mapAsync(\n GPUMapMode.READ,\n 0,\n allocatable.dataType.size,\n );\n const mappedBuffer = this._readBuffer.getMappedRange().slice(0);\n\n const res = allocatable.dataType.read(\n new BufferReader(mappedBuffer),\n ) as Parsed<TData>;\n\n this._readBuffer.unmap();\n\n return res;\n });\n }\n\n writeBuffer<TValue extends AnyWgslData>(\n allocatable: WgslAllocatable<TValue>,\n data: Parsed<TValue>,\n ) {\n const gpuBuffer = this.bufferFor(allocatable);\n\n const size = roundUp(\n allocatable.dataType.size,\n allocatable.dataType.byteAlignment,\n );\n\n const hostBuffer = new ArrayBuffer(size);\n allocatable.dataType.write(new BufferWriter(hostBuffer), data);\n this.device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n\n readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n return this._plumStore.get(plum);\n }\n\n setPlum<TPlum extends WgslPlum & WgslSettable>(\n plum: TPlum,\n value: ExtractPlumValue<TPlum>,\n ) {\n this._plumStore.set(plum, value);\n }\n\n onPlumChange<TValue>(\n plum: WgslPlum<TValue>,\n listener: () => unknown,\n ): Unsubscribe {\n return this._plumStore.subscribe(plum, listener);\n }\n\n makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor {\n const vertexProgram = new ProgramBuilder(\n this,\n code`\n @vertex fn main_vertex(${options.vertex.args.flatMap((arg) => [arg, ', '])}) -> ${options.vertex.output} {\n ${options.vertex.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.VERTEX,\n });\n\n const fragmentProgram = new ProgramBuilder(\n this,\n code`\n @fragment fn main_frag(${options.fragment.args.flatMap((arg) => [arg, ', '])}) -> ${options.fragment.output} {\n ${options.fragment.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length + 1,\n shaderStage: GPUShaderStage.FRAGMENT,\n });\n\n const vertexShaderModule = this.device.createShaderModule({\n code: vertexProgram.code,\n });\n\n const fragmentShaderModule = this.device.createShaderModule({\n code: fragmentProgram.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n vertexProgram.bindGroupLayout,\n fragmentProgram.bindGroupLayout,\n ],\n });\n\n const renderPipeline = this.device.createRenderPipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n vertex: {\n module: vertexShaderModule,\n buffers: options.vertex.buffersLayouts ?? [],\n },\n fragment: {\n module: fragmentShaderModule,\n targets: options.fragment.target ?? [],\n },\n primitive: options.primitive,\n });\n\n const executor = new RenderPipelineExecutor(\n this,\n renderPipeline,\n [vertexProgram, fragmentProgram],\n options.externalLayouts?.length ?? 0,\n );\n\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n makeComputePipeline(\n options: ComputePipelineOptions,\n ): ComputePipelineExecutor {\n const program = new ProgramBuilder(\n this,\n code`\n @compute @workgroup_size(${options.workgroupSize.join(', ')}) fn main_compute(${options.args.flatMap((arg) => [arg, ', '])}) {\n ${options.code}\n }\n\n ${options.externalDeclarations?.flatMap((arg) => [arg, '\\n']) ?? ''}\n `,\n ).build({\n bindingGroup: (options.externalLayouts ?? []).length,\n shaderStage: GPUShaderStage.COMPUTE,\n });\n\n const shaderModule = this.device.createShaderModule({\n code: program.code,\n });\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: options.label ?? '',\n bindGroupLayouts: [\n ...(options.externalLayouts ?? []),\n program.bindGroupLayout,\n ],\n });\n\n const computePipeline = this.device.createComputePipeline({\n label: options.label ?? '',\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n },\n });\n\n const executor = new ComputePipelineExecutor(\n this,\n computePipeline,\n [program],\n options.externalLayouts?.length ?? 0,\n );\n this._pipelineExecutors.push(executor);\n return executor;\n }\n\n flush() {\n if (!this._commandEncoder) {\n return;\n }\n\n this.device.queue.submit([this._commandEncoder.finish()]);\n this._commandEncoder = null;\n }\n}\n\nclass PipelineExecutor<T extends GPURenderPipeline | GPUComputePipeline> {\n constructor(\n protected _runtime: TypeGpuRuntime,\n public pipeline: T,\n public programs: Program[],\n public externalLayoutCount: number,\n protected label?: string,\n ) {}\n}\n\nclass RenderPipelineExecutor extends PipelineExecutor<GPURenderPipeline> {\n execute(options: RenderPipelineExecutorOptions) {\n const {\n vertexCount,\n instanceCount,\n firstVertex,\n firstInstance,\n externalBindGroups,\n externalVertexBuffers,\n ...descriptor\n } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginRenderPass({\n ...descriptor,\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n (externalVertexBuffers ?? []).forEach((group, index) =>\n passEncoder.setVertexBuffer(index, group),\n );\n\n this.programs.forEach((program, i) => {\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n );\n });\n\n passEncoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n passEncoder.end();\n }\n}\n\nclass ComputePipelineExecutor extends PipelineExecutor<GPUComputePipeline> {\n execute(options: ComputePipelineExecutorOptions) {\n const { workgroups, externalBindGroups } = options;\n\n if ((externalBindGroups?.length ?? 0) !== this.externalLayoutCount) {\n throw new Error(\n `External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${externalBindGroups?.length ?? 0}`,\n );\n }\n\n const passEncoder = this._runtime.commandEncoder.beginComputePass({\n label: this.label ?? '',\n });\n passEncoder.setPipeline(this.pipeline);\n\n (externalBindGroups ?? []).forEach((group, index) =>\n passEncoder.setBindGroup(index, group),\n );\n\n this.programs.forEach((program, i) =>\n passEncoder.setBindGroup(\n (externalBindGroups ?? []).length + i,\n program.bindGroup,\n ),\n );\n passEncoder.dispatchWorkgroups(...workgroups);\n passEncoder.end();\n }\n}\n\n/**\n * Options passed into {@link createRuntime}.\n */\nexport type CreateRuntimeOptions = {\n adapter: GPURequestAdapterOptions | undefined;\n device: GPUDeviceDescriptor | undefined;\n};\n\n/**\n * @param options\n * @returns\n *\n * @example\n * When given no options, the function will ask the browser for a suitable GPU device.\n * ```ts\n * createRuntime();\n * ```\n *\n * @example\n * If there are specific options that should be used when requesting a device, you can pass those in.\n * ```ts\n * const adapterOptions: GPURequestAdapterOptions = ...;\n * const deviceDescriptor: GPUDeviceDescriptor = ...;\n * createRuntime({ adapter: adapterOptions, device: deviceDescriptor });\n * ```\n *\n * @example\n * If a specific device should be used instead, it can be passed in as a parameter.\n * ```ts\n * const device: GPUDevice = ...;\n * createRuntime(device);\n * ```\n */\nexport async function createRuntime(\n options?: CreateRuntimeOptions | GPUDevice,\n): Promise<TypeGpuRuntime> {\n if (options instanceof GPUDevice) {\n return new WebWigsillRuntime(options);\n }\n\n if (!navigator.gpu) {\n throw new Error('WebGPU is not supported by this browser.');\n }\n\n const adapter = await navigator.gpu.requestAdapter(options?.adapter);\n\n if (!adapter) {\n throw new Error('Could not find a compatible GPU');\n }\n\n return new WebWigsillRuntime(await adapter.requestDevice(options?.device));\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import type { WgslSettable } from './settableTrait';\nimport {\n type ExtractPlumValue,\n type Getter,\n type WgslPlum,\n isExternalPlum,\n} from './wgslPlum';\n\ntype Listener = () => unknown;\ntype Unsubscribe = () => void;\n\ntype PlumState<T = unknown> = {\n value: T;\n /**\n * Gets incremented each time its value changes.\n * Allows dependents to determine if they are dirty or not.\n */\n version: number;\n /**\n * Map of dependencies to the versions used to\n * compute the latest value.\n */\n dependencies: Map<WgslPlum, number>;\n active?: PlumActiveState | undefined;\n};\n\n/**\n * Tracked state of a plum that is being subscribed to.\n */\ntype PlumActiveState = {\n /**\n * Cannot be a WeakSet, because we need to iterate on them.\n */\n listeners: Set<Listener>;\n unsubs: Set<Unsubscribe>;\n};\n\nexport class PlumStore {\n private readonly _stateMap = new WeakMap<WgslPlum, PlumState>();\n\n /**\n * Used to inspect the current state of a plum.\n * To be used mostly in unit tests.\n */\n inspect(plum: WgslPlum): PlumState | undefined {\n return this._stateMap.get(plum);\n }\n\n private _getState<T>(plum: WgslPlum<T>): PlumState<T> {\n let state = this._stateMap.get(plum) as PlumState<T> | undefined;\n\n if (!state) {\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state = {\n value,\n dependencies,\n version: 0,\n };\n this._stateMap.set(plum, state);\n }\n\n return state;\n }\n\n private _notifyListeners<T>(plum: WgslPlum<T>): void {\n const state = this._getState(plum);\n\n if (!state.active) {\n return;\n }\n\n // Copying, because listeners may change after we notify our dependents.\n const listeners = [...state.active.listeners];\n\n for (const listener of listeners) {\n listener();\n }\n }\n\n private _computeAndGatherDependencies<T>(plum: WgslPlum<T>) {\n const dependencies = new Map<WgslPlum, number>();\n\n const getter = (<T>(dep: WgslPlum<T>) => {\n // registering dependency.\n if (!dependencies.has(dep)) {\n const depState = this._getState(dep);\n dependencies.set(dep, depState.version);\n }\n\n return this.get(dep);\n }) as Getter;\n\n return { value: plum.compute(getter), dependencies };\n }\n\n private _recompute<T>(plum: WgslPlum<T>): T {\n const state = this._getState(plum);\n\n if (state.active) {\n // Unsubscribing from old dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n }\n\n const { value, dependencies } = this._computeAndGatherDependencies(plum);\n\n state.dependencies = dependencies;\n if (state.active) {\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n state.active.unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n }\n\n if (Object.is(state.value, value)) {\n return state.value;\n }\n\n state.value = value;\n state.version = isExternalPlum(plum) ? plum.version : state.version + 1;\n\n this._notifyListeners(plum);\n\n return state.value;\n }\n\n get<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum> {\n const state = this._getState(plum);\n\n if (state.active) {\n // Return memoized value, the dependencies are keeping it up to date.\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n let dirty = false;\n\n if (isExternalPlum(plum)) {\n plum.compute(null as unknown as Getter); // external plums do not use 'get'\n dirty = state.version !== plum.version;\n } else if (state.dependencies.size > 0) {\n dirty = [...state.dependencies.entries()].some(([dep, prevVersion]) => {\n this.get(dep); // allowing dependencies to recompute if necessary.\n const depState = this._getState(dep);\n\n return depState.version !== prevVersion;\n });\n }\n\n if (!dirty) {\n // No need to recompute\n return state.value as ExtractPlumValue<TPlum>;\n }\n\n return this._recompute(plum) as ExtractPlumValue<TPlum>;\n }\n\n set<T>(plum: WgslPlum<T> & WgslSettable, value: T): void {\n const state = this._getState(plum);\n\n if (Object.is(state.value, value)) {\n // Value is the same as before, aborting.\n return;\n }\n\n state.value = value;\n state.version++;\n\n this._notifyListeners(plum);\n }\n\n subscribe(plum: WgslPlum, listener: Listener): Unsubscribe {\n const state = this._getState(plum);\n\n let externalUnsub: (() => unknown) | undefined;\n\n if (!state.active) {\n const unsubs = new Set<Unsubscribe>();\n state.active = {\n listeners: new Set(),\n unsubs,\n };\n // subscribing to dependencies\n for (const [dep] of state.dependencies) {\n unsubs.add(\n this.subscribe(dep, () => {\n this._recompute(plum);\n }),\n );\n }\n // if external, subscribing to itself\n if (isExternalPlum(plum)) {\n externalUnsub = plum.subscribe(() => {\n this._recompute(plum);\n });\n }\n }\n\n state.active.listeners.add(listener);\n\n return () => {\n if (!state.active) {\n return;\n }\n\n state.active.listeners.delete(listener);\n\n if (state.active.listeners.size === 0) {\n // Unsubscribing from dependencies\n for (const unsub of state.active.unsubs) {\n unsub();\n }\n externalUnsub?.();\n\n // no listeners left, deactivate\n state.active = undefined;\n }\n };\n }\n}\n","export class TaskQueue<T> {\n private _queue: (() => Promise<void>)[] = [];\n private _pending = false;\n\n enqueue<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this._queue.push(async () => {\n try {\n resolve(await task());\n } catch (e) {\n reject(e);\n }\n });\n this._processQueue();\n });\n }\n\n private async _processQueue() {\n if (this._pending) {\n return;\n }\n this._pending = true;\n while (this._queue.length > 0) {\n const task = this._queue.shift();\n if (task) {\n await task();\n }\n }\n this._pending = false;\n }\n}\n"],"mappings":"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","names":["BufferReader","BufferWriter","roundUp","value","modulo","bitMask","invBitMask","PlumStore","__publicField","plum","state","value","dependencies","listeners","listener","getter","dep","depState","unsub","isExternalPlum","dirty","prevVersion","externalUnsub","unsubs","TaskQueue","__publicField","task","resolve","reject","e","WebWigsillRuntime","device","__publicField","TaskQueue","PlumStore","_a","unsub","buffer","allocatable","roundUp","writer","BufferWriter","isPlum","plum","commandEncoder","mappedBuffer","res","BufferReader","data","gpuBuffer","size","hostBuffer","value","listener","options","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","vertexProgram","ProgramBuilder","code","arg","fragmentProgram","vertexShaderModule","fragmentShaderModule","pipelineLayout","renderPipeline","executor","RenderPipelineExecutor","program","shaderModule","computePipeline","ComputePipelineExecutor","PipelineExecutor","_runtime","pipeline","programs","externalLayoutCount","label","vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups","externalVertexBuffers","descriptor","__objRest","passEncoder","__spreadProps","__spreadValues","group","index","i","workgroups","createRuntime","adapter"]}