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

 

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