@aardworx/wombat.rendering 0.9.32 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/runtime/derivedModes/kernelCodegen.d.ts +90 -0
- package/dist/runtime/derivedModes/kernelCodegen.d.ts.map +1 -0
- package/dist/runtime/derivedModes/kernelCodegen.js +623 -0
- package/dist/runtime/derivedModes/kernelCodegen.js.map +1 -0
- package/dist/runtime/derivedModes/modeKeyCpu.d.ts.map +1 -1
- package/dist/runtime/derivedModes/modeKeyCpu.js +23 -67
- package/dist/runtime/derivedModes/modeKeyCpu.js.map +1 -1
- package/dist/runtime/derivedModes/partitionDispatcher.d.ts +79 -0
- package/dist/runtime/derivedModes/partitionDispatcher.d.ts.map +1 -0
- package/dist/runtime/derivedModes/partitionDispatcher.js +303 -0
- package/dist/runtime/derivedModes/partitionDispatcher.js.map +1 -0
- package/dist/runtime/derivedModes/partitionKernel.d.ts +12 -0
- package/dist/runtime/derivedModes/partitionKernel.d.ts.map +1 -0
- package/dist/runtime/derivedModes/partitionKernel.js +127 -0
- package/dist/runtime/derivedModes/partitionKernel.js.map +1 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.d.ts +4 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.d.ts.map +1 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.js +24 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.js.map +1 -0
- package/dist/runtime/derivedModes/rule.d.ts +38 -86
- package/dist/runtime/derivedModes/rule.d.ts.map +1 -1
- package/dist/runtime/derivedModes/rule.js +34 -74
- package/dist/runtime/derivedModes/rule.js.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.d.ts +10 -8
- package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.js +31 -18
- package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
- package/dist/runtime/derivedUniforms/marker.d.ts +90 -11
- package/dist/runtime/derivedUniforms/marker.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/marker.js +161 -15
- package/dist/runtime/derivedUniforms/marker.js.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +25 -6
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.js +61 -20
- package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
- package/dist/runtime/heapEligibility.d.ts.map +1 -1
- package/dist/runtime/heapEligibility.js +22 -2
- package/dist/runtime/heapEligibility.js.map +1 -1
- package/dist/runtime/heapScene/chunkedArena.d.ts +76 -0
- package/dist/runtime/heapScene/chunkedArena.d.ts.map +1 -0
- package/dist/runtime/heapScene/chunkedArena.js +223 -0
- package/dist/runtime/heapScene/chunkedArena.js.map +1 -0
- package/dist/runtime/heapScene/freelist.d.ts +50 -0
- package/dist/runtime/heapScene/freelist.d.ts.map +1 -0
- package/dist/runtime/heapScene/freelist.js +160 -0
- package/dist/runtime/heapScene/freelist.js.map +1 -0
- package/dist/runtime/heapScene/growBuffer.d.ts +23 -2
- package/dist/runtime/heapScene/growBuffer.d.ts.map +1 -1
- package/dist/runtime/heapScene/growBuffer.js +35 -3
- package/dist/runtime/heapScene/growBuffer.js.map +1 -1
- package/dist/runtime/heapScene/pools.d.ts +65 -42
- package/dist/runtime/heapScene/pools.d.ts.map +1 -1
- package/dist/runtime/heapScene/pools.js +206 -134
- package/dist/runtime/heapScene/pools.js.map +1 -1
- package/dist/runtime/heapScene.d.ts +12 -0
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +949 -167
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/hybridScene.d.ts +7 -0
- package/dist/runtime/hybridScene.d.ts.map +1 -1
- package/dist/runtime/hybridScene.js +1 -0
- package/dist/runtime/hybridScene.js.map +1 -1
- package/dist/runtime/index.d.ts +4 -3
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +4 -3
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderTask.d.ts +5 -0
- package/dist/runtime/renderTask.d.ts.map +1 -1
- package/dist/runtime/renderTask.js +1 -0
- package/dist/runtime/renderTask.js.map +1 -1
- package/dist/runtime/runtime.d.ts +6 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +1 -0
- package/dist/runtime/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/derivedModes/kernelCodegen.ts +673 -0
- package/src/runtime/derivedModes/modeKeyCpu.ts +22 -60
- package/src/runtime/derivedModes/partitionDispatcher.ts +349 -0
- package/src/runtime/derivedModes/partitionKernelLayout.ts +25 -0
- package/src/runtime/derivedModes/rule.ts +66 -145
- package/src/runtime/derivedUniforms/dispatch.ts +48 -21
- package/src/runtime/derivedUniforms/marker.ts +210 -16
- package/src/runtime/derivedUniforms/sceneIntegration.ts +67 -20
- package/src/runtime/heapEligibility.ts +22 -1
- package/src/runtime/heapScene/chunkedArena.ts +238 -0
- package/src/runtime/heapScene/freelist.ts +161 -0
- package/src/runtime/heapScene/growBuffer.ts +39 -2
- package/src/runtime/heapScene/pools.ts +231 -143
- package/src/runtime/heapScene.ts +1134 -161
- package/src/runtime/hybridScene.ts +8 -0
- package/src/runtime/index.ts +12 -9
- package/src/runtime/renderTask.ts +6 -0
- package/src/runtime/runtime.ts +7 -0
- package/src/runtime/derivedModes/gpuDispatcher.ts +0 -226
- package/src/runtime/derivedModes/gpuKernel.ts +0 -98
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
// §7 v2 — heap-scene integration.
|
|
2
2
|
//
|
|
3
|
-
// One DerivedUniformsScene per heap scene: owns the rule registry,
|
|
4
|
-
//
|
|
5
|
-
// constituents GPU buffer, and the dispatcher.
|
|
6
|
-
//
|
|
7
|
-
// (
|
|
3
|
+
// One DerivedUniformsScene per heap scene: owns the rule registry, a per-chunk
|
|
4
|
+
// records buffer (§3), the constituent-slots heap (df32 trafo halves, scene-
|
|
5
|
+
// wide), the constituents GPU buffer, and the dispatcher.
|
|
6
|
+
//
|
|
7
|
+
// Multi-chunk (§3): each arena chunk has its own GPUBuffer for drawHeaders.
|
|
8
|
+
// Derived-uniform records reference HostHeap slots by absolute byte offset
|
|
9
|
+
// within ONE buffer — so a record must be bound to its bucket's chunk at
|
|
10
|
+
// dispatch. We partition records by chunkIdx: one RecordsBuffer per chunk,
|
|
11
|
+
// one dispatch per chunk binding that chunk's main heap.
|
|
8
12
|
//
|
|
9
13
|
// Per frame, inside the heap scene's `evaluateAlways(token, …)` scope:
|
|
10
14
|
// const dirty = scene.pullDirty(token); // drains changed trafo avals (re-subscribes)
|
|
11
15
|
// scene.uploadDirty(dirty); // O(changed) value uploads
|
|
12
|
-
// scene.encode(enc); // one compute dispatch
|
|
16
|
+
// scene.encode(enc); // one compute dispatch per chunk
|
|
13
17
|
// Clean frames: zero CPU work, records buffer static.
|
|
14
18
|
// See docs/derived-uniforms-extensible.md.
|
|
15
19
|
import { ConstituentSlots, DF32_MAT4_BYTES, } from "./slots.js";
|
|
@@ -22,15 +26,19 @@ export class DerivedUniformsScene {
|
|
|
22
26
|
device;
|
|
23
27
|
constituents;
|
|
24
28
|
registry = new DerivedUniformRegistry();
|
|
25
|
-
/**
|
|
26
|
-
|
|
29
|
+
/** Per-chunk records buffers (§3). Constituents + registry are
|
|
30
|
+
* scene-wide; records partition by chunk so each dispatch binds
|
|
31
|
+
* the right chunk's main heap. */
|
|
32
|
+
recordsByChunk = new Map();
|
|
27
33
|
dispatcher;
|
|
28
34
|
/** Constituents storage GPU buffer (`array<vec2<f32>>` — df32 mat4 halves). */
|
|
29
35
|
constituentsBuf;
|
|
30
|
-
|
|
36
|
+
/** Per-chunk main-heap GPUBuffer getters. Populated as chunks are
|
|
37
|
+
* registered via `setMainHeapForChunk` from the scene factory. */
|
|
38
|
+
mainHeapByChunk = new Map();
|
|
31
39
|
/** Bumped each time a shared GPU buffer is replaced. */
|
|
32
40
|
bufferEpoch = 0;
|
|
33
|
-
constructor(device,
|
|
41
|
+
constructor(device, opts) {
|
|
34
42
|
this.device = device;
|
|
35
43
|
const initial = opts?.initialConstituentSlots ?? 64;
|
|
36
44
|
this.constituents = new ConstituentSlots(() => { }, initial);
|
|
@@ -39,14 +47,32 @@ export class DerivedUniformsScene {
|
|
|
39
47
|
size: initial * DF32_MAT4_BYTES,
|
|
40
48
|
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
41
49
|
});
|
|
42
|
-
this.mainHeapRef = { current: mainHeapBuf };
|
|
43
50
|
this.dispatcher = new DerivedUniformsDispatcher(device, {
|
|
44
51
|
constituentsBuf: () => this.constituentsBuf,
|
|
45
|
-
mainHeapBuf: () => this.mainHeapRef.current,
|
|
46
52
|
});
|
|
47
53
|
}
|
|
48
|
-
|
|
49
|
-
|
|
54
|
+
/** Register (or replace) the GPUBuffer getter for a chunk's main
|
|
55
|
+
* heap. Called by the scene factory at construction and whenever
|
|
56
|
+
* a new chunk opens or an existing chunk's buffer reallocates. */
|
|
57
|
+
setMainHeapForChunk(chunkIdx, getter) {
|
|
58
|
+
this.mainHeapByChunk.set(chunkIdx, getter);
|
|
59
|
+
}
|
|
60
|
+
/** Get-or-create the records buffer for `chunkIdx`. */
|
|
61
|
+
recordsFor(chunkIdx) {
|
|
62
|
+
let r = this.recordsByChunk.get(chunkIdx);
|
|
63
|
+
if (r === undefined) {
|
|
64
|
+
r = new RecordsBuffer();
|
|
65
|
+
this.recordsByChunk.set(chunkIdx, r);
|
|
66
|
+
}
|
|
67
|
+
return r;
|
|
68
|
+
}
|
|
69
|
+
/** Total record count summed across every chunk's records buffer.
|
|
70
|
+
* Used by the scene's stats / diagnostics. */
|
|
71
|
+
get totalRecordCount() {
|
|
72
|
+
let n = 0;
|
|
73
|
+
for (const r of this.recordsByChunk.values())
|
|
74
|
+
n += r.recordCount;
|
|
75
|
+
return n;
|
|
50
76
|
}
|
|
51
77
|
ensureConstituentsCapacity(requiredBytes) {
|
|
52
78
|
if (requiredBytes <= this.constituentsBuf.size)
|
|
@@ -86,9 +112,23 @@ export class DerivedUniformsScene {
|
|
|
86
112
|
this.ensureConstituentsCapacity(this.constituents.slotCount * DF32_MAT4_BYTES);
|
|
87
113
|
uploadConstituentsRange(this.device, this.constituentsBuf, this.constituents.cpuMirror, dirty);
|
|
88
114
|
}
|
|
89
|
-
/** Run the uber-kernel
|
|
115
|
+
/** Run the uber-kernel once per chunk that holds records. No-op
|
|
116
|
+
* when no chunk has records. Each dispatch binds that chunk's
|
|
117
|
+
* main heap buffer. */
|
|
90
118
|
encode(enc) {
|
|
91
|
-
|
|
119
|
+
let any = false;
|
|
120
|
+
for (const [chunkIdx, records] of this.recordsByChunk) {
|
|
121
|
+
if (records.recordCount === 0)
|
|
122
|
+
continue;
|
|
123
|
+
const heapGetter = this.mainHeapByChunk.get(chunkIdx);
|
|
124
|
+
if (heapGetter === undefined) {
|
|
125
|
+
throw new Error(`derivedUniforms.encode: no main-heap binding registered for chunkIdx=${chunkIdx}. ` +
|
|
126
|
+
`Call setMainHeapForChunk(idx, getter) when each chunk opens.`);
|
|
127
|
+
}
|
|
128
|
+
if (this.dispatcher.encodeChunk(enc, this.registry, records, heapGetter))
|
|
129
|
+
any = true;
|
|
130
|
+
}
|
|
131
|
+
return any;
|
|
92
132
|
}
|
|
93
133
|
dispose() {
|
|
94
134
|
this.dispatcher.dispose();
|
|
@@ -97,7 +137,8 @@ export class DerivedUniformsScene {
|
|
|
97
137
|
}
|
|
98
138
|
export function registerRoDerivations(scene, owner, req) {
|
|
99
139
|
if (req.rules.size === 0)
|
|
100
|
-
return { owner, constituentAvals: [], ruleHashes: [] };
|
|
140
|
+
return { owner, constituentAvals: [], ruleHashes: [], chunkIdx: req.chunkIdx };
|
|
141
|
+
const records = scene.recordsFor(req.chunkIdx);
|
|
101
142
|
const acquiredAvals = [];
|
|
102
143
|
const ruleHashes = [];
|
|
103
144
|
const pairByName = new Map();
|
|
@@ -146,13 +187,13 @@ export function registerRoDerivations(scene, owner, req) {
|
|
|
146
187
|
if (outOff === undefined) {
|
|
147
188
|
throw new Error(`derivedUniforms: no drawHeader slot for derived uniform '${outName}' on this RO`);
|
|
148
189
|
}
|
|
149
|
-
|
|
190
|
+
records.add(owner, id, makeHandle(SlotTag.HostHeap, req.drawHeaderBaseByte + outOff), inSlots);
|
|
150
191
|
}
|
|
151
192
|
scene.ensureConstituentsCapacity(scene.constituents.slotCount * DF32_MAT4_BYTES);
|
|
152
|
-
return { owner, constituentAvals: acquiredAvals, ruleHashes };
|
|
193
|
+
return { owner, constituentAvals: acquiredAvals, ruleHashes, chunkIdx: req.chunkIdx };
|
|
153
194
|
}
|
|
154
195
|
export function deregisterRoDerivations(scene, reg) {
|
|
155
|
-
scene.
|
|
196
|
+
scene.recordsFor(reg.chunkIdx).removeAllForOwner(reg.owner);
|
|
156
197
|
for (const h of reg.ruleHashes)
|
|
157
198
|
scene.registry.release(h);
|
|
158
199
|
for (const av of reg.constituentAvals)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneIntegration.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/sceneIntegration.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,EAAE;AACF
|
|
1
|
+
{"version":3,"file":"sceneIntegration.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/sceneIntegration.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heapEligibility.d.ts","sourceRoot":"","sources":["../../src/runtime/heapEligibility.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAK5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"heapEligibility.d.ts","sourceRoot":"","sources":["../../src/runtime/heapEligibility.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAK5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAoH5D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,CA4E9D"}
|
|
@@ -43,6 +43,18 @@ import { asAttributeProvider } from "../core/provider.js";
|
|
|
43
43
|
* (and it sidesteps device-limit risk near `maxTextureDimension2D`).
|
|
44
44
|
*/
|
|
45
45
|
const LEGACY_MAX_DIM = 4096;
|
|
46
|
+
/**
|
|
47
|
+
* Total per-RO payload (attribute + instance + index bytes) above
|
|
48
|
+
* which the heap path ejects the RO to the legacy renderer. The
|
|
49
|
+
* heap path's value is collapsing many small ROs into one
|
|
50
|
+
* drawIndirect; a single-RO bucket emits the same drawIndexed it
|
|
51
|
+
* would have under legacy, AND a multi-MB allocation forces the
|
|
52
|
+
* arena's pow2 GrowBuffer to allocate (and re-copy on grow) a
|
|
53
|
+
* giant contiguous GPUBuffer. Default 16 MB — picked so typical
|
|
54
|
+
* UI/SG geometry (a few hundred kB) sails through and only
|
|
55
|
+
* terrain/photogrammetry/dense-pointcloud meshes eject.
|
|
56
|
+
*/
|
|
57
|
+
const HEAP_PAYLOAD_EJECT_BYTES = 16 * 1024 * 1024;
|
|
46
58
|
const isHostBuffer = (b) => b.kind === "host";
|
|
47
59
|
// Samplers: accept both descriptor-form (`kind: "host"`) and resolved
|
|
48
60
|
// (`kind: "gpu"`). The heap atlas path uses ONE shared GPU sampler for
|
|
@@ -206,9 +218,17 @@ export function isHeapEligible(ro) {
|
|
|
206
218
|
// can flip; if they violate heap constraints the RO routes to the
|
|
207
219
|
// legacy path that frame).
|
|
208
220
|
return AVal.custom(token => {
|
|
209
|
-
|
|
210
|
-
|
|
221
|
+
let payloadBytes = 0;
|
|
222
|
+
for (const av of buffers) {
|
|
223
|
+
const b = av.getValue(token);
|
|
224
|
+
if (!isHostBuffer(b))
|
|
225
|
+
return false;
|
|
226
|
+
payloadBytes += b.sizeBytes;
|
|
227
|
+
// Early-out if any single RO already busts the budget — avoids
|
|
228
|
+
// walking the rest of the buffer list for a guaranteed reject.
|
|
229
|
+
if (payloadBytes > HEAP_PAYLOAD_EJECT_BYTES)
|
|
211
230
|
return false;
|
|
231
|
+
}
|
|
212
232
|
for (const av of textures)
|
|
213
233
|
if (!isHeapServableTexture(av.getValue(token)))
|
|
214
234
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heapEligibility.js","sourceRoot":"","sources":["../../src/runtime/heapEligibility.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"heapEligibility.js","sourceRoot":"","sources":["../../src/runtime/heapEligibility.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,iDAAiD;AACjD,EAAE;AACF,+BAA+B;AAC/B,kEAAkE;AAClE,+DAA+D;AAC/D,kDAAkD;AAClD,iEAAiE;AACjE,gEAAgE;AAChE,6CAA6C;AAC7C,mEAAmE;AACnE,wEAAwE;AACxE,iEAAiE;AACjE,kEAAkE;AAClE,mEAAmE;AACnE,kEAAkE;AAClE,kEAAkE;AAClE,iEAAiE;AACjE,kEAAkE;AAClE,mEAAmE;AACnE,kEAAkE;AAClE,yDAAyD;AACzD,EAAE;AACF,mEAAmE;AACnE,uCAAuC;AACvC,8DAA8D;AAC9D,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,sEAAsE;AACtE,+CAA+C;AAC/C,EAAE;AACF,iEAAiE;AACjE,8DAA8D;AAC9D,sCAAsC;AAEtC,OAAO,EAAE,IAAI,EAAa,MAAM,2BAA2B,CAAC;AAM5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B;;;;;;;;;;GAUG;AACH,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD,MAAM,YAAY,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AAChE,sEAAsE;AACtE,uEAAuE;AACvE,oEAAoE;AACpE,iEAAiE;AACjE,qEAAqE;AACrE,iEAAiE;AACjE,8CAA8C;AAC9C,MAAM,qBAAqB,GAAG,CAAC,EAAY,EAAW,EAAE,CAAC,IAAI,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,qBAAqB,CAAC,CAAW;IACxC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACnC,qEAAqE;IACrE,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,GAAG,CAAC,KAAK,GAAG,cAAc,IAAI,GAAG,CAAC,MAAM,GAAG,cAAc;YAAE,OAAO,KAAK,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,+DAA+D;IAC/D,4DAA4D;IAC5D,6DAA6D;IAC7D,gEAAgE;IAChE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAiB,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,gBAAgB,KAAK,WAAW,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QAC/E,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC;QAAC,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC;IAC1C,CAAC;SAAM,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;QACxE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,GAA0C,CAAC;QACvD,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;QACnB,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,GAAG,cAAc,IAAI,CAAC,GAAG,cAAc;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uEAAuE;AACvE,6DAA6D;AAC7D,wEAAwE;AACxE,uEAAuE;AACvE,SAAS,SAAS,CAAC,CAA2E;IAC5F,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IACvF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,EAAgB;IACnC,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACxF,IAAI,EAAE,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,EAAgB;IACpC,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,EAAgB;IACpC,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAgB;IAC7C,yBAAyB;IACzB,IAAI,EAAE,CAAC,cAAc,KAAK,SAAS,IAAI,EAAE,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,qEAAqE;IACrE,+DAA+D;IAC/D,mEAAmE;IACnE,kEAAkE;IAClE,oEAAoE;IACpE,kEAAkE;IAClE,qEAAqE;IACrE,mEAAmE;IACnE,2CAA2C;IAC3C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvD,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvD,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,kEAAkE;IAClE,+DAA+D;IAC/D,kEAAkE;IAClE,mEAAmE;IACnE,mEAAmE;IACnE,gEAAgE;IAChE,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,WAAW,GAAG,CAAC,CAAa,EAAQ,EAAE;QAC1C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC;QAClD,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,IAAI,MAAM,KAAK,CAAC,CAAC,WAAW,CAAC,QAAQ;YAAE,aAAa,GAAG,IAAI,CAAC;IAC9E,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,EAAE,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;YAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE/C,sDAAsD;IACtD,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,OAAO,GAAI,WAAW,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAElC,oEAAoE;IACpE,iEAAiE;IACjE,kEAAkE;IAClE,2BAA2B;IAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QACzB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YACnC,YAAY,IAAI,CAAC,CAAC,SAAS,CAAC;YAC5B,+DAA+D;YAC/D,+DAA+D;YAC/D,IAAI,YAAY,GAAG,wBAAwB;gBAAE,OAAO,KAAK,CAAC;QAC5D,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,QAAQ;YAAE,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACxF,KAAK,MAAM,EAAE,IAAI,QAAQ;YAAE,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACxF,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,EAAE,CAAC,aAAa,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,EAAE,CAAC,aAAa,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { IDisposable } from "@aardworx/wombat.adaptive";
|
|
2
|
+
import { AttributeArena, IndexAllocator } from "./pools.js";
|
|
3
|
+
/** Address inside a chunked arena. */
|
|
4
|
+
export interface ChunkedRef {
|
|
5
|
+
readonly chunkIdx: number;
|
|
6
|
+
readonly off: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Multi-chunk wrapper around `AttributeArena`. Each chunk is one
|
|
10
|
+
* GrowBuffer / Freelist pair, capped at `maxChunkBytes`. Caller
|
|
11
|
+
* tracks chunkIdx alongside the offset — refs in shaders are just
|
|
12
|
+
* the offset, because shaders bind one chunk at a time.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ChunkedAttributeArena {
|
|
15
|
+
private readonly device;
|
|
16
|
+
private readonly label;
|
|
17
|
+
private readonly usage;
|
|
18
|
+
private readonly initialChunkBytes;
|
|
19
|
+
private readonly maxChunkBytes;
|
|
20
|
+
private readonly _chunks;
|
|
21
|
+
private readonly onChunkAddedCbs;
|
|
22
|
+
constructor(device: GPUDevice, label: string, usage: GPUBufferUsageFlags, initialChunkBytes: number, maxChunkBytes?: number);
|
|
23
|
+
get chunkCount(): number;
|
|
24
|
+
get chunks(): ReadonlyArray<AttributeArena>;
|
|
25
|
+
chunk(i: number): AttributeArena;
|
|
26
|
+
/**
|
|
27
|
+
* Allocate `dataBytes` of attribute storage. Tries the `hint`
|
|
28
|
+
* chunk first when given (caller passes the RO's chunk to keep all
|
|
29
|
+
* uniforms in the same buffer); falls back to the newest chunk;
|
|
30
|
+
* opens a new chunk when none fits.
|
|
31
|
+
*/
|
|
32
|
+
alloc(dataBytes: number, hint?: number): ChunkedRef;
|
|
33
|
+
release(chunkIdx: number, off: number, dataBytes: number): void;
|
|
34
|
+
/** Push the dirty CPU shadow of every chunk to its GPU buffer. */
|
|
35
|
+
flush(device: GPUDevice): void;
|
|
36
|
+
/** Write into a specific chunk's CPU shadow. */
|
|
37
|
+
write(chunkIdx: number, dst: number, data: Uint8Array): void;
|
|
38
|
+
/** Subscribe to "a new chunk was opened" events. Used by the
|
|
39
|
+
* bucket-rebuild path to widen its per-chunk bookkeeping. */
|
|
40
|
+
onChunkAdded(cb: (chunkIdx: number) => void): IDisposable;
|
|
41
|
+
/** Subscribe to "any chunk resized (incl. brand-new chunk)" events.
|
|
42
|
+
* Wires the callback to every current chunk's `onResize` AND
|
|
43
|
+
* fires it for each future-added chunk after subscribing.
|
|
44
|
+
* Used by the scene-level rebuild path that follows arena growth. */
|
|
45
|
+
onAnyResize(cb: (chunkIdx: number) => void): IDisposable;
|
|
46
|
+
/** Total bytes used across all chunks (high-watermark sum). */
|
|
47
|
+
totalUsedBytes(): number;
|
|
48
|
+
destroy(): void;
|
|
49
|
+
private openChunk;
|
|
50
|
+
}
|
|
51
|
+
/** Multi-chunk wrapper around `IndexAllocator`. Element-bump units
|
|
52
|
+
* are u32. Same chunk-open / hint / fallback semantics as
|
|
53
|
+
* `ChunkedAttributeArena`. */
|
|
54
|
+
export declare class ChunkedIndexAllocator {
|
|
55
|
+
private readonly device;
|
|
56
|
+
private readonly label;
|
|
57
|
+
private readonly usage;
|
|
58
|
+
private readonly initialChunkBytes;
|
|
59
|
+
private readonly maxChunkBytes;
|
|
60
|
+
private readonly _chunks;
|
|
61
|
+
private readonly onChunkAddedCbs;
|
|
62
|
+
constructor(device: GPUDevice, label: string, usage: GPUBufferUsageFlags, initialChunkBytes: number, maxChunkBytes?: number);
|
|
63
|
+
get chunkCount(): number;
|
|
64
|
+
get chunks(): ReadonlyArray<IndexAllocator>;
|
|
65
|
+
chunk(i: number): IndexAllocator;
|
|
66
|
+
alloc(elements: number, hint?: number): ChunkedRef;
|
|
67
|
+
release(chunkIdx: number, off: number, elements: number): void;
|
|
68
|
+
flush(device: GPUDevice): void;
|
|
69
|
+
write(chunkIdx: number, dst: number, data: Uint8Array): void;
|
|
70
|
+
onChunkAdded(cb: (chunkIdx: number) => void): IDisposable;
|
|
71
|
+
onAnyResize(cb: (chunkIdx: number) => void): IDisposable;
|
|
72
|
+
totalUsedElements(): number;
|
|
73
|
+
destroy(): void;
|
|
74
|
+
private openChunk;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=chunkedArena.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkedArena.d.ts","sourceRoot":"","sources":["../../../src/runtime/heapScene/chunkedArena.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// Multi-chunk arena allocators — §3 of `docs/heap-future-work.md`.
|
|
2
|
+
//
|
|
3
|
+
// Each chunk owns a separate GPUBuffer with its own pow2-grow + best-
|
|
4
|
+
// fit Freelist. When the newest chunk hits its per-chunk cap, the
|
|
5
|
+
// allocator opens a fresh chunk and routes subsequent allocations
|
|
6
|
+
// there. Each (chunkIdx, offset) is the address; refs in master
|
|
7
|
+
// records / drawHeaders carry only the offset — chunkIdx is implicit
|
|
8
|
+
// in which chunk's bind group the current draw call is using.
|
|
9
|
+
//
|
|
10
|
+
// Cap policy: `maxChunkBytes` ≤ `device.limits.maxStorageBufferBindingSize`
|
|
11
|
+
// per chunk. Default: `min(adapter, DEFAULT_MAX_BUFFER_BYTES)`. Tests
|
|
12
|
+
// can pass a tiny cap (e.g. 4 MB) to exercise multi-chunk behaviour
|
|
13
|
+
// without massive workloads.
|
|
14
|
+
import { GrowBuffer, DEFAULT_MAX_BUFFER_BYTES } from "./growBuffer.js";
|
|
15
|
+
import { AttributeArena, IndexAllocator } from "./pools.js";
|
|
16
|
+
/**
|
|
17
|
+
* Multi-chunk wrapper around `AttributeArena`. Each chunk is one
|
|
18
|
+
* GrowBuffer / Freelist pair, capped at `maxChunkBytes`. Caller
|
|
19
|
+
* tracks chunkIdx alongside the offset — refs in shaders are just
|
|
20
|
+
* the offset, because shaders bind one chunk at a time.
|
|
21
|
+
*/
|
|
22
|
+
export class ChunkedAttributeArena {
|
|
23
|
+
device;
|
|
24
|
+
label;
|
|
25
|
+
usage;
|
|
26
|
+
initialChunkBytes;
|
|
27
|
+
maxChunkBytes;
|
|
28
|
+
_chunks = [];
|
|
29
|
+
onChunkAddedCbs = new Set();
|
|
30
|
+
constructor(device, label, usage, initialChunkBytes, maxChunkBytes = DEFAULT_MAX_BUFFER_BYTES) {
|
|
31
|
+
this.device = device;
|
|
32
|
+
this.label = label;
|
|
33
|
+
this.usage = usage;
|
|
34
|
+
this.initialChunkBytes = initialChunkBytes;
|
|
35
|
+
this.maxChunkBytes = maxChunkBytes;
|
|
36
|
+
this.openChunk();
|
|
37
|
+
}
|
|
38
|
+
get chunkCount() { return this._chunks.length; }
|
|
39
|
+
get chunks() { return this._chunks; }
|
|
40
|
+
chunk(i) { return this._chunks[i]; }
|
|
41
|
+
/**
|
|
42
|
+
* Allocate `dataBytes` of attribute storage. Tries the `hint`
|
|
43
|
+
* chunk first when given (caller passes the RO's chunk to keep all
|
|
44
|
+
* uniforms in the same buffer); falls back to the newest chunk;
|
|
45
|
+
* opens a new chunk when none fits.
|
|
46
|
+
*/
|
|
47
|
+
alloc(dataBytes, hint) {
|
|
48
|
+
if (hint !== undefined && hint >= 0 && hint < this._chunks.length) {
|
|
49
|
+
const off = this._chunks[hint].tryAlloc(dataBytes);
|
|
50
|
+
if (off !== undefined)
|
|
51
|
+
return { chunkIdx: hint, off };
|
|
52
|
+
}
|
|
53
|
+
// Newest-first ordering keeps freshly-opened chunks busy and
|
|
54
|
+
// older chunks naturally drain as their ROs release (helping
|
|
55
|
+
// future drop-empty-chunks cleanup land cheaply).
|
|
56
|
+
for (let i = this._chunks.length - 1; i >= 0; i--) {
|
|
57
|
+
if (i === hint)
|
|
58
|
+
continue;
|
|
59
|
+
const off = this._chunks[i].tryAlloc(dataBytes);
|
|
60
|
+
if (off !== undefined)
|
|
61
|
+
return { chunkIdx: i, off };
|
|
62
|
+
}
|
|
63
|
+
const newIdx = this.openChunk();
|
|
64
|
+
const off = this._chunks[newIdx].tryAlloc(dataBytes);
|
|
65
|
+
if (off === undefined) {
|
|
66
|
+
throw new Error(`ChunkedAttributeArena '${this.label}': allocation of ${dataBytes}B exceeds maxChunkBytes ${this.maxChunkBytes}`);
|
|
67
|
+
}
|
|
68
|
+
return { chunkIdx: newIdx, off };
|
|
69
|
+
}
|
|
70
|
+
release(chunkIdx, off, dataBytes) {
|
|
71
|
+
const c = this._chunks[chunkIdx];
|
|
72
|
+
if (c === undefined)
|
|
73
|
+
return;
|
|
74
|
+
c.release(off, dataBytes);
|
|
75
|
+
}
|
|
76
|
+
/** Push the dirty CPU shadow of every chunk to its GPU buffer. */
|
|
77
|
+
flush(device) {
|
|
78
|
+
for (const c of this._chunks)
|
|
79
|
+
c.flush(device);
|
|
80
|
+
}
|
|
81
|
+
/** Write into a specific chunk's CPU shadow. */
|
|
82
|
+
write(chunkIdx, dst, data) {
|
|
83
|
+
this._chunks[chunkIdx].write(dst, data);
|
|
84
|
+
}
|
|
85
|
+
/** Subscribe to "a new chunk was opened" events. Used by the
|
|
86
|
+
* bucket-rebuild path to widen its per-chunk bookkeeping. */
|
|
87
|
+
onChunkAdded(cb) {
|
|
88
|
+
this.onChunkAddedCbs.add(cb);
|
|
89
|
+
return { dispose: () => { this.onChunkAddedCbs.delete(cb); } };
|
|
90
|
+
}
|
|
91
|
+
/** Subscribe to "any chunk resized (incl. brand-new chunk)" events.
|
|
92
|
+
* Wires the callback to every current chunk's `onResize` AND
|
|
93
|
+
* fires it for each future-added chunk after subscribing.
|
|
94
|
+
* Used by the scene-level rebuild path that follows arena growth. */
|
|
95
|
+
onAnyResize(cb) {
|
|
96
|
+
const disposables = [];
|
|
97
|
+
for (let i = 0; i < this._chunks.length; i++) {
|
|
98
|
+
const idx = i;
|
|
99
|
+
disposables.push(this._chunks[i].onResize(() => cb(idx)));
|
|
100
|
+
}
|
|
101
|
+
disposables.push(this.onChunkAdded((idx) => {
|
|
102
|
+
disposables.push(this._chunks[idx].onResize(() => cb(idx)));
|
|
103
|
+
// Also fire once for the new chunk so listeners can wire bind
|
|
104
|
+
// groups to it.
|
|
105
|
+
cb(idx);
|
|
106
|
+
}));
|
|
107
|
+
return { dispose: () => { for (const d of disposables)
|
|
108
|
+
d.dispose(); } };
|
|
109
|
+
}
|
|
110
|
+
/** Total bytes used across all chunks (high-watermark sum). */
|
|
111
|
+
totalUsedBytes() {
|
|
112
|
+
let s = 0;
|
|
113
|
+
for (const c of this._chunks)
|
|
114
|
+
s += c.usedBytes;
|
|
115
|
+
return s;
|
|
116
|
+
}
|
|
117
|
+
destroy() {
|
|
118
|
+
for (const c of this._chunks)
|
|
119
|
+
c.destroy();
|
|
120
|
+
this._chunks.length = 0;
|
|
121
|
+
}
|
|
122
|
+
openChunk() {
|
|
123
|
+
const idx = this._chunks.length;
|
|
124
|
+
const buf = new GrowBuffer(this.device, `${this.label}/c${idx}`, this.usage, this.initialChunkBytes, this.maxChunkBytes);
|
|
125
|
+
this._chunks.push(new AttributeArena(buf));
|
|
126
|
+
for (const cb of this.onChunkAddedCbs)
|
|
127
|
+
cb(idx);
|
|
128
|
+
return idx;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** Multi-chunk wrapper around `IndexAllocator`. Element-bump units
|
|
132
|
+
* are u32. Same chunk-open / hint / fallback semantics as
|
|
133
|
+
* `ChunkedAttributeArena`. */
|
|
134
|
+
export class ChunkedIndexAllocator {
|
|
135
|
+
device;
|
|
136
|
+
label;
|
|
137
|
+
usage;
|
|
138
|
+
initialChunkBytes;
|
|
139
|
+
maxChunkBytes;
|
|
140
|
+
_chunks = [];
|
|
141
|
+
onChunkAddedCbs = new Set();
|
|
142
|
+
constructor(device, label, usage, initialChunkBytes, maxChunkBytes = DEFAULT_MAX_BUFFER_BYTES) {
|
|
143
|
+
this.device = device;
|
|
144
|
+
this.label = label;
|
|
145
|
+
this.usage = usage;
|
|
146
|
+
this.initialChunkBytes = initialChunkBytes;
|
|
147
|
+
this.maxChunkBytes = maxChunkBytes;
|
|
148
|
+
this.openChunk();
|
|
149
|
+
}
|
|
150
|
+
get chunkCount() { return this._chunks.length; }
|
|
151
|
+
get chunks() { return this._chunks; }
|
|
152
|
+
chunk(i) { return this._chunks[i]; }
|
|
153
|
+
alloc(elements, hint) {
|
|
154
|
+
if (hint !== undefined && hint >= 0 && hint < this._chunks.length) {
|
|
155
|
+
const off = this._chunks[hint].tryAlloc(elements);
|
|
156
|
+
if (off !== undefined)
|
|
157
|
+
return { chunkIdx: hint, off };
|
|
158
|
+
}
|
|
159
|
+
for (let i = this._chunks.length - 1; i >= 0; i--) {
|
|
160
|
+
if (i === hint)
|
|
161
|
+
continue;
|
|
162
|
+
const off = this._chunks[i].tryAlloc(elements);
|
|
163
|
+
if (off !== undefined)
|
|
164
|
+
return { chunkIdx: i, off };
|
|
165
|
+
}
|
|
166
|
+
const newIdx = this.openChunk();
|
|
167
|
+
const off = this._chunks[newIdx].tryAlloc(elements);
|
|
168
|
+
if (off === undefined) {
|
|
169
|
+
throw new Error(`ChunkedIndexAllocator '${this.label}': allocation of ${elements} elements exceeds maxChunkBytes/4 ${this.maxChunkBytes / 4}`);
|
|
170
|
+
}
|
|
171
|
+
return { chunkIdx: newIdx, off };
|
|
172
|
+
}
|
|
173
|
+
release(chunkIdx, off, elements) {
|
|
174
|
+
const c = this._chunks[chunkIdx];
|
|
175
|
+
if (c === undefined)
|
|
176
|
+
return;
|
|
177
|
+
c.release(off, elements);
|
|
178
|
+
}
|
|
179
|
+
flush(device) {
|
|
180
|
+
for (const c of this._chunks)
|
|
181
|
+
c.flush(device);
|
|
182
|
+
}
|
|
183
|
+
write(chunkIdx, dst, data) {
|
|
184
|
+
this._chunks[chunkIdx].write(dst, data);
|
|
185
|
+
}
|
|
186
|
+
onChunkAdded(cb) {
|
|
187
|
+
this.onChunkAddedCbs.add(cb);
|
|
188
|
+
return { dispose: () => { this.onChunkAddedCbs.delete(cb); } };
|
|
189
|
+
}
|
|
190
|
+
onAnyResize(cb) {
|
|
191
|
+
const disposables = [];
|
|
192
|
+
for (let i = 0; i < this._chunks.length; i++) {
|
|
193
|
+
const idx = i;
|
|
194
|
+
disposables.push(this._chunks[i].onResize(() => cb(idx)));
|
|
195
|
+
}
|
|
196
|
+
disposables.push(this.onChunkAdded((idx) => {
|
|
197
|
+
disposables.push(this._chunks[idx].onResize(() => cb(idx)));
|
|
198
|
+
cb(idx);
|
|
199
|
+
}));
|
|
200
|
+
return { dispose: () => { for (const d of disposables)
|
|
201
|
+
d.dispose(); } };
|
|
202
|
+
}
|
|
203
|
+
totalUsedElements() {
|
|
204
|
+
let s = 0;
|
|
205
|
+
for (const c of this._chunks)
|
|
206
|
+
s += c.usedElements;
|
|
207
|
+
return s;
|
|
208
|
+
}
|
|
209
|
+
destroy() {
|
|
210
|
+
for (const c of this._chunks)
|
|
211
|
+
c.destroy();
|
|
212
|
+
this._chunks.length = 0;
|
|
213
|
+
}
|
|
214
|
+
openChunk() {
|
|
215
|
+
const idx = this._chunks.length;
|
|
216
|
+
const buf = new GrowBuffer(this.device, `${this.label}/c${idx}`, this.usage, this.initialChunkBytes, this.maxChunkBytes);
|
|
217
|
+
this._chunks.push(new IndexAllocator(buf));
|
|
218
|
+
for (const cb of this.onChunkAddedCbs)
|
|
219
|
+
cb(idx);
|
|
220
|
+
return idx;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=chunkedArena.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkedArena.js","sourceRoot":"","sources":["../../../src/runtime/heapScene/chunkedArena.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A best-fit free-block manager. All offsets and sizes are in the
|
|
3
|
+
* caller's units (bytes for the attribute arena, u32 elements for
|
|
4
|
+
* the index allocator); the freelist doesn't interpret them.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Freelist {
|
|
7
|
+
/** size → set of starting offsets currently free at that size. */
|
|
8
|
+
private readonly bySize;
|
|
9
|
+
/** Sorted ascending list of every size present in `bySize`. */
|
|
10
|
+
private readonly sizes;
|
|
11
|
+
/** off → size, for the right-coalesce probe in `release`. */
|
|
12
|
+
private readonly byStart;
|
|
13
|
+
/** off+size (= end offset) → off, for the left-coalesce probe. */
|
|
14
|
+
private readonly byEnd;
|
|
15
|
+
/** Number of distinct free blocks currently tracked. */
|
|
16
|
+
get blockCount(): number;
|
|
17
|
+
/**
|
|
18
|
+
* Return any offset of a free block whose size is ≥ `size`, splitting
|
|
19
|
+
* off any leftover bytes back into the freelist. Returns `undefined`
|
|
20
|
+
* when no block fits.
|
|
21
|
+
*/
|
|
22
|
+
alloc(size: number): number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Reintroduce a `(off, size)` block, coalescing with any immediate
|
|
25
|
+
* neighbour on the left (some other block ending at `off`) or right
|
|
26
|
+
* (some other block starting at `off + size`).
|
|
27
|
+
*/
|
|
28
|
+
release(off: number, size: number): void;
|
|
29
|
+
/**
|
|
30
|
+
* Take and remove the free block whose end offset is exactly
|
|
31
|
+
* `endOff`, if any exists. Used by `AttributeArena` /
|
|
32
|
+
* `IndexAllocator` to shrink the bump cursor back when releases
|
|
33
|
+
* expose a free tail (§5 — cursor-shrink hygiene for long-lived
|
|
34
|
+
* high-churn scenes).
|
|
35
|
+
*/
|
|
36
|
+
takeBlockEndingAt(endOff: number): {
|
|
37
|
+
off: number;
|
|
38
|
+
size: number;
|
|
39
|
+
} | undefined;
|
|
40
|
+
/** Drop every block. */
|
|
41
|
+
clear(): void;
|
|
42
|
+
/** Snapshot for tests / debugging — sorted by offset. */
|
|
43
|
+
toArray(): Array<{
|
|
44
|
+
off: number;
|
|
45
|
+
size: number;
|
|
46
|
+
}>;
|
|
47
|
+
private addBlock;
|
|
48
|
+
private removeBlock;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=freelist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freelist.d.ts","sourceRoot":"","sources":["../../../src/runtime/heapScene/freelist.ts"],"names":[],"mappings":"AA+BA;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEnD,wDAAwD;IACxD,IAAI,UAAU,IAAI,MAAM,CAA8B;IAEtD;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAavC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAqBxC;;;;;;OAMG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAQ5E,wBAAwB;IACxB,KAAK,IAAI,IAAI;IAOb,yDAAyD;IACzD,OAAO,IAAI,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAO/C,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,WAAW;CAYpB"}
|