smithay/backend/renderer/element/utils/
wayland.rs

1use crate::{
2    backend::renderer::element::{Id, RenderElementPresentationState, RenderElementStates, RenderingReason},
3    wayland::dmabuf::DmabufFeedback,
4};
5
6/// Select a [`DmabufFeedback`] based on the [`RenderElementPresentationState`] for a single [`Element`](crate::backend::renderer::element::Element)
7///
8/// Returns the provided scan-out feedback if the element has been successfully assigned for scan-out or
9/// was selected for scan-out but failed the scan-out test.
10/// Otherwise the provided default feedback is returned.
11pub fn select_dmabuf_feedback<'a>(
12    element: impl Into<Id>,
13    render_element_states: &RenderElementStates,
14    default_feedback: &'a DmabufFeedback,
15    scanout_feedback: &'a DmabufFeedback,
16) -> &'a DmabufFeedback {
17    let id = element.into();
18
19    let Some(state) = render_element_states.element_render_state(id) else {
20        return default_feedback;
21    };
22
23    match state.presentation_state {
24        RenderElementPresentationState::Rendering { reason } => match reason {
25            Some(RenderingReason::FormatUnsupported) | Some(RenderingReason::ScanoutFailed) => {
26                scanout_feedback
27            }
28            None => default_feedback,
29        },
30        RenderElementPresentationState::ZeroCopy => scanout_feedback,
31        RenderElementPresentationState::Skipped => default_feedback,
32    }
33}