openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor
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相关推荐
- openxr runtime Monado 源码解析 源码分析:CreateSwapchain 画布 HardwareBuffer共享纹理 渲染线程 xrEndeFrame comp_renderer
monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...
- Colly源码解析——结合例子分析底层实现
通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...
- Netty 源码解析系列-服务端启动流程解析
netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...
- Zabbix 源码解析之监控项数据采集流程
一.概述 监控项数据采集是一个监控工具最基本的功能,监控数据采集的准确.实时.有效是Zabbix其它监控功能正常运转的前提.因此,Zabbix运维人员有必要了解监控项数据采集流程,并有针对性的设计巡检 ...
- Qt源码解析-源码解析-QVideoWidget播放手机视频旋转问题
Qt源码解析 索引 Qt源码解析-源码解析-QVideoWidget播放手机视频旋转问题 问题描述与复现 使用手机拍摄的视频是竖屏的,上传后,使用QVideoWidget播放,变成横屏. 总结,可以让 ...
- Flink 源码解析 —— 源码编译运行
更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...
- 从源码解析-结合Activity加载流程深入理解ActivityThrad的工作逻辑
ActivityThread源码解析 前言 类简称 类简介 一 二 三 四 五 代理和桩的理解 ActivityThread ActivityThread.main AT.attach AMN.get ...
- Spring源码解析(五)-Bean的实例化流程(上)
在前面已经完成了对需要实例化bean的收集并封装成BeanDefinition,并且将BeanPostProcess等组件进行了提前实例化.接下来就到了容器启动的最后一步,也是最复杂的一步-实例化be ...
- FlinkSQL源码解析(三)执行流程
1.前言 前面2部分主要是介绍以下2点: flink sql整体的执行流程大致为:sqlNode --> Operation --> RelNode --> 优化 --> ex ...
最新文章
- python实现反转链表讲解_基于Python实现2种反转链表方法代码实例
- 给线程变量pthread_t *thread动态分配空间
- EBS并发管理器请求汇总(按照并发消耗时间,等待时间,平均等待事件等汇总)...
- 线上BUG 处理并分析原因
- 深入入门正则表达式(java) - 1 - 入门基础
- fedora16 解码方案
- Zabbix graph(图形 告警) 时间显示不正确的解决办法
- AI一分钟 | 美媒称中国导弹阵地遭美国AI技术快速识别,人工智能主播将亮相BBC节目
- linux 没有network服务,求助,network起不来
- System V消息队列报Resource temporarily unavailable 错误
- 【计算机图形学 】绘制椭圆 | OpenGL+鼠标交互
- 优思学院|六西格玛:如何最有效地制定目标?
- 【发现】中国与日德最可怕的差距,看着寒心
- 如何使用WooCommerce简码
- 阿里云ACP级认证考试心得+过关经验
- 网络摄像机镜头毫米数如何选择
- arm汇编的学习笔记,对比x86和arm(1)-从最简单的函数谈起
- x86、x64、x32和64位、32位的区别与联系
- 虚拟机 ubuntu 16 安装caffe CPU版本 安装open pose
- win10 家庭版如何能远程桌面控制