monado系列文章索引汇总:
openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读
openxr runtime Monado 源码解析 源码分析:整体介绍 模块架构 模块作用 进程 线程模型 整体流程
openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor
openxr runtime Monado 源码解析 源码分析:Prober设备发现和管理 system device HMD target instance
openxr runtime Monado 源码解析 源码分析:InitializeSession client native multi_compositor client_compositor
openxr runtime Monado 源码解析 源码分析:CreateSwapchain 画布 HardwareBuffer共享纹理 渲染线程 xrEndeFrame comp_renderer

目录

模块目的

容易混淆的概念:native和非native

XR对象与monado底层实现对象持有和转换关系

主要类和关系

主要流程

时序和代码注解

补充说明

comp_main

comp_client

comp_multi

comp_render comp_util

总结


模块目的

创建进程唯一的XR资源句柄(指针)XrInstance,通过XrInstance在runtime层可以找到所有其它对象。Instance创建过程涉及两大核心模块创建:

合成器系统模块(xrt_system_compositor):持有主合成器,当App开启Session时(client),负责管理client的链接和Layer提交,最终由主合成器合并一层(或多层)到最终画面。

设备系统模块(xrt_system_devices):持有所有设备对象,由Prober模块负责发现,加载。在Prober篇详细介绍。

容易混淆的概念:native和非native

不正确但直观的理解:native指离vulkan更近的对象,非native离client跟近,非native持有native对象,用于vk共享纹理创建。
native对象,如
1)主合成器comp_compositor是native性质的对象,因为它使用vk渲染,申请很多vk内存、纹理等资源。
2)客户端layer提交和管理multi_compositor是native性质对象,因为它通过native swapchain间接使用vk资源,与vk跟近,使用vk资源。
3)后续文章涉及的重要概念native swapchain申请VkMemeory内存,共client端创建EglImage和glTexture,与vk跟近,使用vk资源。

非native概念:与client端跟近,如客户端是gl、vk、dx等资源。

1)与multi_compositor相对的comp_gl_client和comp_egl_client

2)与comp_swapchain(native vk)相对的client_gl_swapchan

XR对象与monado底层实现对象持有和转换关系

* C语言通过“组合式”继承,实现c++类继承

* 指针类型强转

主要类和关系

multi_system_devices: 合成器系统的具体实现者,runtime重要模块之一,持有主合成器对象和所有client连接实例。管理主合成器渲染线程。

comp_compositor: 主合成器,使用vulkan渲染,负责基础内容绘制和client提交的layer合成绘制,distortion等算法在此完成。

multi_compositor:与vk通信,通过HardwareBuffer共享纹理给client端使用,并负责client layer提交给主合成器合并渲染。这里不做详细介绍,在InitializeSession篇详细介绍。

xrt_compositor:所有compositor(native和非native类型)基类,代码注释表示与XrSession相同生命周期

持有关系。

XrInstance即oxr_instance,前者是官方规范,后者是monado的具体实现。

oxr_instance持有合成器系统xrt_system_compositor,具体实现为multi_system_compositor,在comp_multi库中。

合成器系统multi_system_compositor持有主合成器comp_compositor,用于runtime渲染,采用vulkan,并监听client链接,提交client layer数据到主合成器“逐层”合并渲染,并最终呈现。

主要流程

时序和代码注解

补充说明

compositor模块非常复杂,也是非常重要的模块,从monado模块设计上看出,compositor细分为几个独立的模块:comp_main, comp_client, comp_multi, comp_render, comp_util。原则上每个模块都可以按照接口自定义个性化实现。comp_main主合成器一般是重点性能优化模块,各XR厂家会提供深度优化的、自定义的主合成器模块。

comp_main

* 繁琐的vk环境创建,如android window, android view, surface 画布swapchain等资源初始化和创建

* 算法实现:如ATW 补帧 distortion等算法实现

* 单层快速绘制,省vk资源,理论上更快

* 多层绘制:先逐层合并渲染,再最终输出

comp_client

从源码很容易看出,主要用于连接不同客户单渲染环境的,如gl gles vulkan d3d。

* 与mulit_compositor配合,基于共享内存,创建图形库对应的纹理对象,作为画布给App侧进行3D内容绘制。

* client layer提交,待合成处理。

comp_multi

* 合成器系统,开启主渲染线程

* 开启客户单监听线程,处理client layer提交

* 提交layer,主合成器完成合成渲染

comp_render comp_util

vulkan渲染资源和繁琐对象设置,逻辑不复杂,没有难点。

总结

本文重点关注“合成器系统”模块,容易混淆的概念是native和非native。multi_system_devices是合成器系统的具体实现,持有主合成器(native)comp_compositor,管理client连接等。

主合成器用vulkan渲染环境,涉及到vk的繁琐初始化;包含重要的时空扭曲算法、畸变矫正等算法;分为单层快速渲染和多层合并渲染等功能,swapchain篇会继续讨论合成渲染内容。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