@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.
- package/dist/runtime/derivedUniforms/codegen.d.ts +8 -0
- package/dist/runtime/derivedUniforms/codegen.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/codegen.js +449 -0
- package/dist/runtime/derivedUniforms/codegen.js.map +1 -0
- package/dist/runtime/derivedUniforms/dispatch.d.ts +14 -93
- package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.js +123 -299
- package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
- package/dist/runtime/derivedUniforms/flatten.d.ts +25 -0
- package/dist/runtime/derivedUniforms/flatten.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/flatten.js +71 -0
- package/dist/runtime/derivedUniforms/flatten.js.map +1 -0
- package/dist/runtime/derivedUniforms/index.d.ts +10 -5
- package/dist/runtime/derivedUniforms/index.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/index.js +24 -19
- package/dist/runtime/derivedUniforms/index.js.map +1 -1
- package/dist/runtime/derivedUniforms/marker.d.ts +32 -0
- package/dist/runtime/derivedUniforms/marker.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/marker.js +84 -0
- package/dist/runtime/derivedUniforms/marker.js.map +1 -0
- package/dist/runtime/derivedUniforms/recipes.d.ts +6 -41
- package/dist/runtime/derivedUniforms/recipes.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/recipes.js +53 -129
- package/dist/runtime/derivedUniforms/recipes.js.map +1 -1
- package/dist/runtime/derivedUniforms/records.d.ts +40 -0
- package/dist/runtime/derivedUniforms/records.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/records.js +151 -0
- package/dist/runtime/derivedUniforms/records.js.map +1 -0
- package/dist/runtime/derivedUniforms/registry.d.ts +33 -0
- package/dist/runtime/derivedUniforms/registry.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/registry.js +58 -0
- package/dist/runtime/derivedUniforms/registry.js.map +1 -0
- package/dist/runtime/derivedUniforms/rule.d.ts +26 -0
- package/dist/runtime/derivedUniforms/rule.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/rule.js +35 -0
- package/dist/runtime/derivedUniforms/rule.js.map +1 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +34 -33
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.js +80 -90
- package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
- package/dist/runtime/heapAdapter.d.ts.map +1 -1
- package/dist/runtime/heapAdapter.js +9 -6
- package/dist/runtime/heapAdapter.js.map +1 -1
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +72 -27
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/hybridScene.js +1 -1
- package/dist/runtime/hybridScene.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderTask.js +1 -1
- package/dist/runtime/renderTask.js.map +1 -1
- package/dist/runtime/runtime.js +1 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/derivedUniforms/codegen.ts +477 -0
- package/src/runtime/derivedUniforms/dispatch.ts +135 -341
- package/src/runtime/derivedUniforms/flatten.ts +89 -0
- package/src/runtime/derivedUniforms/index.ts +50 -34
- package/src/runtime/derivedUniforms/marker.ts +91 -0
- package/src/runtime/derivedUniforms/recipes.ts +63 -155
- package/src/runtime/derivedUniforms/records.ts +158 -0
- package/src/runtime/derivedUniforms/registry.ts +77 -0
- package/src/runtime/derivedUniforms/rule.ts +59 -0
- package/src/runtime/derivedUniforms/sceneIntegration.ts +115 -149
- package/src/runtime/heapAdapter.ts +9 -4
- package/src/runtime/heapScene.ts +73 -29
- package/src/runtime/hybridScene.ts +1 -1
- package/src/runtime/index.ts +8 -0
- package/src/runtime/renderTask.ts +1 -1
- package/src/runtime/runtime.ts +1 -1
- package/dist/runtime/derivedUniforms/slotId.d.ts +0 -15
- package/dist/runtime/derivedUniforms/slotId.d.ts.map +0 -1
- package/dist/runtime/derivedUniforms/slotId.js +0 -30
- package/dist/runtime/derivedUniforms/slotId.js.map +0 -1
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts +0 -13
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts.map +0 -1
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.js +0 -218
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.js.map +0 -1
- package/src/runtime/derivedUniforms/slotId.ts +0 -35
- package/src/runtime/derivedUniforms/uberKernel.wgsl.ts +0 -220
|
@@ -1,355 +1,179 @@
|
|
|
1
|
-
// §7
|
|
1
|
+
// §7 v2 — uber-kernel dispatcher (GPU plumbing).
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
/**
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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:
|
|
65
|
+
size: cap,
|
|
84
66
|
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
85
67
|
});
|
|
86
|
-
this.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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 (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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.
|
|
103
|
-
|
|
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:
|
|
85
|
+
size: 16,
|
|
107
86
|
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
108
87
|
});
|
|
109
|
-
this.
|
|
88
|
+
this.bufCapBytes = 16;
|
|
110
89
|
}
|
|
111
|
-
return this.
|
|
90
|
+
return this.buf;
|
|
112
91
|
}
|
|
113
92
|
dispose() {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
/**
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
151
|
-
this.bgl = device.createBindGroupLayout({
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
130
|
+
gpu;
|
|
131
|
+
pipe;
|
|
173
132
|
cachedBg;
|
|
174
|
-
|
|
175
|
-
|
|
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.
|
|
187
|
-
this.
|
|
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
|
-
/**
|
|
194
|
-
|
|
195
|
-
|
|
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.
|
|
201
|
-
if (
|
|
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(
|
|
218
|
-
|
|
149
|
+
pass.setPipeline(pipeline);
|
|
150
|
+
pass.setBindGroup(0, this.bindGroup());
|
|
151
|
+
pass.dispatchWorkgroups(Math.ceil(records.recordCount / 64));
|
|
219
152
|
pass.end();
|
|
220
|
-
return
|
|
153
|
+
return true;
|
|
221
154
|
}
|
|
222
155
|
dispose() {
|
|
223
|
-
this.
|
|
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.
|
|
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.
|
|
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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"}
|