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.
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/fontconfiginstalled (the same set the CIInstall Linux GL prereqsstep 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_windowopens 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.