evidence · 4.1 KiB

README.md

Committed at docs/evidence/vglite-scene-board/padded/README.md. This is what grounds the requirements that cite it.

Open raw source

Padded scanout: real GPU submission, color mismatch retained

Board trials on 2026-09-23 at 16:26:23 UTC (GPU) and 16:27:56 UTC (forced Pixman). Renderer source ead54046b786a073f6ac880dde0f4838a6d78dee, landed as db751008; cross-build /nix/store/iy08ig1xw3xhhh1ph31g5jy59lj04f19-sway-1.12. The exact unwrapped executable and trusted synthetic client are in each result.json. Both modes use the same compositor, native RGB565 panel, scale one, and 1152-byte padded pitch. Normal installed Sway remains unchanged.

Actual outcomes

ModeCompleted GPU framesPixman replaysVisible prerequisiteRecovery
GPU diagnostic1960PassedNormal shell restored
Forced Pixman0576PassedNormal shell restored

The same Sway/wlroots DRM backend owns the output; the renderer uses its supplied buffer, with no independent DRM open/modeset/commit path. Only one Sway PID was observed in each run, and kernel scanout state reports DRM RGB565. Decision logs record single-plane linear dma-bufs, offset zero and stride 1152. The GPU trial records actual successful full-frame submissions. Forced replay is selected by the existing cache opt-in flag set to zero, retaining WLR_RENDERER=vglite and the same padded allocator. It records opt_in_disabled and no GPU submissions.

This satisfies the bounded scene-selection/submission observation in task 3.1. It does not satisfy ordinary-user service access, source/target color correctness, cache ownership, normal controls under GPU, or performance gates. This root-owned diagnostic is separate from the proposed normal-service broker.

Capture and color review

The executed checker is ../padded-check.py; it runs the bounded root scene harness with a 30-second animated parent/desynchronized-child fixture. Before retaining PNGs it requires a native PPM capture with recognizable blue parent content at multiple locations. Mapping a window over IPC alone is insufficient. The coordinator reviewed both later PNGs: parent bands, child bands/counter, placement and panel coverage are visible in both modes.

The animations have different frame counters, so directly comparing complete screenshots would confuse motion with rendering error. Instead, analyze-palette.py compares the parent and child color sets in fixed regions away from the counters, checking the same colors across both captures per mode. Its output is retained in palette-comparison.json; MISMATCH is expected and is not waived. For the brighter bands:

RegionGPU RGBPixman RGB
Parent33, 113, 17333, 113, 181
Child222, 142, 33231, 146, 33

The darker bands match. The differing channels are one RGB565 code step apart. This evidence identifies a conversion/quantization discrepancy; it does not yet establish its cause or an acceptable correction. Exact source upload/conversion and cache/correctness acceptance remain open. No tolerance was increased.

The raw frame totals also do not establish a speedup. The free-running fixture completed fewer frames under GPU. Capture/startup costs and nonidentical frame sequences make this a diagnostic comparison, not the required wall/process CPU/system/interrupt benchmark. All performance gates remain open.

Reproduction, recovery and limits

The checker invokes the same private root-owned harness and unprivileged Wayland client used in the earlier scene trial, with its independent recovery timer. --force-pixman selects the paired replay mode without changing scanout allocation. Seven host lifecycle/configuration checks passed, including the new same-allocation comparison mode and retained client isolation.

Both controller runs exited zero, found normal shell and seatd active, and recorded the restoration marker. The normal image and boot ID are unchanged in their manifests. restoration.json records a separate injected normal-control regression after the pair. No flash, battery, real-finger or optical proof is claimed. Source/format/clip, synchronization, user-service access and measured interaction costs must still be resolved before considering any default change.