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