From be8fbf0c84edeb0d87a147f78d1fda555cf336a2 Mon Sep 17 00:00:00 2001 From: Kayshen-X Date: Tue, 5 May 2026 12:42:39 +0800 Subject: [PATCH] ci(shell-native): force xvfb GLX + mesa software-render for P0 probe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Linux P0 probe was failing with `GLXBadWindow` because: - bare `xvfb-run` brings up Xvfb with default args (no `+extension GLX`); the X server then advertises no GLX FBConfigs, so winit's X11 backend fails when glutin tries to create a GL window. - the runner has no GPU, so even with GLX enabled mesa would not pick a hardware visual; without a software fallback configured glutin cannot resolve `ContextApi::OpenGl`. Fix: - pass `xvfb-run -s "-screen 0 1280x1024x24 +extension GLX +render -noreset"` so Xvfb advertises a 24-bit GLX-capable visual. - set `LIBGL_ALWAYS_SOFTWARE=1`, `GALLIUM_DRIVER=llvmpipe`, and `MESA_GL_VERSION_OVERRIDE=4.5` so mesa loads llvmpipe (CPU rasterizer) and reports a desktop-GL version high enough for skia. These env vars propagate naturally from the workflow shell down through xvfb-run → cargo → the spawned `cargo run --example p0_probe` subprocess (probe runs each verification in a fresh process so winit's EventLoop singleton guard doesn't trip). --- .github/workflows/rust-check.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust-check.yml b/.github/workflows/rust-check.yml index e983d66aa..1a0d5f734 100644 --- a/.github/workflows/rust-check.yml +++ b/.github/workflows/rust-check.yml @@ -59,9 +59,29 @@ jobs: # tests. Linux: route through `xvfb-run` for a virtual display. # Windows: the test body early-returns with a "deferred" message # (spec §8.2 WINDOWS_GPU_DEFERRED_NO_RUNNER); macOS: runs natively. + # + # Xvfb arguments: + # -screen 0 1280x1024x24 — 24-bit color so GLX visuals can match. + # +extension GLX — explicitly enable GLX (without this, a + # winit X11 window hits `GLXBadWindow` when + # the X server reports an empty FBConfig list). + # +render — RENDER extension (winit/skia path queries it). + # -noreset — keep the X server alive across the cargo + # subprocess fork (probe spawns + # `cargo run --example p0_probe` per test). + # Env: + # LIBGL_ALWAYS_SOFTWARE=1 + GALLIUM_DRIVER=llvmpipe forces mesa to + # software-render (xvfb has no GPU); without it create_context + # negotiates an unusable hardware visual. - name: P0 probe gate (Linux) if: runner.os == 'Linux' - run: xvfb-run -a cargo test -p openpencil-shell-native --test p0_probe -- --ignored + env: + LIBGL_ALWAYS_SOFTWARE: '1' + GALLIUM_DRIVER: llvmpipe + MESA_GL_VERSION_OVERRIDE: '4.5' + run: | + xvfb-run -a -s "-screen 0 1280x1024x24 +extension GLX +render -noreset" \ + cargo test -p openpencil-shell-native --test p0_probe -- --ignored - name: P0 probe gate (macOS / Windows) if: runner.os != 'Linux' run: cargo test -p openpencil-shell-native --test p0_probe -- --ignored