@aardworx/wombat.rendering 0.19.20 → 0.19.22
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/window/loop.d.ts.map +1 -1
- package/dist/window/loop.js +39 -4
- package/dist/window/loop.js.map +1 -1
- package/package.json +1 -1
- package/src/window/loop.ts +37 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAQ,aAAa,EAAe,MAAM,2BAA2B,CAAC;AAElF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAQ,aAAa,EAAe,MAAM,2BAA2B,CAAC;AAElF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA4DpD,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAE5E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CACtB,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,eAAoB,GACzB;IAAE,IAAI,IAAI,IAAI,CAAA;CAAE,CA2FlB"}
|
package/dist/window/loop.js
CHANGED
|
@@ -42,6 +42,43 @@ function isUncapped() {
|
|
|
42
42
|
function bumpFrameCount() {
|
|
43
43
|
const g = globalThis;
|
|
44
44
|
g.__wombatFrameCount = (g.__wombatFrameCount ?? 0) + 1;
|
|
45
|
+
// one-shot completion hook: lets a harness await frame completion
|
|
46
|
+
// without poll-spinning a timer/MessageChannel loop (which competes
|
|
47
|
+
// with the render loop's own scheduling).
|
|
48
|
+
const cb = g.__wombatOnFrame;
|
|
49
|
+
if (cb !== undefined) {
|
|
50
|
+
g.__wombatOnFrame = undefined;
|
|
51
|
+
cb();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// setTimeout(0) is useless for an uncapped loop: Chrome clamps nested
|
|
55
|
+
// timers to a 4 ms minimum after depth 5. MessageChannel.postMessage
|
|
56
|
+
// is the unthrottled macrotask primitive.
|
|
57
|
+
const immediateCbs = new Map();
|
|
58
|
+
let immediateNext = 1;
|
|
59
|
+
const immediateChannel = typeof MessageChannel !== "undefined" ? new MessageChannel() : null;
|
|
60
|
+
if (immediateChannel !== null) {
|
|
61
|
+
immediateChannel.port1.onmessage = (e) => {
|
|
62
|
+
const id = e.data;
|
|
63
|
+
const cb = immediateCbs.get(id);
|
|
64
|
+
immediateCbs.delete(id);
|
|
65
|
+
cb?.();
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function setImmediate2(cb) {
|
|
69
|
+
if (immediateChannel === null)
|
|
70
|
+
return setTimeout(cb, 0);
|
|
71
|
+
const id = immediateNext++;
|
|
72
|
+
immediateCbs.set(id, cb);
|
|
73
|
+
immediateChannel.port2.postMessage(id);
|
|
74
|
+
return id;
|
|
75
|
+
}
|
|
76
|
+
function clearImmediate2(id) {
|
|
77
|
+
if (immediateChannel === null) {
|
|
78
|
+
clearTimeout(id);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
immediateCbs.delete(id);
|
|
45
82
|
}
|
|
46
83
|
export function runFrame(attachment, frame, opts = {}) {
|
|
47
84
|
let stopped = false;
|
|
@@ -83,12 +120,10 @@ export function runFrame(attachment, frame, opts = {}) {
|
|
|
83
120
|
sub.dispose();
|
|
84
121
|
}
|
|
85
122
|
};
|
|
86
|
-
const schedule = (cb) => UNCAPPED
|
|
87
|
-
? setTimeout(cb, 0)
|
|
88
|
-
: requestAnimationFrame(cb);
|
|
123
|
+
const schedule = (cb) => UNCAPPED ? setImmediate2(cb) : requestAnimationFrame(cb);
|
|
89
124
|
const cancel = (h) => {
|
|
90
125
|
if (UNCAPPED)
|
|
91
|
-
|
|
126
|
+
clearImmediate2(h);
|
|
92
127
|
else
|
|
93
128
|
cancelAnimationFrame(h);
|
|
94
129
|
};
|
package/dist/window/loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iEAAiE;AACjE,gEAAgE;AAChE,oEAAoE;AACpE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,0DAA0D;AAC1D,iCAAiC;AACjC,+DAA+D;AAC/D,6DAA6D;AAC7D,4DAA4D;AAC5D,iEAAiE;AACjE,iCAAiC;AACjC,6DAA6D;AAC7D,gEAAgE;AAChE,iEAAiE;AACjE,kEAAkE;AAClE,2CAA2C;AAC3C,gEAAgE;AAChE,wDAAwD;AACxD,EAAE;AACF,oEAAoE;AAGpE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG3D,0EAA0E;AAC1E,EAAE;AACF,sEAAsE;AACtE,wDAAwD;AACxD,4DAA4D;AAC5D,6DAA6D;AAC7D,+DAA+D;AAC/D,oEAAoE;AACpE,+DAA+D;AAC/D,mEAAmE;AACnE,iCAAiC;AACjC,sEAAsE;AACtE,yDAAyD;AACzD,SAAS,UAAU;IACjB,OAAQ,UAA0D;SAC/D,0BAA0B,KAAK,IAAI,CAAC;AACzC,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,CAAC,GAAG,UAAyD,CAAC;IACpE,CAAC,CAAC,kBAAkB,GAAG,CAAE,CAAC,CAAC,kBAAyC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aardworx/wombat.rendering",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.22",
|
|
4
4
|
"description": "WebGPU rendering layer for the Wombat TypeScript stack — RenderObject/RenderTask/runtime + window glue, port of Aardvark.Rendering's lower layers on top of WebGPU and wombat.shader.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "krauthaufen",
|
package/src/window/loop.ts
CHANGED
|
@@ -47,6 +47,41 @@ function isUncapped(): boolean {
|
|
|
47
47
|
function bumpFrameCount(): void {
|
|
48
48
|
const g = globalThis as Record<string, unknown> & typeof globalThis;
|
|
49
49
|
g.__wombatFrameCount = ((g.__wombatFrameCount as number | undefined) ?? 0) + 1;
|
|
50
|
+
// one-shot completion hook: lets a harness await frame completion
|
|
51
|
+
// without poll-spinning a timer/MessageChannel loop (which competes
|
|
52
|
+
// with the render loop's own scheduling).
|
|
53
|
+
const cb = g.__wombatOnFrame as (() => void) | undefined;
|
|
54
|
+
if (cb !== undefined) {
|
|
55
|
+
g.__wombatOnFrame = undefined;
|
|
56
|
+
cb();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// setTimeout(0) is useless for an uncapped loop: Chrome clamps nested
|
|
61
|
+
// timers to a 4 ms minimum after depth 5. MessageChannel.postMessage
|
|
62
|
+
// is the unthrottled macrotask primitive.
|
|
63
|
+
const immediateCbs = new Map<number, () => void>();
|
|
64
|
+
let immediateNext = 1;
|
|
65
|
+
const immediateChannel: MessageChannel | null =
|
|
66
|
+
typeof MessageChannel !== "undefined" ? new MessageChannel() : null;
|
|
67
|
+
if (immediateChannel !== null) {
|
|
68
|
+
immediateChannel.port1.onmessage = (e: MessageEvent): void => {
|
|
69
|
+
const id = e.data as number;
|
|
70
|
+
const cb = immediateCbs.get(id);
|
|
71
|
+
immediateCbs.delete(id);
|
|
72
|
+
cb?.();
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function setImmediate2(cb: () => void): number {
|
|
76
|
+
if (immediateChannel === null) return setTimeout(cb, 0) as unknown as number;
|
|
77
|
+
const id = immediateNext++;
|
|
78
|
+
immediateCbs.set(id, cb);
|
|
79
|
+
immediateChannel.port2.postMessage(id);
|
|
80
|
+
return id;
|
|
81
|
+
}
|
|
82
|
+
function clearImmediate2(id: number): void {
|
|
83
|
+
if (immediateChannel === null) { clearTimeout(id); return; }
|
|
84
|
+
immediateCbs.delete(id);
|
|
50
85
|
}
|
|
51
86
|
|
|
52
87
|
export interface RunFrameOptions {
|
|
@@ -131,11 +166,9 @@ export function runFrame(
|
|
|
131
166
|
};
|
|
132
167
|
|
|
133
168
|
const schedule = (cb: () => void): number =>
|
|
134
|
-
UNCAPPED
|
|
135
|
-
? (setTimeout(cb, 0) as unknown as number)
|
|
136
|
-
: requestAnimationFrame(cb);
|
|
169
|
+
UNCAPPED ? setImmediate2(cb) : requestAnimationFrame(cb);
|
|
137
170
|
const cancel = (h: number): void => {
|
|
138
|
-
if (UNCAPPED)
|
|
171
|
+
if (UNCAPPED) clearImmediate2(h);
|
|
139
172
|
else cancelAnimationFrame(h);
|
|
140
173
|
};
|
|
141
174
|
|