@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.
Files changed (101) hide show
  1. package/dist/core/elementType.d.ts +2 -0
  2. package/dist/core/elementType.d.ts.map +1 -1
  3. package/dist/core/elementType.js +10 -0
  4. package/dist/core/elementType.js.map +1 -1
  5. package/dist/core/provider.d.ts.map +1 -1
  6. package/dist/core/provider.js +65 -32
  7. package/dist/core/provider.js.map +1 -1
  8. package/dist/core/renderObject.d.ts +9 -0
  9. package/dist/core/renderObject.d.ts.map +1 -1
  10. package/dist/resources/preparedRenderObject.d.ts.map +1 -1
  11. package/dist/resources/preparedRenderObject.js +19 -2
  12. package/dist/resources/preparedRenderObject.js.map +1 -1
  13. package/dist/runtime/derivedModes/modeKeyCpu.d.ts +2 -12
  14. package/dist/runtime/derivedModes/modeKeyCpu.d.ts.map +1 -1
  15. package/dist/runtime/derivedModes/modeKeyCpu.js +30 -13
  16. package/dist/runtime/derivedModes/modeKeyCpu.js.map +1 -1
  17. package/dist/runtime/derivedModes/partitionDispatcher.d.ts +11 -0
  18. package/dist/runtime/derivedModes/partitionDispatcher.d.ts.map +1 -1
  19. package/dist/runtime/derivedModes/partitionDispatcher.js +31 -0
  20. package/dist/runtime/derivedModes/partitionDispatcher.js.map +1 -1
  21. package/dist/runtime/derivedUniforms/dispatch.d.ts +5 -1
  22. package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
  23. package/dist/runtime/derivedUniforms/dispatch.js +28 -13
  24. package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
  25. package/dist/runtime/derivedUniforms/records.d.ts +15 -0
  26. package/dist/runtime/derivedUniforms/records.d.ts.map +1 -1
  27. package/dist/runtime/derivedUniforms/records.js +81 -14
  28. package/dist/runtime/derivedUniforms/records.js.map +1 -1
  29. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +6 -0
  30. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
  31. package/dist/runtime/derivedUniforms/sceneIntegration.js +9 -0
  32. package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
  33. package/dist/runtime/flattenTree.d.ts.map +1 -1
  34. package/dist/runtime/flattenTree.js +46 -2
  35. package/dist/runtime/flattenTree.js.map +1 -1
  36. package/dist/runtime/heapAdapter.d.ts +3 -1
  37. package/dist/runtime/heapAdapter.d.ts.map +1 -1
  38. package/dist/runtime/heapAdapter.js +42 -4
  39. package/dist/runtime/heapAdapter.js.map +1 -1
  40. package/dist/runtime/heapDecoder.d.ts.map +1 -1
  41. package/dist/runtime/heapDecoder.js +8 -3
  42. package/dist/runtime/heapDecoder.js.map +1 -1
  43. package/dist/runtime/heapEffect.d.ts +14 -1
  44. package/dist/runtime/heapEffect.d.ts.map +1 -1
  45. package/dist/runtime/heapEffect.js +13 -1
  46. package/dist/runtime/heapEffect.js.map +1 -1
  47. package/dist/runtime/heapEffectIR.d.ts.map +1 -1
  48. package/dist/runtime/heapEffectIR.js +18 -9
  49. package/dist/runtime/heapEffectIR.js.map +1 -1
  50. package/dist/runtime/heapEligibility.d.ts.map +1 -1
  51. package/dist/runtime/heapEligibility.js +64 -12
  52. package/dist/runtime/heapEligibility.js.map +1 -1
  53. package/dist/runtime/heapIrBuilders.d.ts +8 -0
  54. package/dist/runtime/heapIrBuilders.d.ts.map +1 -1
  55. package/dist/runtime/heapIrBuilders.js +47 -2
  56. package/dist/runtime/heapIrBuilders.js.map +1 -1
  57. package/dist/runtime/heapScene/chunkedArena.d.ts +20 -28
  58. package/dist/runtime/heapScene/chunkedArena.d.ts.map +1 -1
  59. package/dist/runtime/heapScene/chunkedArena.js +28 -91
  60. package/dist/runtime/heapScene/chunkedArena.js.map +1 -1
  61. package/dist/runtime/heapScene/freelist.d.ts +1 -1
  62. package/dist/runtime/heapScene/freelist.js +3 -3
  63. package/dist/runtime/heapScene/freelist.js.map +1 -1
  64. package/dist/runtime/heapScene/pools.d.ts +103 -59
  65. package/dist/runtime/heapScene/pools.d.ts.map +1 -1
  66. package/dist/runtime/heapScene/pools.js +335 -194
  67. package/dist/runtime/heapScene/pools.js.map +1 -1
  68. package/dist/runtime/heapScene.d.ts +116 -1
  69. package/dist/runtime/heapScene.d.ts.map +1 -1
  70. package/dist/runtime/heapScene.js +581 -125
  71. package/dist/runtime/heapScene.js.map +1 -1
  72. package/dist/runtime/hybridScene.d.ts.map +1 -1
  73. package/dist/runtime/hybridScene.js +19 -3
  74. package/dist/runtime/hybridScene.js.map +1 -1
  75. package/dist/runtime/index.d.ts +1 -1
  76. package/dist/runtime/index.d.ts.map +1 -1
  77. package/dist/runtime/index.js +1 -1
  78. package/dist/runtime/index.js.map +1 -1
  79. package/package.json +1 -1
  80. package/src/core/elementType.ts +10 -0
  81. package/src/core/provider.ts +56 -28
  82. package/src/core/renderObject.ts +9 -0
  83. package/src/resources/preparedRenderObject.ts +22 -3
  84. package/src/runtime/derivedModes/modeKeyCpu.ts +26 -11
  85. package/src/runtime/derivedModes/partitionDispatcher.ts +30 -0
  86. package/src/runtime/derivedUniforms/dispatch.ts +26 -10
  87. package/src/runtime/derivedUniforms/records.ts +70 -15
  88. package/src/runtime/derivedUniforms/sceneIntegration.ts +10 -0
  89. package/src/runtime/flattenTree.ts +47 -2
  90. package/src/runtime/heapAdapter.ts +40 -5
  91. package/src/runtime/heapDecoder.ts +8 -3
  92. package/src/runtime/heapEffect.ts +15 -1
  93. package/src/runtime/heapEffectIR.ts +18 -9
  94. package/src/runtime/heapEligibility.ts +39 -12
  95. package/src/runtime/heapIrBuilders.ts +50 -2
  96. package/src/runtime/heapScene/chunkedArena.ts +29 -94
  97. package/src/runtime/heapScene/freelist.ts +3 -3
  98. package/src/runtime/heapScene/pools.ts +340 -218
  99. package/src/runtime/heapScene.ts +717 -141
  100. package/src/runtime/hybridScene.ts +20 -3
  101. 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":"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"}
