Istvan Matejcsok
daaff1f973
fix(3d): blank viewer after raytracing round-trip — owner-context FFP routing + VAO isolation (gl1)
...
Switching OpenGL → raytracing → OpenGL could leave the viewer showing only the
background gradient, with mid-session "[gl1] WebGL context changed" thrash and
INVALID_OPERATION storms on BOTH WebGL contexts. Traced mechanism: the shim's
FFP draw routing keyed on one process-global client-array flag; an interrupted
fixed-function window (MODEL_3D::BeginDrawMulti loops, or the switch-back
reload re-recording display lists with the GL context lock released across
JSPI suspensions) left it set, after which the raytracer blit's and the 2D
GAL's glDrawArrays were routed through the FFP pipeline — and one misrouted
draw permanently repointed the VICTIM's own VAO attributes at shim buffers
(the blit's attribute 0 collides with ATTR_POSITION), so both stayed
broken/blank even after the flag cleared.
Shim fixes (wasm/gl1):
- Owner-context routing gate: __wrap_glDrawArrays/Elements route into the FFP
pipeline only under the shim's owner context (adopted at the first FFP
client-state mutation or programSync in a context); foreign-context draws
always pass through — the 2D GAL can never be misrouted and the context
guard can never thrash.
- VAO isolation (ScopedDefaultVAO): draw executors do their attribute setup on
VAO 0 and restore the caller's binding — a misrouted draw can no longer
corrupt the caller.
- contextSync() resets the whole client-array mirror on a context change
(enables/pointers/VBO names all described the dead context).
kicad pointer bump (d6e3dc1a87a): blit preamble disables the four client
arrays (same-context firewall) + DoRePaint hidden-parent early return now
clears m_is_currently_painting like its six siblings (a standalone
sufficient cause of a permanently blank viewer).
TDD (each observed red before its fix, green after; harness = authoritative):
- T1 VAO corruption, T2 foreign-context routing + guard thrash, T3 stale
client-state surviving context recreation — tests/e2e/3d-webgl.spec.ts over
new harness choreography (appQuad/ffpMakeStale/createSecondContext/
quadDrawFresh). Parity stays 47/47 with zero drift.
- tests/kicad/3d-viewer-engine-toggle.spec.ts (new, CI-skipped like the
deadlock spec): real round-trip happy-path gate — board re-renders, zero
[gl1] lines, zero INVALID_OPERATION. (The raytraced image itself never
displays on the wasm build — the pre-existing inert-toggle KNOWN ISSUE in
3d-viewer-deadlock.spec.ts, out of scope here; the engine switch and the
poisoning reload path run regardless.)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 11:25:34 +02:00
..
utils
tests(trio): settleConverged names the diverging tab + first differing line
2026-08-24 19:35:52 +02:00
3d-viewer-deadlock.spec.ts
tests: un-skip sweep — 26 tests revived on the JSPI build, failures re-gated with fresh evidence
2026-08-13 18:43:36 +02:00
3d-viewer-engine-toggle.spec.ts
fix(3d): blank viewer after raytracing round-trip — owner-context FFP routing + VAO isolation (gl1)
2026-08-25 11:25:34 +02:00
3d-viewer-models.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
3d-viewer-reopen.spec.ts
fix(3d): blank render + lost position after 3D viewer close/reopen (gl1 context guard)
2026-08-24 16:18:22 +02:00
3d-viewer.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
appearance.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
calculator.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
collab-load-fuzz.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
collab-undo.spec.ts
feat(collab): local-ops-only undo — remote applies skip the undo stack (ysync miss 09)
2026-07-08 11:09:26 +02:00
contextmenu-scrollbar-pcbnew.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
contextmenu-scrollbar.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
coroutine-lifecycle.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
dark-mode.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
drift-trio-fuzz.spec.ts
tests: un-skip sweep — 26 tests revived on the JSPI build, failures re-gated with fresh evidence
2026-08-13 18:43:36 +02:00
drift-trio-scenarios.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
drift-trio.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
eeschema-collab.spec.ts
tests: fix two-tab collab baseline race + build the jspi harnesses in CI
2026-08-14 21:46:24 +02:00
eeschema-crosshair.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
eeschema-load.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
eeschema-perf.spec.ts
build+perf: wasm-opt the shipped wasm, and measure real frames in CI
2026-08-22 12:53:00 +02:00
eeschema-sim.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
eeschema-subschema.spec.ts
feat(eeschema): hierarchical subschema collaboration — per-sheet rooms, lazy seed, save flow, embind + e2e
2026-06-17 17:55:30 +02:00
eeschema-ui.spec.ts
fix(dialogs): centre unpositioned dialogs — repair the origin-placement regression from the display-index fix
2026-08-24 17:50:21 +02:00
eeschema-url-regex.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
eeschema.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
fixtures.ts
eeschema simulator: lazy ngspice_service worker — static sharedspice (XSPICE registry + CIDER), init_dll ifdef, e2e both engines
2026-07-19 15:59:21 +02:00
footprint-chooser-close.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
frame-runtime.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
gerbview-print.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
gerbview.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
import-settings-modal-stack.spec.ts
test(pcbnew): e2e repro for stacked-modal click routing + wxwidgets barrier
2026-07-17 16:53:34 +02:00
items-bridge.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
load-pcb-probe.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
load-pcb.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
mailbox-ordering.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
ngspice-probe.spec.ts
eeschema simulator: lazy ngspice_service worker — static sharedspice (XSPICE registry + CIDER), init_dll ifdef, e2e both engines
2026-07-19 15:59:21 +02:00
occ-export-models.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
occ-export.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
occ-probe.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
pcbnew-collab.spec.ts
tests: fix two-tab collab baseline race + build the jspi harnesses in CI
2026-08-14 21:46:24 +02:00
pcbnew-large-perf.spec.ts
bench: jetson FPS battery — both backends saturate at 80.9 MB scale
2026-08-14 12:07:18 +02:00
pcbnew-move.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
pcbnew-perf.spec.ts
build+perf: wasm-opt the shipped wasm, and measure real frames in CI
2026-08-22 12:53:00 +02:00
pcbnew.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
pl_editor-collab.spec.ts
feat: adopt shared wasm wire schemas; resurrect collab e2e bundle (ysync 0008 A)
2026-06-12 14:05:40 +02:00
pl_editor-load.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
pl_editor-uuid.spec.ts
feat(pl_editor): add KIID m_Uuid + (uuid) to .kicad_wks format (yjs-bridge commit 1)
2026-06-05 13:56:38 +02:00
pl_editor.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
presence-eeschema.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
presence-locks-eeschema.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
presence-locks-pcbnew.spec.ts
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate
2026-07-17 12:21:54 +02:00
presence-pcbnew.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
project-sync.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
quasimodal-strand.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
roundtrip.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
save-hook.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
shell-open-dialogs.spec.ts
Phase F fix: open-lane token was lost across the dispatch-context swap — mint it in JS; repro spec added
2026-08-10 10:14:21 +02:00
symbol_editor.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
timer-park-repro.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
xface-probe.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00
ysync-libsymbols.spec.ts
tests: un-skip sweep — 26 tests revived on the JSPI build, failures re-gated with fresh evidence
2026-08-13 18:43:36 +02:00
ysync-repros-eeschema.spec.ts
fix(ysync): review bugs 01–07 — listener registration, pad nets, child removals, dirty-set emit, targeted rebaseline, seed arbitration, stale hook (doc 17)
2026-07-06 08:57:57 +02:00
ysync-repros-pcbnew.spec.ts
fix(ysync): review bugs 01–07 — listener registration, pad nets, child removals, dirty-set emit, targeted rebaseline, seed arbitration, stale hook (doc 17)
2026-07-06 08:57:57 +02:00
ysync-two-tab.spec.ts
jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
2026-08-14 09:25:32 +02:00
zoom-cursor.spec.ts
test(determinism): deterministic waits + stableShot screenshots; drop blind sleeps/ifs/retries
2026-07-07 10:50:24 +02:00