一、RK3568简介
- RK3568四核64位Cortex-A55 处理器,采用全新ARM v8.2-A架构,主频最高可达2.0GHz,效能有大幅提升;采用22nm先进工艺,具有低功耗高性能的特点
- RK3568集成了双核心架构 GPU,高性能VPU以及高效能 NPU。 GPU:Mail-G52,支持OpenGL ES3.2/2.0/1.1,Vulkan1.1;VPU:可实现4K 60fps H.265/H.264/VP9视频解码和1080P 60fps H.265/H.264视频编码;NPU:0.8Tops算力,支持INT8/INT16混合操作。此外,兼容基于一系列框架的网络模型,如TensorFlow/MXNet/PyTorch/Caffe可轻松转换
- RK3568支持SATA/PCIE/USB3.0/HDMI/MIPI CSI/MIPI DSI/eDP/LVDS等各类型外围接口
- RK3568除支持Android及Linux系统外,更可适配多个主流国产OS
二、3568平台GUP
2.1、GPU简介
GPU提供了一个基于开放标准的完整图形加速平台,支持2D/3D图形渲染硬件加速。GPU的作用是为计算机系统提供强大的图形处理和计算能力,能够处理大量的图形数据并进行高效的计算,从而实现各种应用的图形渲染、数据处理和加速等功能。 Rk356x是使用Mali-G52,支持OpenGL ES1.1/2.0/3.0,Vulkan 以及OpenCL。 Rk3588x系列使用Mali-G610,同样支持OpenGL ES 1.1/2.0/3.1/3.2,Vulkan 1.1,1.2以及OpenCL 1.1,1.2,2.0。
除了GPU,RK系列板卡上还有一个独立的2D硬件加速器–RGA (Raster Graphic Acceleration Unit),可以不占用CPU资源下, 加速点/线绘制,执行图像缩放、旋转、bitBlt、alpha混合等常见的2D图形操作,用户空间使用通过 librga 库。
Mali其实是ARM的Mali系列IP核,ARM mali gpu目前有四大架构,每一代架构在性能上都有提升和更高效的能耗管理:
- 第一代微架构Utgard(北欧神话人物:乌特加德),2007年推出,主要系列有:mali-200, mali-400, mali-450, mali-470
- 第二代微架构Midgard(北欧神话人物:米德加德),主要系列有:mali-t6xx, mali-t7xx, mali-t8xx
- 第三代微架构Bifrost(北欧神话中连接天宫和大地的:彩虹桥),2016年推出,主要系列有:mali-g31, mali-g51, mali-g71, mali-g52, mali-g72, mali-g76
- 第四代微架构Valhall,2019年退出,主要系列有:mali-g57, mali-g77
2.2、GPU驱动
Mali GPU 驱动一般分为两部分:一小部分在 Linux 内核中,另外一大部分在 userspace,在 usercapce 的部分向下操作内核中的驱动,向上对应用层提供标准的 OpenGL 接口,这样各种图形显示相关的应用才能通过标准的 OpenGL API 进行图形渲染加速。其 结构图 简单参考如下:
在linux系统上使用OpenGL ES或者OpenCL接口,需要添加libmali库以及头文件, libmali有不同的版本(x11,gbm,wayland),提供了opengles,egl,opencl接口
但是 mali GPU IP 提供商 Arm 公司只开放了内核部分驱动,而且这部分驱动还没有按照 linux kernel 的规范以 Drm 的框架去实现,所以它无法被 linux mainline 接受;usersapce 部分,Arm 没有开源,只是以库的形式提供给购买了 mali GPU 授权的 SOC 厂商,比如 Rockchip,Amlogic。
面对这种状况,很多人为了能够利用 GPU 加速,就只能使用 SOC 原厂提供的内核,和他们定制的系统,这种内核和系统一般都比较老。如果想跑 mainline 的内核,基本就没法使用 GPU 加速了。
但是也有一部分黑客们不满于这种封锁,他们勇于探索,积极尝试,逆向了 Arm 发布的二进制库,然后重写了针对 Arm mali gpu 的开源驱动,最终在 Linux 5.2 发布的时候合并到了 mainline 中:针对 Mali-400/Mali-450 的驱动叫做 lima,针对 Mali-T6xx / Mali-T7xx / Mali-T8xx GPU 和 GXX 系列的叫做 panfrost。Usersacpe 部分的开源库叫做 mesa,对 mali gpu 的支持从 mesa 19.2 开始
2.3、GPU驱动使用方案
2.3.1、方案一:使用官方闭源的GPU驱动
Graphics User Guide(Rockchip Linux) - 程序员大本营 (pianshen.com)
Graphics - Rockchip open source Document (rock-chips.com)
闭源的驱动可以通过下面途径获取到
(1)通过官方的SDK编译下载,需要在buildroot中使能 rockchip-mali
编译完成后会下载到 sdk/external/libmali 目录下
最后会编译到rootfs中
(2)通过 gitee下载
RockChipMirror/libmali - Gitee.com
libmali的命名规则:gpu型号-软件版本-硬件版本(如果有的话,比如说r1p0区分3288和3288w)-编译选项。
要注意编译选项。
- 不带后缀。是x11-gbm,注意gbm是配置drm使用的memory机制,如果不是3.10的kernel,不要用fbdev的。
- gbm。 是给qteglfs这样的程序用的,不依赖x11,wayland。
- wayland。 wayland-gbm, 给wayaland使用
2.3.2、方案二:使用开源的mesa
这种方案要 利用 linux kernel 的 Panfrost 驱动 + userspace 的 mesa 来解锁 3D 图形加速功能。详细参考:在 RK3399 上运行开源的 mali GPU 驱动-腾讯云开发者社区-腾讯云 (tencent.com)。但是这种方案对内核版本有要求,需要在5.2以上,但是瑞芯微提供的4.19的kernel版本还没有支持Panfrost 驱动,需要使用5.10内核版本的
三、Linux图形显示
2. 野火demo 部署运行 — [野火]嵌入式Qt应用开发实战指南—基于LubanCat-RK开发板 文档 (embedfire.com)
Tina_Linux_图形系统_开发指南_linux图形系统-CSDN博客
Wayland与Weston简介_weston wayland-CSDN博客
GPU的使用是需要结合图形显示系统的,对于不同的图形显示系统,GPU驱动库也有所不同,所以要使用GPU必须先了解Linux下的图形显示方式。
linux是一个基于命令行的操作系统,图形界面是一个应用程序(而windows的图形界面是操作系统的一部分)。 Linux中图形显示所涉及的知识,简单框图如下所示:
下面简单介绍一些图形相关的知识,包括内核驱动、图形API接口、显示管理器、窗口管理器、GUI应用工具,桌面环境等等。
3.1. DRM/KMS
Direct Rendering Manager(DRM)子系统用于linux内核显示、图形和合成子系统的管理。 通常使用该框架来控制显示接口和外部显示器(控制分辨率,频率,多屏显示等)、输出画面到显示面板、硬件渲染画面等。
DRM是在内核空间,用户空间使用,通常通过相应的 libdrm 库函数调用, 也可以直接ioctl访问设备文件或者使用sysfs文件DRM驱动通信, 使用OpenGL或Vulkan等图形API的应用程序可以通过这些设备文件与GPU进行交互,以实现硬件加速渲染等。
3.2. libdrm
libdrm库,为DRM驱动ioctl提供了包装函数,避免了将内核接口直接暴露给应用程序, 通过libdrm对显示资源进行统一访问,libdrm将命令传递到内核最终由DRM驱动接管各应用的请求并处理。
libdrm是一个底层库,通常被其他图形驱动程序调用,例如Mesa、X、libva和类似项目。
3.3. OpenGL
OpenGL是一组专门涉及2D和3D图形的硬件加速渲染的规范, 至于内部具体每个函数是如何实现,将由编写OpenGL库的人自行决定,实际通常是GPU的生产商。 OpenGL API实现通常是C语言,也有其他语言的实现,如Java、Golang和Rust等。
OpenGL ES(OpenGL for Embedded Systems)是适用于嵌入式设备的OpenGL规范,针对Android手机和iPhone等嵌入式设备。
EGL 是一个依赖于平台的API, 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口。通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁,且它与平台无关的。
3.4. Vulkan
Vulkan 是一个低开销、跨平台的2D和3D图形与计算的应用程序接口(API),能够跨平台高效访问GPU。
Vulkan的设计目标是提供一个更轻量级、更高效的图形API,以取代OpenGL等传统的图形API。 作为业内开放标准的现代GPU API,开发人员能够编写可移植到多个不同平台的应用程序。
3.5. Mesa
Mesa 也称为Mesa3D和Mesa 3D图形库,是OpenGL、Vulkan和其他图形API规范的开源实现。 Mesa将这些API规范转换为特定于供应商的图形硬件驱动程序。
Mesa项目最初是作为OpenGL规范的开源实现而开始。经过多年来发展,具有跨平台支持、高性能、开源和扩展性等特点,并且该项目已经扩展到实现更多的图形API, 包括OpenGL ES、OpenCL、OpenMAX、VDPAU、VA-API、Vulkan和EGL。
3.6. X Window System
大多数基于Linux的发行版都使用 X Window System (X11,或者简称X) , 它是基于客户端-服务器体系结构,可以在远程环境中使用。
X Window系统基于客户端-服务器体系结构,客户端和服务器可以在同一台机器上也可以不在同一台机器上,就需要一个在客户端和服务器之间传递消息的协议。 X11协议就是负责消息传递,当客户端和服务器在同一台机器上时,消息通过UNIX套接字进行交换,不同机器上通过网络(TCP/IP)
3.7. Wayland
Wayland 是一种显示服务协议,不依赖客户端-服务器体系结构,旨在提供一个现代、 安全的的Linux和其他类Unix操作系统窗口系统取代X Window system,而Weston是Wayland开源显示协议的参考实现
3.8. EGLFS
EGLFS是QT自带的一个平台插件,可以在EGL和OpenGL ES之上运行Qt应用程序,而不需要通过X11或Wayland这样的实际窗口系统。 EGLFS还支持软件渲染窗口,如QWidget的内容使用CPU渲染成图像,然后上传到纹理中,并由插件进行合成。
四、GPU使用
4.1、查看GPU是否启用
cat /sys/devices/platform/fde60000.gpu/devfreq/fde60000.gpu/load
@前面的数值表示gpu占用率,如果一直为0,说明gpu没有用起来
performance:GPU会固定工作在其支持的最高频率上,以追求最高性能。
powersave:GPU会固定工作在其支持的最低频率上,以追求最低的功耗。
userspace:早期的管理策略,系统将变频策略的决策交给了用户态应用程序,并提供相应的接口供其使用。
ondemand:userspace 是用户态的检测,效率低,cur_freq 当前频率
governor 当前工作模式查看GPU频率范围
# cat /sys/class/devfreq/ff9a0000.gpu/available_frequencies
200000000 300000000 400000000 600000000 800000000 查看GPU工作模式
# cat /sys/class/devfreq/ff9a0000.gpu/available_governors
userspace powersave performance simple_ondemand查看GPU最大频率
# cat /sys/class/devfreq/ff9a0000.gpu/max_freq
0查看GPU最大频率
# cat /sys/class/devfreq/ff9a0000.gpu/min_freq
0查看GPU实时工作模式及频率
# cat /sys/class/devfreq/ff9a0000.gpu/trans_stat From : To:200000000300000000400000000600000000800000000 time(ms)
*200000000: 0 0 0 0 119 59866300000000: 68 0 0 0 75 6326400000000: 28 95 0 0 65 24126600000000: 14 23 141 0 11 29833800000000: 9 25 47 189 0 9766
Total transition : 909查看当前GPU load情况
# cat /sys/class/devfreq/ff9a0000.gpu/load
47@200000000Hz注意:
47:当前占用GPU百分比
200000000Hz:当前占用GPU频率
200000000Hz = 200000KHz = 200MHz
4.2、glmark2 跑分
glmark2是一个用于评估OpenGL(图形编程接口)性能的基准测试工具。它可以测试图形处理器(GPU)在处理图形渲染任务时的性能表现。glmark2 工具可以通过SDK编译出来,在rootfs的 rockchip_test 目录下,使用方式如下:
- 显示屏幕跑分:
sh /rockchip_test/gpu/test_glmark2_fullscreen.sh
- 屏幕不显示跑分:
sh /rockchip_test/gpu/test_glmark2_offscreen.sh
4.3、QT图形显示
Qt for Embedded Linux | Qt 5.15
Qt Embedded:简介与平台插件介绍_eglfs-CSDN博客
QT是一种具体的图形窗口,使用不同的平台插件来支持不同的显示后端,一般使用的平台插件有:eglfs(需要OpenGL/EGL图形栈)、linuxfb(帧缓冲区接口)、 wayland和xcb(x11)。EGLFS、wayland平台插件就需要用到GPU
- linuxfb插件是linux标准的显示框架,会打开/dev/fb0节点进行绘图和显示,通过Linux的fbdev子系统直接写入帧缓冲区,不支持硬件渲染,显示性能可能会不好
- eglfs是qt自己实现的一个gui显示插件,eglfs使用opengles/egl进行gpu渲染后,直接送给drm去显示(使用opengles、egl接口,安装gbm或者x11-gbm版的libmali)