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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user