openxr runtime Monado 源码解析 源码分析:CreateSwapchain 画布 HardwareBuffer共享纹理 渲染线程 xrEndeFrame comp_renderer

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 源码解析 源码分析:openxr runtime Monado 源码解析 源码分析:InitializeSession client native multi_compositor client_compositor
openxr runtime Monado 源码解析 源码分析:CreateSwapchain 画布 HardwareBuffer共享纹理 渲染线程 xrEndeFrame comp_renderer

目录

模块目的

主要类和关系

要点

获取System相关配置

基于HardwareBuffer实现Android跨进程纹理共享

三个重要线程

要点

合成渲染

合成器系统的渲染器功能介绍

Layer提交后的渲染逻辑

总结


模块目的

当打开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等(暂未介绍)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值