搭建一个和linux开发者知识共享和学习的平台
分类: LINUX
2024-10-29 14:06:29
Linux显示系统框架DRI(Direct Rendering Infrastructure),它涉及一些不同层次的专有名词如下:
Framebuffer:一种底层的显示缓存,具体细分为如颜色缓存、深度缓存等多种,在这些缓存的共同作用下,{BANNED}最佳终形成在屏幕上显示的图像;
DRM(Direct Rendering Manager):主要负责负责数据流,即通过软件或硬件加速,生成{BANNED}最佳终目标图像,存储在Framebuffer中。
KMS(Kernel Mode Setting):主要负责控制流,根据显示器类型以及显示模式设置,将生成的Framebuffer数据信息送到显示端口上(VGA、HDMI等)。
Libdrm库:Kernel将这DRM/KMS抽象出来,封装成libdrm库供上层的Display Server使用。
OpenGL:简单理解为它是一个操作图形、图像的API规范;
OpenGL ES:是OpenGL的嵌入式版本,适用于在低功耗显示设备渲染高效的2D、3D 图形,当然需要GPU的驱动支持;
Vulkan:是另一种2D、3D操作图形、图像的API规范;
Mesa:是一种开源的OpenGL的库实现,OpenGL是接口规范,Mesa是具体实现;
这部分名词很很多,先粗略介绍一遍。
绘制 2D 图形(如GPU填充)
绘制 3D 场景(如多边形、纹理和变换)
视频压缩/解压缩(如H.264等)
视频编辑和过滤(如相机镜头校正、虚拟背景等)
合成(叠加和混合图层)
非视频的东西,比如神经网络
运行 Linux 和通用代码的 ARM CPU
Broadcom的VideoCore GPU,具体包括:
- VPU,GPU内部的一个通用处理器,用于运行GPU专用的操作系统固件
- 压缩/解压缩器
- 视频捕捉助手
- 3D渲染的QPU着色器单元
- 执行输出时间缩放和合成的硬件视频缩放器 (HVS, Hardware Video Scaler)
- 将HVS输出转换为视频信号的编码器
VideoCore 固件是在 VPU 上运行的专有代码,总体管理 GPU,并包括对 OpenGL 和视频压缩/解压缩的一些支持
VideoCore API:
- EGL,用于OpenGL的标准 C API,Pi 有两种实现:① Broadcom libbrcmEGL ② Mesa libEGL
- DispmanX,用于控制帧缓冲区分层和合成
- MMAL,用于多媒体抽象层
- OpenMAX (OMX),用于一种用于音频/视频的标准
- OpenVG,用于 2D 图形的标准
直接渲染管理器 (DRM) 提供对视频硬件的访问
- “vc4”DRM 驱动程序为 VideoCore IV 和 VI执行2D处理,并为 VideoCore IV 执行 3D
- “v3d”DRM 驱动程序为 VideoCore VI (RPi 4专用) 进行 3D 处理
内核模式设置 (KMS) 是 DRM 的一部分,管理视频模式和输出时间合成
Video4Linux 2 (V4L2) 管理视频捕获以及硬件视频压缩/解压缩
DMA-buf 在子系统之间共享内存,例如。V4L2 和 DRM 之间
X windows 及其整个生态系统,包括:
- 直接渲染基础设施 (DRI),允许客户端共享硬件以进行直接渲染(使用 DRM、OpenGL 等)
- GL X 扩展 (GLX),允许客户端发送 GL 命令(间接渲染)或直接访问硬件(直接渲染)
Mesa,一种 OpenGL 实现
- “vc4”Mesa 驱动程序使用 vc4 DRM 驱动程序来支持 VideoCore IV (RPi <= 3) 上的 OpenGL 2.1
- “v3d”Mesa 驱动程序使用 v3d DRM 驱动程序(以及用于模式设置的 vc4)来支持 VideoCore VI (RPi 4) 上的 OpenGL 2.1 和 OpenGL ES 3.1
FFmpeg,一组用于音频/视频处理的工具和软件库
GStreamer,使用硬件和软件构建块的音频/视频管道系统
VLC(和 libvlc),一种流行的视频播放器
在了解了树莓派GPU的软硬件资源之后,来看一下要让上述资源协同工作,有哪几种配置方式?及有什么优缺点。
此模式支持但已弃用。
在此模式下,DRM 和 KMS 不可用。
V4L2内部使用MMAL提供硬件视频压缩/解压缩。
DispmanX、MMAL 和 OMX 均可用。
X服务器使用DispmanX切换模式,并直接渲染到帧缓冲区(framebuffer),没有硬件加速。
内核可以制作简单非加速的帧缓冲区(framebuffer)和渲染控制台文本之外。
这是一种折中的传统模式,在树莓派 OS Buster 上是默认配置模式。
在此模式下,DRM 和 KMS 可用,但使用 DispmanX 进行模式设置和帧缓冲区管理(framebuffer),因此是“假”。
V4L2 如上包装 MMAL。
OpenGL 可通过“vc4”和“v3d”Mesa 驱动程序使用,这些驱动程序通过 DRM 使用 VideoCore 资源,无需专有 VPU 固件。
DispmanX、MMAL 和 OMX 均可用。
X服务器呈现为 DRM 并使用 KMS 来切换模式。
这是 在树莓派 OS Bullseye 的推荐设置和默认设置。
在此模式下,DRM 和 KMS 直接管理 GPU,无需依赖专有的 VideoCore VPU 固件。
V4L2仍然如上包装MMAL。
OpenGL 可通过上述“VC4”和“V3D”Mesa 驱动程序使用。
DispmanX 和 OMX 不可用,因为内核已接管 GPU。omxplayer 等程序无法运行。MMAL 仍然可用。VLC使用MMAL进行硬件解压。
X服务器呈现为 DRM 并使用 KMS 来切换模式。
总结:
Fake KMS:允许VPU固件控制 DRM/KMS 渲染管道,如果想使用常规的OpenGL(其版本仅限于 2.1),FKMS 是必需的。如桌面软件(X服务器)倾向于使用 OpenGL 进行合成和像素推送,但在性能或功耗方面并不理想。
Full KMS:使用 Linux 内核来控制 DRM/KMS 管道,与常规的OpenGL不兼容,但使用GLES,并且可以运行更多功能。树莓派的VideoCore VI GPU 驱动可以执行 OpenGL ES 3.2,但不能执行 OpenGL 3.0。
推荐:选择“Full KMS”
对于开发,目标是通用 API(OpenGL、X11、DRI/DRM/KMS、V4L2)或使用它们的库(gstreamer、ffmpeg)。在完整的 KMS 下运行,这是{BANNED}最佳面向未来的开源接口。
对于 3D,请使用 OpenGL 并首选 Mesa 的 vc4/v3d 驱动程序(而不是 Broadcom EGL 层)。
对于桌面视频播放,更喜欢 VLC而不是 omxplayer 或其他播放器。
选择方式:在/boot/config.txt中dtoverlay=vc4-kms-v3d