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))
} else {
output
let new_config = output
.user_data()
.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")?;
let has_surface = if let Some(crtc) = maybe_crtc {
@ -947,6 +947,7 @@ fn populate_modes(
drm: &mut DrmDevice,
output: &Output,
conn: connector::Handle,
new_config: bool,
position: (u32, u32),
) -> Result<()> {
let conn_info = drm.get_connector(conn, false)?;
@ -960,10 +961,6 @@ fn populate_modes(
else {
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 output_mode = OutputMode {
@ -971,15 +968,30 @@ fn populate_modes(
refresh: refresh_rate as i32,
};
let mut modes = Vec::new();
for mode in conn_info.modes() {
let refresh_rate = drm_helpers::calculate_refresh_rate(*mode);
let mode = OutputMode {
size: (mode.size().0 as i32, mode.size().1 as i32).into(),
refresh: refresh_rate as i32,
};
modes.push(mode.clone());
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);
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);
output.change_current_state(
Some(output_mode),
@ -1005,6 +1017,7 @@ fn populate_modes(
vrr: AdaptiveSync::Enabled,
..std::mem::take(&mut *output_config)
};
}
Ok(())
}