Skip to main content

render_node_tick

Function render_node_tick 

Source
pub(crate) fn render_node_tick(
    state: &mut AppState,
    node: &mut OutputNode,
    trigger: TickTrigger,
    drives_screen: bool,
) -> bool
Expand description

One display’s frame: decide whether this tick produces one, reserve a pool buffer, take the host’s frame or compose the output’s own, publish it to the encode thread, and answer the clients’ frame callbacks and presentation feedback. True where the encoder still holds every pool buffer and the tick is skipped.

The output’s own frame is its element list (composition_elements), rendered by the GL renderer into a zero-copy target or read back, or by pixman straight into a pool buffer. Where that list is one opaque surface over exactly the output and nothing else (scanout_candidate), the frame is the client’s buffer and nothing is drawn: a zero-copy session is handed the dmabuf itself and the pixman path’s encode thread reads the shm buffer’s rows where they lie, each held for the client until the encode is done (WlCapture::scanout_inflight); the damage trackers record the frame either way, so a later composite repaints what changed meanwhile. Wayland otherwise costs a render pass X11 never pays, since X11 clients draw into the one framebuffer the capture reads, and this is the one case where the compositor can skip its own.