kms: fixup device-usage logic

This commit is contained in:
Victoria Brekenfeld 2024-06-18 18:19:39 +02:00 committed by Victoria Brekenfeld
parent 492e16bfa5
commit bfbf20d61d

View file

@ -381,7 +381,7 @@ impl KmsState {
pub fn refresh_used_devices(&mut self) -> Result<()> { pub fn refresh_used_devices(&mut self) -> Result<()> {
let mut used_devices = HashSet::new(); let mut used_devices = HashSet::new();
for (node, device) in self.drm_devices.iter_mut() { for device in self.drm_devices.values_mut() {
if device.in_use(self.primary_node.as_ref()) { if device.in_use(self.primary_node.as_ref()) {
if device.egl.is_none() { if device.egl.is_none() {
let egl = init_egl(&device.gbm).context("Failed to create EGL context")?; let egl = init_egl(&device.gbm).context("Failed to create EGL context")?;
@ -408,23 +408,32 @@ impl KmsState {
); );
device.egl = Some(egl); device.egl = Some(egl);
} }
used_devices.insert(*node); used_devices.insert(device.render_node);
} else { } else {
if device.egl.is_none() { if device.egl.is_some() {
let _ = device.egl.take(); let _ = device.egl.take();
self.api.as_mut().remove_node(&device.render_node); self.api.as_mut().remove_node(&device.render_node);
} }
} }
} }
// trigger re-evaluation... urgh
if let Some(primary_node) = self.primary_node.as_ref() {
let _ = self.api.single_renderer(primary_node);
}
// I hate this. I want partial borrows of hashmap values // I hate this. I want partial borrows of hashmap values
let all_devices = self.drm_devices.keys().copied().collect::<Vec<_>>(); let all_devices = self
.drm_devices
.values()
.map(|d| d.render_node)
.collect::<Vec<_>>();
for node in all_devices { for node in all_devices {
let (mut device, mut others) = self let (mut device, mut others) = self
.drm_devices .drm_devices
.iter_mut() .values_mut()
.partition::<Vec<_>, _>(|(n, _)| **n == node); .partition::<Vec<_>, _>(|d| d.render_node == node);
let device = &mut device[0].1; let device = &mut device[0];
for surface in device.surfaces.values_mut() { for surface in device.surfaces.values_mut() {
let known_nodes = surface.known_nodes().clone(); let known_nodes = surface.known_nodes().clone();
@ -442,8 +451,7 @@ impl KmsState {
} else { } else {
let device = others let device = others
.iter_mut() .iter_mut()
.find(|(n, _)| *n == new_device) .find(|d| d.render_node == *new_device)
.map(|(_, d)| d)
.unwrap(); .unwrap();
( (
device.render_node, device.render_node,