1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// SPDX-FileCopyrightText: (c) 2026 Joel Winarske
// SPDX-License-Identifier: MIT
//! Every decoration blended onto one plane.
//!
//! The middle tier: not enough overlays for a plane each, but one plane free
//! for a canvas. Every decoration is blended into that canvas and the canvas
//! is scanned out whole, so the cost is a canvas-sized blend over whatever
//! changed rather than a plane per window.
//!
//! What makes it affordable is [`compute_damage`](crate::compute_damage): a
//! frame where nothing moved or repainted blends nothing at all.
use crate::;
/// The property writes that arm the canvas plane.
///
/// The canvas is always **full-screen and unscaled** — it is the size of the
/// CRTC's mode by construction, and its contents are already positioned in
/// screen coordinates. There is no per-decoration geometry here, which is the
/// difference from the plane tier: the positioning happened during the blend.
///
/// `fb_id` is written verbatim, zero included, and `CRTC_ID` is always the
/// slot's CRTC: this function never disarms the canvas plane. A zero `fb_id`
/// with a CRTC set is a plane the kernel refuses, failing the whole commit,
/// so a caller with nothing to show passes a cleared canvas, as upstream
/// keeps its canvas plane always armed.