Phase 0: X11 paths + measurement-instrument inventory captured
Live Plasma X11 session on ohm probed over SSH; substrate is healthy (xorg-server 21.1.22 + Mesa 26.0.5 / Panfrost, modesetting in-server, all 7 needed X protocol extensions live). Evidence in phase0_evidence/x11_inventory_2026-05-03/ — five raw captures + inventory.md summary. Worklist deliverables 2 + 4 flipped to done with operator-action checklist for the remaining gating items (no non-compositing WM installed today; six candidates one pacman -S away, openbox recommended). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,310 @@
|
||||
# Phase 0 — X11 paths + measurement-instrument inventory
|
||||
|
||||
**Date captured:** 2026-05-03 09:08 CEST (ohm uptime 17h34m, 1280×800 panel)
|
||||
**Session under capture:** Plasma X11 (`startplasma-x11`) on tty3,
|
||||
session-id 347, Type=x11, kwin_x11 6.6.4 active (`--replace`).
|
||||
**Captured from:** `mfritsche@noether` over SSH (`ohm.fritz.box`),
|
||||
no operator interaction required for the captures themselves.
|
||||
|
||||
Raw evidence files in this directory:
|
||||
|
||||
- `01_live_session.txt` — Xorg cmdline, kwin_x11 cmdline, plasmashell,
|
||||
full process tree, thermal/governor, Xorg.0.log tail.
|
||||
- `02_x11_paths.txt` — installed packages, drivers, SDDM sessions,
|
||||
WM availability, mpv, rockchip-drm bind.
|
||||
- `03_xprotocol_extensions.txt` — xdpyinfo, per-extension probes,
|
||||
glxinfo, drm_info (16k lines — large because drm_info dumps every
|
||||
property). Excerpts copied below.
|
||||
- `04_measurement_instruments.txt` — tool availability + perf
|
||||
paranoid + xtrace probe.
|
||||
- `05_repo_check_and_planes.txt` — repo availability of
|
||||
not-yet-installed tools + planes-table head from drm_info.
|
||||
|
||||
## TL;DR
|
||||
|
||||
- **The currently-live "X11" session is Plasma X11 with `kwin_x11`
|
||||
as compositing WM.** Per `phase0_findings.md`, this is **explicitly
|
||||
excluded** from the without-KWin cell of the matrix. It is still
|
||||
useful as the Phase 0 X11-substrate ground truth (live `Xorg`,
|
||||
live drivers, live extensions). A second X11 *session type* —
|
||||
no compositor — has to be created before the matrix can run its
|
||||
without-KWin cells. **Operator action required** (see § "What the
|
||||
campaign cannot acquire over SSH alone" below).
|
||||
- **X11 stack is healthy on ohm:** `xorg-server 21.1.22-1`, sole
|
||||
DDX is `modesetting_drv.so` (in-server), Mesa `26.0.5-arch1.1`,
|
||||
Panfrost (Mali-G52 r1 MC1), DRI3 + Present + Composite +
|
||||
XVideo + RANDR all initialized. Direct rendering: yes.
|
||||
- **All required X protocol extensions for the matrix are present**
|
||||
on the running server: Composite, DAMAGE, DRI3, Present, RANDR,
|
||||
SYNC, XVideo. (Confirmed via xdpyinfo extension listing — 28
|
||||
extensions total.)
|
||||
- **rockchip-drm planes are the same ones the predecessor cataloged**
|
||||
on Wayland: Plane 39 (Primary, on CRTC 1 / object-id 52), Plane 45
|
||||
(Overlay, on CRTCs {0,1}). Format-support details not re-extracted
|
||||
in this capture but predecessor's
|
||||
`kwin_overlay_subsurface/phase2_source_findings.md` is valid for
|
||||
reference (Plane 39 is the only NV12-LINEAR-capable plane).
|
||||
- **Most measurement tools we'll want are missing but free in extra:**
|
||||
`xorg-xrandr`, `xorg-xev`, `xorg-xinput`, `xorg-xwininfo`,
|
||||
`xorg-xkill`, `sysprof`. Operator-installable via one `pacman -S`.
|
||||
- **mpv 0.41.0 is installed** with libplacebo 7.360.1 — the
|
||||
reference X11-overlay client called out in
|
||||
`phase0_findings.md` § "Open questions" can be added to the
|
||||
matrix without further install.
|
||||
- **Firefox is NOT installed.** Two of the six matrix cells (`C-W-ff-*`,
|
||||
`C-X-ff-*`) need it. Operator decision whether to install or to
|
||||
drop Firefox from the matrix.
|
||||
- **The X11 protocol tracer `xtrace` is AUR-only**, NOT in extra.
|
||||
The `/usr/bin/xtrace` shipped with glibc is a *syscall* tracer,
|
||||
unrelated. If protocol-trace evidence is wanted for X11 cells
|
||||
parallel to `WAYLAND_DEBUG=1` for Wayland cells, this is an
|
||||
operator-tasked install (or a build-from-source, or a switch to
|
||||
`xscope`/Python xcb capture).
|
||||
- **`perf_event_paranoid = 2`** so perf record on Xorg PID needs
|
||||
sudo or a one-line sysctl tweak.
|
||||
|
||||
## Deliverable 2 — X11 paths inventory
|
||||
|
||||
### Installed (confirmed, no install needed)
|
||||
|
||||
| Component | Version | Notes |
|
||||
|---|---|---|
|
||||
| `xorg-server` | 21.1.22-1 | binary `/usr/lib/Xorg`, runs as `vt3 -seat seat0 -keeptty -novtswitch -verbose 3 -auth ...` |
|
||||
| Sole DDX driver | `modesetting_drv.so` | shipped *inside* `xorg-server`; no `xf86-video-*` package needed (and none would help on rockchip-drm) |
|
||||
| Mesa | 1:26.0.5-1 | Panfrost (Mali-G52 r1 MC1), GL 3.1 core / GLES 3.1 |
|
||||
| `libdrm` | 2.4.131-1 | |
|
||||
| `libglvnd` | 1.7.0-3 | |
|
||||
| `xorg-xwayland` | 24.1.11-1 | for the Wayland axis only — NOT used for native X11 cells |
|
||||
| AIGLX module | rockchip | per Xorg.0.log line "AIGLX: Loaded and initialized rockchip" |
|
||||
| GLX provider | DRI2 | Xorg log: "GLX: Initialized DRI2 GL provider for screen 0" — DRI3 also initialized via separate extension; both available to clients |
|
||||
|
||||
### SDDM-advertised sessions
|
||||
|
||||
| File | Type | Exec | Status |
|
||||
|---|---|---|---|
|
||||
| `/usr/share/xsessions/plasmax11.desktop` | X11 | `/usr/bin/startplasma-x11` | **the only X11 session SDDM offers today** |
|
||||
| `/usr/share/wayland-sessions/plasma.desktop` | Wayland | (Plasma 6.6.4 startup) | predecessor's baseline session |
|
||||
| `/usr/share/wayland-sessions/weston.desktop` | Wayland | weston | reference Wayland compositor (separate concern) |
|
||||
|
||||
### WM availability
|
||||
|
||||
| WM | Installed? | Available in repo? |
|
||||
|---|---|---|
|
||||
| `kwin_x11` | yes (running) | (KDE) — **excluded** from without-KWin cell per matrix definition |
|
||||
| openbox | **no** | yes (extra) |
|
||||
| fluxbox | **no** | yes (extra) |
|
||||
| i3-wm | **no** | yes (extra) |
|
||||
| xfwm4 | **no** | yes (extra) |
|
||||
| awesome | **no** | yes (extra) |
|
||||
| bspwm | **no** | yes (extra) |
|
||||
| icewm | **no** | yes (extra) |
|
||||
| jwm | **no** | yes (extra) |
|
||||
|
||||
**Verdict:** zero non-compositing WMs are installed today. The
|
||||
without-KWin cell of the matrix needs operator install +
|
||||
SDDM session-entry creation (or a `startx` from a free TTY).
|
||||
**Recommendation: openbox.** Smallest install, no compositing by
|
||||
default, well-documented, used by the LFS/X11-tutorial canon for
|
||||
this exact "minimal X11" purpose.
|
||||
|
||||
### Display + DRM
|
||||
|
||||
- DRM driver: **rockchip-drm** (compatible
|
||||
`rockchip,display-subsystem`).
|
||||
- `/dev/dri/card0` (active) and `/dev/dri/card1` (secondary VOP —
|
||||
drm_info fails to read it, normal on dual-VOP rockchip), plus
|
||||
`/dev/dri/renderD128`.
|
||||
- Panel: 1280×800 @ 59.98 Hz (the panel is mounted portrait so the
|
||||
DRM mode reads as 800×1280; Xorg presents it 1280×800 logical
|
||||
after rotation).
|
||||
- Xorg.0.log shows `modeset(0): Damage tracking initialized` and a
|
||||
re-allocation `Allocate new frame buffer 1280x800 stride` —
|
||||
modesetting + DRI3-Present are wired up cleanly.
|
||||
- `/dev/video0..2` present (hantro VPU character devices —
|
||||
unchanged from predecessor).
|
||||
|
||||
### Browsers
|
||||
|
||||
| Browser | Installed? | Path |
|
||||
|---|---|---|
|
||||
| brave | yes | `/usr/bin/brave` (`brave-bin 1:1.89.145-1`) |
|
||||
| chromium-fourier | yes | `/tmp/chromium-ohm-gl-fix-step2/chrome` (149.0.7812.0, Step 1 + Step 2) |
|
||||
| firefox | **no** | NOT installed — operator decision needed |
|
||||
|
||||
## Deliverable 4 — X11 measurement-instrument inventory
|
||||
|
||||
### Installed and verified working
|
||||
|
||||
| Tool | Path | Owner pkg | Notes |
|
||||
|---|---|---|---|
|
||||
| `xprop` | `/usr/bin/xprop` | xorg-xprop 1.2.8 | window-property dump (works) |
|
||||
| `xdpyinfo` | `/usr/bin/xdpyinfo` | xorg-xdpyinfo 1.4.0 | display + extension probe (works); per-extension probe limited (e.g. `-ext Present` returns "not supported by xdpyinfo" — the ext IS on the server, xdpyinfo just lacks the printer) |
|
||||
| `xset` | `/usr/bin/xset` | xorg-xset 1.2.5 | DPMS + repeat etc. |
|
||||
| `xmessage` | `/usr/bin/xmessage` | xorg-xmessage 1.0.7 | popup notifier — useful for unattended tests as ack-flag |
|
||||
| `glxinfo` / `glxgears` | `/usr/bin/glxinfo` etc. | mesa-utils 9.0.0 | GL renderer + benchmark fallback |
|
||||
| `drm_info` | `/usr/bin/drm_info` | drm-info 2.9.0 | plane/CRTC/format dump under live X11 |
|
||||
| `perf` | `/usr/bin/perf` | perf 7.0.2 | works; **perf_event_paranoid=2** so attaching to Xorg needs `sudo perf record -p <Xorg_pid>` or `sysctl kernel.perf_event_paranoid=1` first |
|
||||
| Python `libxcb-present.so.0` | shared lib present | (libxcb) | xcb_present capture from a small Python client is doable — the protocol-side present-feedback path the matrix wants for end-to-end latency timing |
|
||||
|
||||
### Missing-but-installable (single `pacman -S` from extra)
|
||||
|
||||
| Tool | Pkg | Why we want it |
|
||||
|---|---|---|
|
||||
| `xrandr` | `xorg-xrandr 1.5.4-1` | output / vblank / mode CLI for the cells |
|
||||
| `xev` | `xorg-xev 1.2.6-2` | per-window event capture (X equivalent of `wayland-info` event echo) |
|
||||
| `xinput` | `xorg-xinput 1.6.4-2` | input-device probe for the touchscreen/touchpad confound |
|
||||
| `xwininfo` | `xorg-xwininfo 1.1.6-2` | get the browser window's geometry/wid for targeted xprop/xrandr crop math |
|
||||
| `xkill` | `xorg-xkill 1.0.7-1` | clean kill of a stuck client between reps |
|
||||
| `sysprof` | `sysprof 50.0-1` | userspace alt to perf with nicer flamegraph defaults |
|
||||
|
||||
**Recommend:** install all six together —
|
||||
`sudo pacman -S xorg-xrandr xorg-xev xorg-xinput xorg-xwininfo xorg-xkill sysprof`
|
||||
(no session restart needed; doesn't affect kwin_x11).
|
||||
|
||||
### Missing — AUR or build-from-source
|
||||
|
||||
| Tool | Source | Why we'd want it |
|
||||
|---|---|---|
|
||||
| `xtrace` (X protocol tracer, NOT the glibc syscall xtrace) | AUR | parallel to `WAYLAND_DEBUG=1` for the X cells of the matrix — captures every X protocol request/reply per browser frame |
|
||||
| `xrestop` | AUR | per-X-client resource (windows/pixmaps/GCs) snapshot — handy for "browser leaks GC handles per video frame" diagnostics |
|
||||
| `intel-gpu-tools` | not applicable | rockchip GPU is Mali, irrelevant here |
|
||||
|
||||
`xtrace` (X-protocol) is the only one that materially affects the
|
||||
research question. Whether to install is an operator decision —
|
||||
the matrix doesn't strictly need protocol traces to answer the
|
||||
research question (effective fps, drops, CPU% are
|
||||
extension-independent), but they would be useful for cross-server
|
||||
parity claims. Default-conservative: skip `xtrace` for now, add
|
||||
later if a Phase 1 cell needs it.
|
||||
|
||||
### What the X server itself supports (live xdpyinfo)
|
||||
|
||||
28 extensions. Of the seven the matrix actually needs:
|
||||
|
||||
| Extension | Status on running X server | Use |
|
||||
|---|---|---|
|
||||
| Composite | initialized (line 87 of Xorg log) | window-redirect base; *off* by default in non-compositing WMs which is what we want for the without-KWin cell |
|
||||
| DAMAGE | initialized | per-window invalidation events |
|
||||
| DRI3 | initialized | dmabuf import/export from clients (needed for browser/mpv hardware paths) |
|
||||
| Present | initialized | flip-presentation w/ vblank-aligned timing — **the X-side equivalent of `wp_presentation_feedback` for end-to-end latency** |
|
||||
| RANDR | initialized | mode + output info, vblank events |
|
||||
| SYNC | initialized | `XSyncCounter` for present timing fences |
|
||||
| XVideo | initialized | legacy hardware-overlay path (Xv); mpv `--vo=xv` uses this |
|
||||
|
||||
All seven are present.
|
||||
|
||||
### Extension-level "is it really wired up" probe results
|
||||
|
||||
- `xdpyinfo -ext Present|DAMAGE|DRI3|RANDR|XVideo` all return
|
||||
"extension not supported by xdpyinfo" — that's an `xdpyinfo`
|
||||
capability gap, **not** a server gap. Confirmed via the master
|
||||
extension list above.
|
||||
- For a definitive Present-extension probe, use a small XCB
|
||||
client (`xcb_present_query_version`) — `libxcb-present.so.0` is
|
||||
on the system. This is the same shape of probe `mpv --vo=gpu
|
||||
--gpu-context=x11` would do at startup; a successful mpv launch
|
||||
doubles as the probe.
|
||||
- Composite extension is initialized, but the matrix's
|
||||
without-KWin cell wants Composite to be *unredirected for the
|
||||
browser window* so that the X server's plane allocator can
|
||||
scanout the browser's NV12 dmabuf onto Plane 39 directly.
|
||||
Whether each browser actually issues
|
||||
`XCompositeUnredirectWindow` (or just trusts no-compositor-WM
|
||||
default) is the **browser-side open question** in
|
||||
`phase0_findings.md` § "Open questions". The Phase 0
|
||||
browser-overlay-path inventory will address that.
|
||||
|
||||
## Cross-checks against the predecessor
|
||||
|
||||
These ground-truth confirmations are from this campaign's session,
|
||||
**not** imported as data per the campaign-contained-data rule:
|
||||
|
||||
| Predecessor claim | This-session check | Match? |
|
||||
|---|---|---|
|
||||
| "Plane 39 is the Primary plane on the active CRTC" | drm_info under X11 shows Plane object-id 39 on CRTC object-id 52 (CRTC 1) | ✓ |
|
||||
| "Plane 45 is the Overlay plane" | drm_info shows Plane object-id 45 on CRTCs {0,1} | ✓ |
|
||||
| "rockchip-drm is the active DRM driver" | sysfs `card0/device/uevent` confirms `DRIVER=rockchip-drm` | ✓ |
|
||||
| "kernel 6.19.10-danctnix1-1-pinetab2, Mesa 26.0.5" | uname -a + pacman -Q match | ✓ |
|
||||
| "CPU governor is `performance`" | `/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor` all = performance | ✓ |
|
||||
| "/dev/video0..2 are the hantro VPU nodes" | confirmed (root:video, mode 660, present at session start) | ✓ |
|
||||
|
||||
These are agreement-with-substrate checks, not measurement
|
||||
imports. They establish that the hardware/kernel/Mesa/governor
|
||||
substrate the predecessor described is the substrate this
|
||||
campaign starts from.
|
||||
|
||||
## What the campaign cannot acquire over SSH alone
|
||||
|
||||
These items require operator action because they involve session
|
||||
switches at the SDDM greeter or root-only state changes that
|
||||
warrant explicit ack:
|
||||
|
||||
1. **Install the missing measurement tools** (one-shot):
|
||||
```sh
|
||||
sudo pacman -S xorg-xrandr xorg-xev xorg-xinput xorg-xwininfo xorg-xkill sysprof
|
||||
```
|
||||
(Optionally also: `sudo pacman -S openbox` and `sudo pacman -S firefox` —
|
||||
see items 2 and 3.)
|
||||
|
||||
2. **Create a non-compositing WM session for the without-KWin cell.**
|
||||
Operator decision: openbox (smallest, recommended) vs i3 vs fluxbox.
|
||||
Steps once a WM is installed (e.g. openbox):
|
||||
- `sudo pacman -S openbox`
|
||||
- Verify `/usr/share/xsessions/openbox.desktop` exists (the
|
||||
openbox package ships one); SDDM picks it up at next greet.
|
||||
- **Operator switches at the SDDM greeter** (logout from current
|
||||
Plasma X11 → choose "Openbox" → log in). Cannot be SSH-driven.
|
||||
- Once in the openbox session, this campaign re-runs the live-
|
||||
session capture (`01_live_session.txt`-equivalent) under the
|
||||
no-compositor WM to confirm `kwin_x11` is gone from the process
|
||||
list and the Composite extension is *unused* for browser windows.
|
||||
|
||||
3. **Decide whether Firefox is in scope.** Two cells of the matrix
|
||||
reference Firefox; it is not currently installed. Either
|
||||
`sudo pacman -S firefox` (and the `firefox-vaapi` is already part
|
||||
of mesa's `va_gl` driver) or accept Firefox cells as N/A.
|
||||
|
||||
4. **Enable perf to attach to Xorg without sudo per-rep.** Either
|
||||
the per-run cell uses `sudo perf record`, or do once:
|
||||
```sh
|
||||
echo "kernel.perf_event_paranoid = 1" | sudo tee /etc/sysctl.d/90-perf.conf
|
||||
sudo sysctl --system
|
||||
```
|
||||
The latter is consistent with what the predecessor used for
|
||||
per-rep perf-on-`kwin_wayland` capture; recommend setting it
|
||||
the same way here.
|
||||
|
||||
5. **Optional: install the X-protocol `xtrace` from AUR**
|
||||
(`yay -S xtrace`). Only if Phase 1 wants protocol-level evidence
|
||||
parallel to `WAYLAND_DEBUG=1`; the matrix's primary metrics
|
||||
(effective_fps / drops / latency / CPU%) don't require it.
|
||||
|
||||
## What this inventory does NOT cover
|
||||
|
||||
These were called out as separate Phase 0 deliverables in
|
||||
`worklist.md` and are **not addressed** here:
|
||||
|
||||
- **Browser X11-overlay-path inventory** (worklist.md §
|
||||
"browser X11-overlay-path inventory"). The matrix's strongest
|
||||
hypothesis depends on whether each browser actually requests
|
||||
hardware-overlay presentation under X11. Source-grep + chrome
|
||||
trace inspection — separate work item.
|
||||
- **A1 in-session Wayland baseline** (worklist.md § "A1 baseline").
|
||||
Mandatory per the governing rule. The user is currently in the
|
||||
X11 session, so the A1 Wayland baseline cannot be acquired
|
||||
until the user either switches back to Wayland or starts a
|
||||
parallel Wayland-only test rep. Operator-tasked.
|
||||
- **State snapshot of ohm under current Plasma Wayland**
|
||||
(worklist.md item 1) — same constraint: requires the user to
|
||||
be in Wayland for the snapshot to be of Wayland. The current
|
||||
capture covers Plasma X11 instead, which is *adjacent* to but
|
||||
not a replacement for the Wayland snapshot.
|
||||
|
||||
## Verdict for Phase 1 readiness (deliverables 2 + 4 only)
|
||||
|
||||
**Phase 0 deliverables 2 and 4 are complete.** The X11 substrate
|
||||
exists, is healthy, and supports every protocol extension the matrix
|
||||
will need. The without-KWin matrix cells are blocked on a small
|
||||
operator-action list above (one `pacman -S`, one WM install + SDDM
|
||||
session switch). No technical surprises — nothing structurally
|
||||
prevents the matrix from running.
|
||||
Reference in New Issue
Block a user