walyand学习笔记(五) weston的输入输出
对wayland的学习不是一蹴而就的,需要日积月累的不断深入了解。千里之行,始于足下。日拱一卒是我坚持的做法。
今天在重温weston的文章时,发现一个之前没太留意的东西。那就是weston的主循环是用epoll机制在wait一系列的fd,这里面包括各种输入设备的fd, udev monitor的fd, domain socket fd, listener fd, 以及timer fd和signal fd.
是的,timer和signal,以及eventfd也可以被抽象成fd, 然后被epoll监听. 它们在linux 2.6.25版本后都加入到了内核的支持中。
timerfd: 可以实现定时器的功能 ,将定时器抽象成文件描述符,当定时器到期时,可以对其read, 这样也可以放到监听队列的主循环中。
signalfd: 传统的处理信号的方式是注册信号处理函数,由于信号是异步的,可能需要考虑并发访问,可重入的问题。signalfd 可以将信号抽象成文件描述符,当有信号发生时,可以被epoll监听到,并可对其进行read.
eventfd: 实现了线程之间事件通知的方式。
输入部分依赖的库有:
libinput: 依赖mtdev, libudev, libevdev【这部分相对比较独立,是一个输入设备处理的框架,也可以被其它图形系统使用,类似android的eventHub, 此外它还有pointer acceleration,touchpad support及gesture recognition等功能】
libxkbcommon: 主要用于键盘处理
listener fd和udev monitor 暂时还不清楚,后面再补充吧。
下面讲一下weston的输出,主要就是compositor backend这部分,它决定了合成完成后的结果怎么处置
weston_output是output设备的抽象,下面的backend会实现具体的output设备。
fbdev: 直接输出到linux的framebuffer设备
headless: 和noop-renderer 配合使用,主要用于测试窗口逻辑。【类似powervr里面的nohardware build】
RPI: 用于raspberry pi平台
RDP: 用于远程桌面
DRM: 桌面上一般用这个
x11: compositor作为x server的client, 可以让wayland client运行在x11上
wayland: compositor 输出作为另外一个wayland client, 实现嵌套的wayland compositor
下面讲一下合成,也就是renderer backend这部分:
除了上面讲到的专门用于测试逻辑的noop-renderer, 真正干活的主要是pixman-renderer【软件渲染】和gl-renderer【硬件渲染】
主要对以下库有依赖:
libEGL, libGLES: gl的运行时依赖
libdrm: 封装KMS, GEM等接口【平台相关】
libffi: 用于在运行时根据调用接口描述生成函数跳板并调用
pixman: 用于像素操作
cairo: 软件渲染库,类似skia
libjpeg, libpng, libwebp: 用于加载各种图片文件