@aardworx/wombat.rendering 0.9.23 → 0.9.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/runtime/derivedModes/gpuDispatcher.d.ts +2 -4
- package/dist/runtime/derivedModes/gpuDispatcher.d.ts.map +1 -1
- package/dist/runtime/derivedModes/gpuDispatcher.js +19 -7
- package/dist/runtime/derivedModes/gpuDispatcher.js.map +1 -1
- package/dist/runtime/derivedModes/rule.d.ts +9 -3
- package/dist/runtime/derivedModes/rule.d.ts.map +1 -1
- package/dist/runtime/derivedModes/rule.js.map +1 -1
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +106 -82
- package/dist/runtime/heapScene.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/derivedModes/gpuDispatcher.ts +29 -10
- package/src/runtime/derivedModes/rule.ts +14 -3
- package/src/runtime/heapScene.ts +119 -78
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CullMode } from "../pipelineCache/index.js";
|
|
2
|
+
import type { aval } from "@aardworx/wombat.adaptive";
|
|
2
3
|
export declare class GpuDerivedModesScene {
|
|
3
4
|
readonly device: GPUDevice;
|
|
4
5
|
private readonly entries;
|
|
@@ -15,9 +16,6 @@ export declare class GpuDerivedModesScene {
|
|
|
15
16
|
private capacity;
|
|
16
17
|
/** Last-known arena buffer, used to detect bind-group invalidation. */
|
|
17
18
|
private arenaBuf;
|
|
18
|
-
/** Last-known declared (for kernel uniform). Common case: all RO
|
|
19
|
-
* rules share the same declared (= the SG scope's value). */
|
|
20
|
-
private declared;
|
|
21
19
|
/** True while the staging buffer's mapAsync is in flight. We must
|
|
22
20
|
* not enqueue a new copyBufferToBuffer into it until it's been
|
|
23
21
|
* unmapped (mapAsync resolved + unmap called). */
|
|
@@ -26,7 +24,7 @@ export declare class GpuDerivedModesScene {
|
|
|
26
24
|
readonly lastOutput: Uint32Array;
|
|
27
25
|
constructor(device: GPUDevice);
|
|
28
26
|
get registered(): number;
|
|
29
|
-
registerRo(drawId: number, modelRef: number, declared: CullMode): void;
|
|
27
|
+
registerRo(drawId: number, modelRef: number, declared: CullMode | aval<CullMode>): void;
|
|
30
28
|
deregisterRo(drawId: number): void;
|
|
31
29
|
markDirty(): void;
|
|
32
30
|
consumeDirty(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuDispatcher.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedModes/gpuDispatcher.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"gpuDispatcher.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedModes/gpuDispatcher.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAgBtD,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,KAAK,CAAS;IAGtB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,MAAM,CAAuC;IACrD,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAK;IACrB,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAA0B;IAC1C;;uDAEmD;IACnD,OAAO,CAAC,gBAAgB,CAAS;IAEjC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;gBAErB,MAAM,EAAE,SAAS;IAK7B,IAAI,UAAU,IAAI,MAAM,CAA2B;IAEnD,UAAU,CACR,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAClC,IAAI;IAMP,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOlC,SAAS,IAAI,IAAI;IACjB,YAAY,IAAI,OAAO;IAEvB,OAAO,CAAC,eAAe;IAmDvB,oEAAoE;IACpE,OAAO,CAAC,YAAY;IA2BpB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM;IAqB7E;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3C,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
//
|
|
22
22
|
// The buffers grow lazily (pow2) as ROs are added.
|
|
23
23
|
import { GPU_FLIP_CULL_BY_DET_WGSL, CULL_TO_U32 } from "./gpuKernel.js";
|
|
24
|
+
import { AdaptiveToken } from "@aardworx/wombat.adaptive";
|
|
24
25
|
const NO_RULE = 0xFFFFFFFF;
|
|
25
26
|
const WG_SIZE = 64;
|
|
26
27
|
const POW2 = (n) => { let p = 1; while (p < n)
|
|
@@ -42,9 +43,6 @@ export class GpuDerivedModesScene {
|
|
|
42
43
|
capacity = 0;
|
|
43
44
|
/** Last-known arena buffer, used to detect bind-group invalidation. */
|
|
44
45
|
arenaBuf = null;
|
|
45
|
-
/** Last-known declared (for kernel uniform). Common case: all RO
|
|
46
|
-
* rules share the same declared (= the SG scope's value). */
|
|
47
|
-
declared = CULL_TO_U32.back;
|
|
48
46
|
/** True while the staging buffer's mapAsync is in flight. We must
|
|
49
47
|
* not enqueue a new copyBufferToBuffer into it until it's been
|
|
50
48
|
* unmapped (mapAsync resolved + unmap called). */
|
|
@@ -57,10 +55,9 @@ export class GpuDerivedModesScene {
|
|
|
57
55
|
}
|
|
58
56
|
get registered() { return this.liveCount; }
|
|
59
57
|
registerRo(drawId, modelRef, declared) {
|
|
60
|
-
this.entries[drawId] = { modelRef,
|
|
58
|
+
this.entries[drawId] = { modelRef, declared };
|
|
61
59
|
this.liveCount++;
|
|
62
60
|
this.dirty = true;
|
|
63
|
-
this.declared = CULL_TO_U32[declared];
|
|
64
61
|
}
|
|
65
62
|
deregisterRo(drawId) {
|
|
66
63
|
if (this.entries[drawId] === undefined)
|
|
@@ -124,13 +121,28 @@ export class GpuDerivedModesScene {
|
|
|
124
121
|
/** Upload current per-RO input refs + params; called when dirty. */
|
|
125
122
|
uploadInputs(numROs) {
|
|
126
123
|
const refs = new Uint32Array(this.capacity).fill(NO_RULE);
|
|
124
|
+
let declaredU32 = CULL_TO_U32.back;
|
|
127
125
|
for (let i = 0; i < numROs; i++) {
|
|
128
126
|
const e = this.entries[i];
|
|
129
|
-
if (e !== undefined)
|
|
127
|
+
if (e !== undefined) {
|
|
130
128
|
refs[i] = e.modelRef;
|
|
129
|
+
// Resolve the declared each dispatch. v1 supports one shared
|
|
130
|
+
// declared per kernel (single uniform in the WGSL). Last
|
|
131
|
+
// registered entry's declared wins. For the typical SG shape
|
|
132
|
+
// where a single `<Sg CullMode={cv}>` wraps every leaf, every
|
|
133
|
+
// entry's declared is the same aval — so picking the last is
|
|
134
|
+
// equivalent to picking any. If the user genuinely binds
|
|
135
|
+
// distinct declareds across the scene, an axis-domain
|
|
136
|
+
// analyzer would be the correct generalization.
|
|
137
|
+
const d = e.declared;
|
|
138
|
+
const v = typeof d === "string"
|
|
139
|
+
? d
|
|
140
|
+
: d.getValue(AdaptiveToken.top);
|
|
141
|
+
declaredU32 = CULL_TO_U32[v];
|
|
142
|
+
}
|
|
131
143
|
}
|
|
132
144
|
this.device.queue.writeBuffer(this.inputBuf, 0, refs.buffer, refs.byteOffset, refs.byteLength);
|
|
133
|
-
const params = new Uint32Array([numROs,
|
|
145
|
+
const params = new Uint32Array([numROs, declaredU32, 0, 0]);
|
|
134
146
|
this.device.queue.writeBuffer(this.paramsBuf, 0, params.buffer, params.byteOffset, params.byteLength);
|
|
135
147
|
}
|
|
136
148
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuDispatcher.js","sourceRoot":"","sources":["../../../src/runtime/derivedModes/gpuDispatcher.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,kDAAkD;AAClD,EAAE;AACF,YAAY;AACZ,YAAY;AACZ,EAAE;AACF,qDAAqD;AACrD,sEAAsE;AACtE,kEAAkE;AAClE,kDAAkD;AAClD,sDAAsD;AACtD,gEAAgE;AAChE,wCAAwC;AACxC,sEAAsE;AACtE,uEAAuE;AACvE,oBAAoB;AACpB,iEAAiE;AACjE,iEAAiE;AACjE,kEAAkE;AAClE,kDAAkD;AAClD,EAAE;AACF,mDAAmD;AAEnD,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGxE,MAAM,OAAO,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"gpuDispatcher.js","sourceRoot":"","sources":["../../../src/runtime/derivedModes/gpuDispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,8 +30,14 @@ export interface GpuRuleSpec<A extends ModeAxis = ModeAxis> {
|
|
|
30
30
|
readonly kernel: "flipCullByDeterminant";
|
|
31
31
|
/** Name of the input uniform the kernel reads (e.g. "ModelTrafo"). */
|
|
32
32
|
readonly inputUniform: string;
|
|
33
|
-
/**
|
|
34
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Declared (SG-scope) value the kernel mutates by. Either a plain
|
|
35
|
+
* mode value (baked at scene-build) or an `aval` for reactive
|
|
36
|
+
* declared — the dispatcher re-uploads the kernel uniform on each
|
|
37
|
+
* dispatch from the aval's current value, so flipping it via a UI
|
|
38
|
+
* cval re-runs the rule with the new declared.
|
|
39
|
+
*/
|
|
40
|
+
readonly declared: ModeValue<A> | import("@aardworx/wombat.adaptive").aval<ModeValue<A>>;
|
|
35
41
|
}
|
|
36
42
|
export interface DerivedModeRule<A extends ModeAxis = ModeAxis> {
|
|
37
43
|
readonly __derivedModeRule: true;
|
|
@@ -88,5 +94,5 @@ export declare function flipCull(c: CullMode): CullMode;
|
|
|
88
94
|
* cost — the kernel walks the arena once per frame for ALL ROs that
|
|
89
95
|
* carry this rule.
|
|
90
96
|
*/
|
|
91
|
-
export declare function gpuFlipCullByDeterminant(inputUniform: string, declared?: CullMode): DerivedModeRule<"cull">;
|
|
97
|
+
export declare function gpuFlipCullByDeterminant(inputUniform: string, declared?: CullMode | import("@aardworx/wombat.adaptive").aval<CullMode>): DerivedModeRule<"cull">;
|
|
92
98
|
//# sourceMappingURL=rule.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedModes/rule.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE/E;;;wDAGwD;AACxD,MAAM,MAAM,QAAQ,GAChB,MAAM,GAAG,WAAW,GAAG,UAAU,GACjC,cAAc,GAAG,YAAY,GAC7B,iBAAiB,CAAC;AAEtB,kCAAkC;AAClC,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,QAAQ,IACtC,CAAC,SAAS,MAAM,GAAa,QAAQ,GACrC,CAAC,SAAS,WAAW,GAAQ,SAAS,GACtC,CAAC,SAAS,UAAU,GAAS,QAAQ,GACrC,CAAC,SAAS,cAAc,GAAK,kBAAkB,GAC/C,CAAC,SAAS,YAAY,GAAO,OAAO,GACpC,CAAC,SAAS,iBAAiB,GAAG,OAAO,GACrC,KAAK,CAAC;AAER;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,QAAQ,IAAI,CACnD,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,KACnB,SAAS,CAAC,CAAC,CAAC,CAAC;AAElB;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACxD,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,sEAAsE;IACtE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B
|
|
1
|
+
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedModes/rule.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE/E;;;wDAGwD;AACxD,MAAM,MAAM,QAAQ,GAChB,MAAM,GAAG,WAAW,GAAG,UAAU,GACjC,cAAc,GAAG,YAAY,GAC7B,iBAAiB,CAAC;AAEtB,kCAAkC;AAClC,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,QAAQ,IACtC,CAAC,SAAS,MAAM,GAAa,QAAQ,GACrC,CAAC,SAAS,WAAW,GAAQ,SAAS,GACtC,CAAC,SAAS,UAAU,GAAS,QAAQ,GACrC,CAAC,SAAS,cAAc,GAAK,kBAAkB,GAC/C,CAAC,SAAS,YAAY,GAAO,OAAO,GACpC,CAAC,SAAS,iBAAiB,GAAG,OAAO,GACrC,KAAK,CAAC;AAER;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,QAAQ,IAAI,CACnD,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,KACnB,SAAS,CAAC,CAAC,CAAC,CAAC;AAElB;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACxD,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,sEAAsE;IACtE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EACb,SAAS,CAAC,CAAC,CAAC,GACZ,OAAO,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IAC5D,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAK,CAAC,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACzC,wDAAwD;IACxD,QAAQ,CAAC,GAAG,CAAC,EAAK,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAC5C,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC/B,OAAO,GAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;CAAO,GAC9D,eAAe,CAAC,CAAC,CAAC,CAKpB;AAED;mEACmE;AACnE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,eAAe,CAGlE;AAED;6EAC6E;AAC7E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAE9C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,QAAQ,GACJ,QAAQ,GACR,OAAO,2BAA2B,EAAE,IAAI,CAAC,QAAQ,CAC3C,GACT,eAAe,CAAC,MAAM,CAAC,CAwBzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/runtime/derivedModes/rule.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,oEAAoE;AACpE,iBAAiB;AACjB,EAAE;AACF,mEAAmE;AACnE,kEAAkE;AAClE,oEAAoE;AACpE,oEAAoE;AACpE,iEAAiE;AACjE,iEAAiE;AACjE,sBAAsB;AACtB,EAAE;AACF,iEAAiE;AACjE,oEAAoE;AACpE,4DAA4D;AAC5D,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,oDAAoD;
|
|
1
|
+
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/runtime/derivedModes/rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heapScene.d.ts","sourceRoot":"","sources":["../../src/runtime/heapScene.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"heapScene.d.ts","sourceRoot":"","sources":["../../src/runtime/heapScene.ts"],"names":[],"mappings":"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"}
|
|
@@ -121,6 +121,12 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
121
121
|
modeAvalCallbacks.set(av, addMarkingCallback(av, () => {
|
|
122
122
|
for (const id of set)
|
|
123
123
|
dirtyModeKeyDrawIds.add(id);
|
|
124
|
+
// Mark the GPU mode-rules dispatcher dirty too — at least one
|
|
125
|
+
// of those drawIds may carry a GPU rule whose input changed.
|
|
126
|
+
// The dispatch path checks consumeDirty() before encoding, so
|
|
127
|
+
// an unrelated aval mark (e.g. Color change on hover) leaves
|
|
128
|
+
// the kernel quiet.
|
|
129
|
+
gpuModesScene?.markDirty();
|
|
124
130
|
}));
|
|
125
131
|
}
|
|
126
132
|
set.add(drawId);
|
|
@@ -1431,10 +1437,14 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
1431
1437
|
if (gpuModesScene === undefined)
|
|
1432
1438
|
gpuModesScene = new GpuDerivedModesScene(device);
|
|
1433
1439
|
gpuModesScene.registerRo(drawId, inputRef, gpuRule.declared);
|
|
1440
|
+
// If declared is reactive (e.g. a shared cullModeC cval),
|
|
1441
|
+
// subscribe so flipping it marks the dispatcher dirty.
|
|
1442
|
+
// Plain values: no subscription needed.
|
|
1443
|
+
if (typeof gpuRule.declared !== "string") {
|
|
1444
|
+
subscribeModeLeaf(gpuRule.declared, drawId);
|
|
1445
|
+
}
|
|
1434
1446
|
if (drawId < 3 || drawId % 20 === 0) {
|
|
1435
|
-
|
|
1436
|
-
// spamming for big scenes.
|
|
1437
|
-
console.debug(`[heapScene] GPU rule registered drawId=${drawId} input='${gpuRule.inputUniform}' ref=${inputRef} declared=${gpuRule.declared}`);
|
|
1447
|
+
console.debug(`[heapScene] GPU rule registered drawId=${drawId} input='${gpuRule.inputUniform}' ref=${inputRef} declared=${typeof gpuRule.declared === "string" ? gpuRule.declared : "<aval>"}`);
|
|
1438
1448
|
}
|
|
1439
1449
|
}
|
|
1440
1450
|
else {
|
|
@@ -1738,9 +1748,9 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
1738
1748
|
}
|
|
1739
1749
|
arr.push(drawId);
|
|
1740
1750
|
}
|
|
1751
|
+
const renames = [];
|
|
1752
|
+
const slowChanged = []; // ROs going through per-RO
|
|
1741
1753
|
for (const [bucket, ids] of byBucket) {
|
|
1742
|
-
// First recompute every dirty tracker so .modeKey is fresh.
|
|
1743
|
-
// Filter out ones whose value didn't actually change.
|
|
1744
1754
|
const changed = [];
|
|
1745
1755
|
for (const drawId of ids) {
|
|
1746
1756
|
const tracker = drawIdToModeTracker[drawId];
|
|
@@ -1755,66 +1765,79 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
1755
1765
|
}
|
|
1756
1766
|
if (changed.length === 0)
|
|
1757
1767
|
continue;
|
|
1758
|
-
// Try the all-together fast path.
|
|
1759
1768
|
const wholeBucket = changed.length === bucket.drawSlots.size;
|
|
1760
1769
|
if (wholeBucket) {
|
|
1761
1770
|
const repId = changed[0];
|
|
1762
1771
|
const repTracker = drawIdToModeTracker[repId];
|
|
1763
|
-
const newKey = repTracker.modeKey;
|
|
1764
|
-
// Compute the new bucketByKey string; we need the family.
|
|
1765
1772
|
const sample = drawIdToSpec[repId];
|
|
1766
1773
|
const fam = familyFor(sample.effect);
|
|
1774
|
+
const newKey = repTracker.modeKey;
|
|
1767
1775
|
const newBk = `family#${fam.schema.id}|mk#${newKey.toString(16)}`;
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
let oldBk;
|
|
1774
|
-
for (const [k, v] of bucketByKey) {
|
|
1775
|
-
if (v === bucket) {
|
|
1776
|
-
oldBk = k;
|
|
1777
|
-
break;
|
|
1778
|
-
}
|
|
1776
|
+
let oldBk;
|
|
1777
|
+
for (const [k, v] of bucketByKey) {
|
|
1778
|
+
if (v === bucket) {
|
|
1779
|
+
oldBk = k;
|
|
1780
|
+
break;
|
|
1779
1781
|
}
|
|
1780
|
-
if (oldBk !== undefined)
|
|
1781
|
-
bucketByKey.delete(oldBk);
|
|
1782
|
-
bucketByKey.set(newBk, bucket);
|
|
1783
|
-
// Build the new pipeline with the snapshotted PS.
|
|
1784
|
-
const desc = repTracker.descriptor;
|
|
1785
|
-
const { pipelineLayout } = getBgl(bucket.layout, bucket.isAtlasBucket);
|
|
1786
|
-
const newPipeline = device.createRenderPipeline({
|
|
1787
|
-
label: `heapScene/${newBk}/pipeline`,
|
|
1788
|
-
layout: pipelineLayout,
|
|
1789
|
-
vertex: { module: familyFor(sample.effect).vsModule, entryPoint: familyFor(sample.effect).vsEntryName, buffers: [] },
|
|
1790
|
-
fragment: { module: familyFor(sample.effect).fsModule, entryPoint: familyFor(sample.effect).fsEntryName, targets: colorTargets },
|
|
1791
|
-
primitive: { topology: desc.topology, cullMode: desc.cullMode, frontFace: desc.frontFace },
|
|
1792
|
-
...(depthFormat !== undefined && desc.depth !== undefined
|
|
1793
|
-
? { depthStencil: { format: depthFormat, depthWriteEnabled: desc.depth.write, depthCompare: desc.depth.compare } }
|
|
1794
|
-
: depthFormat !== undefined
|
|
1795
|
-
? { depthStencil: { format: depthFormat, depthWriteEnabled: false, depthCompare: "always" } }
|
|
1796
|
-
: {}),
|
|
1797
|
-
});
|
|
1798
|
-
// Swap pipeline reference on the bucket's single slot.
|
|
1799
|
-
// (Multi-slot Phase 5c would update one slot at a time.)
|
|
1800
|
-
bucket.slots[0].pipeline = newPipeline;
|
|
1801
|
-
continue; // done with this bucket
|
|
1802
1782
|
}
|
|
1803
|
-
|
|
1804
|
-
|
|
1783
|
+
if (oldBk !== undefined && oldBk !== newBk) {
|
|
1784
|
+
renames.push({ bucket, repId, newKey, newBk, oldBk });
|
|
1785
|
+
continue;
|
|
1786
|
+
}
|
|
1787
|
+
if (oldBk === newBk)
|
|
1788
|
+
continue; // shouldn't happen but safe
|
|
1805
1789
|
}
|
|
1806
|
-
//
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1790
|
+
// Partial transition: per-RO slow path.
|
|
1791
|
+
for (const c of changed)
|
|
1792
|
+
slowChanged.push(c);
|
|
1793
|
+
}
|
|
1794
|
+
if (renames.length > 0) {
|
|
1795
|
+
// Phase 1: remove all old keys. After this, the renames' new
|
|
1796
|
+
// keys are free unless they collide with a NON-rename
|
|
1797
|
+
// bucket's current key.
|
|
1798
|
+
for (const r of renames)
|
|
1799
|
+
bucketByKey.delete(r.oldBk);
|
|
1800
|
+
// Phase 2: assign new keys, building new pipelines. If a
|
|
1801
|
+
// collision still exists after phase 1 (against a stale
|
|
1802
|
+
// bucket that's NOT being renamed), restore old key + fall
|
|
1803
|
+
// back to per-RO for that bucket's records.
|
|
1804
|
+
for (const r of renames) {
|
|
1805
|
+
if (bucketByKey.has(r.newBk)) {
|
|
1806
|
+
// Collision with a stale bucket. Restore + flag for slow.
|
|
1807
|
+
bucketByKey.set(r.oldBk, r.bucket);
|
|
1808
|
+
for (const id of r.bucket.drawSlots)
|
|
1809
|
+
slowChanged.push(id);
|
|
1812
1810
|
continue;
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1811
|
+
}
|
|
1812
|
+
bucketByKey.set(r.newBk, r.bucket);
|
|
1813
|
+
const tracker = drawIdToModeTracker[r.repId];
|
|
1814
|
+
const sample = drawIdToSpec[r.repId];
|
|
1815
|
+
const desc = tracker.descriptor;
|
|
1816
|
+
const { pipelineLayout } = getBgl(r.bucket.layout, r.bucket.isAtlasBucket);
|
|
1817
|
+
const newPipeline = device.createRenderPipeline({
|
|
1818
|
+
label: `heapScene/${r.newBk}/pipeline`,
|
|
1819
|
+
layout: pipelineLayout,
|
|
1820
|
+
vertex: { module: familyFor(sample.effect).vsModule, entryPoint: familyFor(sample.effect).vsEntryName, buffers: [] },
|
|
1821
|
+
fragment: { module: familyFor(sample.effect).fsModule, entryPoint: familyFor(sample.effect).fsEntryName, targets: colorTargets },
|
|
1822
|
+
primitive: { topology: desc.topology, cullMode: desc.cullMode, frontFace: desc.frontFace },
|
|
1823
|
+
...(depthFormat !== undefined && desc.depth !== undefined
|
|
1824
|
+
? { depthStencil: { format: depthFormat, depthWriteEnabled: desc.depth.write, depthCompare: desc.depth.compare } }
|
|
1825
|
+
: depthFormat !== undefined
|
|
1826
|
+
? { depthStencil: { format: depthFormat, depthWriteEnabled: false, depthCompare: "always" } }
|
|
1827
|
+
: {}),
|
|
1828
|
+
});
|
|
1829
|
+
r.bucket.slots[0].pipeline = newPipeline;
|
|
1816
1830
|
}
|
|
1817
1831
|
}
|
|
1832
|
+
// Slow per-RO rebucket for the leftover cases.
|
|
1833
|
+
for (const drawId of slowChanged) {
|
|
1834
|
+
const spec = drawIdToSpec[drawId];
|
|
1835
|
+
if (spec === undefined)
|
|
1836
|
+
continue;
|
|
1837
|
+
removeDraw(drawId);
|
|
1838
|
+
const newId = addDrawImpl(spec, tok);
|
|
1839
|
+
void newId;
|
|
1840
|
+
}
|
|
1818
1841
|
}
|
|
1819
1842
|
// 1. Pool: re-pack any aval whose value changed since last frame.
|
|
1820
1843
|
// One writeBuffer per dirty aval, regardless of how many draws
|
|
@@ -1953,7 +1976,13 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
1953
1976
|
// Resolved on the next frame's update() — one-frame lag for the
|
|
1954
1977
|
// first appearance of a state transition. CPU fallback runs at
|
|
1955
1978
|
// addDraw time so the initial bucket assignment is still correct.
|
|
1956
|
-
if (gpuModesScene !== undefined
|
|
1979
|
+
if (gpuModesScene !== undefined
|
|
1980
|
+
&& gpuModesScene.registered > 0
|
|
1981
|
+
&& gpuModesScene.consumeDirty()) {
|
|
1982
|
+
// Dirty-gate: skip the kernel + readback when no rule input
|
|
1983
|
+
// changed since the last dispatch. Unrelated avals (Color on
|
|
1984
|
+
// hover, etc.) don't trigger dirty, so steady state has zero
|
|
1985
|
+
// GPU mode-rule work per frame.
|
|
1957
1986
|
const numROs = nextDrawId; // upper bound; sparse entries are skipped via 0xFFFFFFFF sentinel
|
|
1958
1987
|
gpuModesScene.dispatch(arena.attrs.buffer, numROs, enc);
|
|
1959
1988
|
// mapAsync the staging buffer AFTER the caller's submit. The
|
|
@@ -1962,43 +1991,38 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
1962
1991
|
// submitted the enc. Without this deferral, mapAsync fires
|
|
1963
1992
|
// before submit and WebGPU rejects the next dispatch's
|
|
1964
1993
|
// copy-to-staging with "buffer used in submit while mapped".
|
|
1994
|
+
// v1.5: the readback used to PATCH spec.modeRules.cull with the
|
|
1995
|
+
// GPU output as a constant rule, then mark the drawId dirty so
|
|
1996
|
+
// the next update() rebucketed via the patched value. That had
|
|
1997
|
+
// a fatal bug: per-RO rebucket (the slow-path fallback) creates
|
|
1998
|
+
// a NEW tracker that reads the patched (constant) rule —
|
|
1999
|
+
// permanently breaking the rule's reactivity. Second cullModeC
|
|
2000
|
+
// flip → trackers re-evaluate → constant rule returns the same
|
|
2001
|
+
// value → no rebucket. So patching is gone.
|
|
2002
|
+
//
|
|
2003
|
+
// The CPU fallback already routes ROs correctly: its evaluate
|
|
2004
|
+
// is the same algorithm as the kernel (sign(det(upper3x3))), so
|
|
2005
|
+
// CPU and GPU agree. The readback now runs purely as a
|
|
2006
|
+
// verification signal — disagreements indicate a CPU/GPU eval
|
|
2007
|
+
// drift bug. Phase 5c.2 (no-readback design) drops it entirely.
|
|
1965
2008
|
Promise.resolve().then(() => gpuModesScene.finish(numROs)).then(() => {
|
|
1966
2009
|
const out = gpuModesScene.lastOutput;
|
|
1967
|
-
let
|
|
2010
|
+
let mismatches = 0;
|
|
1968
2011
|
for (let i = 0; i < numROs; i++) {
|
|
1969
2012
|
const cur = out[i] ?? 0xFFFFFFFF;
|
|
1970
|
-
const prev = gpuModesLastKey.get(i);
|
|
1971
2013
|
if (cur === 0xFFFFFFFF)
|
|
1972
|
-
continue; // no rule on this RO
|
|
1973
|
-
if (prev === cur)
|
|
1974
2014
|
continue;
|
|
1975
|
-
changes++;
|
|
1976
|
-
gpuModesLastKey.set(i, cur);
|
|
1977
|
-
// Project the kernel's u32 enum back to a CullMode value,
|
|
1978
|
-
// store on the tracker's modeRules so the next snapshot
|
|
1979
|
-
// picks it up, then schedule a rebucket.
|
|
1980
2015
|
const tracker = drawIdToModeTracker[i];
|
|
1981
|
-
|
|
1982
|
-
if (tracker === undefined || spec === undefined)
|
|
2016
|
+
if (tracker === undefined)
|
|
1983
2017
|
continue;
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
cull: {
|
|
1993
|
-
__derivedModeRule: true, axis: "cull",
|
|
1994
|
-
evaluate: () => cull,
|
|
1995
|
-
},
|
|
1996
|
-
};
|
|
1997
|
-
spec.modeRules = patched;
|
|
1998
|
-
dirtyModeKeyDrawIds.add(i);
|
|
1999
|
-
}
|
|
2000
|
-
if (changes > 0) {
|
|
2001
|
-
console.debug(`[heapScene] GPU rule readback: ${changes}/${numROs} ROs changed modeKey`);
|
|
2018
|
+
// Decode the tracker's current cullMode (CPU result) into the
|
|
2019
|
+
// same u32 enum the kernel emits and compare. Drift logs once.
|
|
2020
|
+
const cpuCull = tracker.descriptor.cullMode;
|
|
2021
|
+
const cpuU32 = cpuCull === "none" ? 0 : cpuCull === "front" ? 1 : 2;
|
|
2022
|
+
if (cpuU32 !== cur && mismatches < 3) {
|
|
2023
|
+
mismatches++;
|
|
2024
|
+
console.warn(`[heapScene] GPU/CPU mode drift drawId=${i} cpu=${cpuCull}(${cpuU32}) gpu=${U32_TO_CULL[cur]}(${cur})`);
|
|
2025
|
+
}
|
|
2002
2026
|
}
|
|
2003
2027
|
}).catch((e) => {
|
|
2004
2028
|
// mapAsync can reject if the device was lost or the scene was
|