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篇会继续讨论合成渲染内容。

openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor相关推荐

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

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...

  2. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  3. Netty 源码解析系列-服务端启动流程解析

    netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...

  4. Zabbix 源码解析之监控项数据采集流程

    一.概述 监控项数据采集是一个监控工具最基本的功能,监控数据采集的准确.实时.有效是Zabbix其它监控功能正常运转的前提.因此,Zabbix运维人员有必要了解监控项数据采集流程,并有针对性的设计巡检 ...

  5. Qt源码解析-源码解析-QVideoWidget播放手机视频旋转问题

    Qt源码解析 索引 Qt源码解析-源码解析-QVideoWidget播放手机视频旋转问题 问题描述与复现 使用手机拍摄的视频是竖屏的,上传后,使用QVideoWidget播放,变成横屏. 总结,可以让 ...

  6. Flink 源码解析 —— 源码编译运行

    更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...

  7. 从源码解析-结合Activity加载流程深入理解ActivityThrad的工作逻辑

    ActivityThread源码解析 前言 类简称 类简介 一 二 三 四 五 代理和桩的理解 ActivityThread ActivityThread.main AT.attach AMN.get ...

  8. Spring源码解析(五)-Bean的实例化流程(上)

    在前面已经完成了对需要实例化bean的收集并封装成BeanDefinition,并且将BeanPostProcess等组件进行了提前实例化.接下来就到了容器启动的最后一步,也是最复杂的一步-实例化be ...

  9. FlinkSQL源码解析(三)执行流程

    1.前言 前面2部分主要是介绍以下2点: flink sql整体的执行流程大致为:sqlNode --> Operation --> RelNode --> 优化 --> ex ...

最新文章

  1. python实现反转链表讲解_基于Python实现2种反转链表方法代码实例
  2. 给线程变量pthread_t *thread动态分配空间
  3. EBS并发管理器请求汇总(按照并发消耗时间,等待时间,平均等待事件等汇总)...
  4. 线上BUG 处理并分析原因
  5. 深入入门正则表达式(java) - 1 - 入门基础
  6. fedora16 解码方案
  7. Zabbix graph(图形 告警) 时间显示不正确的解决办法
  8. AI一分钟 | 美媒称中国导弹阵地遭美国AI技术快速识别,人工智能主播将亮相BBC节目
  9. linux 没有network服务,求助,network起不来
  10. System V消息队列报Resource temporarily unavailable 错误
  11. 【计算机图形学 】绘制椭圆 | OpenGL+鼠标交互
  12. 优思学院|六西格玛:如何最有效地制定目标?
  13. 【发现】中国与日德最可怕的差距,看着寒心
  14. 如何使用WooCommerce简码
  15. 阿里云ACP级认证考试心得+过关经验
  16. 网络摄像机镜头毫米数如何选择
  17. arm汇编的学习笔记,对比x86和arm(1)-从最简单的函数谈起
  18. x86、x64、x32和64位、32位的区别与联系
  19. 虚拟机 ubuntu 16 安装caffe CPU版本 安装open pose
  20. win10 家庭版如何能远程桌面控制

热门文章

  1. [Python开发] 使用python读取图片的EXIF
  2. 关于去除QQ和暴风音影的广告
  3. office2019中不包含onenote2016
  4. Java实现1028 人口普查
  5. Houdini图文笔记:VAT(3.0)导入UE4/5的设置向导[官方文档翻译]
  6. 适配器模式 : 农村小伙娶乌克兰美女语言不通一一翻译软件立功
  7. 华为手机备忘录怎么打开
  8. Sedna终身学习以及KubeEdge梳理
  9. Unity 3D游戏发布到Android平台
  10. 利用计算机制作多媒体作品,多媒体作品设计与制作