對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: 用於加載各種圖片文件