wayland学习

最近正在研究 Wayland 的实现,为此准备写一个关于 Wayland 实现分析的一系列文章,目的主要有两个:一是加强自己的理解;二是供同好观摩指教讨论。

下面是一个写作提纲(也可以看作是一个写作计划):
1. Wayland 简介
主要介绍 Wayland 是什么、Wayland 架构、Wayland 与 X 的比较等。
2. 知识背景
主要介绍 Linux 下的图形栈(要完全理解 Wayland,需要深刻理解 Linux 图形栈);
另外也会介绍在 Wayland 中频繁使用的 C 语言技术。
3. Wayland 源码解析
1) 代码框架
分析 Wayland 代码的目录结构,各个主要模块的功能。
2) 协议分析
由于 Wayland 首先是一个协议(compositor 与 clients 通信),所以这里分析如何解析协议(XML文件),如何用 C 语言实现这些协议。
3) Wayland 中工具函数(工具类)的实现
分析Wayland 中使用的主要工具函数(工具类),如 wl_list、wl_array、wl_map、wl_connection等。
4) Server 端的实现(也就是 Compositor 的实现)
分析 Server 端的主要实现,包含两部分:wayland 库的实现和 Weston 的实现(Wayland Compositor 的参考实现)。
5) Client 端的实现
重点分析 Wayland client 库。
6) Egl 实现
主要分析 Egl surface 与 wayland buffer对象之间的转换。
会对 egl 与 OPEN GLES 作一些简单介绍。
7) 执行流程
分析 Compositor 与 Client 的执行流程。
8) 通信机制
分析 Composirot 与 Client 之间如何进行通信。
9) 输入事件处理流程
分析输入事件的处理流程,如键盘事件、鼠标事件、Touch 事件等。
10) 图形输出处理流程
包括两部分:通过共享内存绘制图形与通过 DRM 绘制图形
11) DND (Drag & drop)处理
分析 Wayland 中的 DND 处理。

获取、编译 Wayland 及其依赖库可参考 Wayland 官方网站的 Build 指南:http://wayland.freedesktop.org/building.html

Wayland 实现的代码组成可以分成以下四部分:

  1. Wayland 库

Wayland 中最核心的部分,Wayland 协议的大部分实现位于这里。

1) 工具程序(wayland-scanner)

分析 Wayland 协议文件,并生成相应的头文件及代码文件。

源码文件列表:

wayland/src/scanner.c

2) 工具库

供其他库、程序使用的工具函数、接口、结构等。

源码文件列表:

wayland/src/connection.c

wayland/src/wayland-util.c

wayland/src/wayland-util.h

wayland/src/wayland-os.c

wayland/src/wayland-os.h

wayland/src/wayland-private.h

3) Client 库

供 Client 使用的桩接口(stub interfaces)及 event listener 结构定义。

源码文件列表:

wayland/src/wayland-protocol.c

wayland/src/wayland-client.c

4) Server 库

Wayland 核心协议的实现。

源码文件列表:

wayland/src/wayland-protocol.c

wayland/src/wayland-server.c

wayland/src/wayland-shm.c

wayland/src/data-device.c

wayland/src/event-loop.c

5) Cursor 库

Cursor 相关功能的实现。不作为重点分析部分。

源码文件列表:

wayland/cursor/wayland-cursor.h

wayland/cursor/wayland-cursor.c

wayland/cursor/os-compatibility.c

wayland/cursor/os-compatibility.h

wayland/cursor/xcursor.c

wayland/cursor/xcursor.h

6) 公用头文件

wayland/src/wayland-util.h

wayland/src/wayland-server-protocol.h

wayland/src/wayland-server.h

wayland/src/wayland-client-protocol.h

wayland/src/wayland-client.h

wayland/src/wayland-version.h

wayland/src/wayland-egl.h

  1. EGL 相关实现

EGL surface 与 Waylandsurface 之间的互相转换,代码位于 mesa 中。

1) libEGL 中的代码

mesa/src/egl/drivers/dri2/platform_wayland.c

mesa/src/egl/wayland/wayland-drm/wayland-drm.c

mesa/src/egl/wayland/wayland-drm/wayland-drm-protocol.c

mesa/src/egl/wayland/wayland-drm/wayland-drm-client-protocol.h

mesa/src/egl/wayland/wayland-drm/wayland-drm-server-protocol.h

2) libwayland-egl

mesa/src/egl/wayland/wayland-egl/wayland-egl-priv.h

mesa/src/egl/wayland/wayland-egl/wayland-egl.c

  1. Weston (WaylandCompositor 的参考实现)

1) Compositor

合成器的一个参考实现,代码较多,选取几个关键部分进行分析,如事件处理、图形输出等。

重点分析的源码列表:

weston/src/compositor.c

weston/src/compositor-drm.c

weston/src/evdev.c

2) Shell (作为Compositor的插件实现)

可以认为是一个窗口管理器或桌面管理插件。

重点分析的源码列表:

weston/src/shell.c

3) Clients

客户端程序,如 Terminal 等。不作为重点分析,仅在分析交互流程时,选取关键代码段进行分析。

  1. 协议

一系列的 XML 文件,定义 Wayland的核心协议及扩展协议。

核心协议:

wayland/protocol/wayland.xml

mesa/src/egl/wayland/wayland-drm/wayland-drm.xml(很重要,可以认为是核心协议)

扩展协议(不作为重点分析对象):

weston/protocol/desktop-shell.xml

weston/protocol/tablet-shell.xml

另外还有一些单元测试代码,位于 wayland 和weston 的tests 目录,主要用来测试通用的 utility 函数,查看这些代码对理解 utility 函数的用途是很有帮助的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值