kms/device: Don't reconfigure existing outputs on connector_added

This commit is contained in:
Victoria Brekenfeld 2025-08-20 17:48:49 +02:00 committed by Victoria Brekenfeld
parent b28f92a6e1
commit 310cf212eb

View file

@ -762,11 +762,11 @@ impl InnerDevice {
Ok((output, false)) Ok((output, false))
} else { } else {
output let new_config = output
.user_data() .user_data()
.insert_if_missing(|| RefCell::new(OutputConfig::default())); .insert_if_missing(|| RefCell::new(OutputConfig::default()));
populate_modes(drm, &output, conn, position) populate_modes(drm, &output, conn, new_config, position)
.with_context(|| "Failed to enumerate connector modes")?; .with_context(|| "Failed to enumerate connector modes")?;
let has_surface = if let Some(crtc) = maybe_crtc { let has_surface = if let Some(crtc) = maybe_crtc {
@ -947,6 +947,7 @@ fn populate_modes(
drm: &mut DrmDevice, drm: &mut DrmDevice,
output: &Output, output: &Output,
conn: connector::Handle, conn: connector::Handle,
new_config: bool,
position: (u32, u32), position: (u32, u32),
) -> Result<()> { ) -> Result<()> {
let conn_info = drm.get_connector(conn, false)?; let conn_info = drm.get_connector(conn, false)?;
@ -960,10 +961,6 @@ fn populate_modes(
else { else {
anyhow::bail!("No mode found"); anyhow::bail!("No mode found");
}; };
let scale = conn_info
.size()
.map(|size| calculate_scale(conn_info.interface(), size, mode.size()))
.unwrap_or(1.0);
let refresh_rate = drm_helpers::calculate_refresh_rate(mode); let refresh_rate = drm_helpers::calculate_refresh_rate(mode);
let output_mode = OutputMode { let output_mode = OutputMode {
@ -971,15 +968,30 @@ fn populate_modes(
refresh: refresh_rate as i32, refresh: refresh_rate as i32,
}; };
let mut modes = Vec::new();
for mode in conn_info.modes() { for mode in conn_info.modes() {
let refresh_rate = drm_helpers::calculate_refresh_rate(*mode); let refresh_rate = drm_helpers::calculate_refresh_rate(*mode);
let mode = OutputMode { let mode = OutputMode {
size: (mode.size().0 as i32, mode.size().1 as i32).into(), size: (mode.size().0 as i32, mode.size().1 as i32).into(),
refresh: refresh_rate as i32, refresh: refresh_rate as i32,
}; };
modes.push(mode.clone());
output.add_mode(mode); output.add_mode(mode);
} }
for mode in output
.modes()
.into_iter()
.filter(|mode| !modes.contains(&mode))
{
output.delete_mode(mode);
}
output.set_preferred(output_mode); output.set_preferred(output_mode);
if new_config {
let scale = conn_info
.size()
.map(|size| calculate_scale(conn_info.interface(), size, mode.size()))
.unwrap_or(1.0);
let transform = drm_helpers::panel_orientation(drm, conn).unwrap_or(Transform::Normal); let transform = drm_helpers::panel_orientation(drm, conn).unwrap_or(Transform::Normal);
output.change_current_state( output.change_current_state(
Some(output_mode), Some(output_mode),
@ -1005,6 +1017,7 @@ fn populate_modes(
vrr: AdaptiveSync::Enabled, vrr: AdaptiveSync::Enabled,
..std::mem::take(&mut *output_config) ..std::mem::take(&mut *output_config)
}; };
}
Ok(()) Ok(())
} }