From 3d5de921cd79cd951cc09bf47b908163aa56b276 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Sat, 6 Jan 2024 09:14:48 +0400 Subject: Add render-drm-device debug config option --- src/backend/tty.rs | 45 +++++++++++++++++++++++++++++++++++++++------ src/config.rs | 5 +++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/backend/tty.rs b/src/backend/tty.rs index cabce8b7..ab7a7e84 100644 --- a/src/backend/tty.rs +++ b/src/backend/tty.rs @@ -190,12 +190,16 @@ impl Tty { let api = GbmGlesBackend::with_factory(Box::new(create_renderer)); let gpu_manager = GpuManager::new(api).unwrap(); - let primary_gpu_path = udev::primary_gpu(&seat_name).unwrap().unwrap(); - let primary_node = DrmNode::from_path(primary_gpu_path).unwrap(); - let primary_render_node = primary_node - .node_with_type(NodeType::Render) - .unwrap() - .unwrap(); + let (primary_node, primary_render_node) = primary_node_from_config(&config.borrow()) + .unwrap_or_else(|| { + let primary_gpu_path = udev::primary_gpu(&seat_name).unwrap().unwrap(); + let primary_node = DrmNode::from_path(primary_gpu_path).unwrap(); + let primary_render_node = primary_node + .node_with_type(NodeType::Render) + .unwrap() + .unwrap(); + (primary_node, primary_render_node) + }); let mut node_path = String::new(); if let Some(path) = primary_render_node.dev_path() { @@ -1224,6 +1228,35 @@ impl Tty { } } +fn primary_node_from_config(config: &Config) -> Option<(DrmNode, DrmNode)> { + let path = config.debug.render_drm_device.as_ref()?; + debug!("attempting to use render node from config: {path:?}"); + + match DrmNode::from_path(path) { + Ok(node) => { + if node.ty() == NodeType::Render { + match node.node_with_type(NodeType::Primary) { + Some(Ok(primary_node)) => { + return Some((primary_node, node)); + } + Some(Err(err)) => { + warn!("error opening primary node for render node {path:?}: {err:?}"); + } + None => { + warn!("error opening primary node for render node {path:?}"); + } + } + } else { + warn!("DRM node {path:?} is not a render node"); + } + } + Err(err) => { + warn!("error opening {path:?} as DRM node: {err:?}"); + } + } + None +} + fn surface_dmabuf_feedback( compositor: &GbmDrmCompositor, primary_formats: HashSet, diff --git a/src/config.rs b/src/config.rs index 8127d9bb..b6397a34 100644 --- a/src/config.rs +++ b/src/config.rs @@ -381,6 +381,8 @@ pub struct DebugConfig { pub enable_overlay_planes: bool, #[knuffel(child)] pub disable_cursor_plane: bool, + #[knuffel(child, unwrap(argument))] + pub render_drm_device: Option, } impl Default for DebugConfig { @@ -392,6 +394,7 @@ impl Default for DebugConfig { enable_color_transformations_capability: false, enable_overlay_planes: false, disable_cursor_plane: false, + render_drm_device: None, } } } @@ -655,6 +658,7 @@ mod tests { debug { animation-slowdown 2.0 + render-drm-device "/dev/dri/renderD129" } "#, Config { @@ -791,6 +795,7 @@ mod tests { ]), debug: DebugConfig { animation_slowdown: 2., + render_drm_device: Some(PathBuf::from("/dev/dri/renderD129")), ..Default::default() }, }, -- cgit