monado系列文章索引汇总
模块目的
当打开session时,创建非native side(client side)和native side的画布。用于App侧3D应用场景绘制,并最终与主合成器合成输出。
主要类和关系
Native side:离vk近,基于AHardwareBuffer创建vk资源。
Client side:离客户端渲染环境近,基于AHardwareBuffer创建EGLImage和GL texture,用于App层3D应用场景绘制。
主合成器画布:主vk环境创建,包括窗口 Surface等。在CreateInstance阶段完成创建,这里只列出类继承关系。
要点
0 app侧获取system等参数
1 通过Hardware实现跨进程共享纹理
2 native swapchain创建vk内存,共享给egl,基于elg创建gl纹理,gl纹理给app做画布
3 三个线程
4 合成系统渲染器介绍
5 单层和多层绘制逻辑
获取System相关配置
目的:获取透明度、宽高等信息,用于画布(swapchain)创建。
主要数据:view类型,数量,swapchain宽高,format,blend_modes等,system所有字段初始化,详见“CreateInstance”篇oxr_system_fill_in逻辑。
基于HardwareBuffer实现Android跨进程纹理共享
原理:基于HardwareBuffer实现跨进程纹理共享
具体到monado runtime的用法是:
1)在native侧comp_swapchain,用AHardwareBuffer创建VkMemory和VkImage
2)在非native侧comp_gl_eglimage_swapchain,用AHardwareBuffer创建EGLImage
3)EGLImage与gl Texture关联,指向同一个内存区域
4)App侧把gl texture attach到framebufer,绘制内容
5)vk环境使用VkMemory和VkImage合成渲染
如下图:
有了上面的知识要点,下面的时序图虽然有点绕,但相对很容易理解。
1 在comp_multi模块,核心目的是创建AHardwareBuffer,以及VkMemory VkImage VkImageView等vk对象,主要通过auxiliary辅助库的vk工具库实现。
2 在comp_client模块,核心目的是创建gl texture,给App层attach到framebuffe,绘制应用层3D场景,创建过程在comp_gl_eglimage_swapchain.c实现。基于AHardwareBuffer,创建EGLImage,然后内存关联到gl texture。
把握核心要点,剩下就是代码实现细节,注意一下类的继承关系和模块封装,基本没什么难度了。
三个重要线程
跟渲染相关有三个重要线程,当然还有其它线程,如android_sensor.c里开启的传感器数据读取线程。
app thread:应用层线程,安卓Native Activity主线程,在XR应用中,也可以称之为client线程,绘制应用相关的3D场景。
client wait thread:客户端监听线程,由multi_compositor.c启动,用于监听client layer绘制提交,把提交信息填充到progress对象,等待调度处理,完成process到scheduled状态调度。
compositor thread:主合成器线程,用于完成scheduled到delivered状态调度,然后合成渲染。如果是单层,走单层快速合成逻辑,如果是多层,走多层合成逻辑。
要点
App层:关注xrBeginFrame/xrEndFrame等帧相关状态变化,其次是xrEndFrame发起layer提交。
progress填充:收集client提交的绘制数据,如左右眼纹理数据,即swapchain
layer状态切换:progress->scheduled->delivered,目的是准备layer数据,准备给主合成器合成渲染,涉及到一堆状态同步和线程锁。
单层/多层渲染分开设计:单层渲染直接复用左右眼纹理做畸变校正等算法后呈现;多层渲染需要把多层左右眼纹理,合并到一层,然后做畸变矫正等算法呈现。
下图列出每个线程涉及到的关键属性和方法。
合成渲染
这是runtime的一个核心模块,monado提供demo实现,即comp_main模块,各厂家会根据自身硬件特点,做不同程度、不同目的的性能优化,提供定制化的compositor实现。
主合成器主要提供:ATW算法、畸变相关矫正算法,Layer合并和渲染呈现等重要功能。本文主要分析渲染相关,算法类后续单独分析。
根据Layer数量不同,分为单层和多层渲染两个分支。
不论单层/多层渲染,都用到vk环境和相关资源,资源相关由comp_render模块封装,不同平台(Android wayland xcb等)窗口相关如window surface等初始化设置,有comp_main实现。
comp_renderer.c:合成系统的渲染器,单层/多层的左右眼数据,统一调用renderer_build_rendering()进行distortion处理(具体由render_gfx.c实现),然后调用renderer_submit_queue()提交到渲染队列,最后调用renderer_present_swapchain_queue()呈现。见下图。
合成器系统的渲染器功能介绍
Layer提交后的渲染逻辑
总结
本文信息量比较大,非常复杂,很多地方没研究透。抓住几个要点,可以快速掌握整体逻辑,后续遇到问题可以继续深入研究。
几个要点:
- 基于HardwareBuffer跨进程共享纹理机制
- 三个重要线程
- progress->scheduled->delivered调度
- 单层/多层渲染逻辑
- 繁琐的vulkan接口使用
- 重要算法:ATW distortion等(暂未介绍)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net