diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index 200b332f..4c00b1dd 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -358,6 +358,14 @@ impl State { ) { let backend = self.backend.kms(); + // recreate all graphics contexts + backend + .clear_used_devices() + .expect("This should never fail"); + if let Err(err) = backend.refresh_used_devices() { + warn!(?err, "Failed to re-create graphics contexts"); + } + // resume input if let Err(err) = backend.libinput.resume() { error!(?err, "Failed to resume libinput context."); @@ -591,6 +599,25 @@ impl KmsState { Ok(()) } + fn clear_used_devices(&mut self) -> Result<()> { + let primary_node = self.primary_node.read().unwrap(); + let empty_devices = HashSet::new(); + + for device in self.drm_devices.values_mut() { + if device.inner.egl.take().is_some() { + self.api.as_mut().remove_node(&device.inner.render_node); + device.inner.update_surface_nodes(&empty_devices, &[])?; + } + } + + // trigger re-evaluation... urgh + if let Some(primary_node) = primary_node.as_ref() { + let _ = self.api.single_renderer(primary_node); + } + + Ok(()) + } + pub fn refresh_used_devices(&mut self) -> Result<()> { let primary_node = self.primary_node.read().unwrap(); let mut used_devices = HashSet::new();