From 7373567af15d5a70517b8a9e9736da2185c079af Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Fri, 7 Jun 2024 15:44:25 +0200 Subject: [PATCH] kms: Fix output mirroring not working across gpus --- src/backend/kms/mod.rs | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index ee58a845..d012aa60 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -561,17 +561,6 @@ impl KmsState { // reconfigure existing for (crtc, surface) in device.surfaces.iter_mut() { let output_config = surface.output.config(); - let mirrored_output = if let OutputState::Mirroring(conn) = &output_config.enabled { - Some( - outputs - .iter() - .find(|output| &output.name() == conn) - .cloned() - .ok_or(anyhow::anyhow!("Unable to find mirroring output"))?, - ) - } else { - None - }; let drm = &mut device.drm; let conn = surface.connector; @@ -631,10 +620,6 @@ impl KmsState { surface.set_mode(*mode); // TODO: .context("Failed to apply new mode")?; } - - if mirrored_output != surface.output.mirroring() { - surface.set_mirroring(mirrored_output.clone()); - } } } @@ -654,12 +639,37 @@ impl KmsState { if output.mirroring().is_none() { w += output.config().mode_size().w; } + all_outputs.push(output); } } all_outputs.extend(outputs); } + // we need to handle mirroring, after all outputs have been enabled + for device in self.drm_devices.values_mut() { + for surface in device.surfaces.values_mut() { + let mirrored_output = + if let OutputState::Mirroring(conn) = &surface.output.config().enabled { + Some( + all_outputs + .iter() + .find(|output| &output.name() == conn) + .cloned() + .ok_or(anyhow::anyhow!("Unable to find mirroring output"))?, + ) + } else { + None + }; + + if !test_only { + if mirrored_output != surface.output.mirroring() { + surface.set_mirroring(mirrored_output.clone()); + } + } + } + } + Ok(all_outputs) } }