当前位置: 首页 > 科技观察

OpenHarmony图形子系统(二)weston合成器分析

时间:2023-03-14 00:56:58 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com通过上一节,我们熟悉基于LinuxDRM的基本展示平台和Wayland相关的几个基本概念。在本节中,我们将对构建在其上的weston合成器进行深入分析。Weston是基于Wayland协议的合成器的参考实现。其他实现如GNOME和KDE也默认提供基于Wayland显示服务器协议的全功能桌面环境。OpenHarmony标准系统目前使用weston的实现。了解westoncompositor有助于我们调试OpenHarmony图形子系统的移植适配和启动问题。Weston结构分析下图是OpenHarmony-3.0-LTS版本的图形子系统compositorserver端的结构图。合成器上端通过wayland协议与客户端通信。服务器端除了weston之外,还加载了窗口管理服务(wmserver)模块和vsync模块。另外还加载了一个ivi-shell模块,这个我们后面分析客户端WindowManager的时候再说。weston的下端依赖于显示hdi层相关的几个库:libdisplay_gfx实现了图形硬件加速接口。libdisplay_gralloc:负责显示模块的内存管理,包括内存申请与释放、内存映射等操作。drm后端的渲染器模块通过use_pixman选项选择使用pixman渲染器还是egl。egl是渲染API(如OpenGL、OpenGLES)和底层原生平台窗口系统的接口。pixman-render中use_tde变量用于选择是否使用tde硬件加速模块。TDE(TwoDimensionalEngine)是海思的二维图形加速引擎。瑞芯微对应RGA(RasterGraphicAcceleration)二维光栅图形加速单元,用于加速二维图形运算。如点/线绘制、图像缩放、旋转、位图、图像合成等。目前3.0-LTS如果是其他非海思平台,如果检测不到tde模块,会使用pixman进行软件渲染,通过默认。关于Wayland,你要知道Wayland协议被设计为“异步面向对象协议”(asynchronousobject-orientedprotocol)。面向对象意味着由合成器提供的服务被呈现为存储在同一个合成器中的一系列对象。每个对象都实现一个接口(interface),它有一个名称、一些方法(request)和一系列相关事件。接口协议可以用xml文件描述,编译时有自动生成C代码的脚本(wayland_standard/wayland_scanner_wrapper.py)。如果对象的接口支持此请求,则客户端可以向该对象发送请求。compositor中有一些wayland核心接口(coreinterfaces)是必须要有的,定义在wayland_standard/protocol/wayland.xml中。此外,特定的合成器可以将自己的接口实现为扩展协议。每个接口协议都有一个版本号,以确保版本兼容性。知道了上面的前置知识,我们就可以开始分析weston的代码了。Weston启动过程伪代码weston启动过程比较长,我们只挑出我们感兴趣的主要部分。梳理一下流程,可以帮助你快速回忆在后续调试中看过的代码。wet_main(args)weston_display_create()//创建显示对象load_configuration(&config)//根据启动参数,加载配置文件weston.ini中的配置weston_compositor_create()//创建compositor实例load_backend()//根据给启动参数-b,显式加载后端显示接口drm-backend.soWL_EXPORTweston_backend_init()//显示后端drm-bakcend.so初始化入口drm_backend_create()ifuse_pixman:init_pixman()//根据启动参数use_pixman,在渲染器pixman或egl中选择一个pixman_render_init()tde_renderer_alloc_hook()tde_render_gfx_init()dlopen(”libdisplay_gfx.so”)GrallocInitialize()→peripheral/display“libdisplay_gralloc.so”else:init_egl()VsyncModuleStart()//Dependonlibvsync_module.soingraphicssubsystemInitSA()//注册ID为VSYNC_MANAGER_ID的VsyncManager服务RegisterSystemAbility(VSYNC_MANAGER_ID)VsyncMainThread()load_modules()//Loadweston.ini中配置的模块,libivi-controller.z.so在3.0-LTS版本加载,libwmserver.z.so。wmserver窗口管理器模块将在后面介绍。wl_display_run()//进入事件等待和定时任务循环while(run)wl_display_flush_clients()wl_event_loop_dispatch()然后整理出我们最关心的surface提交,然后重绘(repaint)输出的过程。Surface接口绑定和SurfaceCommit过程会涉及到一些接口实现的绑定。我们感兴趣的接口方法之一的实现在伪代码中用(->)箭头表示。当客户端发送相应的wl_xxx请求事件时调用该方法。weston_compositor_create()compositor_bind()//创建compositor时,绑定compositor_interface接口实现structwl_compositor_interfacecompositor_interface//compositor接口实现→compositor_create_surface//创建surface时,绑定surface接口实现structwl_surface_interfacesurface_interface//surface接口实现→commit_//(surface)在客户端调用wl_surface_commit()提交到这个接口weston_surface_commit_state()pixman_render_attach()//如果有新的surface加入,会执行rendererattachweston_surface_schedule_repaint(surface)//在输出中标记surface当一个表面被标记为需要重新绘制时,需要重新绘制的重新绘制过程在重新绘制时,重新绘制计时器处理程序将重新绘制这些表面,然后显示输出。wl_event_loop//wayland事件事件输出_repaint_timer_handlerbackend→repaint_begin()//开始开始开始开始开始开始开始开始开始weston_outputpaint()→drm_output_repaint_repaint_repaint_repaint_repaint_render_manemend_render_render_render_render_render_render_render_renderputtrixman)()else:drm_output_render_gl()drm_repaint_flush()//合成重绘屏幕刷新输出drm_pending_state_apply()//kms先复制更新这些,伪代码部分可以对照源码多整理几遍。后面会写一个简单的客户端,你会熟悉它的核心接口对象(coreinterfaces)。然后以此为基础,分析如何在图形子系统中对其进行封装适配,添加WM窗口管理、Vsync帧同步、内存管理等模块。更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com