在 RK3399 上运行开源的 mali GPU 驱动

2020-01-13 15:47:22 浏览数 (1)

GPU

偶尔会听到有嵌入式 Linux 玩家抱怨自己的开发板:图形界面不够流畅,拖动窗口有卡顿感。

造成这种情况一般由两个原因:

  1. 开发板上主控 SOC 的性能比较弱,没有带 3D 图形加速(即 GPU)功能,比如 i.MX6ULL
  2. 开发板上的 SOC 带了 GPU,但是没有用起来。

第一个原因基本是无解的,如果你选的 SOC上面没有带 GPU,唯一的办法就是尽量去跑轻量级的图形界面,如果想跑 Debian、Ubuntu 这种发行版上默认搭配的 Gnome 或者 KDE,这种没有 GPU 支持,所有的图像合成渲染都要通过 CPU 来运算,是很难跑流畅的。所以如果你对图形显示功能比较看重,在选开发板的时候一定要查阅与之搭配的主控 SOC 是否带有 GPU。

也有很多人被卡在了第二个关卡,SOC 上搭配了强劲的 GPU、比如 RK3399,S912,他们都搭载了 Arm mali GPU,但是 mainline 内核却缺少相应的驱动支持 —— GPU 驱动一般分为两部分:一小部分在 Linux 内核中,另外一大部分在 userspace,在 usercapce 的部分向下操作内核中的驱动,向上对应用层提供标准的 OpenGL 接口,这样各种图形显示相关的应用才能通过标准的 OpenGL API 进行图形渲染加速。

但是 mali GPU IP 提供商 Arm 公司只开放了内核部分驱动,而且这部分驱动还没有按照 linux kernel 的规范以 Drm 的框架去实现,所以它无法被 linux mainline 接受,还有一个更重要的部分,usersapce 部分,Arm 没有开源,只是以库的形式提供给购买了 mali GPU 授权的 SOC 厂商,比如 Rockchip,Amlogic。而且这套代码主要是为 Android 系统设计的,对 Debian、Ubuntu 这种系统的兼容性也不好。

看到这里,也许你就想骂 Arm 了,其实也不能完全怪他们,因为这并不是 Arm 独创的玩法,其他的 GPU 供应商也都这样玩,比如 Nvidia、Vivante、Imagination。大神 Linus 为这事还对 Nvidia 竖过中指呢,怒吼:“Nvidia,F*K you!”

面对这种状况,很多人为了能够利用 GPU 加速,就只能使用 SOC 原厂提供的内核,和他们定制的系统,这种内核和系统一般都比较老。

如果想跑 mainline 的内核,基本就没法使用 GPU 加速了,这也是为什么我们目前看到的大部分开发板如果搭载了 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 开始。

这篇文章主要讲如何在运行 mainline linux kernel 的 RK3399 开发板上开启 GPU 加速:RK3399 集成了 Mali-T860 GPU,所以我们可以利用 linux kernel 的 Panfrost 驱动 userspace 的 mesa 来解锁 3D 图形加速功能。

启动 Panfrost GPU 驱动

  1. 在内核里面启用 Panfrost GPU 驱动

默认编译到内核中或者以模块的形式加载都可以。 关于 mainline linux kernel 在 RK3399 上的适配可以参考:在 RK3399 上部署最新的 Linux 5.4 和 U-Boot v2020 .01 这篇文章。 如果 Panfrost GPU 驱动正常加载,我们会看到类似下面的 Log:

cat /proc/interrupts 可以看到 Panfrost GPU 驱动注册的中断:

