summaryrefslogtreecommitdiffhomepage
path: root/packages/kernel/src/spike/rml_compositing_spike.cpp
AgeCommit message (Collapse)Author
2026-06-15spike(kernel): --demo perf scenario — 4 corner windows + FPS HUD/logAdam Malczewski
New `--demo` mode for a real-seat perf load test (the Phase-0 perf measurement): - Four windows, one per screen corner, angled INWARD (perspective + per-corner rotateX/rotateY) — a curated layout, distinct from --run's single centered window. - Clients: 3x foot + 1x vivaldi (Chromium on Wayland via --ozone-platform=wayland; probes vivaldi-stable/vivaldi/vivaldi-snapshot, loud warning if absent). Replaces firefox, which rendered as an empty/clear box on this compositor. Each client claimed into the next free corner slot at map time (browser steered to its designated corner via app_id match; vivaldi/chromium/firefox all recognized); per-slot bookkeeping freed on unmap/destroy. - Live FPS HUD (RmlUi text) in the corner; per-5s min/max FPS written to $UNBOX_SPIKE_FPS_LOG (default $HOME/rml-spike-fps.log), fflush+fsync per line. - Demo dead-man defaults to 120s (P resets; Esc/Ctrl+Alt+Backspace quit) so an HD video can play while watching FPS. All existing behavior intact (live-update loop, input routing through the transform, cursor, escape hatch, persistent log). --verify ALL PASS, kernel suite green, spike builds clean (build_by_default:false, out of the shipped binary). Headless smoke: 3 foot + vivaldi map into 4 distinct corners; 5s min/max FPS lines written.
2026-06-14spike(kernel): RML compositing live + interactive on the real DRM seatAdam Malczewski
Iterated the Phase-0 spike from "self-verified headless" to "works on the CF-AX3": a live, 3D-tilted client window you can type into, with a visible cursor and pointer/touch routed through the transform. Real-seat confirmed. Safety / escape (a black-screen lockout had forced reboots): - session escape hatch on --run (mirrors src/input.cpp): Esc + Ctrl+Alt+Backspace quit, Ctrl+Alt+F1..F12 VT-switch, SIGINT/SIGTERM clean-terminate. - 15s DEAD-MAN auto-exit, reset by pressing P (also a keyboard-liveness probe); UNBOX_SPIKE_TIMEOUT overrides. Guarantees the spike can never lock the machine. - persistent crash-survivable log at $HOME/rml-spike.log (UNBOX_SPIKE_LOG), fflush+fsync per line (was on tmpfs /tmp -> lost on reboot); loud diagnostics for backend/modeset/client-connect/map/import. Black screen / no window fixes: - present path works on real DRM+gles2 (blue bg + marker confirmed on panel); dark-blue clear + marker rect make "empty vs not-presenting" diagnosable. - xdg wired from new_toplevel/new_popup (was new_surface -> no role -> no configure -> client never mapped); foot now maps as a live surface element. - WAYLAND_DISPLAY exported so spawned clients connect. Interactivity: - keyboard focus enter + key forward to the focused client (was never sent without a pre-existing keyboard device); typing reaches foot. - visible wlr-plane cursor (xcursor theme load + set; never drawn into RmlUi). - pointer + touch hit-tested via RmlUi pick through the 3D transform, mapped to surface-local, forwarded via wl_seat (criterion-3 pointer confirmed at edges). Live update loop (was frozen on frame #1): - send wlr_surface_send_frame_done to all mapped surfaces+subsurfaces each frame (client lives as an imported texture, not a wlr_scene node). - re-import the surface's CURRENT buffer per commit, gated on the surface commit SEQUENCE not the buffer pointer (foot recycles a buffer pool -> same pointer, new contents); double-buffered wlr_buffer lock/release so the client is never starved. reimports now track commits ~1:1 (was capped 3:1). --verify ALL PASS (criteria 1-7), kernel suite green, build + build-asan clean. Spike target stays build_by_default:false, out of the shipped binary.
2026-06-14spike(kernel): RML compositing Phase-0 — GO (self-verified on Haswell+crocus)Adam Malczewski
Throwaway, self-contained spike target `packages/kernel/rml-compositing-spike` (build_by_default:false, not in kernel_dep) proving RMLUi can composite live client windows. `--verify` reads back the framebuffer headlessly and asserts all 7 criteria; `--run` brings up a real/nested-seat compositor for the user's real-seat run. All 7 = ALL PASS on this dev box (an Intel Haswell-ULT iGPU on Mesa crocus — the CF-AX3's GPU class): 1 zero-copy live dmabuf→EGLImage→GL texture sampled by RmlUi, cached (0 reimport when buffer unchanged); 2 RCSS perspective+rotateY on the live pixels (verified by readback); 3 screen→surface-local inversion through the 3D transform, round-trip 0.000000 px (pure core doctested in the kernel suite); 4 surface tree (toplevel+subsurface+popup) composited correctly → recommend PER-SUBSURFACE elements (RTT escape-hatch for tree-spanning effects in Phase 1); 5 wallpaper (layer surface) via the identical import path; 6 idle dirty-gate = 0 renders over 120 idle turns, exactly 1 render per commit; 7 present path FBO→dmabuf swapchain→wlr_scene_buffer with an EGL fence (no glFinish). Crocus gotchas documented (linear modifiers, AR24 swizzle, cross-context fence, FBO Y-flip, re-import only on new buffer). Real-seat GO/NO-GO (3D/touch feel, frame-time @4 windows+video, idle power) is the user's call — runbook in reports/rml-compositing-spike.md §5. Also: GLOSSARY rows for "RML compositing" + "surface element" (user-confirmed); tasks.md slice 13 updated to spike-complete/GO pending real-seat. kernel suite green; full build clean; spike --verify ALL PASS.