@aardworx/wombat.rendering 0.19.12 → 0.19.13
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/sceneIntegration.d.ts +36 -7
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.js +103 -24
- package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/derivedUniforms/sceneIntegration.ts +120 -26
|
@@ -16,11 +16,15 @@ export declare class DerivedUniformsScene {
|
|
|
16
16
|
* scene-wide; records partition by chunk so each dispatch binds
|
|
17
17
|
* the right chunk's main heap. */
|
|
18
18
|
private readonly recordsByChunk;
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
19
|
+
/** CHAIN records partitioned by trie LEVEL (GPU transform propagation). A
|
|
20
|
+
* trie node at level L computes `link · parentNode.world` — reading its
|
|
21
|
+
* parent (level L-1) output — so levels must dispatch in ascending order,
|
|
22
|
+
* BEFORE the §7 per-chunk passes. Scene-wide: they target the shared
|
|
23
|
+
* constituents buffer (per-node Model), not any chunk's main heap.
|
|
24
|
+
* Prefix-sharing: sibling chains share trie nodes (see TrafoTree). */
|
|
25
|
+
private readonly chainByLevel;
|
|
26
|
+
/** The suffix trie that dedups shared ancestor sub-chains across ROs. */
|
|
27
|
+
readonly trafoTree: TrafoTree;
|
|
24
28
|
readonly dispatcher: DerivedUniformsDispatcher;
|
|
25
29
|
/** Constituents storage GPU buffer (`array<vec2<f32>>` — df32 mat4 halves). */
|
|
26
30
|
constituentsBuf: GPUBuffer;
|
|
@@ -30,6 +34,8 @@ export declare class DerivedUniformsScene {
|
|
|
30
34
|
/** Bumped each time a shared GPU buffer is replaced. */
|
|
31
35
|
bufferEpoch: number;
|
|
32
36
|
constructor(device: GPUDevice, opts?: DerivedUniformsSceneOptions);
|
|
37
|
+
/** Get-or-create the CHAIN records buffer for trie `level`. */
|
|
38
|
+
chainRecordsFor(level: number): RecordsBuffer;
|
|
33
39
|
/** Register (or replace) the GPUBuffer getter for a chunk's main
|
|
34
40
|
* heap. Called by the scene factory at construction and whenever
|
|
35
41
|
* a new chunk opens or an existing chunk's buffer reallocates. */
|
|
@@ -55,6 +61,29 @@ export declare class DerivedUniformsScene {
|
|
|
55
61
|
encode(enc: GPUCommandEncoder): boolean;
|
|
56
62
|
dispose(): void;
|
|
57
63
|
}
|
|
64
|
+
export interface TrieNode {
|
|
65
|
+
readonly id: number;
|
|
66
|
+
readonly key: string;
|
|
67
|
+
readonly modelPair: PairedSlots;
|
|
68
|
+
readonly level: number;
|
|
69
|
+
readonly parent: TrieNode | undefined;
|
|
70
|
+
refcount: number;
|
|
71
|
+
}
|
|
72
|
+
export declare class TrafoTree {
|
|
73
|
+
private readonly scene;
|
|
74
|
+
private readonly byKey;
|
|
75
|
+
private nextId;
|
|
76
|
+
constructor(scene: DerivedUniformsScene);
|
|
77
|
+
/** Number of live trie nodes — diagnostics / tests (prefix-sharing check). */
|
|
78
|
+
get nodeCount(): number;
|
|
79
|
+
/** Intern a chain (array order `[leaf, …, root]`); returns the LEAF trie node
|
|
80
|
+
* whose Model is the full product. increfs every node on the path so shared
|
|
81
|
+
* ancestor nodes survive while any RO references them. */
|
|
82
|
+
intern(linkPairs: readonly PairedSlots[]): TrieNode;
|
|
83
|
+
/** Decref every node on the leaf→root path; free those that hit 0. */
|
|
84
|
+
release(leaf: TrieNode): void;
|
|
85
|
+
private internOne;
|
|
86
|
+
}
|
|
58
87
|
export interface RoDerivedRequest {
|
|
59
88
|
/** Derived rules to install, keyed by the uniform name each produces. */
|
|
60
89
|
readonly rules: ReadonlyMap<string, DerivedRule>;
|
|
@@ -90,9 +119,9 @@ export interface RoRegistration {
|
|
|
90
119
|
readonly ruleHashes: readonly string[];
|
|
91
120
|
/** Chunk this registration was placed into — used by deregister. */
|
|
92
121
|
readonly chunkIdx: number;
|
|
93
|
-
/**
|
|
122
|
+
/** This RO's leaf trie node (transform propagation); its path is decref'd on
|
|
94
123
|
* deregister. Present iff the request carried a `modelChain`. */
|
|
95
|
-
readonly
|
|
124
|
+
readonly modelLeaf?: TrieNode;
|
|
96
125
|
}
|
|
97
126
|
export declare function registerRoDerivations(scene: DerivedUniformsScene, owner: object, req: RoDerivedRequest): RoRegistration;
|
|
98
127
|
export declare function deregisterRoDerivations(scene: DerivedUniformsScene, reg: RoRegistration): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneIntegration.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/sceneIntegration.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,EAAE,KAAK,SAAS,EACjC,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,aAAa,EAAuB,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,yBAAyB,EAA2B,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAC3C;AAED,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,QAAQ,yBAAgC;IACjD;;uCAEmC;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE
|
|
1
|
+
{"version":3,"file":"sceneIntegration.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/sceneIntegration.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,11 +31,15 @@ export class DerivedUniformsScene {
|
|
|
31
31
|
* scene-wide; records partition by chunk so each dispatch binds
|
|
32
32
|
* the right chunk's main heap. */
|
|
33
33
|
recordsByChunk = new Map();
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
|
|
34
|
+
/** CHAIN records partitioned by trie LEVEL (GPU transform propagation). A
|
|
35
|
+
* trie node at level L computes `link · parentNode.world` — reading its
|
|
36
|
+
* parent (level L-1) output — so levels must dispatch in ascending order,
|
|
37
|
+
* BEFORE the §7 per-chunk passes. Scene-wide: they target the shared
|
|
38
|
+
* constituents buffer (per-node Model), not any chunk's main heap.
|
|
39
|
+
* Prefix-sharing: sibling chains share trie nodes (see TrafoTree). */
|
|
40
|
+
chainByLevel = new Map();
|
|
41
|
+
/** The suffix trie that dedups shared ancestor sub-chains across ROs. */
|
|
42
|
+
trafoTree;
|
|
39
43
|
dispatcher;
|
|
40
44
|
/** Constituents storage GPU buffer (`array<vec2<f32>>` — df32 mat4 halves). */
|
|
41
45
|
constituentsBuf;
|
|
@@ -56,6 +60,16 @@ export class DerivedUniformsScene {
|
|
|
56
60
|
this.dispatcher = new DerivedUniformsDispatcher(device, {
|
|
57
61
|
constituentsBuf: () => this.constituentsBuf,
|
|
58
62
|
});
|
|
63
|
+
this.trafoTree = new TrafoTree(this);
|
|
64
|
+
}
|
|
65
|
+
/** Get-or-create the CHAIN records buffer for trie `level`. */
|
|
66
|
+
chainRecordsFor(level) {
|
|
67
|
+
let r = this.chainByLevel.get(level);
|
|
68
|
+
if (r === undefined) {
|
|
69
|
+
r = new RecordsBuffer();
|
|
70
|
+
this.chainByLevel.set(level, r);
|
|
71
|
+
}
|
|
72
|
+
return r;
|
|
59
73
|
}
|
|
60
74
|
/** Register (or replace) the GPUBuffer getter for a chunk's main
|
|
61
75
|
* heap. Called by the scene factory at construction and whenever
|
|
@@ -130,16 +144,23 @@ export class DerivedUniformsScene {
|
|
|
130
144
|
* main heap buffer. */
|
|
131
145
|
encode(enc) {
|
|
132
146
|
let any = false;
|
|
133
|
-
//
|
|
134
|
-
// shared constituents buffer.
|
|
135
|
-
//
|
|
136
|
-
|
|
147
|
+
// Chain pass — writes per-RO/per-node Model constituents (fwd+inv) into the
|
|
148
|
+
// shared constituents buffer. Dispatch trie LEVELS in ascending order: a
|
|
149
|
+
// level-L node reads its parent's (level L-1) output. Must run BEFORE the
|
|
150
|
+
// §7 passes that read the Models. MainHeap binding is unused here; bind any.
|
|
151
|
+
const levels = [...this.chainByLevel.keys()].sort((a, b) => a - b);
|
|
152
|
+
if (levels.length > 0) {
|
|
137
153
|
const anyHeap = this.firstHeapGetter();
|
|
138
154
|
if (anyHeap === undefined) {
|
|
139
155
|
throw new Error("derivedUniforms.encode: chain records present but no chunk main-heap registered to bind.");
|
|
140
156
|
}
|
|
141
|
-
|
|
142
|
-
|
|
157
|
+
for (const lvl of levels) {
|
|
158
|
+
const recs = this.chainByLevel.get(lvl);
|
|
159
|
+
if (recs.recordCount === 0)
|
|
160
|
+
continue;
|
|
161
|
+
if (this.dispatcher.encodeChunk(enc, this.registry, recs, anyHeap))
|
|
162
|
+
any = true;
|
|
163
|
+
}
|
|
143
164
|
}
|
|
144
165
|
// Phase 2: §7 per-chunk (reads constituents incl. the chain-written Model).
|
|
145
166
|
for (const [chunkIdx, records] of this.recordsByChunk) {
|
|
@@ -160,6 +181,67 @@ export class DerivedUniformsScene {
|
|
|
160
181
|
this.constituentsBuf.destroy();
|
|
161
182
|
}
|
|
162
183
|
}
|
|
184
|
+
export class TrafoTree {
|
|
185
|
+
scene;
|
|
186
|
+
byKey = new Map();
|
|
187
|
+
nextId = 0;
|
|
188
|
+
constructor(scene) {
|
|
189
|
+
this.scene = scene;
|
|
190
|
+
}
|
|
191
|
+
/** Number of live trie nodes — diagnostics / tests (prefix-sharing check). */
|
|
192
|
+
get nodeCount() { return this.byKey.size; }
|
|
193
|
+
/** Intern a chain (array order `[leaf, …, root]`); returns the LEAF trie node
|
|
194
|
+
* whose Model is the full product. increfs every node on the path so shared
|
|
195
|
+
* ancestor nodes survive while any RO references them. */
|
|
196
|
+
intern(linkPairs) {
|
|
197
|
+
let parent;
|
|
198
|
+
// Root end (last) → leaf (first), so shared ancestor suffixes share nodes.
|
|
199
|
+
for (let i = linkPairs.length - 1; i >= 0; i--) {
|
|
200
|
+
parent = this.internOne(parent, linkPairs[i]);
|
|
201
|
+
}
|
|
202
|
+
if (parent === undefined)
|
|
203
|
+
throw new Error("TrafoTree.intern: empty chain");
|
|
204
|
+
return parent;
|
|
205
|
+
}
|
|
206
|
+
/** Decref every node on the leaf→root path; free those that hit 0. */
|
|
207
|
+
release(leaf) {
|
|
208
|
+
let n = leaf;
|
|
209
|
+
while (n !== undefined) {
|
|
210
|
+
const parent = n.parent;
|
|
211
|
+
if (--n.refcount === 0) {
|
|
212
|
+
this.byKey.delete(n.key);
|
|
213
|
+
this.scene.chainRecordsFor(n.level).removeAllForOwner(n);
|
|
214
|
+
this.scene.constituents.freeOutputPair(n.modelPair);
|
|
215
|
+
}
|
|
216
|
+
n = parent;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
internOne(parent, link) {
|
|
220
|
+
const key = `${parent?.id ?? -1}:${link.fwd}`;
|
|
221
|
+
const existing = this.byKey.get(key);
|
|
222
|
+
if (existing !== undefined) {
|
|
223
|
+
existing.refcount++;
|
|
224
|
+
return existing;
|
|
225
|
+
}
|
|
226
|
+
const level = parent === undefined ? 0 : parent.level + 1;
|
|
227
|
+
const modelPair = this.scene.constituents.allocOutputPair();
|
|
228
|
+
const node = { id: this.nextId++, key, modelPair, level, parent, refcount: 1 };
|
|
229
|
+
this.byKey.set(key, node);
|
|
230
|
+
const h = (s) => makeHandle(SlotTag.Constituent, s);
|
|
231
|
+
const recs = this.scene.chainRecordsFor(level);
|
|
232
|
+
// node.world.fwd = link.fwd · parent.world.fwd (just link at the root end).
|
|
233
|
+
// node.world.inv = parent.world.inv · link.inv (reversed; just link at root).
|
|
234
|
+
if (parent === undefined) {
|
|
235
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.fwd), [1, h(link.fwd)]);
|
|
236
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.inv), [1, h(link.inv)]);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.fwd), [2, h(link.fwd), h(parent.modelPair.fwd)]);
|
|
240
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.inv), [2, h(parent.modelPair.inv), h(link.inv)]);
|
|
241
|
+
}
|
|
242
|
+
return node;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
163
245
|
export function registerRoDerivations(scene, owner, req) {
|
|
164
246
|
if (req.rules.size === 0 && req.modelChain === undefined) {
|
|
165
247
|
return { owner, constituentAvals: [], ruleHashes: [], chunkIdx: req.chunkIdx };
|
|
@@ -204,19 +286,17 @@ export function registerRoDerivations(scene, owner, req) {
|
|
|
204
286
|
// from its ancestor chain, and point §7's `Model` leaf at it. The chain pass
|
|
205
287
|
// (a separate, earlier dispatch) writes the fwd half from the links and the
|
|
206
288
|
// inv half from the reversed inverse links.
|
|
207
|
-
let
|
|
208
|
-
if (req.modelChain !== undefined) {
|
|
209
|
-
modelPair = scene.constituents.allocOutputPair();
|
|
210
|
-
pairByName.set("Model", modelPair);
|
|
289
|
+
let modelLeaf;
|
|
290
|
+
if (req.modelChain !== undefined && req.modelChain.length > 0) {
|
|
211
291
|
const linkPairs = req.modelChain.map((av) => {
|
|
212
292
|
acquiredAvals.push(av);
|
|
213
293
|
return scene.constituents.acquire(av);
|
|
214
294
|
});
|
|
215
|
-
|
|
216
|
-
//
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
295
|
+
// Intern the chain into the suffix trie — siblings share ancestor nodes,
|
|
296
|
+
// each composed once (link · parent.world) at its level. The RO's Model is
|
|
297
|
+
// the leaf node's per-node Model constituent.
|
|
298
|
+
modelLeaf = scene.trafoTree.intern(linkPairs);
|
|
299
|
+
pairByName.set("Model", modelLeaf.modelPair);
|
|
220
300
|
}
|
|
221
301
|
for (const [outName, rule] of req.rules) {
|
|
222
302
|
// `flatten` returns the same Expr object when nothing was substituted (the common case —
|
|
@@ -237,17 +317,16 @@ export function registerRoDerivations(scene, owner, req) {
|
|
|
237
317
|
scene.ensureConstituentsCapacity(scene.constituents.slotCount * DF32_MAT4_BYTES);
|
|
238
318
|
return {
|
|
239
319
|
owner, constituentAvals: acquiredAvals, ruleHashes, chunkIdx: req.chunkIdx,
|
|
240
|
-
...(
|
|
320
|
+
...(modelLeaf !== undefined ? { modelLeaf } : {}),
|
|
241
321
|
};
|
|
242
322
|
}
|
|
243
323
|
export function deregisterRoDerivations(scene, reg) {
|
|
244
324
|
scene.recordsFor(reg.chunkIdx).removeAllForOwner(reg.owner);
|
|
245
|
-
scene.chainRecords.removeAllForOwner(reg.owner);
|
|
246
325
|
for (const h of reg.ruleHashes)
|
|
247
326
|
scene.registry.release(h);
|
|
248
327
|
for (const av of reg.constituentAvals)
|
|
249
328
|
scene.constituents.release(av);
|
|
250
|
-
if (reg.
|
|
251
|
-
scene.
|
|
329
|
+
if (reg.modelLeaf !== undefined)
|
|
330
|
+
scene.trafoTree.release(reg.modelLeaf);
|
|
252
331
|
}
|
|
253
332
|
//# sourceMappingURL=sceneIntegration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneIntegration.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/sceneIntegration.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sceneIntegration.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/sceneIntegration.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aardworx/wombat.rendering",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.13",
|
|
4
4
|
"description": "WebGPU rendering layer for the Wombat TypeScript stack — RenderObject/RenderTask/runtime + window glue, port of Aardvark.Rendering's lower layers on top of WebGPU and wombat.shader.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "krauthaufen",
|
|
@@ -42,11 +42,15 @@ export class DerivedUniformsScene {
|
|
|
42
42
|
* scene-wide; records partition by chunk so each dispatch binds
|
|
43
43
|
* the right chunk's main heap. */
|
|
44
44
|
private readonly recordsByChunk = new Map<number, RecordsBuffer>();
|
|
45
|
-
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
|
|
45
|
+
/** CHAIN records partitioned by trie LEVEL (GPU transform propagation). A
|
|
46
|
+
* trie node at level L computes `link · parentNode.world` — reading its
|
|
47
|
+
* parent (level L-1) output — so levels must dispatch in ascending order,
|
|
48
|
+
* BEFORE the §7 per-chunk passes. Scene-wide: they target the shared
|
|
49
|
+
* constituents buffer (per-node Model), not any chunk's main heap.
|
|
50
|
+
* Prefix-sharing: sibling chains share trie nodes (see TrafoTree). */
|
|
51
|
+
private readonly chainByLevel = new Map<number, RecordsBuffer>();
|
|
52
|
+
/** The suffix trie that dedups shared ancestor sub-chains across ROs. */
|
|
53
|
+
readonly trafoTree: TrafoTree;
|
|
50
54
|
readonly dispatcher: DerivedUniformsDispatcher;
|
|
51
55
|
/** Constituents storage GPU buffer (`array<vec2<f32>>` — df32 mat4 halves). */
|
|
52
56
|
constituentsBuf: GPUBuffer;
|
|
@@ -68,6 +72,17 @@ export class DerivedUniformsScene {
|
|
|
68
72
|
this.dispatcher = new DerivedUniformsDispatcher(device, {
|
|
69
73
|
constituentsBuf: () => this.constituentsBuf,
|
|
70
74
|
});
|
|
75
|
+
this.trafoTree = new TrafoTree(this);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Get-or-create the CHAIN records buffer for trie `level`. */
|
|
79
|
+
chainRecordsFor(level: number): RecordsBuffer {
|
|
80
|
+
let r = this.chainByLevel.get(level);
|
|
81
|
+
if (r === undefined) {
|
|
82
|
+
r = new RecordsBuffer();
|
|
83
|
+
this.chainByLevel.set(level, r);
|
|
84
|
+
}
|
|
85
|
+
return r;
|
|
71
86
|
}
|
|
72
87
|
|
|
73
88
|
/** Register (or replace) the GPUBuffer getter for a chunk's main
|
|
@@ -147,15 +162,21 @@ export class DerivedUniformsScene {
|
|
|
147
162
|
* main heap buffer. */
|
|
148
163
|
encode(enc: GPUCommandEncoder): boolean {
|
|
149
164
|
let any = false;
|
|
150
|
-
//
|
|
151
|
-
// shared constituents buffer.
|
|
152
|
-
//
|
|
153
|
-
|
|
165
|
+
// Chain pass — writes per-RO/per-node Model constituents (fwd+inv) into the
|
|
166
|
+
// shared constituents buffer. Dispatch trie LEVELS in ascending order: a
|
|
167
|
+
// level-L node reads its parent's (level L-1) output. Must run BEFORE the
|
|
168
|
+
// §7 passes that read the Models. MainHeap binding is unused here; bind any.
|
|
169
|
+
const levels = [...this.chainByLevel.keys()].sort((a, b) => a - b);
|
|
170
|
+
if (levels.length > 0) {
|
|
154
171
|
const anyHeap = this.firstHeapGetter();
|
|
155
172
|
if (anyHeap === undefined) {
|
|
156
173
|
throw new Error("derivedUniforms.encode: chain records present but no chunk main-heap registered to bind.");
|
|
157
174
|
}
|
|
158
|
-
|
|
175
|
+
for (const lvl of levels) {
|
|
176
|
+
const recs = this.chainByLevel.get(lvl)!;
|
|
177
|
+
if (recs.recordCount === 0) continue;
|
|
178
|
+
if (this.dispatcher.encodeChunk(enc, this.registry, recs, anyHeap)) any = true;
|
|
179
|
+
}
|
|
159
180
|
}
|
|
160
181
|
// Phase 2: §7 per-chunk (reads constituents incl. the chain-written Model).
|
|
161
182
|
for (const [chunkIdx, records] of this.recordsByChunk) {
|
|
@@ -178,6 +199,84 @@ export class DerivedUniformsScene {
|
|
|
178
199
|
}
|
|
179
200
|
}
|
|
180
201
|
|
|
202
|
+
// ─── Trafo suffix-trie (prefix sharing) ───────────────────────────────
|
|
203
|
+
//
|
|
204
|
+
// Dedups shared ancestor sub-chains across ROs. Each RO's chain is interned
|
|
205
|
+
// from the ROOT end, so sibling chains share trie nodes for their common
|
|
206
|
+
// ancestor suffix. A trie node owns a per-node Model constituent (fwd+inv) and
|
|
207
|
+
// two CHAIN records computing `node.world = link · parent.world` (and the
|
|
208
|
+
// reversed inverse) — at the node's depth LEVEL, so a shared ancestor is
|
|
209
|
+
// composed ONCE and every descendant reads it. Levels dispatch in ascending
|
|
210
|
+
// order (DerivedUniformsScene.encode). Refcounted: a node is freed when no RO
|
|
211
|
+
// path references it. See docs/gpu-transform-propagation.md (Phase 2).
|
|
212
|
+
|
|
213
|
+
export interface TrieNode {
|
|
214
|
+
readonly id: number;
|
|
215
|
+
readonly key: string;
|
|
216
|
+
readonly modelPair: PairedSlots;
|
|
217
|
+
readonly level: number;
|
|
218
|
+
readonly parent: TrieNode | undefined;
|
|
219
|
+
refcount: number;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export class TrafoTree {
|
|
223
|
+
private readonly byKey = new Map<string, TrieNode>();
|
|
224
|
+
private nextId = 0;
|
|
225
|
+
constructor(private readonly scene: DerivedUniformsScene) {}
|
|
226
|
+
|
|
227
|
+
/** Number of live trie nodes — diagnostics / tests (prefix-sharing check). */
|
|
228
|
+
get nodeCount(): number { return this.byKey.size; }
|
|
229
|
+
|
|
230
|
+
/** Intern a chain (array order `[leaf, …, root]`); returns the LEAF trie node
|
|
231
|
+
* whose Model is the full product. increfs every node on the path so shared
|
|
232
|
+
* ancestor nodes survive while any RO references them. */
|
|
233
|
+
intern(linkPairs: readonly PairedSlots[]): TrieNode {
|
|
234
|
+
let parent: TrieNode | undefined;
|
|
235
|
+
// Root end (last) → leaf (first), so shared ancestor suffixes share nodes.
|
|
236
|
+
for (let i = linkPairs.length - 1; i >= 0; i--) {
|
|
237
|
+
parent = this.internOne(parent, linkPairs[i]!);
|
|
238
|
+
}
|
|
239
|
+
if (parent === undefined) throw new Error("TrafoTree.intern: empty chain");
|
|
240
|
+
return parent;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** Decref every node on the leaf→root path; free those that hit 0. */
|
|
244
|
+
release(leaf: TrieNode): void {
|
|
245
|
+
let n: TrieNode | undefined = leaf;
|
|
246
|
+
while (n !== undefined) {
|
|
247
|
+
const parent: TrieNode | undefined = n.parent;
|
|
248
|
+
if (--n.refcount === 0) {
|
|
249
|
+
this.byKey.delete(n.key);
|
|
250
|
+
this.scene.chainRecordsFor(n.level).removeAllForOwner(n);
|
|
251
|
+
this.scene.constituents.freeOutputPair(n.modelPair);
|
|
252
|
+
}
|
|
253
|
+
n = parent;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private internOne(parent: TrieNode | undefined, link: PairedSlots): TrieNode {
|
|
258
|
+
const key = `${parent?.id ?? -1}:${link.fwd}`;
|
|
259
|
+
const existing = this.byKey.get(key);
|
|
260
|
+
if (existing !== undefined) { existing.refcount++; return existing; }
|
|
261
|
+
const level = parent === undefined ? 0 : parent.level + 1;
|
|
262
|
+
const modelPair = this.scene.constituents.allocOutputPair();
|
|
263
|
+
const node: TrieNode = { id: this.nextId++, key, modelPair, level, parent, refcount: 1 };
|
|
264
|
+
this.byKey.set(key, node);
|
|
265
|
+
const h = (s: number): number => makeHandle(SlotTag.Constituent, s);
|
|
266
|
+
const recs = this.scene.chainRecordsFor(level);
|
|
267
|
+
// node.world.fwd = link.fwd · parent.world.fwd (just link at the root end).
|
|
268
|
+
// node.world.inv = parent.world.inv · link.inv (reversed; just link at root).
|
|
269
|
+
if (parent === undefined) {
|
|
270
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.fwd), [1, h(link.fwd)]);
|
|
271
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.inv), [1, h(link.inv)]);
|
|
272
|
+
} else {
|
|
273
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.fwd), [2, h(link.fwd), h(parent.modelPair.fwd)]);
|
|
274
|
+
recs.add(node, CHAIN_RULE_ID, h(modelPair.inv), [2, h(parent.modelPair.inv), h(link.inv)]);
|
|
275
|
+
}
|
|
276
|
+
return node;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
181
280
|
// ─── Per-RO registration ──────────────────────────────────────────────
|
|
182
281
|
|
|
183
282
|
export interface RoDerivedRequest {
|
|
@@ -216,9 +315,9 @@ export interface RoRegistration {
|
|
|
216
315
|
readonly ruleHashes: readonly string[];
|
|
217
316
|
/** Chunk this registration was placed into — used by deregister. */
|
|
218
317
|
readonly chunkIdx: number;
|
|
219
|
-
/**
|
|
318
|
+
/** This RO's leaf trie node (transform propagation); its path is decref'd on
|
|
220
319
|
* deregister. Present iff the request carried a `modelChain`. */
|
|
221
|
-
readonly
|
|
320
|
+
readonly modelLeaf?: TrieNode;
|
|
222
321
|
}
|
|
223
322
|
|
|
224
323
|
export function registerRoDerivations(
|
|
@@ -271,21 +370,17 @@ export function registerRoDerivations(
|
|
|
271
370
|
// from its ancestor chain, and point §7's `Model` leaf at it. The chain pass
|
|
272
371
|
// (a separate, earlier dispatch) writes the fwd half from the links and the
|
|
273
372
|
// inv half from the reversed inverse links.
|
|
274
|
-
let
|
|
275
|
-
if (req.modelChain !== undefined) {
|
|
276
|
-
modelPair = scene.constituents.allocOutputPair();
|
|
277
|
-
pairByName.set("Model", modelPair);
|
|
373
|
+
let modelLeaf: TrieNode | undefined;
|
|
374
|
+
if (req.modelChain !== undefined && req.modelChain.length > 0) {
|
|
278
375
|
const linkPairs = req.modelChain.map((av) => {
|
|
279
376
|
acquiredAvals.push(av);
|
|
280
377
|
return scene.constituents.acquire(av);
|
|
281
378
|
});
|
|
282
|
-
|
|
283
|
-
//
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
scene.chainRecords.add(owner, CHAIN_RULE_ID, makeHandle(SlotTag.Constituent, modelPair.inv),
|
|
288
|
-
[n, ...linkPairs.slice().reverse().map((p) => makeHandle(SlotTag.Constituent, p.inv))]);
|
|
379
|
+
// Intern the chain into the suffix trie — siblings share ancestor nodes,
|
|
380
|
+
// each composed once (link · parent.world) at its level. The RO's Model is
|
|
381
|
+
// the leaf node's per-node Model constituent.
|
|
382
|
+
modelLeaf = scene.trafoTree.intern(linkPairs);
|
|
383
|
+
pairByName.set("Model", modelLeaf.modelPair);
|
|
289
384
|
}
|
|
290
385
|
|
|
291
386
|
for (const [outName, rule] of req.rules) {
|
|
@@ -308,14 +403,13 @@ export function registerRoDerivations(
|
|
|
308
403
|
scene.ensureConstituentsCapacity(scene.constituents.slotCount * DF32_MAT4_BYTES);
|
|
309
404
|
return {
|
|
310
405
|
owner, constituentAvals: acquiredAvals, ruleHashes, chunkIdx: req.chunkIdx,
|
|
311
|
-
...(
|
|
406
|
+
...(modelLeaf !== undefined ? { modelLeaf } : {}),
|
|
312
407
|
};
|
|
313
408
|
}
|
|
314
409
|
|
|
315
410
|
export function deregisterRoDerivations(scene: DerivedUniformsScene, reg: RoRegistration): void {
|
|
316
411
|
scene.recordsFor(reg.chunkIdx).removeAllForOwner(reg.owner);
|
|
317
|
-
scene.chainRecords.removeAllForOwner(reg.owner);
|
|
318
412
|
for (const h of reg.ruleHashes) scene.registry.release(h);
|
|
319
413
|
for (const av of reg.constituentAvals) scene.constituents.release(av);
|
|
320
|
-
if (reg.
|
|
414
|
+
if (reg.modelLeaf !== undefined) scene.trafoTree.release(reg.modelLeaf);
|
|
321
415
|
}
|