2. 理解Wayland架构与协议

任务说明

本案例要求通过阅读Wayland官方文档与参考实现源码,梳理Wayland的客户端-服务端架构,并理解核心协议对象(wl_display、wl_compositor、wl_surface等)以及请求(request)/事件(event)的通信流程。最终交付物为一份架构梳理文档与一张协议交互时序图,不要求编写业务代码。

环境准备

  • Linux主机(推荐Ubuntu 22.04+),已安装weston(参考合成器)与wayland-utils(提供wayland-info工具)。
  • 安装命令:sudo apt install weston wayland-utils
  • 源码阅读路径:/usr/include/wayland-client-core.h、/usr/include/wayland-server-core.h(协议头文件);在线协议定义见https://gitlab.freedesktop.org/wayland/wayland/-/blob/main/protocol/wayland.xml

架构梳理要点

Wayland采用客户端-服务端模型,服务端为合成器(Compositor,如Weston),客户端为GUI应用。通信通过Unix域套接字进行,协议定义在wayland.xml中。核心对象关系如下:

  • wl_display:连接入口,管理客户端与服务端之间的套接字通信,负责事件循环与消息分发。
  • wl_registry:客户端通过它向服务端请求全局对象列表,绑定wl_compositor、wl_shm等全局接口。
  • wl_compositor:核心图形接口,客户端通过其create_surface请求创建wl_surface。
  • wl_surface:代表一块可显示的画布,客户端将内容提交到其上,由合成器合成输出。
  • wl_shm:共享内存机制,用于在客户端与服务端之间传递像素缓冲区。

请求(Request)由客户端发出,服务端处理;事件(Event)由服务端发出,客户端监听。例如客户端调用wl_registry_bind是请求,服务端返回全局对象是事件。整个通信为异步消息传递,客户端通过wl_display_dispatch或wl_display_roundtrip处理事件。

协议交互流程(SVG时序图)

客户端应用 libwayland 合成器(Weston) wl_display_connect() wl_display_get_registry() wl_registry_bind(compositor) wl_compositor_create_surface() wl_surface_attach(buffer) wl_surface_commit() frame事件(帧回调) wl_display_roundtrip() sync事件(同步确认) 请求(Request) 事件(Event)

验证方法

运行weston启动合成器,在另一个终端执行wayland-info。若输出中包含wl_compositor、wl_shm等全局接口列表,说明客户端与服务端通信链路正常。随后可运行weston-simple-shm示例程序(若已安装),观察窗口正常显示即验证了wl_surface创建、缓冲区提交与合成显示的全流程。

判定标准:wayland-info能列出至少5个全局接口;weston-simple-shm能弹出并正常渲染一个色块窗口,且关闭时无错误输出。