pub(crate) fn render_node_tick(
state: &mut AppState,
node: &mut OutputNode,
trigger: TickTrigger,
drives_screen: bool,
) -> boolExpand 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.