高通hypervisor display的架构
下面这张图是高通文档上能看到的对于高通hypervisor的display显示框架,但是关于QNX和LA侧是如何交互的,好像没有找到相关的文档介绍。
正好最近遇到了一些和display相关的问题,趁着这个档口稍微研究了下QNX和LA侧两边是怎么交互的
Hypervisor Display架构部分细节解析
下图是对前面那张图的细节补充
1,所有LA侧的APP与显示相关的调用最终都会交由SurfaceFlinger处理
2,SurfaceFlinger会最终调用android.hardware.graphics.composer@2.4-service服务
3,android.hardware.graphics.composer@2.4-service服务会调用Qcom的一些列库文件(很遗憾这些库源码是不开源的)
4,库文件最终调用LA侧的GPU驱动HGSL的ioctl接口
5,HGSL驱动中会调用hab通信接口与QNX侧的wfd_be服务进行通信
6,wfd_be服务会解析接收到的LA侧的数据包
7,根据数据包中的命令类型调用不同的openwfd接口,需要注意的是,这里的接口是做了一层转换的,举个例子wfdEnumerateDevices_Host,这个接口会进行转换之后真正调用wfdEnumerateDevices函数
8,所有的操作都执行完成之后,如果有必要会唤醒wfd_be的commit&vsync现场,通知openwfd刷新画面
更细节的框图:
相关概念补充
有关commit:
在OpenWFD或者其他图形系统中,"commit"的概念通常指的是将一系列的更改或更新应用到图形系统,使得这些更改在屏幕上可见。
在你对系统做了一系列的更改后,例如更改了图形对象的属性,或者更改了绘制命令,这些更改在内存中进行,但并不会立即反映到屏幕上。这是因为立即更新屏幕会导致屏幕频繁刷新,这会消耗大量的系统资源,并且可能导致屏幕闪烁。因此,你可以在内存中做所有的更改,然后在完成所有更改后,通过调用"commit"操作,将这些更改一次性应用到屏幕上。
在OpenWFD中,有一个API函数叫做"wfdDeviceCommit",它的功能就是执行这个"commit"操作。当你调用这个函数时,所有之前对设备做的更改(例如设置设备属性或者更改端口模式)都会被应用,这些更改将会在下一次屏幕刷新时可见。
这种"commit"机制在许多图形系统中都很常见,包括OpenWFD和Wayland等,它们都使用这种机制来优化屏幕更新和减少资源使用。
有关vsync:
"VSync"是"垂直同步"的缩写,这是一种在计算机图形中常见的技术,用于解决屏幕撕裂(screen tearing)问题。屏幕撕裂是当计算机的图形处理器(GPU)输出的帧率超过显示器的刷新率时,一帧的上半部分和下半部分不同步,导致画面看起来像是被撕裂了一样。
垂直同步技术通过同步GPU的帧输出速度和显示器的刷新率来避免屏幕撕裂。具体来说,当启用VSync时,GPU会等到显示器完成一次完整的垂直刷新(从上到下更新所有像素)后,才开始渲染下一帧。这样可以确保在显示器每次刷新时,只有一帧数据被发送到显示器,避免了屏幕撕裂。
然而,垂直同步也有一些缺点。由于GPU需要等待显示器完成刷新,如果GPU的渲染速度非常快,这可能会导致GPU的性能没有得到充分利用。此外,如果GPU的帧率低于显示器的刷新率,用户可能会感觉到画面卡顿。因此,垂直同步是否启用,以及如何配置垂直同步,往往取决于具体的应用需求和硬件性能。
在OpenWFD中,可能有相关的API或设置用于控制垂直同步,但具体的实现和使用可能会根据不同的OpenWFD实现和硬件配置有所不同。
版权归原作者 norlan_jame 所有, 如有侵权,请联系我们删除。