@aardworx/wombat.rendering 0.9.16 → 0.9.17
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/modeKeyCpu.d.ts +33 -1
- package/dist/runtime/derivedModes/modeKeyCpu.d.ts.map +1 -1
- package/dist/runtime/derivedModes/modeKeyCpu.js +124 -31
- package/dist/runtime/derivedModes/modeKeyCpu.js.map +1 -1
- package/dist/runtime/derivedModes/rule.d.ts +59 -0
- package/dist/runtime/derivedModes/rule.d.ts.map +1 -0
- package/dist/runtime/derivedModes/rule.js +55 -0
- package/dist/runtime/derivedModes/rule.js.map +1 -0
- package/dist/runtime/heapScene.d.ts +32 -0
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +55 -5
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/derivedModes/modeKeyCpu.ts +142 -23
- package/src/runtime/derivedModes/rule.ts +110 -0
- package/src/runtime/heapScene.ts +88 -5
- package/src/runtime/index.ts +10 -0
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import type { PipelineState } from "../../core/pipelineState.js";
|
|
2
2
|
import type { FramebufferSignature } from "../../core/framebufferSignature.js";
|
|
3
3
|
import type { aval, IDisposable } from "@aardworx/wombat.adaptive";
|
|
4
|
+
import { AdaptiveToken } from "@aardworx/wombat.adaptive";
|
|
4
5
|
import { type PipelineStateDescriptor } from "../pipelineCache/index.js";
|
|
6
|
+
import type { DerivedModeRule } from "./rule.js";
|
|
7
|
+
/**
|
|
8
|
+
* Per-axis derived-mode rules for one RO. Same shape as
|
|
9
|
+
* `HeapDrawSpec.modeRules`.
|
|
10
|
+
*/
|
|
11
|
+
export interface RoModeRules {
|
|
12
|
+
readonly cull?: DerivedModeRule<"cull">;
|
|
13
|
+
readonly frontFace?: DerivedModeRule<"frontFace">;
|
|
14
|
+
readonly topology?: DerivedModeRule<"topology">;
|
|
15
|
+
readonly depthCompare?: DerivedModeRule<"depthCompare">;
|
|
16
|
+
readonly depthWrite?: DerivedModeRule<"depthWrite">;
|
|
17
|
+
readonly alphaToCoverage?: DerivedModeRule<"alphaToCoverage">;
|
|
18
|
+
}
|
|
5
19
|
/**
|
|
6
20
|
* One-shot snapshot of the current values of every leaf aval in a
|
|
7
21
|
* `PipelineState`, mapped onto a `PipelineStateDescriptor` whose
|
|
@@ -9,7 +23,12 @@ import { type PipelineStateDescriptor } from "../pipelineCache/index.js";
|
|
|
9
23
|
* (missing entries default to non-blended / 0xF writeMask, matching
|
|
10
24
|
* `BLEND_DEFAULT` semantics in heapScene).
|
|
11
25
|
*/
|
|
12
|
-
export declare function snapshotDescriptor(ps: PipelineState | undefined, signature: FramebufferSignature
|
|
26
|
+
export declare function snapshotDescriptor(ps: PipelineState | undefined, signature: FramebufferSignature, options?: {
|
|
27
|
+
readonly modeRules?: RoModeRules;
|
|
28
|
+
readonly uniformAvals?: ReadonlyMap<string, aval<unknown>>;
|
|
29
|
+
readonly token?: AdaptiveToken;
|
|
30
|
+
readonly recordDep?: (av: aval<unknown>) => void;
|
|
31
|
+
}): PipelineStateDescriptor;
|
|
13
32
|
/**
|
|
14
33
|
* Subscribes to every leaf aval in a `PipelineState` and invokes
|
|
15
34
|
* `onDirty` when any of them marks. Use one tracker per RO; call
|
|
@@ -27,6 +46,11 @@ export declare class ModeKeyTracker implements IDisposable {
|
|
|
27
46
|
private readonly subs;
|
|
28
47
|
private cachedDescriptor;
|
|
29
48
|
private cachedModeKey;
|
|
49
|
+
private readonly modeRules;
|
|
50
|
+
private readonly uniformAvals;
|
|
51
|
+
/** Avals discovered while evaluating rules; merged into the leaf
|
|
52
|
+
* set returned by `forEachLeaf` so the heap scene subscribes once. */
|
|
53
|
+
private readonly ruleDeps;
|
|
30
54
|
constructor(ps: PipelineState | undefined, signature: FramebufferSignature, onDirty: () => void,
|
|
31
55
|
/**
|
|
32
56
|
* Skip the per-instance addMarkingCallback subscriptions. The caller
|
|
@@ -38,7 +62,10 @@ export declare class ModeKeyTracker implements IDisposable {
|
|
|
38
62
|
*/
|
|
39
63
|
options?: {
|
|
40
64
|
skipSubscribe?: boolean;
|
|
65
|
+
modeRules?: RoModeRules;
|
|
66
|
+
uniformAvals?: ReadonlyMap<string, aval<unknown>>;
|
|
41
67
|
});
|
|
68
|
+
private snapshot;
|
|
42
69
|
/**
|
|
43
70
|
* Walk every leaf aval in this tracker's PipelineState and invoke
|
|
44
71
|
* `visit(aval)`. Used by the heap scene to register ONE
|
|
@@ -51,6 +78,11 @@ export declare class ModeKeyTracker implements IDisposable {
|
|
|
51
78
|
* Snapshot current aval values and rebuild descriptor + modeKey.
|
|
52
79
|
* Returns true iff the modeKey changed (so the bucket only needs to
|
|
53
80
|
* upload + repartition when something actually moved).
|
|
81
|
+
*
|
|
82
|
+
* Also rediscovers rule-input dependencies on every call — a
|
|
83
|
+
* conditional rule body may read different uniforms in different
|
|
84
|
+
* branches. New deps surface in `forEachLeaf` so the heap scene's
|
|
85
|
+
* subscription-dedupe layer picks them up.
|
|
54
86
|
*/
|
|
55
87
|
recompute(): boolean;
|
|
56
88
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modeKeyCpu.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedModes/modeKeyCpu.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,aAAa,EAKd,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"modeKeyCpu.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedModes/modeKeyCpu.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,28 @@
|
|
|
9
9
|
// GPU on the next frame, and the partition kernel re-buckets the
|
|
10
10
|
// record into its new slot. No rule-IR machinery yet — Task 2 layers
|
|
11
11
|
// `derivedMode(...)` on top of this.
|
|
12
|
-
import { addMarkingCallback } from "@aardworx/wombat.adaptive";
|
|
12
|
+
import { addMarkingCallback, AdaptiveToken } from "@aardworx/wombat.adaptive";
|
|
13
13
|
import { encodeModeKey, DEFAULT_DESCRIPTOR, DEFAULT_ATTACHMENT_BLEND, } from "../pipelineCache/index.js";
|
|
14
|
+
/**
|
|
15
|
+
* Uniforms accessor exposed to a derived-mode rule's `(u, declared)`
|
|
16
|
+
* closure. Reads each `u.<Name>` from the supplied aval map at
|
|
17
|
+
* evaluation time and tracks which avals were accessed so the
|
|
18
|
+
* `ModeKeyTracker` can subscribe to them.
|
|
19
|
+
*/
|
|
20
|
+
function uniformsProxy(uniformAvals, tok, recordDep) {
|
|
21
|
+
return new Proxy({}, {
|
|
22
|
+
get(_target, prop) {
|
|
23
|
+
if (typeof prop !== "string")
|
|
24
|
+
return undefined;
|
|
25
|
+
const av = uniformAvals.get(prop);
|
|
26
|
+
if (av === undefined)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (recordDep !== undefined)
|
|
29
|
+
recordDep(av);
|
|
30
|
+
return av.getValue(tok);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
14
34
|
/**
|
|
15
35
|
* One-shot snapshot of the current values of every leaf aval in a
|
|
16
36
|
* `PipelineState`, mapped onto a `PipelineStateDescriptor` whose
|
|
@@ -18,9 +38,9 @@ import { encodeModeKey, DEFAULT_DESCRIPTOR, DEFAULT_ATTACHMENT_BLEND, } from "..
|
|
|
18
38
|
* (missing entries default to non-blended / 0xF writeMask, matching
|
|
19
39
|
* `BLEND_DEFAULT` semantics in heapScene).
|
|
20
40
|
*/
|
|
21
|
-
export function snapshotDescriptor(ps, signature) {
|
|
41
|
+
export function snapshotDescriptor(ps, signature, options = {}) {
|
|
22
42
|
if (ps === undefined) {
|
|
23
|
-
return buildAttachmentsFor(DEFAULT_DESCRIPTOR, signature);
|
|
43
|
+
return applyRules(buildAttachmentsFor(DEFAULT_DESCRIPTOR, signature), options);
|
|
24
44
|
}
|
|
25
45
|
const r = ps.rasterizer;
|
|
26
46
|
const depth = ps.depth !== undefined ? snapshotDepth(ps.depth, signature) : undefined;
|
|
@@ -39,6 +59,51 @@ export function snapshotDescriptor(ps, signature) {
|
|
|
39
59
|
attachments,
|
|
40
60
|
alphaToCoverage: atc,
|
|
41
61
|
};
|
|
62
|
+
return applyRules(out, options);
|
|
63
|
+
}
|
|
64
|
+
function applyRules(d, options) {
|
|
65
|
+
const rules = options.modeRules;
|
|
66
|
+
if (rules === undefined)
|
|
67
|
+
return d;
|
|
68
|
+
const uniforms = options.uniformAvals ?? new Map();
|
|
69
|
+
const tok = options.token ?? AdaptiveToken.top;
|
|
70
|
+
const proxy = uniformsProxy(uniforms, tok, options.recordDep);
|
|
71
|
+
let out = d;
|
|
72
|
+
if (rules.cull !== undefined) {
|
|
73
|
+
const v = rules.cull.evaluate(proxy, out.cullMode);
|
|
74
|
+
if (v !== out.cullMode)
|
|
75
|
+
out = { ...out, cullMode: v };
|
|
76
|
+
}
|
|
77
|
+
if (rules.frontFace !== undefined) {
|
|
78
|
+
const v = rules.frontFace.evaluate(proxy, out.frontFace);
|
|
79
|
+
if (v !== out.frontFace)
|
|
80
|
+
out = { ...out, frontFace: v };
|
|
81
|
+
}
|
|
82
|
+
if (rules.topology !== undefined) {
|
|
83
|
+
const v = rules.topology.evaluate(proxy, out.topology);
|
|
84
|
+
if (v !== out.topology)
|
|
85
|
+
out = { ...out, topology: v, stripIndexFormat: stripFormatFor(v) };
|
|
86
|
+
}
|
|
87
|
+
if (rules.alphaToCoverage !== undefined) {
|
|
88
|
+
const v = rules.alphaToCoverage.evaluate(proxy, out.alphaToCoverage);
|
|
89
|
+
if (v !== out.alphaToCoverage)
|
|
90
|
+
out = { ...out, alphaToCoverage: v };
|
|
91
|
+
}
|
|
92
|
+
if (out.depth !== undefined && (rules.depthCompare !== undefined || rules.depthWrite !== undefined)) {
|
|
93
|
+
let depthOut = out.depth;
|
|
94
|
+
if (rules.depthCompare !== undefined) {
|
|
95
|
+
const v = rules.depthCompare.evaluate(proxy, depthOut.compare);
|
|
96
|
+
if (v !== depthOut.compare)
|
|
97
|
+
depthOut = { ...depthOut, compare: v };
|
|
98
|
+
}
|
|
99
|
+
if (rules.depthWrite !== undefined) {
|
|
100
|
+
const v = rules.depthWrite.evaluate(proxy, depthOut.write);
|
|
101
|
+
if (v !== depthOut.write)
|
|
102
|
+
depthOut = { ...depthOut, write: v };
|
|
103
|
+
}
|
|
104
|
+
if (depthOut !== out.depth)
|
|
105
|
+
out = { ...out, depth: depthOut };
|
|
106
|
+
}
|
|
42
107
|
return out;
|
|
43
108
|
}
|
|
44
109
|
function buildAttachmentsFor(base, signature) {
|
|
@@ -97,6 +162,11 @@ export class ModeKeyTracker {
|
|
|
97
162
|
subs = [];
|
|
98
163
|
cachedDescriptor;
|
|
99
164
|
cachedModeKey;
|
|
165
|
+
modeRules;
|
|
166
|
+
uniformAvals;
|
|
167
|
+
/** Avals discovered while evaluating rules; merged into the leaf
|
|
168
|
+
* set returned by `forEachLeaf` so the heap scene subscribes once. */
|
|
169
|
+
ruleDeps = new Set();
|
|
100
170
|
constructor(ps, signature, onDirty,
|
|
101
171
|
/**
|
|
102
172
|
* Skip the per-instance addMarkingCallback subscriptions. The caller
|
|
@@ -110,46 +180,63 @@ export class ModeKeyTracker {
|
|
|
110
180
|
this.ps = ps;
|
|
111
181
|
this.signature = signature;
|
|
112
182
|
this.onDirty = onDirty;
|
|
113
|
-
|
|
183
|
+
if (options.modeRules !== undefined)
|
|
184
|
+
this.modeRules = options.modeRules;
|
|
185
|
+
if (options.uniformAvals !== undefined)
|
|
186
|
+
this.uniformAvals = options.uniformAvals;
|
|
187
|
+
this.cachedDescriptor = this.snapshot();
|
|
114
188
|
this.cachedModeKey = encodeModeKey(this.cachedDescriptor);
|
|
115
189
|
if (options.skipSubscribe !== true)
|
|
116
190
|
this.subscribeAll();
|
|
117
191
|
}
|
|
192
|
+
snapshot() {
|
|
193
|
+
return snapshotDescriptor(this.ps, this.signature, {
|
|
194
|
+
...(this.modeRules !== undefined ? { modeRules: this.modeRules } : {}),
|
|
195
|
+
...(this.uniformAvals !== undefined ? { uniformAvals: this.uniformAvals } : {}),
|
|
196
|
+
recordDep: (av) => { this.ruleDeps.add(av); },
|
|
197
|
+
});
|
|
198
|
+
}
|
|
118
199
|
/**
|
|
119
200
|
* Walk every leaf aval in this tracker's PipelineState and invoke
|
|
120
201
|
* `visit(aval)`. Used by the heap scene to register ONE
|
|
121
202
|
* addMarkingCallback per unique aval across many trackers.
|
|
122
203
|
*/
|
|
123
204
|
forEachLeaf(visit) {
|
|
124
|
-
if (this.ps === undefined)
|
|
125
|
-
return;
|
|
126
205
|
const ps = this.ps;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (ps.blends !== undefined) {
|
|
139
|
-
visit(ps.blends);
|
|
140
|
-
const map = ps.blends.force( /* allow-force */);
|
|
141
|
-
for (const [, bs] of map) {
|
|
142
|
-
visit(bs.color.srcFactor);
|
|
143
|
-
visit(bs.color.dstFactor);
|
|
144
|
-
visit(bs.color.operation);
|
|
145
|
-
visit(bs.alpha.srcFactor);
|
|
146
|
-
visit(bs.alpha.dstFactor);
|
|
147
|
-
visit(bs.alpha.operation);
|
|
148
|
-
visit(bs.writeMask);
|
|
206
|
+
if (ps !== undefined) {
|
|
207
|
+
visit(ps.rasterizer.topology);
|
|
208
|
+
visit(ps.rasterizer.cullMode);
|
|
209
|
+
visit(ps.rasterizer.frontFace);
|
|
210
|
+
if (ps.rasterizer.depthBias !== undefined)
|
|
211
|
+
visit(ps.rasterizer.depthBias);
|
|
212
|
+
if (ps.depth !== undefined) {
|
|
213
|
+
visit(ps.depth.write);
|
|
214
|
+
visit(ps.depth.compare);
|
|
215
|
+
if (ps.depth.clamp !== undefined)
|
|
216
|
+
visit(ps.depth.clamp);
|
|
149
217
|
}
|
|
218
|
+
if (ps.blends !== undefined) {
|
|
219
|
+
visit(ps.blends);
|
|
220
|
+
const map = ps.blends.force( /* allow-force */);
|
|
221
|
+
for (const [, bs] of map) {
|
|
222
|
+
visit(bs.color.srcFactor);
|
|
223
|
+
visit(bs.color.dstFactor);
|
|
224
|
+
visit(bs.color.operation);
|
|
225
|
+
visit(bs.alpha.srcFactor);
|
|
226
|
+
visit(bs.alpha.dstFactor);
|
|
227
|
+
visit(bs.alpha.operation);
|
|
228
|
+
visit(bs.writeMask);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (ps.alphaToCoverage !== undefined)
|
|
232
|
+
visit(ps.alphaToCoverage);
|
|
150
233
|
}
|
|
151
|
-
|
|
152
|
-
|
|
234
|
+
// Rule-input deps discovered on the last evaluation. The set is
|
|
235
|
+
// refreshed each `recompute()`; callers re-subscribe accordingly.
|
|
236
|
+
// Surfaced regardless of `ps` because a rule can fire without
|
|
237
|
+
// any underlying PipelineState aval (e.g. ps === undefined).
|
|
238
|
+
for (const av of this.ruleDeps)
|
|
239
|
+
visit(av);
|
|
153
240
|
}
|
|
154
241
|
get descriptor() { return this.cachedDescriptor; }
|
|
155
242
|
get modeKey() { return this.cachedModeKey; }
|
|
@@ -157,9 +244,15 @@ export class ModeKeyTracker {
|
|
|
157
244
|
* Snapshot current aval values and rebuild descriptor + modeKey.
|
|
158
245
|
* Returns true iff the modeKey changed (so the bucket only needs to
|
|
159
246
|
* upload + repartition when something actually moved).
|
|
247
|
+
*
|
|
248
|
+
* Also rediscovers rule-input dependencies on every call — a
|
|
249
|
+
* conditional rule body may read different uniforms in different
|
|
250
|
+
* branches. New deps surface in `forEachLeaf` so the heap scene's
|
|
251
|
+
* subscription-dedupe layer picks them up.
|
|
160
252
|
*/
|
|
161
253
|
recompute() {
|
|
162
|
-
|
|
254
|
+
this.ruleDeps.clear();
|
|
255
|
+
const next = this.snapshot();
|
|
163
256
|
const nextKey = encodeModeKey(next);
|
|
164
257
|
if (nextKey === this.cachedModeKey)
|
|
165
258
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modeKeyCpu.js","sourceRoot":"","sources":["../../../src/runtime/derivedModes/modeKeyCpu.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"modeKeyCpu.js","sourceRoot":"","sources":["../../../src/runtime/derivedModes/modeKeyCpu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { CullMode, FrontFace, Topology } from "../pipelineCache/index.js";
|
|
2
|
+
/** Discrete pipeline-state axes a `derivedMode` rule can target. v1
|
|
3
|
+
* supports cull / frontFace / topology / depthCompare / depthWrite /
|
|
4
|
+
* blendEnabled. Stencil + per-attachment blend factor/operation are
|
|
5
|
+
* deferred — same carve-outs as `derived-modes.md`. */
|
|
6
|
+
export type ModeAxis = "cull" | "frontFace" | "topology" | "depthCompare" | "depthWrite" | "alphaToCoverage";
|
|
7
|
+
/** Output value type per axis. */
|
|
8
|
+
export type ModeValue<A extends ModeAxis> = A extends "cull" ? CullMode : A extends "frontFace" ? FrontFace : A extends "topology" ? Topology : A extends "depthCompare" ? GPUCompareFunction : A extends "depthWrite" ? boolean : A extends "alphaToCoverage" ? boolean : never;
|
|
9
|
+
/**
|
|
10
|
+
* The closure signature a `derivedMode` rule body takes:
|
|
11
|
+
* - `u`: a proxy whose properties resolve to the RO's uniform values
|
|
12
|
+
* at evaluation time. The proxy is type-erased in v1 — declare the
|
|
13
|
+
* uniforms you'll read via `UniformScope` augmentation on the
|
|
14
|
+
* wombat.shader side for compile-time safety, or annotate locally.
|
|
15
|
+
* - `declared`: the SG-declared value for this axis at this leaf.
|
|
16
|
+
* Identity rules `(u, d) => d` are valid and useful for axes that
|
|
17
|
+
* want to pass declared through unchanged.
|
|
18
|
+
*/
|
|
19
|
+
export type DerivedModeBuilder<A extends ModeAxis> = (u: Record<string, unknown>, declared: ModeValue<A>) => ModeValue<A>;
|
|
20
|
+
export interface DerivedModeRule<A extends ModeAxis = ModeAxis> {
|
|
21
|
+
readonly __derivedModeRule: true;
|
|
22
|
+
readonly axis: A;
|
|
23
|
+
readonly evaluate: DerivedModeBuilder<A>;
|
|
24
|
+
/**
|
|
25
|
+
* Conservative over-approximation of the rule's output set. Used by
|
|
26
|
+
* the build-time pre-warm in v2 to enumerate the pipelines a scene
|
|
27
|
+
* could realize. v1 doesn't use it at runtime, but recording it
|
|
28
|
+
* here keeps the API forward-compatible.
|
|
29
|
+
*/
|
|
30
|
+
readonly domain?: ReadonlyArray<ModeValue<A>>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Author a derived mode rule.
|
|
34
|
+
*
|
|
35
|
+
* derivedMode("cull", (u, declared) =>
|
|
36
|
+
* u.WindingFlipped ? flipCull(declared) : declared);
|
|
37
|
+
*
|
|
38
|
+
* derivedMode("blend", (u) => u.Premultiplied ? "premul" : "straight");
|
|
39
|
+
*
|
|
40
|
+
* // Determinant-flip-cull (the motivating case):
|
|
41
|
+
* derivedMode("cull", (u, declared) => {
|
|
42
|
+
* const m = u.ModelTrafo as M44d;
|
|
43
|
+
* const det =
|
|
44
|
+
* m.M00 * (m.M11 * m.M22 - m.M12 * m.M21) -
|
|
45
|
+
* m.M01 * (m.M10 * m.M22 - m.M12 * m.M20) +
|
|
46
|
+
* m.M02 * (m.M10 * m.M21 - m.M11 * m.M20);
|
|
47
|
+
* return det < 0 ? flipCull(declared) : declared;
|
|
48
|
+
* });
|
|
49
|
+
*/
|
|
50
|
+
export declare function derivedMode<A extends ModeAxis>(axis: A, evaluate: DerivedModeBuilder<A>, options?: {
|
|
51
|
+
readonly domain?: ReadonlyArray<ModeValue<A>>;
|
|
52
|
+
}): DerivedModeRule<A>;
|
|
53
|
+
/** Brand check — distinguishes a DerivedModeRule from an aval/raw value
|
|
54
|
+
* at runtime so PipelineState consumers can route accordingly. */
|
|
55
|
+
export declare function isDerivedModeRule(x: unknown): x is DerivedModeRule;
|
|
56
|
+
/** Convenience: flip 'back' ↔ 'front' (and pass through 'none').
|
|
57
|
+
* Useful in `(u, declared) => mirrored ? flipCull(declared) : declared`. */
|
|
58
|
+
export declare function flipCull(c: CullMode): CullMode;
|
|
59
|
+
//# sourceMappingURL=rule.d.ts.map
|
|
@@ -0,0 +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,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;;;;;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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// `derivedMode(axis, (u, declared) => modeValue)` — author-facing
|
|
2
|
+
// marker for per-RO pipeline-state values that are functions of the
|
|
3
|
+
// RO's uniforms.
|
|
4
|
+
//
|
|
5
|
+
// v1 is CPU-evaluated: the user's closure runs in JS each time the
|
|
6
|
+
// rule's inputs mark. That's a good fit for the typical authoring
|
|
7
|
+
// shapes (a uniform-driven enum flip, a determinant-sign cull flip,
|
|
8
|
+
// etc.) and pairs naturally with the bucket-level rebuild fast path
|
|
9
|
+
// shipped in 0.9.16 — only ROs whose inputs actually changed get
|
|
10
|
+
// re-evaluated, and same-key buckets re-bind their pipeline once
|
|
11
|
+
// rather than per-RO.
|
|
12
|
+
//
|
|
13
|
+
// v2 (deferred) lowers rules to a GPU compute kernel via §7's IR
|
|
14
|
+
// machinery — needed only when bulk-animated per-RO inputs become a
|
|
15
|
+
// CPU-side bottleneck. See docs/derived-mode-rules-plan.md.
|
|
16
|
+
//
|
|
17
|
+
// What can be derived (the small-enum axes — cull/blend/depth-compare/
|
|
18
|
+
// topology/etc.) and what stays static (depth bias, blend constant,
|
|
19
|
+
// stencil ref) is covered in docs/derived-modes.md.
|
|
20
|
+
/**
|
|
21
|
+
* Author a derived mode rule.
|
|
22
|
+
*
|
|
23
|
+
* derivedMode("cull", (u, declared) =>
|
|
24
|
+
* u.WindingFlipped ? flipCull(declared) : declared);
|
|
25
|
+
*
|
|
26
|
+
* derivedMode("blend", (u) => u.Premultiplied ? "premul" : "straight");
|
|
27
|
+
*
|
|
28
|
+
* // Determinant-flip-cull (the motivating case):
|
|
29
|
+
* derivedMode("cull", (u, declared) => {
|
|
30
|
+
* const m = u.ModelTrafo as M44d;
|
|
31
|
+
* const det =
|
|
32
|
+
* m.M00 * (m.M11 * m.M22 - m.M12 * m.M21) -
|
|
33
|
+
* m.M01 * (m.M10 * m.M22 - m.M12 * m.M20) +
|
|
34
|
+
* m.M02 * (m.M10 * m.M21 - m.M11 * m.M20);
|
|
35
|
+
* return det < 0 ? flipCull(declared) : declared;
|
|
36
|
+
* });
|
|
37
|
+
*/
|
|
38
|
+
export function derivedMode(axis, evaluate, options = {}) {
|
|
39
|
+
const out = options.domain !== undefined
|
|
40
|
+
? { __derivedModeRule: true, axis, evaluate, domain: options.domain }
|
|
41
|
+
: { __derivedModeRule: true, axis, evaluate };
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
/** Brand check — distinguishes a DerivedModeRule from an aval/raw value
|
|
45
|
+
* at runtime so PipelineState consumers can route accordingly. */
|
|
46
|
+
export function isDerivedModeRule(x) {
|
|
47
|
+
return typeof x === "object" && x !== null
|
|
48
|
+
&& x.__derivedModeRule === true;
|
|
49
|
+
}
|
|
50
|
+
/** Convenience: flip 'back' ↔ 'front' (and pass through 'none').
|
|
51
|
+
* Useful in `(u, declared) => mirrored ? flipCull(declared) : declared`. */
|
|
52
|
+
export function flipCull(c) {
|
|
53
|
+
return c === "back" ? "front" : c === "front" ? "back" : "none";
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=rule.js.map
|
|
@@ -0,0 +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;AAmDpD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CACzB,IAAO,EACP,QAA+B,EAC/B,UAA6D,EAAE;IAE/D,MAAM,GAAG,GAAuB,OAAO,CAAC,MAAM,KAAK,SAAS;QAC1D,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACrE,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;mEACmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;WAClC,CAAqC,CAAC,iBAAiB,KAAK,IAAI,CAAC;AAC3E,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,QAAQ,CAAC,CAAW;IAClC,OAAO,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAClE,CAAC"}
|
|
@@ -84,6 +84,38 @@ export interface HeapDrawSpec {
|
|
|
84
84
|
* with depth write enabled. Matches the demo's existing visuals.
|
|
85
85
|
*/
|
|
86
86
|
readonly pipelineState?: PipelineState;
|
|
87
|
+
/**
|
|
88
|
+
* Per-RO derived pipeline-mode rules: per-axis closures
|
|
89
|
+
* `(u, declared) => modeValue` that compute the effective mode
|
|
90
|
+
* value as a function of this RO's uniforms (see
|
|
91
|
+
* `derivedMode(...)` in `runtime/derivedModes/rule.ts`).
|
|
92
|
+
*
|
|
93
|
+
* A rule overrides the corresponding `pipelineState.rasterizer.*`
|
|
94
|
+
* (or `pipelineState.depth.*`) aval value at descriptor-snapshot
|
|
95
|
+
* time. The rule's closure runs CPU-side with a proxy that
|
|
96
|
+
* resolves `u.<Name>` against this spec's `inputs[<Name>]`. The
|
|
97
|
+
* heap renderer auto-discovers the closure's input dependencies on
|
|
98
|
+
* first run and subscribes the per-RO ModeKeyTracker to each of
|
|
99
|
+
* them — so a rule that reads `u.ModelTrafo` reactively rebuckets
|
|
100
|
+
* when ModelTrafo marks.
|
|
101
|
+
*
|
|
102
|
+
* Common use cases:
|
|
103
|
+
* - cull: flip-by-determinant-sign for mirrored geometry
|
|
104
|
+
* - blend: pick a preset based on a boolean uniform
|
|
105
|
+
* - depthCompare: lighter passes for transparent overlays
|
|
106
|
+
*
|
|
107
|
+
* v1 evaluates rules CPU-side. v2 (deferred) lowers them to a GPU
|
|
108
|
+
* compute kernel for the bulk-animated-input case. See
|
|
109
|
+
* `docs/derived-modes.md`.
|
|
110
|
+
*/
|
|
111
|
+
readonly modeRules?: {
|
|
112
|
+
readonly cull?: import("./derivedModes/rule.js").DerivedModeRule<"cull">;
|
|
113
|
+
readonly frontFace?: import("./derivedModes/rule.js").DerivedModeRule<"frontFace">;
|
|
114
|
+
readonly topology?: import("./derivedModes/rule.js").DerivedModeRule<"topology">;
|
|
115
|
+
readonly depthCompare?: import("./derivedModes/rule.js").DerivedModeRule<"depthCompare">;
|
|
116
|
+
readonly depthWrite?: import("./derivedModes/rule.js").DerivedModeRule<"depthWrite">;
|
|
117
|
+
readonly alphaToCoverage?: import("./derivedModes/rule.js").DerivedModeRule<"alphaToCoverage">;
|
|
118
|
+
};
|
|
87
119
|
}
|
|
88
120
|
export interface HeapSceneStats {
|
|
89
121
|
readonly groups: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heapScene.d.ts","sourceRoot":"","sources":["../../src/runtime/heapScene.ts"],"names":[],"mappings":"AA4CA,OAAO,EAA2B,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAwB,aAAa,EAAa,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAgD,MAAM,2BAA2B,CAAC;AAC1G,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EAEc,KAAK,oBAAoB,EAE7C,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAEL,KAAK,SAAS,EAAwB,KAAK,SAAS,EACrD,MAAM,6BAA6B,CAAC;AA6DrC;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAI,YAAY,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAI,WAAW,CAAC;CACjC;AAgJD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;KAAE,CAAC;IACtE;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;KAAE,CAAC;IACnF;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;IAClD;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"heapScene.d.ts","sourceRoot":"","sources":["../../src/runtime/heapScene.ts"],"names":[],"mappings":"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"}
|
|
@@ -891,7 +891,14 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
891
891
|
// right per-effect helper at draw time. Atlas-binding shape follows
|
|
892
892
|
// from `family.drawHeaderUnion.atlasTextureBindings.size > 0`.
|
|
893
893
|
void texIdOf; // retained for future per-bucket diagnostics
|
|
894
|
-
function findOrCreateBucket(effect, _textures, pipelineState
|
|
894
|
+
function findOrCreateBucket(effect, _textures, pipelineState,
|
|
895
|
+
/**
|
|
896
|
+
* Optional precomputed descriptor. addDrawImpl passes this when
|
|
897
|
+
* the spec carries `modeRules` so the bucket key reflects the
|
|
898
|
+
* rule-evaluated value (not the raw PS aval values). When omitted
|
|
899
|
+
* the descriptor is snapshotted from PS as before.
|
|
900
|
+
*/
|
|
901
|
+
precomputedDescriptor) {
|
|
895
902
|
if (!familyBuilt) {
|
|
896
903
|
throw new Error("heapScene: findOrCreateBucket called before family build");
|
|
897
904
|
}
|
|
@@ -904,13 +911,25 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
904
911
|
// (the actual value-set in the descriptor), so identical-value
|
|
905
912
|
// cvals collapse to ONE bucket. See docs/derived-modes.md and
|
|
906
913
|
// tests/heap-multi-pipeline-bucket.test.ts.
|
|
907
|
-
const psDescriptor = snapshotDescriptor(pipelineState, sig);
|
|
914
|
+
const psDescriptor = precomputedDescriptor ?? snapshotDescriptor(pipelineState, sig);
|
|
908
915
|
const psModeKey = encodeModeKey(psDescriptor);
|
|
909
916
|
const bk = `family#${fam.schema.id}|mk#${psModeKey.toString(16)}`;
|
|
910
917
|
const existing = bucketByKey.get(bk);
|
|
911
918
|
if (existing !== undefined)
|
|
912
919
|
return existing;
|
|
913
|
-
|
|
920
|
+
// If a precomputed descriptor is supplied (rule-evaluated path),
|
|
921
|
+
// use its post-rule axis values so the pipeline reflects what the
|
|
922
|
+
// RO actually wants. Otherwise fall through to PS-aval forcing.
|
|
923
|
+
const ps = precomputedDescriptor !== undefined
|
|
924
|
+
? {
|
|
925
|
+
topology: precomputedDescriptor.topology,
|
|
926
|
+
cullMode: precomputedDescriptor.cullMode,
|
|
927
|
+
frontFace: precomputedDescriptor.frontFace,
|
|
928
|
+
...(precomputedDescriptor.depth !== undefined
|
|
929
|
+
? { depth: { write: precomputedDescriptor.depth.write, compare: precomputedDescriptor.depth.compare } }
|
|
930
|
+
: {}),
|
|
931
|
+
}
|
|
932
|
+
: resolvePipelineState(pipelineState);
|
|
914
933
|
const layout = fam.schema.drawHeaderUnion;
|
|
915
934
|
const isAtlasBucket = layout.atlasTextureBindings.size > 0;
|
|
916
935
|
const vsModule = fam.vsModule;
|
|
@@ -1185,7 +1204,23 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
1185
1204
|
const perInstanceAttributes = spec.instanceAttributes !== undefined
|
|
1186
1205
|
? new Set(Object.keys(spec.instanceAttributes))
|
|
1187
1206
|
: new Set();
|
|
1188
|
-
|
|
1207
|
+
// If the spec has modeRules, pre-snapshot the rule-evaluated
|
|
1208
|
+
// descriptor so the bucket key + pipeline reflect post-rule
|
|
1209
|
+
// values. Without this, two ROs with identical PS but different
|
|
1210
|
+
// rule outputs would collide on the same bucket.
|
|
1211
|
+
let precomputedDescriptor;
|
|
1212
|
+
if (spec.modeRules !== undefined) {
|
|
1213
|
+
const uAvals = new Map();
|
|
1214
|
+
for (const [name, val] of Object.entries(spec.inputs)) {
|
|
1215
|
+
uAvals.set(name, asAval(val));
|
|
1216
|
+
}
|
|
1217
|
+
precomputedDescriptor = snapshotDescriptor(spec.pipelineState, sig, {
|
|
1218
|
+
modeRules: spec.modeRules,
|
|
1219
|
+
uniformAvals: uAvals,
|
|
1220
|
+
token: outerTok,
|
|
1221
|
+
});
|
|
1222
|
+
}
|
|
1223
|
+
const bucket = findOrCreateBucket(spec.effect, spec.textures, spec.pipelineState, precomputedDescriptor);
|
|
1189
1224
|
const fam = familyFor(spec.effect);
|
|
1190
1225
|
const effectFields = fam.fieldsForEffect.get(spec.effect.id);
|
|
1191
1226
|
// Indices live in their own INDEX-usage buffer (WebGPU constraint).
|
|
@@ -1357,7 +1392,22 @@ export function buildHeapScene(device, sig, initialDraws, opts = {}) {
|
|
|
1357
1392
|
// skipSubscribe: this tracker doesn't install its own callbacks.
|
|
1358
1393
|
// The scene-level `modeAvalToDrawIds` does it once per unique aval
|
|
1359
1394
|
// (the 20k-ROs-share-one-cullCval optimization).
|
|
1360
|
-
|
|
1395
|
+
// If the spec has modeRules, pre-build a uniforms-aval map the
|
|
1396
|
+
// rule closures will read against; the tracker auto-discovers
|
|
1397
|
+
// which avals each rule reads and surfaces them via forEachLeaf.
|
|
1398
|
+
let uniformAvals;
|
|
1399
|
+
if (spec.modeRules !== undefined) {
|
|
1400
|
+
const m = new Map();
|
|
1401
|
+
for (const [name, val] of Object.entries(spec.inputs)) {
|
|
1402
|
+
m.set(name, asAval(val));
|
|
1403
|
+
}
|
|
1404
|
+
uniformAvals = m;
|
|
1405
|
+
}
|
|
1406
|
+
const tracker = new ModeKeyTracker(spec.pipelineState, sig, () => { dirtyModeKeyDrawIds.add(drawId); }, {
|
|
1407
|
+
skipSubscribe: true,
|
|
1408
|
+
...(spec.modeRules !== undefined ? { modeRules: spec.modeRules } : {}),
|
|
1409
|
+
...(uniformAvals !== undefined ? { uniformAvals } : {}),
|
|
1410
|
+
});
|
|
1361
1411
|
drawIdToModeTracker[drawId] = tracker;
|
|
1362
1412
|
tracker.forEachLeaf((av) => subscribeModeLeaf(av, drawId));
|
|
1363
1413
|
// ─── §7 derived-uniforms registration ────────────────────────────
|