openpencil/crates/openpencil-shell-native/notes/step-1a-linux-manual-smoke.md
Kayshen-X e66e8aefcc feat(shell-native): Step 1a Task 4 — basic_window demo + acceptance + Phase C Gate
Phase C Task 4 closes Step 1a (G1 shared Skia context) on v0.8.0:

- crates/openpencil-shell-native/examples/basic_window.rs:
  winit + SharedSkiaContext::new_desktop + NativeBackend (Jian DrawOp)
  + JianPointerMapper integration. Paints chrome rect + "Hello 你好"
  + box outline; close → idempotent teardown. Demonstrates Phase B
  Task 3 winit → Jian PointerTranslator → JianPointerMapper →
  ShellEvent pipeline end-to-end.
- crates/openpencil-shell-native/notes/step-1a-{macos,linux,windows}-manual-smoke.md:
  manual GPU smoke runbooks for spec §1.2 acceptance #1 (macOS PASS
  recorded; Linux/Windows pending real-hardware run, deferred per
  CONCERN-R5-1 + WINDOWS_GPU_DEFERRED_NO_RUNNER).
- tools/check-jian-boundaries.sh: spec §11 + §12.3 invariants.
  Verifies that openpencil-app has no direct jian-* dep, mobile
  (aarch64-linux-android, aarch64-apple-ios) and wasm32 closures
  exclude jian-host-desktop / jian-skia, and openpencil-shell-web
  declares no jian-host-desktop dep at the manifest level.
- .github/workflows/rust-check.yml: wires bash tools/check-jian-boundaries.sh
  on Linux runner with mobile + wasm32 targets installed.
- README.md: roadmap entry for the Step 1a milestone.

Verified locally on macOS aarch64:
- cargo fmt --all -- --check
- cargo clippy --workspace --all-targets -- -D warnings
- cargo build --examples --workspace
- cargo test --workspace (38 PASS, 0 FAIL, 0 IGNORED)
- cargo check -p openpencil-shell-native --target {aarch64-linux-android, aarch64-apple-ios}
- bash tools/check-jian-boundaries.sh (4 invariants PASS)
- spec §11 invariants 1–4 grep checks PASS

Spec v19.3 FROZEN (openpencil-docs 651090d); Plan v7 FROZEN.
vendor/jian pinned at c4a794dc.
2026-05-05 12:23:27 +08:00

1.9 KiB

Step 1a Linux manual GPU smoke (per spec v19 §1.2 acceptance #1)

Status: PENDING — to be filled by a maintainer running on a Linux desktop with a real or Mesa software-rendered GL driver.

The CI Linux runner ships Mesa llvmpipe via Xvfb but gpu_smoke / gpu_chrome_stub_composition are currently #[ignore]'d under LINUX_GPU_SKIA_LOADER_TBD (spec §3.1 mini-patch — skia-safe's Interface::new_native cannot resolve GL syms from EGL pbuffer + llvmpipe; the proper fix is new_load_with(eglGetProcAddress) and is deferred to Step 1f). The spec acceptance #1 on Linux therefore needs a separate human runtime check.

Prerequisites

  • Ubuntu 22.04+ / Fedora 40+ / Arch with mesa / libglvnd / xkbcommon / wayland-client / freetype / fontconfig installed (the same set the CI Install Linux GL prereqs step provisions).
  • X11 or Wayland session.
  • Rust toolchain 1.85.
  • Submodules at vendor/jian@c4a794dc.

Required commands

cargo run -p openpencil-shell-native --example basic_window
# After Step 1f spec §3.1 mini-patch lands, also:
# cargo test -p openpencil-shell-native --test gpu_smoke -- --include-ignored gpu_smoke
# cargo test -p openpencil-shell-native --test gpu_chrome_stub_composition -- --include-ignored gpu_chrome_stub_composition

Expected outcomes

  • basic_window opens an 800x600 window showing:
    • White background.
    • Red filled rect at (50, 50) — 100x100.
    • Black Hello 你好 text at (50, 200).
    • Blue stroked rect outline at (200, 50) — 200x150.
    • Closing the window exits cleanly.
  • Running under Xvfb + Mesa llvmpipe is acceptable for "no real GPU" hosts; the chrome must still render correctly.

Where to record results

Append the run date, distro/version, GL renderer (glxinfo | grep OpenGL.renderer), and output excerpt to this file (replacing the Status: PENDING line) and commit on v0.8.0 with docs(shell-native): record Linux manual GPU smoke.