@aardworx/wombat.rendering 0.19.23 → 0.19.25
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/elementType.d.ts +2 -0
- package/dist/core/elementType.d.ts.map +1 -1
- package/dist/core/elementType.js +10 -0
- package/dist/core/elementType.js.map +1 -1
- package/dist/core/provider.d.ts.map +1 -1
- package/dist/core/provider.js +65 -32
- package/dist/core/provider.js.map +1 -1
- package/dist/core/renderObject.d.ts +9 -0
- package/dist/core/renderObject.d.ts.map +1 -1
- package/dist/resources/preparedRenderObject.d.ts.map +1 -1
- package/dist/resources/preparedRenderObject.js +19 -2
- package/dist/resources/preparedRenderObject.js.map +1 -1
- package/dist/runtime/derivedModes/modeKeyCpu.d.ts +2 -12
- package/dist/runtime/derivedModes/modeKeyCpu.d.ts.map +1 -1
- package/dist/runtime/derivedModes/modeKeyCpu.js +30 -13
- package/dist/runtime/derivedModes/modeKeyCpu.js.map +1 -1
- package/dist/runtime/derivedModes/partitionDispatcher.d.ts +11 -0
- package/dist/runtime/derivedModes/partitionDispatcher.d.ts.map +1 -1
- package/dist/runtime/derivedModes/partitionDispatcher.js +31 -0
- package/dist/runtime/derivedModes/partitionDispatcher.js.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.d.ts +5 -1
- package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.js +28 -13
- package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
- package/dist/runtime/derivedUniforms/records.d.ts +15 -0
- package/dist/runtime/derivedUniforms/records.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/records.js +81 -14
- package/dist/runtime/derivedUniforms/records.js.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +6 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.js +9 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
- package/dist/runtime/flattenTree.d.ts.map +1 -1
- package/dist/runtime/flattenTree.js +46 -2
- package/dist/runtime/flattenTree.js.map +1 -1
- package/dist/runtime/heapAdapter.d.ts +3 -1
- package/dist/runtime/heapAdapter.d.ts.map +1 -1
- package/dist/runtime/heapAdapter.js +42 -4
- package/dist/runtime/heapAdapter.js.map +1 -1
- package/dist/runtime/heapDecoder.d.ts.map +1 -1
- package/dist/runtime/heapDecoder.js +8 -3
- package/dist/runtime/heapDecoder.js.map +1 -1
- package/dist/runtime/heapEffect.d.ts +14 -1
- package/dist/runtime/heapEffect.d.ts.map +1 -1
- package/dist/runtime/heapEffect.js +13 -1
- package/dist/runtime/heapEffect.js.map +1 -1
- package/dist/runtime/heapEffectIR.d.ts.map +1 -1
- package/dist/runtime/heapEffectIR.js +18 -9
- package/dist/runtime/heapEffectIR.js.map +1 -1
- package/dist/runtime/heapEligibility.d.ts.map +1 -1
- package/dist/runtime/heapEligibility.js +64 -12
- package/dist/runtime/heapEligibility.js.map +1 -1
- package/dist/runtime/heapIrBuilders.d.ts +8 -0
- package/dist/runtime/heapIrBuilders.d.ts.map +1 -1
- package/dist/runtime/heapIrBuilders.js +47 -2
- package/dist/runtime/heapIrBuilders.js.map +1 -1
- package/dist/runtime/heapScene/chunkedArena.d.ts +20 -28
- package/dist/runtime/heapScene/chunkedArena.d.ts.map +1 -1
- package/dist/runtime/heapScene/chunkedArena.js +28 -91
- package/dist/runtime/heapScene/chunkedArena.js.map +1 -1
- package/dist/runtime/heapScene/freelist.d.ts +1 -1
- package/dist/runtime/heapScene/freelist.js +3 -3
- package/dist/runtime/heapScene/freelist.js.map +1 -1
- package/dist/runtime/heapScene/pools.d.ts +103 -59
- package/dist/runtime/heapScene/pools.d.ts.map +1 -1
- package/dist/runtime/heapScene/pools.js +335 -194
- package/dist/runtime/heapScene/pools.js.map +1 -1
- package/dist/runtime/heapScene.d.ts +116 -1
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +581 -125
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/hybridScene.d.ts.map +1 -1
- package/dist/runtime/hybridScene.js +19 -3
- package/dist/runtime/hybridScene.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/package.json +1 -1
- package/src/core/elementType.ts +10 -0
- package/src/core/provider.ts +56 -28
- package/src/core/renderObject.ts +9 -0
- package/src/resources/preparedRenderObject.ts +22 -3
- package/src/runtime/derivedModes/modeKeyCpu.ts +26 -11
- package/src/runtime/derivedModes/partitionDispatcher.ts +30 -0
- package/src/runtime/derivedUniforms/dispatch.ts +26 -10
- package/src/runtime/derivedUniforms/records.ts +70 -15
- package/src/runtime/derivedUniforms/sceneIntegration.ts +10 -0
- package/src/runtime/flattenTree.ts +47 -2
- package/src/runtime/heapAdapter.ts +40 -5
- package/src/runtime/heapDecoder.ts +8 -3
- package/src/runtime/heapEffect.ts +15 -1
- package/src/runtime/heapEffectIR.ts +18 -9
- package/src/runtime/heapEligibility.ts +39 -12
- package/src/runtime/heapIrBuilders.ts +50 -2
- package/src/runtime/heapScene/chunkedArena.ts +29 -94
- package/src/runtime/heapScene/freelist.ts +3 -3
- package/src/runtime/heapScene/pools.ts +340 -218
- package/src/runtime/heapScene.ts +717 -141
- package/src/runtime/hybridScene.ts +20 -3
- package/src/runtime/index.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybridScene.d.ts","sourceRoot":"","sources":["../../src/runtime/hybridScene.ts"],"names":[],"mappings":"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
|
|
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;AAOnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAK5D,MAAM,WAAW,yBAAyB;IACxC;;;;;;OAMG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IACrD;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,oBAAoB,KAAK,cAAc,CAAC;IAClF;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC;;OAEG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IACtE;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1E;;;;OAIG;IACH,QAAQ,IAAI,OAAO,CAAC;IACpB;;;;OAIG;IACH,eAAe,IAAI,MAAM,CAAC;IAC1B,oDAAoD;IACpD,cAAc,IAAI,MAAM,CAAC;IACzB,+DAA+D;IAC/D,cAAc,IAAI,MAAM,CAAC;IACzB,kEAAkE;IAClE,iBAAiB,IAAI,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,aAAa,IAAI,MAAM,CAAC;IACxB,6DAA6D;IAC7D,kBAAkB,IAAI;QACpB,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;KACrE,CAAC;IACF;;;0DAGsD;IACtD,YAAY,IAAI,OAAO,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAChC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QACpE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QACjD,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH;;;sEAGkE;IAClE,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,YAAY,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;KACrD,CAAC,CAAC;IACH;;;oEAGgE;IAChE,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3C,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;KAC/D,CAAC,CAAC;IACH;oEACgE;IAChE,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAChD,gBAAgB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;KAC/D,CAAC,CAAC;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAQD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,oBAAoB,EAC/B,IAAI,EAAE,UAAU,EAChB,IAAI,GAAE,yBAA8B,GACnC,WAAW,CAuKb"}
|
|
@@ -51,18 +51,32 @@ export function compileHybridScene(device, signature, tree, opts = {}) {
|
|
|
51
51
|
// toggle — flipping that off forces every RO to legacy.
|
|
52
52
|
const heapEnabled = opts.heapEnabled ?? AVal.constant(true);
|
|
53
53
|
const eligCache = new WeakMap();
|
|
54
|
+
const notEligCache = new WeakMap();
|
|
54
55
|
const elig = (ro) => {
|
|
55
56
|
let av = eligCache.get(ro);
|
|
56
57
|
if (av === undefined) {
|
|
57
58
|
const perRO = isHeapEligible(ro);
|
|
58
|
-
|
|
59
|
+
// Constant collapse (static RO + constant heapEnabled): a plain
|
|
60
|
+
// constant instead of a custom aval + two subscriptions per RO.
|
|
61
|
+
av = heapEnabled.isConstant && perRO.isConstant
|
|
62
|
+
? AVal.constant(heapEnabled.force( /* allow-force */) && perRO.force( /* allow-force */))
|
|
63
|
+
: AVal.custom(t => heapEnabled.getValue(t) && perRO.getValue(t));
|
|
59
64
|
eligCache.set(ro, av);
|
|
60
65
|
}
|
|
61
66
|
return av;
|
|
62
67
|
};
|
|
68
|
+
const notElig = (ro) => {
|
|
69
|
+
let av = notEligCache.get(ro);
|
|
70
|
+
if (av === undefined) {
|
|
71
|
+
const e = elig(ro);
|
|
72
|
+
av = e.isConstant ? AVal.constant(!e.force( /* allow-force */)) : e.map(b => !b);
|
|
73
|
+
notEligCache.set(ro, av);
|
|
74
|
+
}
|
|
75
|
+
return av;
|
|
76
|
+
};
|
|
63
77
|
const flat = flattenRenderTree(tree);
|
|
64
78
|
const heapAset = flat.filterA(ro => elig(ro));
|
|
65
|
-
const legacyAset = flat.filterA(ro =>
|
|
79
|
+
const legacyAset = flat.filterA(ro => notElig(ro));
|
|
66
80
|
// ─── Atlas pool ──────────────────────────────────────────────────
|
|
67
81
|
// Per-scene Tier-S atlas pool. Owned by this hybrid scene; disposed
|
|
68
82
|
// alongside the heap path. The adapter consults it to classify
|
|
@@ -82,7 +96,9 @@ export function compileHybridScene(device, signature, tree, opts = {}) {
|
|
|
82
96
|
const heapSpecAset = heapAset.map((ro) => {
|
|
83
97
|
let spec = specCache.get(ro);
|
|
84
98
|
if (spec === undefined) {
|
|
85
|
-
spec = renderObjectToHeapSpec(ro, AdaptiveToken.top, atlasPool
|
|
99
|
+
spec = renderObjectToHeapSpec(ro, AdaptiveToken.top, atlasPool, {
|
|
100
|
+
enableDerivedUniforms: opts.enableDerivedUniforms !== false,
|
|
101
|
+
});
|
|
86
102
|
specCache.set(ro, spec);
|
|
87
103
|
}
|
|
88
104
|
return spec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybridScene.js","sourceRoot":"","sources":["../../src/runtime/hybridScene.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,kDAAkD;AAClD,EAAE;AACF,YAAY;AACZ,sEAAsE;AACtE,mCAAmC;AACnC,oEAAoE;AACpE,qEAAqE;AACrE,iDAAiD;AACjD,sEAAsE;AACtE,kEAAkE;AAClE,oEAAoE;AACpE,yDAAyD;AACzD,wEAAwE;AACxE,kEAAkE;AAClE,iCAAiC;AACjC,EAAE;AACF,aAAa;AACb,kEAAkE;AAClE,4CAA4C;AAC5C,gEAAgE;AAChE,oDAAoD;AACpD,EAAE;AACF,iEAAiE;AACjE,oEAAoE;AACpE,kEAAkE;AAClE,sEAAsE;AACtE,+BAA+B;AAE/B,OAAO,EACL,IAAI,EAAE,IAAI,EAAE,aAAa,GAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAqC,MAAM,gBAAgB,CAAC;AAEnF,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,KAAM,IAAkC,CAAC;AAiIzC,SAAS,2BAA2B,CAAC,GAAyB;IAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,SAA+B,EAC/B,IAAgB,EAChB,OAAkC,EAAE;IAEpC,MAAM,oBAAoB,GACxB,IAAI,CAAC,oBAAoB,IAAI,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,aAAa,GACjB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAS,EAAE,IAA0B,EAAE,EAAE,CAC/D,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;IAEzD,oEAAoE;IACpE,oEAAoE;IACpE,mEAAmE;IACnE,iEAAiE;IACjE,gEAAgE;IAChE,wDAAwD;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,OAAO,EAA+B,CAAC;IAC7D,MAAM,IAAI,GAAG,CAAC,EAAgB,EAAiB,EAAE;QAC/C,IAAI,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;YACjC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hybridScene.js","sourceRoot":"","sources":["../../src/runtime/hybridScene.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { compileRenderTask, type RuntimeContext, } from "./renderTask.js";
|
|
|
3
3
|
export { copy } from "./copy.js";
|
|
4
4
|
export { renderTo, type RenderToOptions, type RenderToResult, } from "./renderTo.js";
|
|
5
5
|
export { ScenePass, type WalkerStats, } from "./scenePass.js";
|
|
6
|
-
export { buildHeapScene, type HeapScene, type HeapSceneStats, type HeapDrawSpec, type HeapGeometry, type HeapTextureSet, type BuildHeapSceneOptions, } from "./heapScene.js";
|
|
6
|
+
export { buildHeapScene, createHeapStorage, oct32, c4b, type HeapPackedAttribute, type HeapScene, type HeapStorage, type HeapStorageOptions, type HeapSceneStats, type HeapDrawSpec, type HeapGeometry, type HeapTextureSet, type BuildHeapSceneOptions, } from "./heapScene.js";
|
|
7
7
|
export { compileHeapEffect, type CompiledHeapEffect, type FragmentOutputLayout, } from "./heapEffect.js";
|
|
8
8
|
export { flattenRenderTree } from "./flattenTree.js";
|
|
9
9
|
export { isHeapEligible } from "./heapEligibility.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { compileRenderTask, } from "./renderTask.js";
|
|
|
4
4
|
export { copy } from "./copy.js";
|
|
5
5
|
export { renderTo, } from "./renderTo.js";
|
|
6
6
|
export { ScenePass, } from "./scenePass.js";
|
|
7
|
-
export { buildHeapScene, } from "./heapScene.js";
|
|
7
|
+
export { buildHeapScene, createHeapStorage, oct32, c4b, } from "./heapScene.js";
|
|
8
8
|
export { compileHeapEffect, } from "./heapEffect.js";
|
|
9
9
|
export { flattenRenderTree } from "./flattenTree.js";
|
|
10
10
|
export { isHeapEligible } from "./heapEligibility.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,EACL,OAAO,GAER,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,QAAQ,GAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,GAEV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,EACL,OAAO,GAER,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,QAAQ,GAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,GAEV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,EAAE,GAAG,GAUX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,GAGlB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,uFAAuF;AACvF,OAAO,EACL,cAAc,EAAE,WAAW,EAC3B,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAE7C,sBAAsB,EAAE,qBAAqB,GAC9C,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,kBAAkB,GAGnB,MAAM,kBAAkB,CAAC;AAE1B,uEAAuE;AACvE,OAAO,EACL,SAAS,EACT,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,KAAK,IAAI,mBAAmB,EAC5B,OAAO,IAAI,qBAAqB,EAChC,KAAK,IAAI,mBAAmB,EAC5B,SAAS,IAAI,uBAAuB,EACpC,MAAM,IAAI,oBAAoB,EAC9B,UAAU,IAAI,wBAAwB,EACtC,UAAU,IAAI,wBAAwB,GACvC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,GAKjB,MAAM,6BAA6B,CAAC;AAErC,sEAAsE;AACtE,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,GAWjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,SAAS,GAEV,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,GAGrB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,WAAW,EACX,iBAAiB,GAIlB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAA2B,MAAM,uCAAuC,CAAC;AACnG,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EAAE,yBAAyB,EAC9C,yBAAyB,EACzB,2BAA2B,GAE5B,MAAM,iCAAiC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aardworx/wombat.rendering",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.25",
|
|
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/elementType.ts
CHANGED
|
@@ -82,6 +82,14 @@ const _V3u = new ElementKind<V3i>("v3u", 12, "uint32x3", undefined);
|
|
|
82
82
|
const _V4u = new ElementKind<V4i>("v4u", 16, "uint32x4", undefined);
|
|
83
83
|
const _F32 = new ElementKind<number>("f32", 4, "float32", undefined);
|
|
84
84
|
const _U32 = new ElementKind<number>("u32", 4, "uint32", "uint32");
|
|
85
|
+
// Packed vertex encodings — HEAP-ONLY (no native GPUVertexFormat
|
|
86
|
+
// decodes them): `oct32` = unit vec3 as 2×unorm16 octahedral in one
|
|
87
|
+
// u32 (shader type vec3<f32>); `c4b` = RGBA8-unorm in one u32 (shader
|
|
88
|
+
// type vec4<f32>). The heap VS decodes them via its typeId arms
|
|
89
|
+
// (ENC_OCT32 / ENC_C4B); the classic path rejects them at pipeline
|
|
90
|
+
// creation. 4 bytes/element instead of 12/16.
|
|
91
|
+
const _Oct32 = new ElementKind<import("@aardworx/wombat.base").V3f>("oct32", 4, undefined, undefined);
|
|
92
|
+
const _C4b = new ElementKind<import("@aardworx/wombat.base").V4f>("c4b", 4, undefined, undefined);
|
|
85
93
|
const _I32 = new ElementKind<number>("i32", 4, "sint32", undefined);
|
|
86
94
|
const _U16 = new ElementKind<number>("u16", 2, undefined, "uint16");
|
|
87
95
|
const _I16 = new ElementKind<number>("i16", 2, undefined, undefined);
|
|
@@ -167,6 +175,8 @@ export const ElementType = {
|
|
|
167
175
|
V2u: _V2u, V3u: _V3u, V4u: _V4u,
|
|
168
176
|
// Scalars
|
|
169
177
|
F32: _F32, U32: _U32, I32: _I32,
|
|
178
|
+
// Packed vertex encodings (heap-only decode)
|
|
179
|
+
Oct32: _Oct32, C4b: _C4b,
|
|
170
180
|
U16: _U16, I16: _I16, U8: _U8, I8: _I8,
|
|
171
181
|
|
|
172
182
|
/** Infer from a wombat.base packed array or a native TypedArray. */
|
package/src/core/provider.ts
CHANGED
|
@@ -51,6 +51,57 @@ function hasOwn(o: object, k: string): boolean {
|
|
|
51
51
|
|
|
52
52
|
const EMPTY_NAMES: readonly string[] = [];
|
|
53
53
|
|
|
54
|
+
// Class-based providers: methods live on the prototype, so a provider
|
|
55
|
+
// instance is ONE small object instead of an object + 2 closures + a
|
|
56
|
+
// shared closure context. At heap scale (a provider per RenderObject)
|
|
57
|
+
// that difference is measurable JS-heap ballast.
|
|
58
|
+
|
|
59
|
+
class MapProvider<T> {
|
|
60
|
+
constructor(private readonly m: HashMap<string, T>) {}
|
|
61
|
+
tryGet(n: string): T | undefined { return this.m.tryFind(n); }
|
|
62
|
+
names(): Iterable<string> { return mapKeys(this.m); }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
class ObjectProvider<T> {
|
|
66
|
+
constructor(private readonly o: Readonly<Record<string, T>>) {}
|
|
67
|
+
tryGet(n: string): T | undefined { return hasOwn(this.o, n) ? this.o[n] : undefined; }
|
|
68
|
+
names(): Iterable<string> { return Object.keys(this.o); }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
class UnionProvider<T> {
|
|
72
|
+
constructor(private readonly ps: readonly { tryGet(name: string): T | undefined; names(): Iterable<string> }[]) {}
|
|
73
|
+
tryGet(n: string): T | undefined {
|
|
74
|
+
for (let i = 0; i < this.ps.length; i++) {
|
|
75
|
+
const v = this.ps[i]!.tryGet(n);
|
|
76
|
+
if (v !== undefined) return v;
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
names(): Iterable<string> {
|
|
81
|
+
const s = new Set<string>();
|
|
82
|
+
for (const p of this.ps) for (const n of p.names()) s.add(n);
|
|
83
|
+
return s;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
class LazyProvider<T> {
|
|
88
|
+
private readonly cache = new Map<string, T | undefined>();
|
|
89
|
+
constructor(
|
|
90
|
+
private readonly known: readonly string[],
|
|
91
|
+
private readonly compute: (name: string) => T | undefined,
|
|
92
|
+
) {}
|
|
93
|
+
tryGet(n: string): T | undefined {
|
|
94
|
+
const hit = this.cache.get(n);
|
|
95
|
+
if (hit !== undefined || this.cache.has(n)) return hit;
|
|
96
|
+
const v = this.compute(n);
|
|
97
|
+
this.cache.set(n, v);
|
|
98
|
+
return v;
|
|
99
|
+
}
|
|
100
|
+
names(): Iterable<string> { return this.known; }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const EMPTY_PROVIDER = { tryGet: (): undefined => undefined, names: (): Iterable<string> => EMPTY_NAMES };
|
|
104
|
+
|
|
54
105
|
function makeProvider<T>(): {
|
|
55
106
|
empty: { tryGet(name: string): T | undefined; names(): Iterable<string> };
|
|
56
107
|
ofMap(m: HashMap<string, T>): { tryGet(name: string): T | undefined; names(): Iterable<string> };
|
|
@@ -59,15 +110,15 @@ function makeProvider<T>(): {
|
|
|
59
110
|
lazy(known: readonly string[], compute: (name: string) => T | undefined): { tryGet(name: string): T | undefined; names(): Iterable<string> };
|
|
60
111
|
} {
|
|
61
112
|
type P = { tryGet(name: string): T | undefined; names(): Iterable<string> };
|
|
62
|
-
const empty
|
|
113
|
+
const empty = EMPTY_PROVIDER as P;
|
|
63
114
|
return {
|
|
64
115
|
empty,
|
|
65
116
|
ofMap(m: HashMap<string, T>): P {
|
|
66
117
|
if (m.containsKey === undefined) return empty; // defensive
|
|
67
|
-
return
|
|
118
|
+
return new MapProvider(m);
|
|
68
119
|
},
|
|
69
120
|
ofObject(o: Readonly<Record<string, T>>): P {
|
|
70
|
-
return
|
|
121
|
+
return new ObjectProvider(o);
|
|
71
122
|
},
|
|
72
123
|
/** First non-`undefined` wins. Pass providers in priority order —
|
|
73
124
|
* e.g. `[leafAttrs, scopeAttrs]` so a leaf shadows the scope, or
|
|
@@ -75,36 +126,13 @@ function makeProvider<T>(): {
|
|
|
75
126
|
union(...ps: P[]): P {
|
|
76
127
|
if (ps.length === 0) return empty;
|
|
77
128
|
if (ps.length === 1) return ps[0]!;
|
|
78
|
-
return
|
|
79
|
-
tryGet: (n) => {
|
|
80
|
-
for (let i = 0; i < ps.length; i++) {
|
|
81
|
-
const v = ps[i]!.tryGet(n);
|
|
82
|
-
if (v !== undefined) return v;
|
|
83
|
-
}
|
|
84
|
-
return undefined;
|
|
85
|
-
},
|
|
86
|
-
names: () => {
|
|
87
|
-
const s = new Set<string>();
|
|
88
|
-
for (const p of ps) for (const n of p.names()) s.add(n);
|
|
89
|
-
return s;
|
|
90
|
-
},
|
|
91
|
-
};
|
|
129
|
+
return new UnionProvider(ps);
|
|
92
130
|
},
|
|
93
131
|
/** `compute(name)` runs the first time `name` is requested; the
|
|
94
132
|
* result (incl. `undefined`) is memoised. `known` is the cheap
|
|
95
133
|
* list of names `compute` can produce. */
|
|
96
134
|
lazy(known: readonly string[], compute: (name: string) => T | undefined): P {
|
|
97
|
-
|
|
98
|
-
return {
|
|
99
|
-
tryGet: (n) => {
|
|
100
|
-
const hit = cache.get(n);
|
|
101
|
-
if (hit !== undefined || cache.has(n)) return hit;
|
|
102
|
-
const v = compute(n);
|
|
103
|
-
cache.set(n, v);
|
|
104
|
-
return v;
|
|
105
|
-
},
|
|
106
|
-
names: () => known,
|
|
107
|
-
};
|
|
135
|
+
return new LazyProvider(known, compute);
|
|
108
136
|
},
|
|
109
137
|
};
|
|
110
138
|
}
|
package/src/core/renderObject.ts
CHANGED
|
@@ -67,6 +67,15 @@ export interface RenderObject {
|
|
|
67
67
|
/** Index buffer for indexed draws. */
|
|
68
68
|
readonly indices?: BufferView;
|
|
69
69
|
readonly drawCall: aval<DrawCall>;
|
|
70
|
+
/**
|
|
71
|
+
* Optional picking id (u32 < 2^24). First-class instead of a
|
|
72
|
+
* `PickId` uniform: one unique `AVal.constant` per RO would drag a
|
|
73
|
+
* pool entry + per-RO provider identity + adaptive bookkeeping in —
|
|
74
|
+
* measured ~6.5 KB of JS heap PER RO at scale. The heap path writes
|
|
75
|
+
* this INLINE into the drawHeader (like `__layoutId`); the classic
|
|
76
|
+
* path synthesizes the `PickId` uniform from it.
|
|
77
|
+
*/
|
|
78
|
+
readonly pickId?: number;
|
|
70
79
|
/**
|
|
71
80
|
* Optional gate: when `active` ticks to `false`, the runtime must
|
|
72
81
|
* skip drawing this RO this frame **without** releasing pool
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// PreparedRenderObject so flipping a non-pipeline-affecting field
|
|
13
13
|
// (`stencilReference`, `blendConstant`) does NOT trigger a recompile.
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { type IUniformProvider,
|
|
16
16
|
AdaptiveResource,
|
|
17
17
|
AttributeProvider,
|
|
18
18
|
BufferView,
|
|
@@ -736,8 +736,16 @@ export function prepareRenderObject(
|
|
|
736
736
|
const perGroup: EntryDesc[][] = [];
|
|
737
737
|
for (let g = 0; g <= maxGroup; g++) perGroup.push([]);
|
|
738
738
|
|
|
739
|
+
// First-class `RenderObject.pickId` → synthesized `PickId` uniform on
|
|
740
|
+
// the classic path (the heap path writes it inline into the
|
|
741
|
+
// drawHeader instead — see INLINE_HEADER_UNIFORMS). Classic scenes
|
|
742
|
+
// are small, so a per-RO constant aval is fine here.
|
|
743
|
+
const uniformSource: IUniformProvider = obj.pickId !== undefined
|
|
744
|
+
? withPickId(obj.pickId, asUniformProvider(obj.uniforms))
|
|
745
|
+
: asUniformProvider(obj.uniforms);
|
|
746
|
+
|
|
739
747
|
for (const ub of iface.uniformBlocks) {
|
|
740
|
-
const merged = mergeUniformInputs(
|
|
748
|
+
const merged = mergeUniformInputs(uniformSource, effect.avalBindings, ub);
|
|
741
749
|
const block = ubAsBlock(ub);
|
|
742
750
|
const res = prepareUniformBuffer(device, block, merged, {
|
|
743
751
|
...(opts.label !== undefined ? { label: `${opts.label}.${ub.name}` } : {}),
|
|
@@ -811,7 +819,9 @@ export function prepareRenderObject(
|
|
|
811
819
|
// the RO's provider (resolving nested derived-uniform rules too).
|
|
812
820
|
let modeUniformReader: ((name: string, token: AdaptiveToken) => unknown) | undefined;
|
|
813
821
|
if (obj.modeRules !== undefined) {
|
|
814
|
-
const uniProv =
|
|
822
|
+
const uniProv = obj.pickId !== undefined
|
|
823
|
+
? withPickId(obj.pickId, asUniformProvider(obj.uniforms))
|
|
824
|
+
: asUniformProvider(obj.uniforms);
|
|
815
825
|
modeUniformReader = (name: string, token: AdaptiveToken): unknown => {
|
|
816
826
|
const v = uniProv.tryGet(name);
|
|
817
827
|
if (v === undefined) return undefined;
|
|
@@ -844,6 +854,15 @@ export function prepareRenderObject(
|
|
|
844
854
|
const SENTINEL_PIPELINE = { __sentinel: "PreparedRenderObject.pipeline" } as unknown as GPURenderPipeline;
|
|
845
855
|
|
|
846
856
|
// ---------------------------------------------------------------------------
|
|
857
|
+
/** Overlay provider: `PickId` first (constant), then `base`. */
|
|
858
|
+
function withPickId(pickId: number, base: IUniformProvider): IUniformProvider {
|
|
859
|
+
const pick = AVal.constant<number>(pickId);
|
|
860
|
+
return {
|
|
861
|
+
tryGet(name: string) { return name === "PickId" ? (pick as aval<unknown>) : base.tryGet(name); },
|
|
862
|
+
*names() { yield "PickId"; yield* base.names(); },
|
|
863
|
+
};
|
|
864
|
+
}
|
|
865
|
+
|
|
847
866
|
// Uniform input merging — `obj.uniforms` wins; `avalBindings` is fallback.
|
|
848
867
|
// ---------------------------------------------------------------------------
|
|
849
868
|
|
|
@@ -165,18 +165,32 @@ function stripFormatFor(topology: GPUPrimitiveTopology): GPUIndexFormat | undefi
|
|
|
165
165
|
* — `addMarkingCallback` is a no-op for an aval that never marks, so
|
|
166
166
|
* no special-casing required.
|
|
167
167
|
*/
|
|
168
|
+
/** Canonical descriptor per modeKey. The modeKey is a COMPLETE encoding
|
|
169
|
+
* of the descriptor (that's what makes it the bucket key), so two
|
|
170
|
+
* trackers with equal keys can share one frozen snapshot object —
|
|
171
|
+
* at heap scale most draws share a handful of pipeline states, and a
|
|
172
|
+
* per-draw descriptor (+ its attachments array) was measurable ballast.
|
|
173
|
+
* The map is bounded by the number of DISTINCT pipeline states. */
|
|
174
|
+
const descriptorInterning = new Map<bigint, PipelineStateDescriptor>();
|
|
175
|
+
function internDescriptor(key: bigint, d: PipelineStateDescriptor): PipelineStateDescriptor {
|
|
176
|
+
const hit = descriptorInterning.get(key);
|
|
177
|
+
if (hit !== undefined) return hit;
|
|
178
|
+
descriptorInterning.set(key, d);
|
|
179
|
+
return d;
|
|
180
|
+
}
|
|
181
|
+
|
|
168
182
|
export class ModeKeyTracker implements IDisposable {
|
|
169
183
|
readonly ps: PipelineState | undefined;
|
|
170
184
|
readonly signature: FramebufferSignature;
|
|
171
185
|
private readonly onDirty: () => void;
|
|
172
|
-
private
|
|
186
|
+
private subs: IDisposable[] | undefined;
|
|
173
187
|
private cachedDescriptor: PipelineStateDescriptor;
|
|
174
188
|
private cachedModeKey: bigint;
|
|
175
189
|
private readonly modeRules: RoModeRules | undefined;
|
|
176
190
|
private readonly uniformAvals: ReadonlyMap<string, aval<unknown>> | undefined;
|
|
177
191
|
/** Avals discovered while evaluating rules; merged into the leaf
|
|
178
192
|
* set returned by `forEachLeaf` so the heap scene subscribes once. */
|
|
179
|
-
private
|
|
193
|
+
private ruleDeps: Set<aval<unknown>> | undefined;
|
|
180
194
|
|
|
181
195
|
constructor(
|
|
182
196
|
ps: PipelineState | undefined,
|
|
@@ -201,8 +215,9 @@ export class ModeKeyTracker implements IDisposable {
|
|
|
201
215
|
this.onDirty = onDirty;
|
|
202
216
|
if (options.modeRules !== undefined) this.modeRules = options.modeRules;
|
|
203
217
|
if (options.uniformAvals !== undefined) this.uniformAvals = options.uniformAvals;
|
|
204
|
-
|
|
205
|
-
this.cachedModeKey = encodeModeKey(
|
|
218
|
+
const d = this.snapshot();
|
|
219
|
+
this.cachedModeKey = encodeModeKey(d);
|
|
220
|
+
this.cachedDescriptor = internDescriptor(this.cachedModeKey, d);
|
|
206
221
|
if (options.skipSubscribe !== true) this.subscribeAll();
|
|
207
222
|
}
|
|
208
223
|
|
|
@@ -210,7 +225,7 @@ export class ModeKeyTracker implements IDisposable {
|
|
|
210
225
|
return snapshotDescriptor(this.ps, this.signature, {
|
|
211
226
|
...(this.modeRules !== undefined ? { modeRules: this.modeRules } : {}),
|
|
212
227
|
...(this.uniformAvals !== undefined ? { uniformAvals: this.uniformAvals } : {}),
|
|
213
|
-
recordDep: (av) => { this.ruleDeps.add(av); },
|
|
228
|
+
recordDep: (av) => { (this.ruleDeps ??= new Set()).add(av); },
|
|
214
229
|
});
|
|
215
230
|
}
|
|
216
231
|
|
|
@@ -257,7 +272,7 @@ export class ModeKeyTracker implements IDisposable {
|
|
|
257
272
|
}
|
|
258
273
|
}
|
|
259
274
|
}
|
|
260
|
-
for (const av of this.ruleDeps) visit(av);
|
|
275
|
+
if (this.ruleDeps !== undefined) for (const av of this.ruleDeps) visit(av);
|
|
261
276
|
}
|
|
262
277
|
|
|
263
278
|
get descriptor(): PipelineStateDescriptor { return this.cachedDescriptor; }
|
|
@@ -274,18 +289,18 @@ export class ModeKeyTracker implements IDisposable {
|
|
|
274
289
|
* subscription-dedupe layer picks them up.
|
|
275
290
|
*/
|
|
276
291
|
recompute(): boolean {
|
|
277
|
-
this.ruleDeps
|
|
292
|
+
this.ruleDeps?.clear();
|
|
278
293
|
const next = this.snapshot();
|
|
279
294
|
const nextKey = encodeModeKey(next);
|
|
280
295
|
if (nextKey === this.cachedModeKey) return false;
|
|
281
|
-
this.cachedDescriptor = next;
|
|
296
|
+
this.cachedDescriptor = internDescriptor(nextKey, next);
|
|
282
297
|
this.cachedModeKey = nextKey;
|
|
283
298
|
return true;
|
|
284
299
|
}
|
|
285
300
|
|
|
286
301
|
dispose(): void {
|
|
287
|
-
for (const s of this.subs) s.dispose();
|
|
288
|
-
this.subs
|
|
302
|
+
if (this.subs !== undefined) for (const s of this.subs) s.dispose();
|
|
303
|
+
this.subs = undefined;
|
|
289
304
|
}
|
|
290
305
|
|
|
291
306
|
private subscribeAll(): void {
|
|
@@ -318,7 +333,7 @@ export class ModeKeyTracker implements IDisposable {
|
|
|
318
333
|
}
|
|
319
334
|
|
|
320
335
|
private sub(a: aval<unknown>): void {
|
|
321
|
-
this.subs.push(addMarkingCallback(a, this.onDirty));
|
|
336
|
+
(this.subs ??= []).push(addMarkingCallback(a, this.onDirty));
|
|
322
337
|
}
|
|
323
338
|
|
|
324
339
|
private subBlendState(b: PsBlendState): void {
|
|
@@ -248,6 +248,13 @@ export class GpuPartitionScene {
|
|
|
248
248
|
this.masterShadow[recordIdx * this.recordU32 + 5] = comboId >>> 0;
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
+
/** Update an existing record's `indexStart` (field 2 = allocBase + slice).
|
|
252
|
+
* Used by index-buffer compaction; caller flags the bucket partitionDirty. */
|
|
253
|
+
setRecordIndexStart(recordIdx: number, indexStart: number): void {
|
|
254
|
+
if (recordIdx < 0 || recordIdx >= this.numRecords) return;
|
|
255
|
+
this.masterShadow[recordIdx * this.recordU32 + 2] = indexStart >>> 0;
|
|
256
|
+
}
|
|
257
|
+
|
|
251
258
|
/** Update an existing record's uniform ref by uniform index. */
|
|
252
259
|
setRecordUniformRef(recordIdx: number, uniformIdx: number, ref: number): void {
|
|
253
260
|
if (recordIdx < 0 || recordIdx >= this.numRecords) return;
|
|
@@ -255,6 +262,29 @@ export class GpuPartitionScene {
|
|
|
255
262
|
this.masterShadow[recordIdx * this.recordU32 + PARTITION_RECORD_PREFIX_U32 + uniformIdx] = ref >>> 0;
|
|
256
263
|
}
|
|
257
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Re-seat every record's baked arena uniform refs after a main-heap
|
|
267
|
+
* compaction relocated their allocations. `remap` maps OLD→NEW arena byte
|
|
268
|
+
* offset (alloc header offset, same space the refs are stored in). Returns
|
|
269
|
+
* the number of ref words rewritten; the caller must flag the bucket
|
|
270
|
+
* `partitionDirty` so the master re-uploads. O(records × numUniforms).
|
|
271
|
+
*/
|
|
272
|
+
remapUniformRefs(remap: ReadonlyMap<number, number>): number {
|
|
273
|
+
if (remap.size === 0 || this._numUniforms === 0) return 0;
|
|
274
|
+
const ru32 = this.recordU32;
|
|
275
|
+
let changed = 0;
|
|
276
|
+
for (let i = 0; i < this.numRecords; i++) {
|
|
277
|
+
const o = i * ru32 + PARTITION_RECORD_PREFIX_U32;
|
|
278
|
+
for (let k = 0; k < this._numUniforms; k++) {
|
|
279
|
+
const nn = remap.get(this.masterShadow[o + k]!);
|
|
280
|
+
if (nn === undefined) continue;
|
|
281
|
+
this.masterShadow[o + k] = nn >>> 0;
|
|
282
|
+
changed++;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return changed;
|
|
286
|
+
}
|
|
287
|
+
|
|
258
288
|
removeRecord(recordIdx: number): number {
|
|
259
289
|
if (recordIdx < 0 || recordIdx >= this.numRecords) return -1;
|
|
260
290
|
const last = this.numRecords - 1;
|
|
@@ -13,23 +13,39 @@ import type { RecordsBuffer } from "./records.js";
|
|
|
13
13
|
import { buildUberKernel } from "./codegen.js";
|
|
14
14
|
import { DF32_MAT4_BYTES, type SlotIndex } from "./slots.js";
|
|
15
15
|
|
|
16
|
-
/** Upload the changed-constituent
|
|
16
|
+
/** Upload the changed-constituent values to the constituents GPU buffer —
|
|
17
|
+
* one writeBuffer per RUN of nearby dirty slots, not one min..max span.
|
|
18
|
+
* The span version re-uploaded nearly the whole buffer for a handful of
|
|
19
|
+
* scattered edits (68k-object CAD bench: ~28 MB/frame for k = 10 random
|
|
20
|
+
* trafo edits — 10 GB/s of writeBuffer traffic, ~20 ms frames). */
|
|
17
21
|
export function uploadConstituentsRange(
|
|
18
22
|
device: GPUDevice,
|
|
19
23
|
buf: GPUBuffer,
|
|
20
24
|
mirror: Float32Array,
|
|
21
25
|
dirty: ReadonlySet<SlotIndex>,
|
|
22
26
|
): void {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
if (dirty.size === 0) return;
|
|
28
|
+
const slots = [...dirty].sort((a, b) => a - b);
|
|
29
|
+
// merge runs separated by ≤32 clean slots (≤4 KB of clean bytes —
|
|
30
|
+
// cheaper to upload than to issue another writeBuffer)
|
|
31
|
+
const MERGE_GAP_SLOTS = 32;
|
|
32
|
+
const emit = (s: number, e: number): void => {
|
|
33
|
+
const startByte = s * DF32_MAT4_BYTES;
|
|
34
|
+
const endByte = (e + 1) * DF32_MAT4_BYTES;
|
|
35
|
+
device.queue.writeBuffer(
|
|
36
|
+
buf, startByte,
|
|
37
|
+
mirror.buffer, mirror.byteOffset + startByte,
|
|
38
|
+
endByte - startByte,
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
let runStart = slots[0]!;
|
|
42
|
+
let runEnd = slots[0]!;
|
|
43
|
+
for (let i = 1; i < slots.length; i++) {
|
|
44
|
+
const s = slots[i]!;
|
|
45
|
+
if (s - runEnd <= MERGE_GAP_SLOTS) runEnd = s;
|
|
46
|
+
else { emit(runStart, runEnd); runStart = s; runEnd = s; }
|
|
28
47
|
}
|
|
29
|
-
|
|
30
|
-
const startByte = minSlot * DF32_MAT4_BYTES;
|
|
31
|
-
const endByte = (maxSlot + 1) * DF32_MAT4_BYTES;
|
|
32
|
-
device.queue.writeBuffer(buf, startByte, mirror.buffer, mirror.byteOffset + startByte, endByte - startByte);
|
|
48
|
+
emit(runStart, runEnd);
|
|
33
49
|
}
|
|
34
50
|
|
|
35
51
|
/** Live getters for the scene-wide GPU buffers the kernel binds. The
|