@@ -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
- av = AVal.custom(t => heapEnabled.getValue(t) && perRO.getValue(t));
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 => elig(ro).map(b => !b));
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":"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"}
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,YAAY,GAAG,IAAI,OAAO,EAA+B,CAAC;IAChE,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,gEAAgE;YAChE,gEAAgE;YAChE,EAAE,GAAG,WAAW,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU;gBAC7C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,KAAK,EAAC,iBAAiB,CAAC,CAAC;gBACvF,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,EAAgB,EAAiB,EAAE;QAClD,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAK,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnD,oEAAoE;IACpE,oEAAoE;IACpE,+DAA+D;IAC/D,mEAAmE;IACnE,+DAA+D;IAC/D,mEAAmE;IACnE,6CAA6C;IAC7C,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,UAA2C,CAAC,YAAY,GAAG,SAAS,CAAC;IAEtE,oEAAoE;IACpE,gEAAgE;IAChE,6DAA6D;IAC7D,oEAAoE;IACpE,kEAAkE;IAClE,0DAA0D;IAC1D,MAAM,SAAS,GAAG,IAAI,OAAO,EAA8B,CAAC;IAC5D,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAgB,EAAE,EAAE;QACrD,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,sBAAsB,CAAC,EAAE,EAAE,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE;gBAC9D,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,KAAK,KAAK;aAC5D,CAAC,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAc,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE;QAC3E,oBAAoB;QACpB,SAAS;QACT,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,qBAAqB,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnF,CAAC,CAAC;IAEH,oEAAoE;IACpE,oEAAoE;IACpE,qEAAqE;IACrE,mEAAmE;IACnE,mEAAmE;IACnE,MAAM,UAAU,GACd,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAE9E,OAAO;QACL,MAAM,CAAC,KAAoB;YACzB,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,iBAAiB,CAAC,GAAsB,EAAE,KAAoB;YAC5D,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,cAAc,CAAC,OAA6B,EAAE,KAAoB;YAChE,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAClC,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,QAAQ;YACN,+DAA+D;YAC/D,4DAA4D;YAC5D,6DAA6D;YAC7D,oDAAoD;YACpD,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChD,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,eAAe;YACb,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,CAAC;QACD,cAAc;YACZ,OAAO,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;QACpC,CAAC;QACD,cAAc;YACZ,MAAM,EAAE,GAAI,SAA0D,CAAC,cAAc,CAAC;YACtF,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,iBAAiB;YACf,MAAM,EAAE,GAAI,SAA6D,CAAC,iBAAiB,CAAC;YAC5F,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,aAAa;YACX,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;QACpC,CAAC;QAED,kBAAkB;YAChB,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;YAC1B,OAAO;gBACL,MAAM,EAAI,CAAC,CAAC,aAAa;gBACzB,QAAQ,EAAE,CAAC,CAAC,eAAe;gBAC3B,QAAQ,EAAE,CAAC,CAAC,eAAe;gBAC3B,OAAO,EAAG,CAAC,CAAC,cAAc;aAC3B,CAAC;QACJ,CAAC;QACD,YAAY;YACV,OAAQ,SAQD,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAChC,CAAC;QACD,aAAa,CAAC,OAAgB;YAC5B,OAAQ,SAED,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,iBAAiB,CAAC,OAAgB;YAChC,OAAQ,SAED,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,sBAAsB,CAAC,OAAgB;YACrC,OAAQ,SAED,CAAC,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO;YACL,SAAS,CAAC,OAAO,EAAE,CAAC;YACpB,SAAS,CAAC,OAAO,EAAE,CAAC;YACpB,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,cAAc,GAA8B,SAAS,CAAC;AAC5D,KAAK,cAAc,CAAC;AACpB,iFAAiF;AACjF,KAAK,IAAI,CAAC"}
@@ -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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"}
@@ -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,GAOf,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"}
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.23",
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",
@@ -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. */
@@ -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: P = { tryGet: () => undefined, names: () => EMPTY_NAMES };
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 { tryGet: (n) => m.tryFind(n), names: () => mapKeys(m) };
118
+ return new MapProvider(m);
68
119
  },
69
120
  ofObject(o: Readonly<Record<string, T>>): P {
70
- return { tryGet: (n) => (hasOwn(o, n) ? o[n] : undefined), names: () => Object.keys(o) };
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
- const cache = new Map<string, T | undefined>();
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
  }
@@ -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(asUniformProvider(obj.uniforms), effect.avalBindings, ub);
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 = asUniformProvider(obj.uniforms);
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 readonly subs: IDisposable[] = [];
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 readonly ruleDeps = new Set<aval<unknown>>();
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
- this.cachedDescriptor = this.snapshot();
205
- this.cachedModeKey = encodeModeKey(this.cachedDescriptor);
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.clear();
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.length = 0;
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 value range to the constituents GPU buffer. */
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
- let minSlot = Infinity;
24
- let maxSlot = -1;
25
- for (const s of dirty) {
26
- if (s < minSlot) minSlot = s;
27
- if (s > maxSlot) maxSlot = s;
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
- if (maxSlot < 0) return;
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