# M2 — nativer wgpu-2D-Renderer im Tauri-Fenster: Ansatzwahl

> Ziel: den bereits fluessig laufenden standalone `render2d`-Renderer aus dem
> ECHTEN Tauri-Prozess heraus mit nativer GPU-Performance anzeigen — nicht in der
> WebKitGTK-Webview (Perf-Flaschenhals), nicht in einem Chromium-Workaround.
> Maschine: Linux, Wayland, AMD.

## Gewaehlter Ansatz: **B — separates natives Fenster (winit) im Tauri-Prozess**

Der Tauri-Hauptthread haelt weiterhin die GTK-Hauptschleife + das Webview-Fenster
(HTML-Chrome). Aus dem Tauri-`setup`-Hook startet der Prozess auf einem
Hintergrund-Thread ein **eigenes natives winit-Fenster** mit eigener wgpu-Surface,
das die `render2d`-Demo-Szene (konkaves L + Raum + Papier-mm-Linien) rendert,
pan-/zoombar. Renderer/Szene werden NICHT reimplementiert — es ist exakt der Code
des verifizierten standalone `spike`-Bins (`render2d::gpu::Renderer` +
`render2d::demo_scene`).

### Warum B (und was gegen A/C spricht)

- **Kein geteilter Wayland-Surface → keine Contention/Flicker.** winit spricht auf
  Linux DIREKT Wayland/X11 (Crates `wayland-client`/`x11rb`), es benutzt **kein
  GTK**. Das native Fenster bekommt eine eigene, von WebKitGTK voellig getrennte
  Wayland-Surface. Genau das umgeht das dokumentierte Problem aus der Vorrecherche
  (Roh-wgpu-Surface UNTER der Webview im selben Fenster → Flicker/Schwarzbild auf
  Wayland).
- **Zwei Fenster-Stacks, aber KEIN Event-Loop-Konflikt.** tao (Tauri) fuehrt eine
  GTK-Hauptschleife auf dem Hauptthread; winit fuehrt eine eigene Schleife.
  winit 0.30 erlaubt die Event-Loop explizit auf einem Nicht-Haupt-Thread via
  `EventLoopBuilderExtWayland::with_any_thread(true)` (X11-Pendant analog). Der
  native Renderer laeuft daher auf `std::thread` „cad-native2d", der Tauri-/GTK-
  Hauptthread bleibt frei. Da winit nicht an GTK gebunden ist, kollidieren die
  beiden Schleifen nicht (getrennte Stacks, getrennte fds).

- **Ansatz A (wgpu-Surface im SELBEN Tauri-Fenster, Unter-/Overlay):** verworfen.
  taos `raw_window_handle_rwh_06()` liefert auf Wayland den `WaylandWindowHandle`
  der GTK-`ApplicationWindow` — also DIESELBE Surface, in die WebKitGTK
  komponiert. Eine zweite wgpu-Surface darauf ist genau die Contention, die die
  Vorrecherche als flackernd/schwarz auf diesem Setup markiert hat. Hoechstes
  Wayland-Risiko, fuer den Spike ungeeignet.
- **Ansatz C (wgpu als Haupt-Surface, HTML nur duennes Overlay):** verworfen fuer
  den Spike. Sauberste Perf-Story, aber groesster Umbau: die ganze App muesste auf
  eine winit/tao-getriebene Haupt-Schleife umziehen und die Tauri-Webview zur
  Nebenrolle degradiert werden. Kein „minimaler realer Spike" mehr. Bleibt die
  Ziel-Endarchitektur-Option, aber nach B.

## Crates / Versionen (verifiziert aus der Lock-Datei)

| Rolle | Crate | Version |
|---|---|---|
| Tauri | `tauri` / `tauri-runtime-wry` | 2.11.5 / 2.11.4 |
| Fenster (Webview-Seite) | `tao` | 0.35.3 |
| Webview | `wry` | 0.55.1 |
| Natives Renderfenster | `winit` | 0.30.13 |
| GPU | `wgpu` / `wgpu-hal` | 22.1.0 / 22.0.0 |
| Handle-Bruecke | `raw-window-handle` | **0.6.2 (identisch fuer tao UND wgpu/winit)** |
| Renderer | `render2d` (Pfad) | 0.1.0, Feature `window` |

Der entscheidende Kompatibilitaets-Glueckstreffer: tao 0.35 und wgpu 22/winit 0.30
teilen sich `raw-window-handle 0.6.2` — keine rwh-Versionsbruecke noetig. (Fuer
Ansatz B wird der tao-Handle gar nicht gebraucht, weil das native Fenster eine
eigene winit-Surface hat; die Versions-Parität ist aber die Voraussetzung fuer ein
spaeteres A/Compositing, falls je gewuenscht.)

## Wayland-Caveats (fuer den Start auf dieser Maschine)

- **`WEBKIT_DISABLE_DMABUF_RENDERER=1`** bleibt fuer die Webview-Sichtbarkeit auf
  diesem Wayland/AMD-Setup noetig (Vorrecherche). Betrifft die WebKitGTK-Seite,
  nicht das wgpu-Fenster.
- Das native winit-Fenster laeuft ueber Vulkan; GLES/EGL-Fallback wurde standalone
  ebenfalls funktionierend gesehen. `WGPU_BACKEND=gl` erzwingt bei Vulkan-Zicken
  den GL-Pfad.
- `with_any_thread(true)` ist zwingend — ohne die Freigabe panict winit, weil es
  die Event-Loop sonst nur auf dem Hauptthread zulaesst (den haelt hier GTK).

## Bau-Isolierung

Alles hinter Cargo-Feature **`native2d`** in `cad-tauri` (opt-in). Der normale
Build (`cargo build`, `npm run tauri:dev`) zieht weder winit noch wgpu und bleibt
unveraendert. `render2d` bleibt ohne Tauri-/GTK-Abhaengigkeiten headless baubar
und testbar.

## Naechster Schritt Richtung Vollbild-App (2D-Viewport + HTML-Chrome)

1. Szene aus dem echten Modell speisen: `Plan.primitives` (TS) → serde-`Scene` →
   ueber einen Tauri-`emit`/Command an den native2d-Thread (statt `demo_scene`).
2. Pan/Zoom-State zwischen Webview-Chrome und native2d-Fenster synchronisieren
   (Tauri-Events beidseitig).
3. Fenster-Kopplung: das native Fenster als Kind/als angedockten Bereich neben der
   Webview positionieren (Layout), spaeter ggf. Umstieg auf Ansatz C, wenn ein
   einziges Fenster gefordert ist.
