@aardworx/wombat.rendering 0.21.13 → 0.21.15
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/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/renderTree.d.ts +4 -0
- package/dist/core/renderTree.d.ts.map +1 -1
- package/dist/core/renderTree.js +1 -0
- package/dist/core/renderTree.js.map +1 -1
- package/dist/core/rowSet.d.ts +32 -0
- package/dist/core/rowSet.d.ts.map +1 -0
- package/dist/core/rowSet.js +36 -0
- package/dist/core/rowSet.js.map +1 -0
- package/dist/runtime/flattenTree.d.ts.map +1 -1
- package/dist/runtime/flattenTree.js +8 -0
- package/dist/runtime/flattenTree.js.map +1 -1
- package/dist/runtime/heapAdapter.d.ts.map +1 -1
- package/dist/runtime/heapAdapter.js +55 -2
- package/dist/runtime/heapAdapter.js.map +1 -1
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +11 -0
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/hybridScene.d.ts.map +1 -1
- package/dist/runtime/hybridScene.js +46 -4
- package/dist/runtime/hybridScene.js.map +1 -1
- package/dist/runtime/scenePass.d.ts +1 -1
- package/dist/runtime/scenePass.d.ts.map +1 -1
- package/dist/runtime/scenePass.js +6 -1
- package/dist/runtime/scenePass.js.map +1 -1
- package/package.json +1 -1
- package/src/core/index.ts +3 -0
- package/src/core/renderTree.ts +3 -1
- package/src/core/rowSet.ts +64 -0
- package/src/runtime/flattenTree.ts +8 -0
- package/src/runtime/heapAdapter.ts +45 -1
- package/src/runtime/heapScene.ts +8 -0
- package/src/runtime/hybridScene.ts +69 -13
- package/src/runtime/scenePass.ts +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybridScene.d.ts","sourceRoot":"","sources":["../../src/runtime/hybridScene.ts"],"names":[],"mappings":"AA6BA,OAAO,EACO,aAAa,EAAa,KAAK,IAAI,EAChD,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"hybridScene.d.ts","sourceRoot":"","sources":["../../src/runtime/hybridScene.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@ import { ASet, AVal, AdaptiveToken, } from "@aardworx/wombat.adaptive";
|
|
|
30
30
|
import { RenderTree } from "../core/renderTree.js";
|
|
31
31
|
import { ScenePass } from "./scenePass.js";
|
|
32
32
|
import { flattenRenderTree } from "./flattenTree.js";
|
|
33
|
+
import { materializeRow } from "../core/index.js";
|
|
33
34
|
import { isHeapEligible } from "./heapEligibility.js";
|
|
34
35
|
import { renderObjectToHeapSpec } from "./heapAdapter.js";
|
|
35
36
|
import { buildHeapScene } from "./heapScene.js";
|
|
@@ -77,7 +78,30 @@ export function compileHybridScene(device, signature, tree, opts = {}) {
|
|
|
77
78
|
}
|
|
78
79
|
return av;
|
|
79
80
|
};
|
|
80
|
-
|
|
81
|
+
// ─── Row sets (instance-tables M2 proper) ────────────────────────
|
|
82
|
+
// `Rows` nodes on the STATIC spine are consumed directly: the heap
|
|
83
|
+
// gets one choose stage per set (row → spec over the shared
|
|
84
|
+
// template), the flat pipeline never sees per-row RenderObjects.
|
|
85
|
+
// Rows under reactive containers stay in the tree and go through
|
|
86
|
+
// the materialization fallback (correct, just not accelerated).
|
|
87
|
+
// Producer contract (dom row lowering): a Rows node's template is
|
|
88
|
+
// heap-asserted and seeded before its first row arrives.
|
|
89
|
+
const rowSets = [];
|
|
90
|
+
const stripRows = (t) => {
|
|
91
|
+
switch (t.kind) {
|
|
92
|
+
case "Rows":
|
|
93
|
+
rowSets.push(t.set);
|
|
94
|
+
return RenderTree.empty;
|
|
95
|
+
case "Ordered":
|
|
96
|
+
return RenderTree.ordered(...t.children.map(stripRows));
|
|
97
|
+
case "Unordered":
|
|
98
|
+
return RenderTree.unordered(...t.children.map(stripRows));
|
|
99
|
+
default:
|
|
100
|
+
return t;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const strippedTree = stripRows(tree);
|
|
104
|
+
const flat = flattenRenderTree(strippedTree);
|
|
81
105
|
// ─── Atlas pool ──────────────────────────────────────────────────
|
|
82
106
|
// Per-scene Tier-S atlas pool. Owned by this hybrid scene; disposed
|
|
83
107
|
// alongside the heap path. The adapter consults it to classify
|
|
@@ -113,6 +137,12 @@ export function compileHybridScene(device, signature, tree, opts = {}) {
|
|
|
113
137
|
}
|
|
114
138
|
return spec;
|
|
115
139
|
};
|
|
140
|
+
// Row sets: one choose stage per set — row → spec via the cached
|
|
141
|
+
// materialized RO (prototype over the shared template). `undefined`
|
|
142
|
+
// (atlas-full) drops the row for the cycle, like the flat path.
|
|
143
|
+
const rowSpecSets = rowSets.map((set) => ASet.bind((on) => on
|
|
144
|
+
? set.rows.choose((row) => specOf(materializeRow(set, row)))
|
|
145
|
+
: ASet.empty(), heapEnabled));
|
|
116
146
|
// ONE fused stage: eligibility routes straight into the spec.
|
|
117
147
|
// Constant eligibility (asserted rows, fully-static ROs) takes the
|
|
118
148
|
// closure-free branch: an eager constant wrapper per RO — and the
|
|
@@ -130,7 +160,10 @@ export function compileHybridScene(device, signature, tree, opts = {}) {
|
|
|
130
160
|
}
|
|
131
161
|
return e.map((b) => (b ? specOf(ro) : undefined));
|
|
132
162
|
});
|
|
133
|
-
const
|
|
163
|
+
const allHeapSpecs = rowSpecSets.length === 0
|
|
164
|
+
? heapSpecAset
|
|
165
|
+
: ASet.unionMany(ASet.ofArray([heapSpecAset, ...rowSpecSets]));
|
|
166
|
+
const heapScene = buildHeapScene(device, signature, allHeapSpecs, {
|
|
134
167
|
fragmentOutputLayout,
|
|
135
168
|
atlasPool,
|
|
136
169
|
...(opts.enableFamilyMerge === true ? { enableFamilyMerge: true } : {}),
|
|
@@ -156,7 +189,7 @@ export function compileHybridScene(device, signature, tree, opts = {}) {
|
|
|
156
189
|
}
|
|
157
190
|
return l;
|
|
158
191
|
};
|
|
159
|
-
const
|
|
192
|
+
const legacyFromFlat = flat.chooseA((ro) => {
|
|
160
193
|
const e = elig(ro);
|
|
161
194
|
if (e.isConstant) {
|
|
162
195
|
// Why force here: constant — immutable by definition.
|
|
@@ -165,7 +198,16 @@ export function compileHybridScene(device, signature, tree, opts = {}) {
|
|
|
165
198
|
: AVal.constant(leafOf(ro));
|
|
166
199
|
}
|
|
167
200
|
return e.map((b) => (b ? undefined : leafOf(ro)));
|
|
168
|
-
})
|
|
201
|
+
});
|
|
202
|
+
// Row sets render legacy ONLY when the global heap toggle is off —
|
|
203
|
+
// with the (default) constant-true toggle the bind collapses and
|
|
204
|
+
// this contributes nothing.
|
|
205
|
+
const legacySet = rowSets.length === 0
|
|
206
|
+
? legacyFromFlat
|
|
207
|
+
: ASet.union(legacyFromFlat, ASet.bind((on) => on
|
|
208
|
+
? ASet.empty()
|
|
209
|
+
: ASet.unionMany(ASet.ofArray(rowSets.map((set) => set.rows.map((r) => leafOf(materializeRow(set, r)))))), heapEnabled));
|
|
210
|
+
const legacyTree = RenderTree.unorderedFromSet(legacySet);
|
|
169
211
|
const scenePass = new ScenePass(device, signature, legacyTree, compileEffect);
|
|
170
212
|
// DEBUG registry: per-hybrid-scene live draw counts (heap vs legacy) so
|
|
171
213
|
// multi-task pipelines (OIT) can be inspected from the console.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybridScene.js","sourceRoot":"","sources":["../../src/runtime/hybridScene.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hybridScene.js","sourceRoot":"","sources":["../../src/runtime/hybridScene.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type AdaptiveToken } from "@aardworx/wombat.adaptive";
|
|
2
|
-
import { type CompiledEffect, type Effect, type FramebufferSignature
|
|
2
|
+
import { RenderTree, type CompiledEffect, type Effect, type FramebufferSignature } from "../core/index.js";
|
|
3
3
|
import { type PreparedRenderObject } from "../resources/index.js";
|
|
4
4
|
/**
|
|
5
5
|
* Counters surfaced for tests. `prepareCount` only goes up when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenePass.d.ts","sourceRoot":"","sources":["../../src/runtime/scenePass.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,KAAK,aAAa,EAQnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"scenePass.d.ts","sourceRoot":"","sources":["../../src/runtime/scenePass.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,KAAK,aAAa,EAQnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,UAAU,EAEV,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,oBAAoB,EAE1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAS/B;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAwMD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAuB;gBAGhD,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,oBAAoB,EAC/B,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,KAAK,cAAc;IAM/E;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAIlC;;;;OAIG;IACH,OAAO,IAAI,oBAAoB,EAAE;IAMjC;;;;;;OAMG;IACH,cAAc,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAKzE;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,EAAE;IAKrD,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// list — that was a .NET↔native amortisation in the F# build with
|
|
16
16
|
// no analogue in WebGPU/JS.
|
|
17
17
|
import { MapExt, } from "@aardworx/wombat.adaptive";
|
|
18
|
-
import {} from "../core/index.js";
|
|
18
|
+
import { RenderTree, materializeRow, } from "../core/index.js";
|
|
19
19
|
import { prepareRenderObject, } from "../resources/index.js";
|
|
20
20
|
class NodeWalker {
|
|
21
21
|
}
|
|
@@ -224,6 +224,11 @@ function build(tree, ctx) {
|
|
|
224
224
|
case "Adaptive": return new AdaptiveWalker(tree.tree, ctx);
|
|
225
225
|
case "OrderedFromList": return new OrderedFromListWalker(tree.children, ctx);
|
|
226
226
|
case "UnorderedFromSet": return new UnorderedFromSetWalker(tree.children, ctx);
|
|
227
|
+
case "Rows":
|
|
228
|
+
// Desugar to an unordered set of materialized leaves — the
|
|
229
|
+
// legacy path keeps its per-RO machinery; the row store's fast
|
|
230
|
+
// path lives in the hybrid renderer.
|
|
231
|
+
return new UnorderedFromSetWalker(tree.set.rows.map((r) => RenderTree.leaf(materializeRow(tree.set, r))), ctx);
|
|
227
232
|
}
|
|
228
233
|
}
|
|
229
234
|
// ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenePass.js","sourceRoot":"","sources":["../../src/runtime/scenePass.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,mEAAmE;AACnE,qDAAqD;AACrD,0DAA0D;AAC1D,yBAAyB;AACzB,EAAE;AACF,kEAAkE;AAClE,kEAAkE;AAClE,gEAAgE;AAChE,iDAAiD;AACjD,EAAE;AACF,+DAA+D;AAC/D,qEAAqE;AACrE,mEAAmE;AACnE,kEAAkE;AAClE,4BAA4B;AAE5B,OAAO,EAIL,MAAM,GAKP,MAAM,2BAA2B,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"scenePass.js","sourceRoot":"","sources":["../../src/runtime/scenePass.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.21.
|
|
3
|
+
"version": "0.21.15",
|
|
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",
|
package/src/core/index.ts
CHANGED
package/src/core/renderTree.ts
CHANGED
|
@@ -16,7 +16,8 @@ export type RenderTree =
|
|
|
16
16
|
| { readonly kind: "Unordered"; readonly children: readonly RenderTree[] }
|
|
17
17
|
| { readonly kind: "Adaptive"; readonly tree: aval<RenderTree> }
|
|
18
18
|
| { readonly kind: "OrderedFromList"; readonly children: alist<RenderTree> }
|
|
19
|
-
| { readonly kind: "UnorderedFromSet"; readonly children: aset<RenderTree> }
|
|
19
|
+
| { readonly kind: "UnorderedFromSet"; readonly children: aset<RenderTree> }
|
|
20
|
+
| { readonly kind: "Rows"; readonly set: import("./rowSet.js").RenderRowSet };
|
|
20
21
|
|
|
21
22
|
export const RenderTree = {
|
|
22
23
|
empty: { kind: "Empty" } as const satisfies RenderTree,
|
|
@@ -26,4 +27,5 @@ export const RenderTree = {
|
|
|
26
27
|
adaptive: (tree: aval<RenderTree>): RenderTree => ({ kind: "Adaptive", tree }),
|
|
27
28
|
orderedFromList: (children: alist<RenderTree>): RenderTree => ({ kind: "OrderedFromList", children }),
|
|
28
29
|
unorderedFromSet: (children: aset<RenderTree>): RenderTree => ({ kind: "UnorderedFromSet", children }),
|
|
30
|
+
rows: (set: import("./rowSet.js").RenderRowSet): RenderTree => ({ kind: "Rows", set }),
|
|
29
31
|
} as const;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// RenderRowSet — the row store's render-side contract (instance-tables
|
|
2
|
+
// M2 proper). A collection of same-shaped draws is ONE shared template
|
|
3
|
+
// `RenderObject` plus an `aset` of thin rows; per row only the fields
|
|
4
|
+
// that actually differ are retained (~a hundred bytes), instead of a
|
|
5
|
+
// full RenderObject + provider graph + spec per element.
|
|
6
|
+
//
|
|
7
|
+
// `materializeRow` produces a REAL RenderObject via prototype
|
|
8
|
+
// inheritance — every consumer that predates the row store (legacy
|
|
9
|
+
// ScenePass, flatten fallback, eligibility) keeps working unchanged on
|
|
10
|
+
// materialized rows, so correctness never depends on the fast path.
|
|
11
|
+
|
|
12
|
+
import type { aval, aset } from "@aardworx/wombat.adaptive";
|
|
13
|
+
import type { Trafo3d } from "@aardworx/wombat.base";
|
|
14
|
+
import type { DrawCall } from "./drawCall.js";
|
|
15
|
+
import type { IAttributeProvider, IUniformProvider } from "./provider.js";
|
|
16
|
+
import type { RenderObject } from "./renderObject.js";
|
|
17
|
+
|
|
18
|
+
/** The per-row delta over a `RenderRowSet.template`. */
|
|
19
|
+
export interface RenderRow {
|
|
20
|
+
readonly uniforms: IUniformProvider;
|
|
21
|
+
readonly drawCall: aval<DrawCall>;
|
|
22
|
+
readonly instanceAttributes?: IAttributeProvider;
|
|
23
|
+
readonly pickId?: number;
|
|
24
|
+
readonly modelChain?: readonly aval<Trafo3d>[];
|
|
25
|
+
readonly active?: aval<boolean>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface RenderRowSet {
|
|
29
|
+
/**
|
|
30
|
+
* Shared fields — a RenderObject whose per-row fields are treated as
|
|
31
|
+
* DEFAULTS (rows override via prototype inheritance). The producer
|
|
32
|
+
* seeds it from the first lowered row; `template.heapAsserted` is
|
|
33
|
+
* expected for the direct heap path (unasserted sets fall back to
|
|
34
|
+
* materialized per-row consumption).
|
|
35
|
+
*
|
|
36
|
+
* Mutable ON PURPOSE: the tree node must exist before the first
|
|
37
|
+
* child arrives through the reactive children set.
|
|
38
|
+
*/
|
|
39
|
+
template: RenderObject | undefined;
|
|
40
|
+
readonly rows: aset<RenderRow>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const materialized = new WeakMap<RenderRow, RenderObject>();
|
|
44
|
+
|
|
45
|
+
/** Row → RenderObject with the set's template as prototype. Cached per
|
|
46
|
+
* row so aset deltas / eligibility caches see a stable identity. */
|
|
47
|
+
export function materializeRow(set: RenderRowSet, row: RenderRow): RenderObject {
|
|
48
|
+
let ro = materialized.get(row);
|
|
49
|
+
if (ro === undefined) {
|
|
50
|
+
if (set.template === undefined) {
|
|
51
|
+
throw new Error("materializeRow: RenderRowSet.template not seeded yet");
|
|
52
|
+
}
|
|
53
|
+
const o = Object.create(set.template) as Record<string, unknown>;
|
|
54
|
+
o["uniforms"] = row.uniforms;
|
|
55
|
+
o["drawCall"] = row.drawCall;
|
|
56
|
+
if (row.instanceAttributes !== undefined) o["instanceAttributes"] = row.instanceAttributes;
|
|
57
|
+
if (row.pickId !== undefined) o["pickId"] = row.pickId;
|
|
58
|
+
if (row.modelChain !== undefined) o["modelChain"] = row.modelChain;
|
|
59
|
+
if (row.active !== undefined) o["active"] = row.active;
|
|
60
|
+
ro = o as unknown as RenderObject;
|
|
61
|
+
materialized.set(row, ro);
|
|
62
|
+
}
|
|
63
|
+
return ro;
|
|
64
|
+
}
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
import { AListBridges } from "@aardworx/wombat.adaptive";
|
|
32
32
|
import type { RenderObject } from "../core/renderObject.js";
|
|
33
33
|
import type { RenderTree } from "../core/renderTree.js";
|
|
34
|
+
import { materializeRow } from "../core/rowSet.js";
|
|
34
35
|
|
|
35
36
|
/** True when `tree` contains no reactive nodes — its RenderObjects can
|
|
36
37
|
* be enumerated as a plain iterable (no inner aset / reader needed). */
|
|
@@ -168,5 +169,12 @@ export function flattenRenderTree(tree: RenderTree): aset<RenderObject> {
|
|
|
168
169
|
return flattenChildSet(AListBridges.toASet(tree.children));
|
|
169
170
|
case "UnorderedFromSet":
|
|
170
171
|
return flattenChildSet(tree.children);
|
|
172
|
+
case "Rows":
|
|
173
|
+
// Materialization fallback — prototype-derived RenderObjects
|
|
174
|
+
// with stable per-row identity. The hybrid renderer consumes
|
|
175
|
+
// row sets DIRECTLY (see hybridScene.collectRowSets) and never
|
|
176
|
+
// takes this path for them; it exists for the legacy ScenePass
|
|
177
|
+
// and for row sets under reactive containers.
|
|
178
|
+
return tree.set.rows.map((r) => materializeRow(tree.set, r));
|
|
171
179
|
}
|
|
172
180
|
}
|
|
@@ -167,6 +167,46 @@ function currentRefCellFor(av: aval<ITexture>, initial: number): { ref: number }
|
|
|
167
167
|
}
|
|
168
168
|
return c;
|
|
169
169
|
}
|
|
170
|
+
// ─── Value-interned constant wrappers ───────────────────────────────
|
|
171
|
+
// Collection rows repeat the same uniform VALUES (class colors, line
|
|
172
|
+
// widths) across thousands of rows. Wrapping each pull in a fresh
|
|
173
|
+
// `AVal.constant` costs ~100 B per row-pass AND defeats the pool's
|
|
174
|
+
// aval-identity sharing (every row gets its own arena slot for an
|
|
175
|
+
// identical value). Interning by VALUE makes equal constants share
|
|
176
|
+
// ONE wrapper — and therefore one pool entry per chunk.
|
|
177
|
+
const constPrimIntern = new Map<unknown, aval<unknown>>();
|
|
178
|
+
const constDataIntern = new Map<string, aval<unknown>>();
|
|
179
|
+
const constObjIntern = new WeakMap<object, aval<unknown>>();
|
|
180
|
+
function internConstant(v: unknown): aval<unknown> {
|
|
181
|
+
const t = typeof v;
|
|
182
|
+
if (t === "number" || t === "string" || t === "boolean") {
|
|
183
|
+
let av = constPrimIntern.get(v);
|
|
184
|
+
if (av === undefined) { av = AVal.constant(v); constPrimIntern.set(v, av); }
|
|
185
|
+
return av;
|
|
186
|
+
}
|
|
187
|
+
if (v !== null && t === "object") {
|
|
188
|
+
// Vector/matrix values expose `_data` (number[] or typed array) —
|
|
189
|
+
// key structurally so per-row `new V4f(...)` instances collapse.
|
|
190
|
+
const data = (v as { _data?: ArrayLike<number> })._data;
|
|
191
|
+
if (data !== undefined && typeof data.length === "number" && data.length <= 16) {
|
|
192
|
+
let key = String(data.length);
|
|
193
|
+
for (let i = 0; i < data.length; i++) key += "," + data[i];
|
|
194
|
+
let av = constDataIntern.get(key);
|
|
195
|
+
if (av === undefined) { av = AVal.constant(v); constDataIntern.set(key, av); }
|
|
196
|
+
return av;
|
|
197
|
+
}
|
|
198
|
+
let av = constObjIntern.get(v as object);
|
|
199
|
+
if (av === undefined) { av = AVal.constant(v); constObjIntern.set(v as object, av); }
|
|
200
|
+
return av;
|
|
201
|
+
}
|
|
202
|
+
return AVal.constant(v);
|
|
203
|
+
}
|
|
204
|
+
/** True when `v` quacks like an aval (matches `asAval`'s test). */
|
|
205
|
+
function isAvalLike(v: unknown): boolean {
|
|
206
|
+
return typeof v === "object" && v !== null
|
|
207
|
+
&& typeof (v as { getValue?: unknown }).getValue === "function";
|
|
208
|
+
}
|
|
209
|
+
|
|
170
210
|
function indicesAvalFor(ibAval: aval<IBuffer>, indexFormat: GPUIndexFormat, baseVertex: number): aval<Uint32Array> {
|
|
171
211
|
let byBase = indicesAvalCache.get(ibAval);
|
|
172
212
|
if (byBase === undefined) {
|
|
@@ -364,7 +404,11 @@ export function renderObjectToHeapSpec(
|
|
|
364
404
|
const pullUniform = (name: string): void => {
|
|
365
405
|
if (Object.prototype.hasOwnProperty.call(inputs, name)) return;
|
|
366
406
|
const av = uProv.tryGet(name);
|
|
367
|
-
if (av
|
|
407
|
+
if (av === undefined) return;
|
|
408
|
+
// Plain (non-aval) uniform values — e.g. row-scope constants
|
|
409
|
+
// resolved through a RowProvider hole — intern by VALUE so equal
|
|
410
|
+
// constants share one wrapper + one pool entry.
|
|
411
|
+
inputs[name] = isAvalLike(av) ? av : internConstant(av);
|
|
368
412
|
};
|
|
369
413
|
// §7-covered derived trafos (ModelViewProjTrafo, NormalMatrix, …) are
|
|
370
414
|
// GPU-computed from the M/V/P constituents — addDraw never reads their
|
package/src/runtime/heapScene.ts
CHANGED
|
@@ -1089,6 +1089,7 @@ export function buildHeapScene(
|
|
|
1089
1089
|
const activeDirty = new Set<number>();
|
|
1090
1090
|
|
|
1091
1091
|
function subscribeActive(av: aval<boolean>, drawId: number): void {
|
|
1092
|
+
if (av.isConstant) return; // fixed visibility — nothing will ever tick
|
|
1092
1093
|
let set = activeAvalToDrawIds.get(av);
|
|
1093
1094
|
if (set === undefined) {
|
|
1094
1095
|
set = new Set<number>();
|
|
@@ -1169,6 +1170,7 @@ export function buildHeapScene(
|
|
|
1169
1170
|
const countDirty = new Set<number>();
|
|
1170
1171
|
|
|
1171
1172
|
function subscribeCount(av: aval<number>, drawId: number): void {
|
|
1173
|
+
if (av.isConstant) return; // fixed count — nothing will ever tick
|
|
1172
1174
|
drawIdToCountAval.set(drawId, av);
|
|
1173
1175
|
drawIdToCountCallback.set(
|
|
1174
1176
|
drawId,
|
|
@@ -1231,6 +1233,12 @@ export function buildHeapScene(
|
|
|
1231
1233
|
}
|
|
1232
1234
|
|
|
1233
1235
|
function subscribeModeLeaf(av: aval<unknown>, drawId: number): void {
|
|
1236
|
+
// A CONSTANT leaf can never mark — subscribing would allocate a
|
|
1237
|
+
// MultiCallbackObject + callback Map + disposable + a draw-id Set
|
|
1238
|
+
// PER AVAL for nothing. At collection scale the per-row uniform
|
|
1239
|
+
// wrappers are overwhelmingly constants; this guard was worth
|
|
1240
|
+
// ~4-5 KB per row-pass (measured, WBOIT 2k).
|
|
1241
|
+
if (av.isConstant) return;
|
|
1234
1242
|
let set = modeAvalToDrawIds.get(av);
|
|
1235
1243
|
if (set === undefined) {
|
|
1236
1244
|
set = new Set<number>();
|
|
@@ -36,6 +36,7 @@ import { RenderTree } from "../core/renderTree.js";
|
|
|
36
36
|
import type { RenderObject } from "../core/renderObject.js";
|
|
37
37
|
import { ScenePass } from "./scenePass.js";
|
|
38
38
|
import { flattenRenderTree } from "./flattenTree.js";
|
|
39
|
+
import { materializeRow, type RenderRowSet } from "../core/index.js";
|
|
39
40
|
import { isHeapEligible } from "./heapEligibility.js";
|
|
40
41
|
import { renderObjectToHeapSpec } from "./heapAdapter.js";
|
|
41
42
|
import { buildHeapScene, type HeapDrawSpec, type HeapScene } from "./heapScene.js";
|
|
@@ -229,7 +230,30 @@ export function compileHybridScene(
|
|
|
229
230
|
return av;
|
|
230
231
|
};
|
|
231
232
|
|
|
232
|
-
|
|
233
|
+
// ─── Row sets (instance-tables M2 proper) ────────────────────────
|
|
234
|
+
// `Rows` nodes on the STATIC spine are consumed directly: the heap
|
|
235
|
+
// gets one choose stage per set (row → spec over the shared
|
|
236
|
+
// template), the flat pipeline never sees per-row RenderObjects.
|
|
237
|
+
// Rows under reactive containers stay in the tree and go through
|
|
238
|
+
// the materialization fallback (correct, just not accelerated).
|
|
239
|
+
// Producer contract (dom row lowering): a Rows node's template is
|
|
240
|
+
// heap-asserted and seeded before its first row arrives.
|
|
241
|
+
const rowSets: RenderRowSet[] = [];
|
|
242
|
+
const stripRows = (t: RenderTree): RenderTree => {
|
|
243
|
+
switch (t.kind) {
|
|
244
|
+
case "Rows":
|
|
245
|
+
rowSets.push(t.set);
|
|
246
|
+
return RenderTree.empty;
|
|
247
|
+
case "Ordered":
|
|
248
|
+
return RenderTree.ordered(...t.children.map(stripRows));
|
|
249
|
+
case "Unordered":
|
|
250
|
+
return RenderTree.unordered(...t.children.map(stripRows));
|
|
251
|
+
default:
|
|
252
|
+
return t;
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
const strippedTree = stripRows(tree);
|
|
256
|
+
const flat = flattenRenderTree(strippedTree);
|
|
233
257
|
|
|
234
258
|
// ─── Atlas pool ──────────────────────────────────────────────────
|
|
235
259
|
// Per-scene Tier-S atlas pool. Owned by this hybrid scene; disposed
|
|
@@ -266,6 +290,18 @@ export function compileHybridScene(
|
|
|
266
290
|
}
|
|
267
291
|
return spec;
|
|
268
292
|
};
|
|
293
|
+
// Row sets: one choose stage per set — row → spec via the cached
|
|
294
|
+
// materialized RO (prototype over the shared template). `undefined`
|
|
295
|
+
// (atlas-full) drops the row for the cycle, like the flat path.
|
|
296
|
+
const rowSpecSets = rowSets.map((set) =>
|
|
297
|
+
ASet.bind(
|
|
298
|
+
(on: boolean) =>
|
|
299
|
+
on
|
|
300
|
+
? set.rows.choose((row) => specOf(materializeRow(set, row)))
|
|
301
|
+
: ASet.empty<HeapDrawSpec>(),
|
|
302
|
+
heapEnabled,
|
|
303
|
+
));
|
|
304
|
+
|
|
269
305
|
// ONE fused stage: eligibility routes straight into the spec.
|
|
270
306
|
// Constant eligibility (asserted rows, fully-static ROs) takes the
|
|
271
307
|
// closure-free branch: an eager constant wrapper per RO — and the
|
|
@@ -284,7 +320,11 @@ export function compileHybridScene(
|
|
|
284
320
|
return e.map((b) => (b ? specOf(ro) : undefined));
|
|
285
321
|
});
|
|
286
322
|
|
|
287
|
-
const
|
|
323
|
+
const allHeapSpecs = rowSpecSets.length === 0
|
|
324
|
+
? heapSpecAset
|
|
325
|
+
: ASet.unionMany(ASet.ofArray([heapSpecAset, ...rowSpecSets]));
|
|
326
|
+
|
|
327
|
+
const heapScene: HeapScene = buildHeapScene(device, signature, allHeapSpecs, {
|
|
288
328
|
fragmentOutputLayout,
|
|
289
329
|
atlasPool,
|
|
290
330
|
...(opts.enableFamilyMerge === true ? { enableFamilyMerge: true } : {}),
|
|
@@ -308,17 +348,33 @@ export function compileHybridScene(
|
|
|
308
348
|
if (l === undefined) { l = RenderTree.leaf(ro); leafCache.set(ro, l); }
|
|
309
349
|
return l;
|
|
310
350
|
};
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
351
|
+
const legacyFromFlat = flat.chooseA((ro: RenderObject) => {
|
|
352
|
+
const e = elig(ro);
|
|
353
|
+
if (e.isConstant) {
|
|
354
|
+
// Why force here: constant — immutable by definition.
|
|
355
|
+
return e.force(/* allow-force */)
|
|
356
|
+
? (CONST_UNDEF as aval<RenderTree | undefined>)
|
|
357
|
+
: AVal.constant(leafOf(ro));
|
|
358
|
+
}
|
|
359
|
+
return e.map((b) => (b ? undefined : leafOf(ro)));
|
|
360
|
+
});
|
|
361
|
+
// Row sets render legacy ONLY when the global heap toggle is off —
|
|
362
|
+
// with the (default) constant-true toggle the bind collapses and
|
|
363
|
+
// this contributes nothing.
|
|
364
|
+
const legacySet = rowSets.length === 0
|
|
365
|
+
? legacyFromFlat
|
|
366
|
+
: ASet.union(
|
|
367
|
+
legacyFromFlat,
|
|
368
|
+
ASet.bind(
|
|
369
|
+
(on: boolean) =>
|
|
370
|
+
on
|
|
371
|
+
? ASet.empty<RenderTree>()
|
|
372
|
+
: ASet.unionMany(ASet.ofArray(rowSets.map((set) =>
|
|
373
|
+
set.rows.map((r) => leafOf(materializeRow(set, r)))))),
|
|
374
|
+
heapEnabled,
|
|
375
|
+
),
|
|
376
|
+
);
|
|
377
|
+
const legacyTree: RenderTree = RenderTree.unorderedFromSet(legacySet);
|
|
322
378
|
const scenePass = new ScenePass(device, signature, legacyTree, compileEffect);
|
|
323
379
|
// DEBUG registry: per-hybrid-scene live draw counts (heap vs legacy) so
|
|
324
380
|
// multi-task pipelines (OIT) can be inspected from the console.
|
package/src/runtime/scenePass.ts
CHANGED
|
@@ -26,11 +26,12 @@ import {
|
|
|
26
26
|
type aset,
|
|
27
27
|
} from "@aardworx/wombat.adaptive";
|
|
28
28
|
import {
|
|
29
|
+
RenderTree,
|
|
30
|
+
materializeRow,
|
|
29
31
|
type CompiledEffect,
|
|
30
32
|
type Effect,
|
|
31
33
|
type FramebufferSignature,
|
|
32
34
|
type RenderObject,
|
|
33
|
-
type RenderTree,
|
|
34
35
|
} from "../core/index.js";
|
|
35
36
|
import {
|
|
36
37
|
prepareRenderObject,
|
|
@@ -238,6 +239,12 @@ function build(tree: RenderTree, ctx: BuildContext): NodeWalker {
|
|
|
238
239
|
case "Adaptive": return new AdaptiveWalker(tree.tree, ctx);
|
|
239
240
|
case "OrderedFromList": return new OrderedFromListWalker(tree.children, ctx);
|
|
240
241
|
case "UnorderedFromSet": return new UnorderedFromSetWalker(tree.children, ctx);
|
|
242
|
+
case "Rows":
|
|
243
|
+
// Desugar to an unordered set of materialized leaves — the
|
|
244
|
+
// legacy path keeps its per-RO machinery; the row store's fast
|
|
245
|
+
// path lives in the hybrid renderer.
|
|
246
|
+
return new UnorderedFromSetWalker(
|
|
247
|
+
tree.set.rows.map((r) => RenderTree.leaf(materializeRow(tree.set, r))), ctx);
|
|
241
248
|
}
|
|
242
249
|
}
|
|
243
250
|
|