Issue #97: WebGL — Native OffscreenCanvas als Backend für alle WebGL-Challenges #92
Labels
No labels
bug
docs
feature
housekeeping
html-spec
performance
react-compat
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
glow-all/true-headless-browser#92
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problembeschreibung
Unser
FakeWebGLRenderingContextliefert nur leere No-Op Stubs. Echte WebGL-Challenges (BotD, CloudFlare Turnstile, PerimeterX, DataDome) prüfen:readPixels()— erwartet echte Pixel (Rauschen, Farb-Gradienten, nicht Null)getSupportedExtensions()— Liste muss Chrome-spezifische Extensions enthaltengetExtension()—WEBGL_debug_renderer_infomuss echte Renderer-Werte liefern (nicht "ANGLE (SwiftShader)")getError()muss korrekt arbeiten, Flags (DEPTH_TEST,BLEND) müssen State haltencheckFramebufferStatus()— muss FRAMEBUFFER_COMPLETE nur bei korrektem Setup liefernAktuelle Implementation (src/fakes/canvas.ts):
Analyse
Option A — Bun's OffscreenCanvas + native WebGL (EMPFEHLUNG)
Bun stellt nativen WebGL via JavaScriptCore bereit:
Vorteile:
Nachteile:
Option B — Verbesserte Fake-Implementation + Recording+KAT
Unser geplanter Ansatz: WebGL-Aufrufe recorden, bei
readPixelsdurch Canvas2D-KAT simulieren:drawArrays()→ Vorgang im Recording-Log speichernreadPixels()→ Aus Recording einen Canvas2D-Draw rekonstruierengetShaderInfoLog()→ Fake-Error-MessagesProblem: KAT (Knowledge Augmented Translation) von WebGL→Canvas2D ist extrem komplex. Shader können arbiträr sein. Nie 100% akkurat.
Option C — Mesa/OSMesa via EGL + bun:ffi
C++ shared library (libOSMesa) via
bun:ffiladen. Echter OpenGL ES Software-Renderer.Option D — Hybrid: C + A
Primär Bun's OffscreenCanvas (A). Fallback auf verbessertes Fake (B). Bei kritischen Challenges optional Mesa (C) via Plugin-System laden.
Entscheidung
Primär: Option A (Bun OffscreenCanvas). Fallback: Option B (verbessertes Fake + KAT). Mesa (C) nur wenn konkrete Challenge Bun's WebGL nicht akzeptiert.
Akzeptanzkriterien
NativeWebGLProxydelegiert ALLE WebGL-Methoden an Bun's nativen ContextreadPixels()liefert echte Pixel (nicht Null)getSupportedExtensions()liefert Chrome-konforme ListegetExtension('WEBGL_debug_renderer_info')liefert Chrome-konforme WerteisEnabled(),getError(),getParameter()) funktioniert korrektBetroffene Dateien
src/fakes/canvas.tsNativeWebGLProxyKlasse hinzufügensrc/fakes/canvas-wgl.tssrc/runtime-isolation.tstests/unit/webgl-backend.test.tsTechnische Risiken
getContext('webgl')könntenullreturnen.Testplan
NativeWebGLProxyerzeugen + alle Methoden aufrufenDependencies
Implementiert ✅ (Commit
031f95a)Option B — Verbesserte Fake-Implementierung (Option A: OffscreenCanvas nicht in Bun verfügbar)
Neuer Code
src/fakes/canvas-wgl.ts— Verbesserter FakeWebGLRenderingContext + FakeWebGL2RenderingContext (1224 Zeilen)tests/unit/webgl-backend.test.ts— 34 Chrome-KompatibilitätstestsWichtigste Verbesserungen
pixels.fill(0)❌Getestet
Nächste Schritte