display: finalize v1 — docs + plan to DONE (D5)

The three integration cases (display, display-service, display-demo) plus the
pure host tests all pass; the default build is clean. Update docs/display.md's
"Verifying it" to name the real cases, and mark docs/display-plan.md D1-D5 done.

The display service v1 is complete: a framebuffer compositor that owns the
write-combining framebuffer, composites a z-ordered layer stack into a cacheable
back buffer, presents only the damaged region, and is driven over IPC by the
runtime.display client — proven end to end by the display-demo process. Deferred
by design (docs/display.md): runtime mode-setting and true vsync.
This commit is contained in:
Daniel Samson
2026-07-14 01:58:18 +01:00
parent 105203b447
commit 3fc2d5b083
2 changed files with 42 additions and 18 deletions
+21 -7
View File
@@ -232,13 +232,27 @@ both are clean additions behind the interfaces v1 establishes.
## Verifying it
A `display` test case ([tests.zig](../system/kernel/tests.zig), `python3
test/qemu_test.py display`) boots the kernel, spawns the service and a synthetic
`display-demo` client (the hardware-free analog of
[`input-source`](../system/services/input-source/)) that drives layers — a wallpaper, a
moving rectangle, a cursor. It passes on a serial heartbeat (`display: presented frame N`
/ `display-demo: ok`), proving a frame travelled client → compositor → screen, exactly
as the [input test](input.md) proves an event travels source → service → subscriber.
Three QEMU test cases ([tests.zig](../system/kernel/tests.zig), `python3
test/qemu_test.py <case>`), each layering on the last:
- **`display`** — the kernel handoff: the seeded `display` device is shaped correctly and
the claim → `mmio_map` leaf is genuinely **write-combining** (PAT entry 4), asserted at
the page-table level.
- **`display-service`** — the compositor comes up: it claims the framebuffer, allocates
the cacheable back buffer, presents a cleared frame through the double-buffer path
(`display: online … / presented frame 0`), and a startup **self-check** composites two
overlapping layers on the real framebuffer and reads them back — overlap = the top
layer — logging `display: compositor self-check ok`.
- **`display-demo`** — the full pipeline from a separate process: the hardware-free
[`display-demo`](../system/services/display-demo/) client (the
[`input-source`](../system/services/input-source/) analog) drives layers — a wallpaper, a
sliding rectangle, a cursor — through the layer client API and heartbeats
`display-demo: ok`, proving a frame travelled client → compositor → screen, exactly as
the [input test](input.md) proves an event travels source → service → subscriber. The
visible motion itself is a screenshot away via `zig build run-x86-64`.
The compositor's pixel math (rectangle clipping, fill, composite, tile blit) and colour
packing are additionally covered by pure host unit tests under `zig build test`.
## See also