握手与注册
对端的第一条消息必须是 HELLO;broker 回复 WELCOME 或致命 ERROR。
HELLO:
u32 roleu16 reserved (zero)u16 min_minoru16 max_minoru64 featuresstring namestring versionWELCOME:
u16 selected_minoru16 reservedu64 featuresstring server_namestring server_version收到 WELCOME 之后,显示端发送 REGISTER_OUTPUT,渲染端发送 REGISTER_PRODUCER;注册被接受之前,不允许任何角色专属流量。
REGISTER_OUTPUT:
string stable_idstring nameu32 physical_widthu32 physical_heightu32 logical_widthu32 logical_heighti32 logical_xi32 logical_yu32 scale_120u32 refresh_mhzu32 transformu32 drm_render_majoru32 drm_render_minoru64 input_capslogical_x 与 logical_y 是虚拟桌面中的逻辑坐标,采用小端有符号 32 位整数,
单位为逻辑桌面像素,允许负数。scale_120 表示逻辑缩放系数乘以 120;
transform 使用 wl_output.transform 的数值 0–7。
broker 回复 OUTPUT_ACCEPTED { u64 output_id }。显示端随后发送 CONSUMER_CAPS:
u64 sync_capsu64 color_capsu32 max_widthu32 max_heightbytes16 device_uuidbytes16 driver_uuidarray<format_cap> formats格式能力为:
u32 fourccu32 plane_countu64 modifier至多允许 256 个格式能力。
显示端可以通过 UPDATE_OUTPUT 在会话中更新几何信息(物理/逻辑尺寸、逻辑坐标、
scale_120、刷新率、变换),broker 据此决定是否重新协商 OUTPUT_CONFIG。
UPDATE_OUTPUT 的负载顺序为:
u32 physical_widthu32 physical_heightu32 logical_widthu32 logical_heighti32 logical_xi32 logical_yu32 scale_120u32 refresh_mhzu32 transformbroker 按 stable_id 管理输出。首个显示消费者注册时触发 on_output_added,
几何字段发生变化时触发 on_output_updated,最后一个显示消费者断开时触发
on_output_removed。这些回调运行在 broker 派发线程;输出结构体和字符串仅在
回调期间有效,宿主跨线程使用前必须复制。
渲染端完成公共握手后发送 REGISTER_PRODUCER,向 broker 广播自己的稳定输出标识、渲染器类型、DRM 渲染节点、设备与驱动 UUID,以及支持的 (fourcc, plane_count, modifier) 元组。
PRODUCER_ACCEPTED 之后,broker 向生产者发送带消费者 GPU 身份的
OUTPUT_CONFIG:
u32 physical_widthu32 physical_heightu32 refresh_mhzu32 transformu32 fourccu32 plane_countu64 modifieru32 target_drm_render_majoru32 target_drm_render_minoru32 target_gpu_flagsbytes16 target_device_uuidbytes16 target_driver_uuidrender node 标识始终有效;target_gpu_flags 中的
MD_TARGET_GPU_DEVICE_UUID_VALID / MD_TARGET_GPU_DRIVER_UUID_VALID 表示对应
UUID 有效,未置位时对应字段必须为零。生产者应先按此身份创建 Vulkan/EGL/VA-API
资源,再发送 PRODUCER_GPU_BOUND(render node、device UUID、driver UUID)。
broker 确认身份匹配后才接受 OFFER_BUFFERS 与帧,避免跨 GPU 路由 DMA-BUF。
新的 OUTPUT_CONFIG 会使先前的绑定失效,生产者必须为新配置重新确认 GPU。
broker 为同一稳定输出标识建立路由,取消费者与生产者格式能力的交集进行协商:
- fourcc 与 modifier 必须完全匹配;
- plane_count 取双方都支持的值;
- 消费者上报的
max_width/max_height约束生产者的输出尺寸。
协商成功后,broker 才会进入 GPU 绑定和缓冲池绑定阶段。