From a409770df732222eff3820bb715b156328dca3fb Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Thu, 31 Jul 2025 18:55:19 +0200 Subject: [PATCH] kms: Correctly handle the source node not being initialized --- src/backend/kms/surface/mod.rs | 50 ++++++++++++++++------------------ 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 3f11316f..70fcf1df 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -304,32 +304,30 @@ impl Surface { state .common .send_dmabuf_feedback(&output_clone, &states, |source_node| { - Some( - surface - .feedback - .entry(source_node) - .or_insert_with(|| { - let render_formats = kms - .api - .single_renderer(&source_node) - .unwrap() - .dmabuf_formats(); - let target_formats = kms - .api - .single_renderer(&target_node) - .unwrap() - .dmabuf_formats(); - get_surface_dmabuf_feedback( - source_node, - target_node, - render_formats, - target_formats, - surface.primary_plane_formats.clone(), - surface.overlay_plane_formats.clone(), - ) - }) - .clone(), - ) + if let Some(cached_feedback) = surface.feedback.get(&source_node) { + Some(cached_feedback.clone()) + } else { + // If we have freed the node, because it didn't have any active buffers/surfaces, + // we might not be able to evaluate surface feedback yet. + let render_formats = + kms.api.single_renderer(&source_node).ok()?.dmabuf_formats(); + // In contrast we must have the target node, if we have an active surface + let target_formats = kms + .api + .single_renderer(&target_node) + .unwrap() + .dmabuf_formats(); + let feedback = get_surface_dmabuf_feedback( + source_node, + target_node, + render_formats, + target_formats, + surface.primary_plane_formats.clone(), + surface.overlay_plane_formats.clone(), + ); + surface.feedback.insert(source_node, feedback.clone()); + Some(feedback) + } }); } Event::Closed => {}