50 lines
1.9 KiB
Zig
50 lines
1.9 KiB
Zig
//! The scanout wire protocol — what the compositor says to a native scanout driver (e.g.
|
|
//! virtio-gpu) over its well-known `.scanout` endpoint to put a composited frame on screen.
|
|
//! The driver owns the panel and the shared scanout surface it handed the compositor (via the
|
|
//! display service's `attach_scanout`); the compositor composites into that surface, then asks
|
|
//! the driver to present a damaged rectangle. Tiny by design — one present request. Separate
|
|
//! from the display protocol because the directions differ: clients call the compositor over
|
|
//! `.display`; the compositor calls the driver over `.scanout`. See docs/display-v2.md.
|
|
|
|
const std = @import("std");
|
|
|
|
pub const Operation = enum(u32) {
|
|
/// present(x, y, width, height): put the given rectangle of the shared scanout surface on
|
|
/// the panel (on virtio-gpu: transfer-to-host of the region, then a fenced resource flush).
|
|
present = 0,
|
|
/// get_modes() -> ModesReply: the display modes this scanout can switch to (V5).
|
|
get_modes = 1,
|
|
/// set_mode(width, height): change the scanout resolution — the shared surface is sized to
|
|
/// the largest mode, so this just re-points the scanout rectangle; the surface is unchanged.
|
|
set_mode = 2,
|
|
};
|
|
|
|
pub const Request = extern struct {
|
|
operation: u32,
|
|
x: u32 = 0,
|
|
y: u32 = 0,
|
|
width: u32 = 0,
|
|
height: u32 = 0,
|
|
};
|
|
|
|
pub const Reply = extern struct {
|
|
status: i32, // 0 on success, negative on failure
|
|
reserved: u32 = 0,
|
|
};
|
|
|
|
/// One offered display mode.
|
|
pub const Mode = extern struct { width: u32, height: u32 };
|
|
pub const max_modes = 4;
|
|
|
|
/// The reply to `get_modes`: a small fixed list of modes.
|
|
pub const ModesReply = extern struct {
|
|
status: i32,
|
|
count: u32,
|
|
modes: [max_modes]Mode,
|
|
};
|
|
|
|
pub const message_maximum: usize = 64;
|
|
pub const request_size: usize = @sizeOf(Request);
|
|
pub const reply_size: usize = @sizeOf(Reply);
|
|
pub const modes_reply_size: usize = @sizeOf(ModesReply);
|