display:weston初始化

平臺:Qcom

weston version: 5.0.0

Weston initialization

\

總體上來說,weston初始化分爲一下幾個階段

Create wl_display
Load backed modules
Create compositor
Backend initialization
Create listen socket                          ->/run/user/0/wayland-0 [client與server通過此socket交互]
Load and initialize other modules
wl_display_run

weston對應的backend 

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

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

合成內容的輸出:compositor backend: drm-backend.so

input管理:libinput.so

對應代碼compositor/main.c

------------------------

         verify_xdg_runtime_dir() 確認XDG_RUNTIME_DIR路徑及相關

  1. 調用 wl_display_create(), 創建wl_display對象, 函數在wayland-server.c實現
  2. 調用 wl_display_get_event_loop(), 創建 wl_event_loop, 函數在wayland-server.c實現
  3. 調用 wl_event_loop_add_signal(), 把signal加入 event loop 的監聽源[SIGINT/SIGQUIT等退出信號],設置 SIGSEGV 的信號處理函數,一旦發生,跳出主循環,程序結束
  4. 調用load_configuration,調用weston_config_get_section解析weston.ini,獲取長寬等內容
  5. 根據傳入的參數或環境變量決定weston的backend,可能的backend包括wayland-backend.so, x11-backend.so, openwfd-backend.so(TV的一個平臺) 或 drm-backend.so
  6. [重要]調用weston_compositor_create創建compositor對象,註冊大量信號消息;創建各種如的資源;創建圖層layer,cursor_layer和fade_layer;函數在compositor.c實現;
    使用wl_global_create創建服務,如下[這些服務會在client通過[registry_handle_global->wl_registry_bind綁定服務] 
    weston_compositor_create
    weston_input_init
    wl_data_device_manager_init
    wl_display_init_shm
    WaylandBufferBackend::Init()
    linux_dmabuf_setup等等

     

  7. 調用weston_compositor_init_config解析weston.ini某些參數;調用weston_config_section_get_bool判斷是否需要input設備的限制
  8. [重要]Load_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節點
  9. 調用weston_create_listening_socket(), 把unix domain socket描述符加入event loop事件監聽源; $XDG_RUNTIME_DIR文件夾下創建用於監聽的socket;默認/run/user/0/wayland-0
  10. 根據傳入的[shell]參數或環境變量選擇shell接口,默認爲 desktop-shell.so;調用wet_load_shell;最終調用shell_init的函數指針->wet_load_module_entrypoint,[dlopen/dlsym]函數在main.c實現
  11. 根據傳入的[modules]參數或環境變量選擇 modules接口;內部實現與10一致
  12. 調用 weston_compositor_wake(),三件事,
    重置compositor狀態:compositor->state = WESTON_COMPOSITOR_ACTIVE;
    設置dpms:set_dpms; Display Power Management Signaling[顯示電源管理信號]
    重置計時器wl_event_source_timer_update(compositor->idle_source,  compositor->idle_time * 1000);

     

  13. 調用 wl_display_run(), 進入主循環, 不斷調用[1是buffer,2是event];wl_display_flush_clients[將當前out buffer中的數據通過socket發往client端, 這些數據是之前在wl_connection_write()中寫入的]並且肩負如果client不再需要便銷燬client的功能wl_event_loop_dispatch()[ 處理消息循環],派發事件
  14. 如果主循環由於某種原因退出,進行一些清理性工作

上述步驟的8,異常重要,再load_backend的操作邏輯裏面,包含了庫與driver建立連接的整個初始過程。 

 

上述步驟10,調用wet_load_shell,加載desktop-shell.so;對應代碼weston/desktop-shell/shell.c裏面的wet_shell_init函數。

1.對shell的notify機制進行處理,分別爲shell_destory,idle_handler,wake_handler,transform_handler.

2.調用weston_layer_init創建layer,分別爲full_screen/panel/background/lock/input_panel/幾種layer;
調用weston_layer_set_position設置位置[側面印證了desktop模式存在三個layer]

3.初始化input_panel_layer相關的notify消息,包括show_input_panels,hide_input_panels,update_input_panels.
並且通過wl_global_create向server請求zwp_input_panel_v1_interface相關服務

4.調用shell_configuration對weston.ini的一些參數進行判斷並賦值desktop_shell結構體

5.調用workspace_create以及activate_workspace.
...todo

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章