Skip to content

Commit a409770

Browse files
committed
kms: Correctly handle the source node not being initialized
1 parent 86493b7 commit a409770

File tree

1 file changed

+24
-26
lines changed

1 file changed

+24
-26
lines changed

src/backend/kms/surface/mod.rs

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -304,32 +304,30 @@ impl Surface {
304304
state
305305
.common
306306
.send_dmabuf_feedback(&output_clone, &states, |source_node| {
307-
Some(
308-
surface
309-
.feedback
310-
.entry(source_node)
311-
.or_insert_with(|| {
312-
let render_formats = kms
313-
.api
314-
.single_renderer(&source_node)
315-
.unwrap()
316-
.dmabuf_formats();
317-
let target_formats = kms
318-
.api
319-
.single_renderer(&target_node)
320-
.unwrap()
321-
.dmabuf_formats();
322-
get_surface_dmabuf_feedback(
323-
source_node,
324-
target_node,
325-
render_formats,
326-
target_formats,
327-
surface.primary_plane_formats.clone(),
328-
surface.overlay_plane_formats.clone(),
329-
)
330-
})
331-
.clone(),
332-
)
307+
if let Some(cached_feedback) = surface.feedback.get(&source_node) {
308+
Some(cached_feedback.clone())
309+
} else {
310+
// If we have freed the node, because it didn't have any active buffers/surfaces,
311+
// we might not be able to evaluate surface feedback yet.
312+
let render_formats =
313+
kms.api.single_renderer(&source_node).ok()?.dmabuf_formats();
314+
// In contrast we must have the target node, if we have an active surface
315+
let target_formats = kms
316+
.api
317+
.single_renderer(&target_node)
318+
.unwrap()
319+
.dmabuf_formats();
320+
let feedback = get_surface_dmabuf_feedback(
321+
source_node,
322+
target_node,
323+
render_formats,
324+
target_formats,
325+
surface.primary_plane_formats.clone(),
326+
surface.overlay_plane_formats.clone(),
327+
);
328+
surface.feedback.insert(source_node, feedback.clone());
329+
Some(feedback)
330+
}
333331
});
334332
}
335333
Event::Closed => {}

0 commit comments

Comments
 (0)