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

这篇具有很好参考价值的文章主要介绍了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阶段完成创建,这里只列出类继承关系。

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

要点

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逻辑。

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

基于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合成渲染

如下图:

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

有了上面的知识要点,下面的时序图虽然有点绕,但相对很容易理解。

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。

把握核心要点,剩下就是代码实现细节,注意一下类的继承关系和模块封装,基本没什么难度了。

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

三个重要线程


跟渲染相关有三个重要线程,当然还有其它线程,如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数据,准备给主合成器合成渲染,涉及到一堆状态同步和线程锁。
单层/多层渲染分开设计:单层渲染直接复用左右眼纹理做畸变校正等算法后呈现;多层渲染需要把多层左右眼纹理,合并到一层,然后做畸变矫正等算法呈现。

下图列出每个线程涉及到的关键属性和方法。

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

合成渲染

这是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()呈现。见下图。

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

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

Layer提交后的渲染逻辑

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

总结

本文信息量比较大,非常复杂,很多地方没研究透。抓住几个要点,可以快速掌握整体逻辑,后续遇到问题可以继续深入研究。

几个要点:文章来源地址https://www.toymoban.com/news/detail-445957.html

  • 基于HardwareBuffer跨进程共享纹理机制
  • 三个重要线程
  • progress->scheduled->delivered调度
  • 单层/多层渲染逻辑
  • 繁琐的vulkan接口使用
  • 重要算法:ATW distortion等(暂未介绍)

到了这里,关于openxr runtime Monado 源码解析 源码分析:CreateSwapchain 画布 HardwareBuffer共享纹理 渲染线程 xrEndeFrame comp_renderer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GDB 源码分析 -- 断点源码解析

    通常,断点是程序中用户指定的位置,如果程序执行到达该位置,用户希望在该位置重新获得程序的控制权。 实现断点主要有两种方法:硬件断点(hardware breakpoints)或者软件断点(software breakpoints)。 硬件断点有时可以作为一些芯片的内置调试功能使用。通常,这些工作是

    2024年02月10日
    浏览(34)
  • flink源码分析 - yaml解析

    flink版本: flink-1.12.1      代码位置:  org.apache.flink.configuration.GlobalConfiguration 主要看下解析yaml文件的方法:  org.apache.flink.configuration.GlobalConfiguration#loadYAMLResource

    2024年01月18日
    浏览(45)
  • Zookeeper源码分析——ZK服务端加载数据源码解析

    (1)zk 中的数据模型,是一棵树,DataTree,每个节点,叫做DataNode (2)zk 集群中的DataTree 时刻保持状态同步 (3)Zookeeper 集群中每个zk 节点中,数据在内存和磁盘中都有一份完整的数据。 ⚫ 内存数据:DataTree ⚫ 磁盘数据:快照文件 + 编辑日志 ZK服务端初始化源码解析 启动

    2023年04月24日
    浏览(56)
  • 【Mybatis源码解析】mapper实例化及执行流程源码分析

    基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 基于SpringBoot的Mybatis源码解析: 1.如何对mapper实例化bean 在加载BeanDefinition时,会将SqlSessionFactory、SqlSessionTemplate、MapperScannerConfigurer加载到注册表中,以供后续进行实例化。

    2024年02月01日
    浏览(40)
  • RecyclerView源码解析(二):结合LinearLayout分析绘制流程

    封面: 上篇文章中主要已经介绍了RecyclerView的View的三大工作流程(onMeasure,onLayout,onDraw),实际上看了上篇文章还是很迷糊,因为RecylerView由于实现了高度的解耦,所以阅读整个RecyclerView的源码和理解整个RecyclerView需要结合多个相关的类别。本篇文章我们将以配合我们最常

    2024年02月10日
    浏览(37)
  • HashMap底层源码解析及红黑树分析

    HashMap线程不安全,底层数组+链表+红黑树 面试重点是put方法,扩容 HashMap的put方法,首先通过key去生成一个hash值,第一次进来是null,此时初始化大小为16,i = (n - 1) hash计算下标值,第一次获取是null,直接放入一个Node节点,如果不是null,分成下面三种情况 1)如果发现hash和

    2024年02月02日
    浏览(51)
  • 开源数据库 OpenGauss 的 SQL 解析源码分析

    openGauss 是关系型数据库,采用客户端/服务器,单进程多线程架构;支持单机和一主多备部署方式,同时支持备机可读、双机高可用等特性。 从代码结构体系结构的角度来说,oepnGauss 的第一个组成部分是通信管理。 openGauss 查询响应是使用“单个用户对应一个服务器线程”的

    2024年03月17日
    浏览(52)
  • 【深入解析spring cloud gateway】06 gateway源码简要分析

    上一节做了一个很简单的示例,微服务通过注册到eureka上,然后网关通过服务发现访问到对应的微服务。本节将简单地对整个gateway请求转发过程做一个简单的分析。 主要流程: Gateway Client向 Spring Cloud Gateway 发送请求 请求首先会被HttpWebHandlerAdapter 进行提取组装成网关上下文

    2024年02月10日
    浏览(40)
  • Android 12 源码分析 —— 应用层 三(SystemUIFactory及其Dependency解析)

    在上一篇文章中,介绍了SystemUI的启动流程,并且简单提及了Dagger2用来管理各个SystemUI中要用的依赖。而这部分代码就在:mContextAvailableCallback.onContextAvailable(this);流程中。而这部分流程我们只是一笔带过,并没有仔细分析。 接下来将会从这个调用开始,介绍SystemUI中Component,

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包