openpencil/crates/openpencil-shell-native/notes/step-1a-windows-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 Windows manual GPU smoke (per spec v19 §8.1)

Status: PENDING — to be filled by a maintainer running on a Windows desktop with a real GL driver.

The standard GitHub Actions windows-latest runner has no GPU driver (WINDOWS_GPU_DEFERRED_NO_RUNNER), so spec v19 §8.1 requires the following sequence to be exercised by a human on real hardware before Step 1a can be declared "live on Windows".

Prerequisites

  • Windows 10/11 (x86_64 or aarch64) with a working OpenGL 3.3+ driver (default factory drivers on most modern GPUs satisfy this).
  • Rust toolchain 1.85 (via rustup toolchain install 1.85).
  • Submodules checked out (git submodule update --init --recursive) so vendor/jian is at c4a794dc (Step 1a freeze).

Required commands

cargo run -p openpencil-shell-native --example basic_window
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 (chrome).
    • Black Hello 你好 text at (50, 200) (chrome via Jian skia textlayout).
    • Blue stroked rect outline at (200, 50) — 200x150.
    • Closing the window exits cleanly (no panic, no driver complaint in the console).
  • gpu_smoke (#[ignore]'d on Windows by WINDOWS_GPU_DEFERRED_NO_RUNNER) passes when run with --include-ignored on a real-GPU host.
  • gpu_chrome_stub_composition likewise passes — chrome pixel reads back red even after CanvasViewportStub::render_into pollutes STENCIL_TEST and BlendFunc(ONE, ZERO).

Where to record results

Append the run date, Windows build, GPU/driver, and output excerpt to this file (replacing the Status: PENDING line) and commit on v0.8.0 with docs(shell-native): record Windows manual GPU smoke.