From 8e1d4de0dccdf14cb60d505cd0864a40e56a33d8 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Wed, 14 Feb 2024 21:14:01 +0400 Subject: tty: Filter out interlaced modes They don't seem to work. wlroots also filters them: https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/feb54979c0940655e36119c63e18a9ee72cc03b0/backend/drm/drm.c#L1461 --- src/backend/tty.rs | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/backend/tty.rs b/src/backend/tty.rs index d9e2ba43..d9c1c7f1 100644 --- a/src/backend/tty.rs +++ b/src/backend/tty.rs @@ -1252,34 +1252,47 @@ impl Tty { }) .unwrap_or_else(|| ("Unknown".into(), "Unknown".into())); + let surface = device.surfaces.get(&crtc); + let current_crtc_mode = surface.map(|surface| surface.compositor.pending_mode()); + let mut current_mode = None; + let modes = connector .modes() .iter() - .map(|m| niri_ipc::Mode { - width: m.size().0, - height: m.size().1, - refresh_rate: Mode::from(*m).refresh as u32, + .filter(|m| !m.flags().contains(ModeFlags::INTERLACE)) + .enumerate() + .map(|(idx, m)| { + if Some(*m) == current_crtc_mode { + current_mode = Some(idx); + } + + niri_ipc::Mode { + width: m.size().0, + height: m.size().1, + refresh_rate: Mode::from(*m).refresh as u32, + } }) .collect(); - let mut output = niri_ipc::Output { + if let Some(crtc_mode) = current_crtc_mode { + if current_mode.is_none() { + if crtc_mode.flags().contains(ModeFlags::INTERLACE) { + warn!("connector mode list missing current mode (interlaced)"); + } else { + error!("connector mode list missing current mode"); + } + } + } + + let output = niri_ipc::Output { name: connector_name.clone(), make, model, physical_size, modes, - current_mode: None, + current_mode, }; - if let Some(surface) = device.surfaces.get(&crtc) { - let current = surface.compositor.pending_mode(); - if let Some(current) = connector.modes().iter().position(|m| *m == current) { - output.current_mode = Some(current); - } else { - error!("connector mode list missing current mode"); - } - } - ipc_outputs.insert(connector_name, output); } } @@ -1662,6 +1675,11 @@ fn pick_mode( continue; } + // Interlaced modes don't appear to work. + if m.flags().contains(ModeFlags::INTERLACE) { + continue; + } + if let Some(refresh) = refresh { // If refresh is set, only pick modes with matching refresh. let wl_mode = Mode::from(*m); -- cgit