@@ -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