gpu 和 job 都是 Panfrost GPU 驱动注册的中断。 左边的数字 112 和 2169 是当前产生的中断的数量。 这个比较重要,我们可以通过观察是否有中断产生来判断 GPU 有没有在工作。

  1. 安装 weston weston 是负责对各种应用绘制的图层进行合成的软件框架,它是按照 Wayland 标准实现的,目标是替代在 Linux PC 端存在了很久的 X11,如果对 Android 图形系统比较了解的话,它相当于 Android 中的 HWC。 因为我在 RK3399 开发板上移植了 Debian 系统,所以可以用 apt install 命令直接安装,不用交叉编译。 apt install weston
  2. 安装 Gnome Gnome 是 Linux 下一款大名鼎鼎的桌面环境,与 KDE 齐名,Ubuntu、Debian 、Fedora 等知名 Linux 发行版都以它为默认桌面。 apt install gnome 如果在安装的过程中弹出了下面的选项,记得选 gdm3
  1. GDM 允许 root 登录 GDM 是 Gnome Display manager 的缩写,提供 Gnome 环境下的登录管理功能,默认禁止以 root 身份登录,所以如果要想以 root 身份登录桌面系统,需要做如下修改: 在 /etc/pam.d/gdm-password 文件中屏蔽如下内容: #auth required pam_succeed_if.so user != root quiet_success 其实到这里,我们已经可以在 RK3399 上使用 Debian 桌面系统了,但是你会发现并没有那么流畅,因为 GPU 还没有真正的使用起来,通过以下方法可以快速判断 GPU 有没有在工作:
    • cat /proc/interrupts 查看 jpu 和 job 产生的中断数量,如果 gpu 在工作,会频繁产生中断
    • 运行 top 命令,观察 cpu 利用率,如果 GPU 没工作,所有的图像渲染靠 CPU,CPU 占用率会高。
  2. 安装依赖 前面有讲到,GPU 驱动分两部分,一部分在内核中,我们已经启动了,另外还有一个重要的部分在 userspace 中,对于 Panfrost GPU 驱动来说,它叫做 mesa。mesa 不能直接安装,我们需要在 RK3399开发板上编译。 首先要安装一些依赖库: sudo apt install flex bison python3-mako libwayland-egl-backend-dev libxcb-dri3-dev libxcb-dri2-0-dev libxcb-glx0-dev libx11-xcb-dev libxcb-present-dev libxcb-sync-dev libxxf86vm-dev libxshmfence-dev libxrandr-dev libwayland-dev libxdamage-dev libxext-dev libxfixes-dev x11proto-dri2-dev x11proto-dri3-dev x11proto-present-dev x11proto-gl-dev x11proto-xf86vidmode-dev libexpat1-dev libudev-dev gettext mesa-utils xutils-dev libpthread-stubs0-dev ninja-build bc python-pip flex bison cmake git valgrind llvm llvm-8-dev python3-pip pkg-config zlib1g-dev wayland-protocols meson
  3. 编译安装 libdrm libdrm 是一个封装了和 Linux Kernel DRM 驱动交互的 api 库。 git clone git://anongit.freedesktop.org/mesa/drm cd drm meson build --prefix=/usr ninja -C build sudo -E ninja -C build install cd ..
  4. 编译安装 mesa mesa 中实现了 Panfrost GPU 驱动的 userspace 部分,它向下操作内核中的 GPU 驱动,向上提供标准的 opengl 接口供各种绘图应用使用。 git clone git://anongit.freedesktop.org/mesa/mesa cd mesa meson -Ddri-drivers= -Dvulkan-drivers= -Dgallium-drivers=panfrost,kmsro -Dlibunwind=false -Dprefix=/usr build/ ninja -C build/ sudo ninja -C build/ install
  5. 编译安装 SDL 如果想运行一些模拟器之类的游戏,比如 supertuxkart 可能会用到这个库。 git clone https://github.com/SDL-mirror/SDL.git cd SDL mkdir build cd build cmake ../ make -j6 sudo make install

到这里所有 GPU 相关的软件都安装完了,重启系统,登录图形桌面,就可以把 GPU 用起来了。

运行 Glmark2 测试

Glmark2 是一款比较出名的 GPU benchmark 测试程序,支持 OpenGL 2.0 和 OpenGL ES 2.0。在 Ubuntu 系统上可以直接通过 apt install 命令安装,在 Debian 系统上需要通过源码编译:

代码语言:javascript复制
 apt install libjpeg62-turbo-dev libpng-dev
 git clone https://github.com/glmark2/glmark2.git
 cd glmark2/
 ./waf configure --with-flavors=drm-gl,drm-glesv2,wayland-gl,wayland-glesv2
 ./waf
 ./waf install

运行 glmark2-es-wayland 命令即可进行测试。

下面是我在 RK3399 Leez P710 开发板上测试的录屏,可能会感觉不够流畅,这是因为这个录屏软件是靠 CPU 进行软编码,严重拖累了整个系统的性能。

参考资料

《MaliGraphics》https://wiki.debian.org/MaliGraphics

《ARM Mali GPU》https://en.opensuse.org/ARM_Mali_GPU

0 人点赞