天天看点

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