feat(mirada-compositor): backend DRM — fase 1, bring-up

mirada-compositor gana un segundo backend para correr sobre una TTY
pelada, sin sesión gráfica anfitriona. main() elige: --winit / --drm,
o automático (con DISPLAY/WAYLAND_DISPLAY → winit anidado; sin ellos →
DRM). run() pasa a llamarse run_winit().

drm_backend.rs — fase 1 (bring-up), construida para verificarse en
hardware real por etapas:
- abre la sesión con libseat (acceso a DRM/input sin root)
- localiza la GPU primaria (udev::primary_gpu)
- abre el dispositivo DRM por la sesión
- enumera los conectores y sus modos

Todo instrumentado con logs para diagnosticar sin el hardware delante.
La composición (GBM + EGL + GlesRenderer + DrmCompositor + libinput +
bucle calloop) es la fase 2. El backend winit queda intacto.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 01:44:40 +00:00
parent f9c4bf594e
commit 6c3a86fbec
2 changed files with 147 additions and 2 deletions
+27 -2
View File
@@ -65,6 +65,8 @@ use mirada_brain::{
};
use mirada_link::BodyLink;
mod drm_backend;
// ---------------------------------------------------------------------
// Estado
// ---------------------------------------------------------------------
@@ -511,7 +513,8 @@ fn load_user_rules() -> Rules {
}
}
fn run() -> Result<(), Box<dyn std::error::Error>> {
/// El backend `winit`: corre anidado dentro de una sesión gráfica.
fn run_winit() -> Result<(), Box<dyn std::error::Error>> {
let mut display: Display<App> = Display::new()?;
let dh = display.handle();
@@ -785,7 +788,29 @@ fn run() -> Result<(), Box<dyn std::error::Error>> {
}
fn main() {
if let Err(e) = run() {
let arg = std::env::args().nth(1);
let result = match arg.as_deref() {
Some("--drm") => drm_backend::run(),
Some("--winit") => run_winit(),
Some(other) => {
eprintln!("mirada-compositor: opción desconocida «{other}» — usa --drm o --winit");
std::process::exit(2);
}
None => {
// Auto: con sesión gráfica anfitriona → winit (anidado);
// sin ella (una TTY pelada) → backend DRM.
let nested = std::env::var_os("WAYLAND_DISPLAY").is_some()
|| std::env::var_os("DISPLAY").is_some();
if nested {
println!("mirada-compositor · sesión gráfica detectada → backend winit.");
run_winit()
} else {
println!("mirada-compositor · sin sesión gráfica → backend DRM.");
drm_backend::run()
}
}
};
if let Err(e) = result {
eprintln!("mirada-compositor · error: {e}");
std::process::exit(1);
}