@aardworx/wombat.rendering 0.9.10 → 0.9.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/runtime/derivedUniforms/codegen.d.ts +8 -0
  2. package/dist/runtime/derivedUniforms/codegen.d.ts.map +1 -0
  3. package/dist/runtime/derivedUniforms/codegen.js +449 -0
  4. package/dist/runtime/derivedUniforms/codegen.js.map +1 -0
  5. package/dist/runtime/derivedUniforms/dispatch.d.ts +14 -93
  6. package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
  7. package/dist/runtime/derivedUniforms/dispatch.js +123 -299
  8. package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
  9. package/dist/runtime/derivedUniforms/flatten.d.ts +25 -0
  10. package/dist/runtime/derivedUniforms/flatten.d.ts.map +1 -0
  11. package/dist/runtime/derivedUniforms/flatten.js +71 -0
  12. package/dist/runtime/derivedUniforms/flatten.js.map +1 -0
  13. package/dist/runtime/derivedUniforms/index.d.ts +10 -5
  14. package/dist/runtime/derivedUniforms/index.d.ts.map +1 -1
  15. package/dist/runtime/derivedUniforms/index.js +24 -19
  16. package/dist/runtime/derivedUniforms/index.js.map +1 -1
  17. package/dist/runtime/derivedUniforms/marker.d.ts +32 -0
  18. package/dist/runtime/derivedUniforms/marker.d.ts.map +1 -0
  19. package/dist/runtime/derivedUniforms/marker.js +84 -0
  20. package/dist/runtime/derivedUniforms/marker.js.map +1 -0
  21. package/dist/runtime/derivedUniforms/recipes.d.ts +6 -41
  22. package/dist/runtime/derivedUniforms/recipes.d.ts.map +1 -1
  23. package/dist/runtime/derivedUniforms/recipes.js +53 -129
  24. package/dist/runtime/derivedUniforms/recipes.js.map +1 -1
  25. package/dist/runtime/derivedUniforms/records.d.ts +40 -0
  26. package/dist/runtime/derivedUniforms/records.d.ts.map +1 -0
  27. package/dist/runtime/derivedUniforms/records.js +151 -0
  28. package/dist/runtime/derivedUniforms/records.js.map +1 -0
  29. package/dist/runtime/derivedUniforms/registry.d.ts +33 -0
  30. package/dist/runtime/derivedUniforms/registry.d.ts.map +1 -0
  31. package/dist/runtime/derivedUniforms/registry.js +58 -0
  32. package/dist/runtime/derivedUniforms/registry.js.map +1 -0
  33. package/dist/runtime/derivedUniforms/rule.d.ts +26 -0
  34. package/dist/runtime/derivedUniforms/rule.d.ts.map +1 -0
  35. package/dist/runtime/derivedUniforms/rule.js +35 -0
  36. package/dist/runtime/derivedUniforms/rule.js.map +1 -0
  37. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +34 -33
  38. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
  39. package/dist/runtime/derivedUniforms/sceneIntegration.js +80 -90
  40. package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
  41. package/dist/runtime/heapAdapter.d.ts.map +1 -1
  42. package/dist/runtime/heapAdapter.js +9 -6
  43. package/dist/runtime/heapAdapter.js.map +1 -1
  44. package/dist/runtime/heapScene.d.ts.map +1 -1
  45. package/dist/runtime/heapScene.js +72 -27
  46. package/dist/runtime/heapScene.js.map +1 -1
  47. package/dist/runtime/hybridScene.js +1 -1
  48. package/dist/runtime/hybridScene.js.map +1 -1
  49. package/dist/runtime/index.d.ts +1 -0
  50. package/dist/runtime/index.d.ts.map +1 -1
  51. package/dist/runtime/index.js +2 -0
  52. package/dist/runtime/index.js.map +1 -1
  53. package/dist/runtime/renderTask.js +1 -1
  54. package/dist/runtime/renderTask.js.map +1 -1
  55. package/dist/runtime/runtime.js +1 -1
  56. package/dist/runtime/runtime.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/runtime/derivedUniforms/codegen.ts +477 -0
  59. package/src/runtime/derivedUniforms/dispatch.ts +135 -341
  60. package/src/runtime/derivedUniforms/flatten.ts +89 -0
  61. package/src/runtime/derivedUniforms/index.ts +50 -34
  62. package/src/runtime/derivedUniforms/marker.ts +91 -0
  63. package/src/runtime/derivedUniforms/recipes.ts +63 -155
  64. package/src/runtime/derivedUniforms/records.ts +158 -0
  65. package/src/runtime/derivedUniforms/registry.ts +77 -0
  66. package/src/runtime/derivedUniforms/rule.ts +59 -0
  67. package/src/runtime/derivedUniforms/sceneIntegration.ts +115 -149
  68. package/src/runtime/heapAdapter.ts +9 -4
  69. package/src/runtime/heapScene.ts +73 -29
  70. package/src/runtime/hybridScene.ts +1 -1
  71. package/src/runtime/index.ts +8 -0
  72. package/src/runtime/renderTask.ts +1 -1
  73. package/src/runtime/runtime.ts +1 -1
  74. package/dist/runtime/derivedUniforms/slotId.d.ts +0 -15
  75. package/dist/runtime/derivedUniforms/slotId.d.ts.map +0 -1
  76. package/dist/runtime/derivedUniforms/slotId.js +0 -30
  77. package/dist/runtime/derivedUniforms/slotId.js.map +0 -1
  78. package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts +0 -13
  79. package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts.map +0 -1
  80. package/dist/runtime/derivedUniforms/uberKernel.wgsl.js +0 -218
  81. package/dist/runtime/derivedUniforms/uberKernel.wgsl.js.map +0 -1
  82. package/src/runtime/derivedUniforms/slotId.ts +0 -35
  83. package/src/runtime/derivedUniforms/uberKernel.wgsl.ts +0 -220
