kms: Recreate graphics contexts on resume

This commit is contained in:
Victoria Brekenfeld 2026-04-27 16:48:53 +02:00 committed by Jacob Kauffmann
parent 9b89a1cc77
commit b5a1a6d317

View file

@ -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();