天天看點

weston啟動關鍵步驟總結

output對應螢幕;view對應視窗,多個view屬于layer;plane對應底層plane。

1.建立log流

2.wl_display_create()建立wl_display對象

3.wl_display_get_event_loop()擷取server端的wl_event_loop 并且通過wl_event_loop_add_signal函數向剛才的wl_event_loop 添加信号量,以便終止主循環結束程式。

4.wl_list_init(&child_process_list)初始化子線程雙向連結清單

5.讀取 weston.ini配置檔案,之後會對配置檔案中的選項進行逐個讀取寫入。

6.weston_compositor_create建立compositor

7.load_backend進行後端初始化,根據傳入的參數/配置backend。[目前用的load_drm_backend] 調用weston_compositor_load_backend;最終調用backend_init的函數指針->weston_load_module,[dlopen/dlsym]函數在compositor.c實作;對應的,compostior-xx.c裡面執行weston_backend_init/drm_backend_create/full_init_main/init_drm;打開/dev/dri/card0節點

8.weston_create_listening_socket建立監聽socket ->/run/user/0/wayland-0 [client與server通過此socket互動]

9.wet_load_shell加載shell

根據傳入的[shell]參數或環境變量選擇shell接口,預設為 desktop-shell.so;調用wet_load_shell;最終調用shell_init的函數指針->wet_load_module_entrypoint,[dlopen/dlsym]函數在main.c實作

會喚醒desktop-shell和桌面上的clients

10.load_modules加載其他子產品,鍵盤等等

11.weston_compositor_wake喚醒compositor

12.wl_display_run(display)開始顯示。

調用 wl_display_run(), 進入主循環, 不斷調用[1是buffer,2是event];wl_display_flush_clients[将目前out buffer中的資料通過socket發往client端, 這些資料是之前在wl_connection_write()中寫入的]并且肩負如果client不再需要便銷毀client的功能wl_event_loop_dispatch()[ 處理消息循環],派發事件

weston對應的backend

負責UI的,視窗管理:shell backend:desktop-shell.so/ivi-shell.so

合成渲染:render backend:gl-renderer.so