@@ -1,355 +1,179 @@
1
- // §7 single-dispatch leaf dispatcher.
1
+ // §7 v2 — uber-kernel dispatcher (GPU plumbing).
2
2
  //
3
- // Each bucket holds a static-ish records buffer (only edited on RO
4
- // add/remove). Per frame the caller:
5
- // 1. Drains dirty constituent avals and uploads the changed byte
6
- // range to the shared constituents buffer.
7
- // 2. Builds a dirty bitmask (one bit per constituent slot) and
8
- // uploads it to the shared dirty buffer.
9
- // 3. For each bucket, calls `dispatcher.encode(enc)` — one
10
- // compute pass with one dispatch per bucket. The kernel
11
- // early-returns on records whose inputs are all clean.
12
- //
13
- // No worklist building, no atomicAdd compaction, no per-frame record
14
- // encoding. The records buffer changes only when ROs come and go.
15
- import { ConstituentSlots, DF32_MAT4_BYTES, } from "./slots.js";
16
- import { RECORD_STRIDE_BYTES, RECORD_STRIDE_U32, RECORD_FIELD, DERIVED_UBER_KERNEL_WGSL, } from "./uberKernel.wgsl.js";
17
- /** Per-bucket records buffer. Records are added/removed when ROs
18
- * enter/leave the bucket. Uses swap-remove to keep the buffer dense.
19
- * CPU mirror is kept up-to-date; the dirty range is uploaded once
20
- * per `flush()`. */
21
- export class RecordsBuffer {
3
+ // Owns: the GPU mirror of the CPU records buffer, a tiny `Count` uniform, and a
4
+ // recompilable compute pipeline. The kernel WGSL is regenerated whenever the rule
5
+ // registry gains a new rule (`registry.version`) or the record stride grows
6
+ // (`records.layoutVersion`). The records GPU buffer is re-uploaded whenever the CPU
7
+ // records buffer mutates (`records.generation`) records change only on RO add/remove,
8
+ // never per frame. One `dispatchWorkgroups` per frame, no levels, no barriers.
9
+ // See docs/derived-uniforms-extensible.md § "Dispatcher".
10
+ import { buildUberKernel } from "./codegen.js";
11
+ import { DF32_MAT4_BYTES } from "./slots.js";
12
+ /** Upload the changed-constituent value range to the constituents GPU buffer. */
13
+ export function uploadConstituentsRange(device, buf, mirror, dirty) {
14
+ let minSlot = Infinity;
15
+ let maxSlot = -1;
16
+ for (const s of dirty) {
17
+ if (s < minSlot)
18
+ minSlot = s;
19
+ if (s > maxSlot)
20
+ maxSlot = s;
21
+ }
22
+ if (maxSlot < 0)
23
+ return;
24
+ const startByte = minSlot * DF32_MAT4_BYTES;
25
+ const endByte = (maxSlot + 1) * DF32_MAT4_BYTES;
26
+ device.queue.writeBuffer(buf, startByte, mirror.buffer, mirror.byteOffset + startByte, endByte - startByte);
27
+ }
28
+ function bglEntries() {
29
+ return [
30
+ { binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: "read-only-storage" } },
31
+ { binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: { type: "storage" } },
32
+ { binding: 2, visibility: GPUShaderStage.COMPUTE, buffer: { type: "read-only-storage" } },
33
+ { binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: { type: "uniform" } },
34
+ ];
35
+ }
36
+ /** GPU mirror of a CPU `RecordsBuffer` + the `Count` uniform. */
37
+ class RecordsGpu {
22
38
  device;
23
- cpu;
24
- cap = 0; // record slots (capacity, in records)
25
- count = 0; // live records
26
- nextId = 0;
27
- slotById = new Map();
28
- idBySlot = [];
29
- /** Dirty CPU-mirror byte range that must be uploaded next flush. */
30
- dirtyMinByte = Infinity;
31
- dirtyMaxByte = -1;
32
- gpu;
33
- gpuCap = 0; // record slots in `gpu`
34
- constructor(device, initialCapacity = 64) {
39
+ buf;
40
+ bufCapBytes = 0;
41
+ uploadedGen = -1;
42
+ countBuf;
43
+ countCpu = new Uint32Array(1);
44
+ uploadedCount = -1;
45
+ constructor(device) {
35
46
  this.device = device;
36
- this.cap = initialCapacity;
37
- this.cpu = new Uint32Array(this.cap * RECORD_STRIDE_U32);
38
- }
39
- /** Add a record. Returns a stable handle for later removal. */
40
- add(rec) {
41
- if (this.count === this.cap)
42
- this.growCpu();
43
- const slot = this.count++;
44
- const id = this.nextId++;
45
- this.slotById.set(id, slot);
46
- this.idBySlot[slot] = id;
47
- this.writeAt(slot, rec);
48
- return id;
49
- }
50
- /** Swap-remove. The last record moves into the freed slot. */
51
- remove(id) {
52
- const slot = this.slotById.get(id);
53
- if (slot === undefined) {
54
- throw new Error("RecordsBuffer.remove: unknown id");
55
- }
56
- const last = this.count - 1;
57
- if (slot !== last) {
58
- // Move last → slot.
59
- const srcOff = last * RECORD_STRIDE_U32;
60
- const dstOff = slot * RECORD_STRIDE_U32;
61
- for (let i = 0; i < RECORD_STRIDE_U32; i++) {
62
- this.cpu[dstOff + i] = this.cpu[srcOff + i];
63
- }
64
- const movedId = this.idBySlot[last];
65
- this.slotById.set(movedId, slot);
66
- this.idBySlot[slot] = movedId;
67
- this.markDirty(slot, slot + 1);
68
- }
69
- this.slotById.delete(id);
70
- this.idBySlot.length = last;
71
- this.count = last;
47
+ this.countBuf = device.createBuffer({
48
+ label: "derivedUniforms.recordCount",
49
+ size: 16, // uniform min binding size
50
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
51
+ });
72
52
  }
73
- /** Live record count. */
74
- get recordCount() { return this.count; }
75
- /** Ensure GPU buffer matches cap and upload dirty CPU range. Call
76
- * before `encode`. */
77
- flush() {
78
- if (this.gpu === undefined || this.gpuCap < this.cap) {
79
- if (this.gpu !== undefined)
80
- this.gpu.destroy();
81
- this.gpu = this.device.createBuffer({
53
+ /** Re-upload the packed record data if it changed since last sync, and refresh `Count`. */
54
+ sync(records) {
55
+ const data = records.data;
56
+ const needBytes = Math.max(16, data.byteLength);
57
+ if (this.buf === undefined || this.bufCapBytes < needBytes) {
58
+ if (this.buf !== undefined)
59
+ this.buf.destroy();
60
+ let cap = Math.max(16, this.bufCapBytes || 16);
61
+ while (cap < needBytes)
62
+ cap *= 2;
63
+ this.buf = this.device.createBuffer({
82
64
  label: "derivedUniforms.records",
83
- size: this.cap * RECORD_STRIDE_BYTES,
65
+ size: cap,
84
66
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
85
67
  });
86
- this.gpuCap = this.cap;
87
- // Whole CPU mirror needs re-upload.
88
- this.dirtyMinByte = 0;
89
- this.dirtyMaxByte = this.count * RECORD_STRIDE_BYTES;
68
+ this.bufCapBytes = cap;
69
+ this.uploadedGen = -1; // force re-upload into the fresh buffer
70
+ }
71
+ if (records.generation !== this.uploadedGen && data.byteLength > 0) {
72
+ this.device.queue.writeBuffer(this.buf, 0, data.buffer, data.byteOffset, data.byteLength);
73
+ this.uploadedGen = records.generation;
90
74
  }
91
- if (this.dirtyMaxByte > this.dirtyMinByte) {
92
- const start = this.dirtyMinByte;
93
- const end = Math.min(this.dirtyMaxByte, this.count * RECORD_STRIDE_BYTES);
94
- if (end > start) {
95
- this.device.queue.writeBuffer(this.gpu, start, this.cpu.buffer, this.cpu.byteOffset + start, end - start);
96
- }
97
- this.dirtyMinByte = Infinity;
98
- this.dirtyMaxByte = -1;
75
+ if (records.recordCount !== this.uploadedCount) {
76
+ this.countCpu[0] = records.recordCount;
77
+ this.device.queue.writeBuffer(this.countBuf, 0, this.countCpu.buffer, this.countCpu.byteOffset, 4);
78
+ this.uploadedCount = records.recordCount;
99
79
  }
100
80
  }
101
81
  buffer() {
102
- if (this.gpu === undefined) {
103
- // Empty bucket — make a tiny stub so binding always has something.
104
- this.gpu = this.device.createBuffer({
82
+ if (this.buf === undefined) {
83
+ this.buf = this.device.createBuffer({
105
84
  label: "derivedUniforms.records.stub",
106
- size: RECORD_STRIDE_BYTES,
85
+ size: 16,
107
86
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
108
87
  });
109
- this.gpuCap = 1;
88
+ this.bufCapBytes = 16;
110
89
  }
111
- return this.gpu;
90
+ return this.buf;
112
91
  }
113
92
  dispose() {
114
- if (this.gpu !== undefined) {
115
- this.gpu.destroy();
116
- this.gpu = undefined;
117
- }
118
- }
119
- // ── Internals ─────────────────────────────────────────────────────
120
- writeAt(slot, rec) {
121
- const off = slot * RECORD_STRIDE_U32;
122
- this.cpu[off + RECORD_FIELD.recipe_id] = rec.recipe;
123
- this.cpu[off + RECORD_FIELD.in0] = rec.in0;
124
- this.cpu[off + RECORD_FIELD.in1] = rec.in1;
125
- this.cpu[off + RECORD_FIELD.in2] = rec.in2;
126
- this.cpu[off + RECORD_FIELD.out_byte] = rec.outByte;
127
- this.markDirty(slot, slot + 1);
128
- }
129
- markDirty(startSlot, endSlot) {
130
- const startByte = startSlot * RECORD_STRIDE_BYTES;
131
- const endByte = endSlot * RECORD_STRIDE_BYTES;
132
- if (startByte < this.dirtyMinByte)
133
- this.dirtyMinByte = startByte;
134
- if (endByte > this.dirtyMaxByte)
135
- this.dirtyMaxByte = endByte;
136
- }
137
- growCpu() {
138
- const newCap = this.cap * 2;
139
- const grown = new Uint32Array(newCap * RECORD_STRIDE_U32);
140
- grown.set(this.cpu);
141
- this.cpu = grown;
142
- this.cap = newCap;
93
+ this.buf?.destroy();
94
+ this.buf = undefined;
95
+ this.countBuf.destroy();
143
96
  }
144
97
  }
145
- /** One compute pipeline shared across buckets created once per scene. */
146
- export class DerivedUniformsPipeline {
147
- pipeline;
98
+ /** Recompilable uber-kernel pipeline. Rebuilt on `(registry.version, strideU32)` change. */
99
+ class UberPipeline {
100
+ device;
148
101
  bgl;
102
+ pipe;
103
+ builtVersion = -1;
104
+ builtStride = -1;
149
105
  constructor(device) {
150
- const module = device.createShaderModule({ code: DERIVED_UBER_KERNEL_WGSL });
151
- this.bgl = device.createBindGroupLayout({
152
- entries: [
153
- { binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: "read-only-storage" } },
154
- { binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: { type: "storage" } },
155
- { binding: 2, visibility: GPUShaderStage.COMPUTE, buffer: { type: "read-only-storage" } },
156
- { binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: { type: "uniform" } },
157
- ],
158
- });
159
- this.pipeline = device.createComputePipeline({
160
- layout: device.createPipelineLayout({ bindGroupLayouts: [this.bgl] }),
106
+ this.device = device;
107
+ this.bgl = device.createBindGroupLayout({ entries: bglEntries() });
108
+ }
109
+ pipeline(registry, strideU32) {
110
+ if (registry.size === 0)
111
+ return undefined;
112
+ if (this.pipe !== undefined && this.builtVersion === registry.version && this.builtStride === strideU32) {
113
+ return this.pipe;
114
+ }
115
+ const { wgsl } = buildUberKernel(registry, strideU32);
116
+ const module = this.device.createShaderModule({ code: wgsl, label: "derivedUniforms.uber" });
117
+ this.pipe = this.device.createComputePipeline({
118
+ label: "derivedUniforms.uber",
119
+ layout: this.device.createPipelineLayout({ bindGroupLayouts: [this.bgl] }),
161
120
  compute: { module, entryPoint: "main" },
162
121
  });
122
+ this.builtVersion = registry.version;
123
+ this.builtStride = strideU32;
124
+ return this.pipe;
163
125
  }
164
126
  }
165
- /** Per-bucket dispatcher. One bind group cached, rebuilt only when a
166
- * bound buffer reference changes (constituents or main heap grew, or
167
- * records buffer was re-created). */
168
127
  export class DerivedUniformsDispatcher {
169
128
  device;
170
- pipe;
171
129
  resources;
172
- records;
130
+ gpu;
131
+ pipe;
173
132
  cachedBg;
174
- bgKeyConsts;
175
- bgKeyHeap;
176
- bgKeyRecs;
177
- /** Tiny uniform holding the live record count — gates threads past
178
- * the live range from reading stale swap-removed records. */
179
- countBuf;
180
- countCpu = new Uint32Array(1);
181
- lastCountUploaded = -1;
182
- constructor(device, pipe, resources, initialRecordCapacity = 64) {
133
+ bgKey = [undefined, undefined, undefined];
134
+ constructor(device, resources) {
183
135
  this.device = device;
184
- this.pipe = pipe;
185
136
  this.resources = resources;
186
- this.records = new RecordsBuffer(device, initialRecordCapacity);
187
- this.countBuf = device.createBuffer({
188
- label: "derivedUniforms.recordCount",
189
- size: 16, // uniform min size
190
- usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
191
- });
137
+ this.gpu = new RecordsGpu(device);
138
+ this.pipe = new UberPipeline(device);
192
139
  }
193
- /** Dispatch into an open compute pass. Caller is responsible for
194
- * beginning/ending the pass and setting the pipeline once across
195
- * all dispatchers (the pipeline is shared). */
196
- dispatchInto(pass) {
197
- const count = this.records.recordCount;
198
- if (count === 0)
140
+ /** Open a compute pass and run the uber-kernel. No-ops if there are no records / no rules. */
141
+ encode(enc, registry, records) {
142
+ if (records.recordCount === 0)
199
143
  return false;
200
- this.records.flush();
201
- if (count !== this.lastCountUploaded) {
202
- this.countCpu[0] = count;
203
- this.device.queue.writeBuffer(this.countBuf, 0, this.countCpu.buffer, this.countCpu.byteOffset, 4);
204
- this.lastCountUploaded = count;
205
- }
206
- pass.setBindGroup(0, this.bindGroup());
207
- pass.dispatchWorkgroups(Math.ceil(count / 64));
208
- return true;
209
- }
210
- /** Convenience: open/close a pass and dispatch. Use only when this
211
- * is the sole dispatcher in the pass; otherwise use `dispatchInto`
212
- * inside a caller-managed pass. */
213
- encode(enc) {
214
- if (this.records.recordCount === 0)
144
+ const pipeline = this.pipe.pipeline(registry, records.strideWords);
145
+ if (pipeline === undefined)
215
146
  return false;
147
+ this.gpu.sync(records);
216
148
  const pass = enc.beginComputePass({ label: "derivedUniforms.uber" });
217
- pass.setPipeline(this.pipe.pipeline);
218
- const ran = this.dispatchInto(pass);
149
+ pass.setPipeline(pipeline);
150
+ pass.setBindGroup(0, this.bindGroup());
151
+ pass.dispatchWorkgroups(Math.ceil(records.recordCount / 64));
219
152
  pass.end();
220
- return ran;
153
+ return true;
221
154
  }
222
155
  dispose() {
223
- this.records.dispose();
224
- this.countBuf.destroy();
156
+ this.gpu.dispose();
225
157
  }
226
158
  bindGroup() {
227
159
  const consts = this.resources.constituentsBuf();
228
160
  const heap = this.resources.mainHeapBuf();
229
- const recs = this.records.buffer();
230
- if (this.cachedBg !== undefined &&
231
- this.bgKeyConsts === consts && this.bgKeyHeap === heap &&
232
- this.bgKeyRecs === recs) {
161
+ const recs = this.gpu.buffer();
162
+ if (this.cachedBg !== undefined && this.bgKey[0] === consts && this.bgKey[1] === heap && this.bgKey[2] === recs) {
233
163
  return this.cachedBg;
234
164
  }
235
165
  this.cachedBg = this.device.createBindGroup({
166
+ label: "derivedUniforms.uber",
236
167
  layout: this.pipe.bgl,
237
168
  entries: [
238
169
  { binding: 0, resource: { buffer: consts } },
239
170
  { binding: 1, resource: { buffer: heap } },
240
171
  { binding: 2, resource: { buffer: recs } },
241
- { binding: 3, resource: { buffer: this.countBuf } },
172
+ { binding: 3, resource: { buffer: this.gpu.countBuf } },
242
173
  ],
243
174
  });
244
- this.bgKeyConsts = consts;
245
- this.bgKeyHeap = heap;
246
- this.bgKeyRecs = recs;
175
+ this.bgKey = [consts, heap, recs];
247
176
  return this.cachedBg;
248
177
  }
249
178
  }
250
- /** Scene-side helper: O(changed) maintenance of a GPU dirty bitmask.
251
- *
252
- * Steady state (clean frame): zero work. The CPU mirror reflects the
253
- * GPU buffer, so we only ever touch bits that actually flip.
254
- *
255
- * Each `upload(dirty)` call:
256
- * 1. Clears the bits set last frame (O(prev_dirty)).
257
- * 2. Sets the bits dirty this frame (O(dirty)).
258
- * 3. Writes only the affected u32 range to the GPU (one writeBuffer).
259
- * If both sets are empty, returns immediately. */
260
- export class DirtyMaskUploader {
261
- device;
262
- cpu;
263
- gpu;
264
- gpuCapU32 = 0;
265
- /** Bits set on the previous upload — must be cleared next time. */
266
- prevDirty = [];
267
- constructor(device, initialU32 = 8) {
268
- this.device = device;
269
- this.cpu = new Uint32Array(Math.max(1, initialU32));
270
- }
271
- /** Resize CPU + GPU mirrors so they cover `slotCount` bits. */
272
- ensureCapacity(slotCount) {
273
- const need = Math.max(1, Math.ceil(slotCount / 32));
274
- if (need > this.cpu.length) {
275
- let cap = Math.max(this.cpu.length, 1);
276
- while (cap < need)
277
- cap *= 2;
278
- const grown = new Uint32Array(cap);
279
- grown.set(this.cpu);
280
- this.cpu = grown;
281
- }
282
- if (this.gpu === undefined || this.gpuCapU32 < need) {
283
- if (this.gpu !== undefined)
284
- this.gpu.destroy();
285
- const cap = this.cpu.length;
286
- this.gpu = this.device.createBuffer({
287
- label: "derivedUniforms.dirtyMask",
288
- size: cap * 4,
289
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
290
- });
291
- this.gpuCapU32 = cap;
292
- // GPU buffer is fresh-zero; CPU mirror should match. Wipe any
293
- // prevDirty (those bits live in the destroyed buffer).
294
- this.prevDirty.length = 0;
295
- }
296
- }
297
- /** Apply the new dirty set. O(prev_dirty + dirty), no O(slotCount). */
298
- upload(dirty) {
299
- let minU32 = Infinity;
300
- let maxU32 = -Infinity;
301
- for (const s of this.prevDirty) {
302
- const i = s >>> 5;
303
- const b = s & 31;
304
- this.cpu[i] = (this.cpu[i] & ~(1 << b)) >>> 0;
305
- if (i < minU32)
306
- minU32 = i;
307
- if (i > maxU32)
308
- maxU32 = i;
309
- }
310
- this.prevDirty.length = 0;
311
- for (const s of dirty) {
312
- const i = s >>> 5;
313
- const b = s & 31;
314
- this.cpu[i] = (this.cpu[i] | (1 << b)) >>> 0;
315
- if (i < minU32)
316
- minU32 = i;
317
- if (i > maxU32)
318
- maxU32 = i;
319
- this.prevDirty.push(s);
320
- }
321
- if (maxU32 < 0 || maxU32 === -Infinity)
322
- return;
323
- const startByte = minU32 * 4;
324
- const endByte = (maxU32 + 1) * 4;
325
- this.device.queue.writeBuffer(this.gpu, startByte, this.cpu.buffer, this.cpu.byteOffset + startByte, endByte - startByte);
326
- }
327
- buffer() {
328
- if (this.gpu === undefined)
329
- this.ensureCapacity(1);
330
- return this.gpu;
331
- }
332
- dispose() {
333
- if (this.gpu !== undefined) {
334
- this.gpu.destroy();
335
- this.gpu = undefined;
336
- }
337
- }
338
- }
339
- /** Upload the dirty constituent value range to the constituents GPU
340
- * buffer. Helper used by the scene each frame after draining. */
341
- export function uploadConstituentsRange(device, buf, mirror, dirty) {
342
- let minSlot = Infinity, maxSlot = -1;
343
- for (const s of dirty) {
344
- if (s < minSlot)
345
- minSlot = s;
346
- if (s > maxSlot)
347
- maxSlot = s;
348
- }
349
- if (maxSlot < 0)
350
- return;
351
- const startByte = minSlot * DF32_MAT4_BYTES;
352
- const endByte = (maxSlot + 1) * DF32_MAT4_BYTES;
353
- device.queue.writeBuffer(buf, startByte, mirror.buffer, mirror.byteOffset + startByte, endByte - startByte);
354
- }
355
179
  //# sourceMappingURL=dispatch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Expr, Type } from "@aardworx/wombat.shader/ir";
2
+ import type { DerivedRule } from "./rule.js";
3
+ export interface RuleInput {
4
+ readonly name: string;
5
+ readonly type: Type;
6
+ /** `true` ⇒ the leaf appeared as `Inverse(ReadInput(name))` — for a constituent
7
+ * trafo this selects the stored backward half (free); the forward half otherwise. */
8
+ readonly inverse: boolean;
9
+ }
10
+ /**
11
+ * The rule's input leaves in **first-appearance order** (DFS pre-order of `ir`),
12
+ * deduplicated by `(name, inverse)`. A leaf is either `ReadInput("Uniform", name)`
13
+ * or `Inverse(ReadInput("Uniform", name))`. Order matters: it is the order the
14
+ * generated kernel arm consumes its arguments (e.g. the multiplication order of a
15
+ * matmul chain). Throws if a name is used at two structurally-different types.
16
+ */
17
+ export declare function inputsOf(ir: Expr): RuleInput[];
18
+ /**
19
+ * Substitute every derived-uniform leaf in `ir` with its (recursively
20
+ * flattened) producer. `name` is the uniform name `ir` is being registered
21
+ * under; it is pushed on the expansion stack so a self-reference — or any
22
+ * cycle through other rules — is caught.
23
+ */
24
+ export declare function flatten(name: string, ir: Expr, derived: ReadonlyMap<string, DerivedRule>, _stack?: readonly string[]): Expr;
25
+ //# sourceMappingURL=flatten.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/flatten.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB;0FACsF;IACtF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,IAAI,GAAG,SAAS,EAAE,CA6B9C;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,IAAI,EACR,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,EACzC,MAAM,GAAE,SAAS,MAAM,EAAO,GAC7B,IAAI,CAcN"}
@@ -0,0 +1,71 @@
1
+ // §7 v2 — chain flattening.
2
+ //
3
+ // A rule whose IR mentions another derived-uniform name has that producer's
4
+ // IR substituted in place (recursively) until the rule reads only non-derived
5
+ // inputs (constituents / host uniforms). After flattening every
6
+ // record is independent ⇒ one compute dispatch, no levels, no barriers.
7
+ // See docs/derived-uniforms-extensible.md § "Chain flattening".
8
+ import { visitExprChildren, stableStringify } from "@aardworx/wombat.shader/ir";
9
+ import { mapExpr } from "@aardworx/wombat.shader/passes";
10
+ /**
11
+ * The rule's input leaves in **first-appearance order** (DFS pre-order of `ir`),
12
+ * deduplicated by `(name, inverse)`. A leaf is either `ReadInput("Uniform", name)`
13
+ * or `Inverse(ReadInput("Uniform", name))`. Order matters: it is the order the
14
+ * generated kernel arm consumes its arguments (e.g. the multiplication order of a
15
+ * matmul chain). Throws if a name is used at two structurally-different types.
16
+ */
17
+ export function inputsOf(ir) {
18
+ const out = [];
19
+ const seen = new Set(); // key = `${inverse ? "i" : "v"}:${name}`
20
+ const typeByName = new Map();
21
+ const record = (name, type, inverse) => {
22
+ const prev = typeByName.get(name);
23
+ if (prev !== undefined && !typesEqual(prev, type)) {
24
+ throw new Error(`derived rule: uniform '${name}' used at conflicting types`);
25
+ }
26
+ typeByName.set(name, type);
27
+ const key = `${inverse ? "i" : "v"}:${name}`;
28
+ if (!seen.has(key)) {
29
+ seen.add(key);
30
+ out.push({ name, type, inverse });
31
+ }
32
+ };
33
+ const walk = (e) => {
34
+ if (e.kind === "ReadInput" && e.scope === "Uniform") {
35
+ record(e.name, e.type, false);
36
+ return;
37
+ }
38
+ if (e.kind === "Inverse" && e.value.kind === "ReadInput" && e.value.scope === "Uniform") {
39
+ record(e.value.name, e.value.type, true);
40
+ return; // do not also count the inner ReadInput as a separate forward leaf
41
+ }
42
+ visitExprChildren(e, walk);
43
+ };
44
+ walk(ir);
45
+ return out;
46
+ }
47
+ /**
48
+ * Substitute every derived-uniform leaf in `ir` with its (recursively
49
+ * flattened) producer. `name` is the uniform name `ir` is being registered
50
+ * under; it is pushed on the expansion stack so a self-reference — or any
51
+ * cycle through other rules — is caught.
52
+ */
53
+ export function flatten(name, ir, derived, _stack = []) {
54
+ if (_stack.includes(name)) {
55
+ throw new Error(`derived uniform cycle: ${[..._stack, name].join(" → ")}`);
56
+ }
57
+ const stack = [..._stack, name];
58
+ return mapExpr(ir, (e) => {
59
+ if (e.kind === "ReadInput" && e.scope === "Uniform") {
60
+ const producer = derived.get(e.name);
61
+ if (producer !== undefined) {
62
+ return flatten(e.name, producer.ir, derived, stack);
63
+ }
64
+ }
65
+ return e;
66
+ });
67
+ }
68
+ function typesEqual(a, b) {
69
+ return a === b || stableStringify(a) === stableStringify(b);
70
+ }
71
+ //# sourceMappingURL=flatten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/flatten.ts"],"names":[],"mappings":"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"}