1 下载xserver

从 Rockchip github git 仓库下载源代码:

git clone https://github.com/rockchip-linux/xserver.git

1.1 rockchip-1.8分支

此分支用于 Rockchip Debian SDK,可以轻松地在 Debian 中使用它。当前的 xserver 版本与 Debian stretch 版本匹配。但是如果使用了 Debian stretch 存储库并从中使用 x 驱动程序(比如fbdev),那么它可以很好地与 Debian Jessie 一起工作。


2 性能

2.1 不使用glamor

200000 reps @ 0.0066 msec (151000.0/sec): 1x1 opaque stippled rectangle (8x8 stipple) 
40000 reps @ 0.0286 msec ( 34900.0/sec): 10x10 opaque stippled rectangle (8x8 stipple)
720 reps @ 1.5920 msec ( 628.0/sec): 100x100 opaque stippled rectangle (8x8 stipple)
30 reps @ 43.3108 msec ( 23.1/sec): 500x500 opaque stippled rectangle (8x8 stipple)

2.2 使用glamor

20000 reps @ 0.0634 msec ( 15800.0/sec): 1x1 tiled rectangle (4x4 tile) 
20000 reps @ 0.0590 msec ( 16900.0/sec): 10x10 tiled rectangle (4x4 tile)
10800 reps @ 0.1326 msec ( 7540.0/sec): 100x100 tiled rectangle (4x4 tile)
600 reps @ 1.8001 msec ( 556.0/sec): 500x500 tiled rectangle (4x4 tile)

随着点的线性增长,当使用 glamor 时,耗时并却没有线性增长。

2.3 检查是否使用glamor

cat /var/log/Xorg.0.log | grep glamor

如果显示“glamor initialized”,则表示已启用加速。

2.4 无法使用的原因

  • 内核空间 gpu 驱动程序与用户空间(libmali)不兼容。
  • 与 mesa-egl、mesa-gles 冲突。删除它们或确保 libmali 处于高优先级。
  • 错误依赖。尝试将 libepoxy 更新到1.31。

3 如何构建xserver

3.1 在PC主机上交叉编译

建议使用 Debian 构建系统来构建 xserver,否则将很难解决依赖性问题。可以参考 Debian Package Maintainer Manuel 来了解更多信息。(更新:现在支持使用 docker 构建xserver,请参见 ​​here​​)

  1. 安装 xserver 的所有构建依赖项。
  2. 安装 mali 库和开发文件。必须使用 Rockchip 的版本。
  3. 进入 xserver 目录。
  4. 使用 Debian 构建工具进行构建。

3.2 本地构建

apt-get build-dep xserver-xorg

4 如何调试xserver

需要为 xserver-core 安装一个调试包:xserver-xorg-core-dbg_1.18.4-1_armhf.deb。

另外,可能涉及 Mesa/GL 库,安装 libgl1-mesa-dri-dbg 和 libgl1-mesa-glx-dbg 可能有帮助。

apt-get install gdb libc6-dbg
gdb -p $(pidof X)
(inside gdb)
set logging overwrite on
set logging on
break xorg_backtrace
continue
(X server is stopped from when gdb is attached until "continue" is typed)
(do whatever caused the problem)
bt full
set logging off
quit

在此之后,在启动 gdb 的目录中可以在 gdb.txt 文件获得 gdb 输出(这是日志命令所做的,另一个解决方案是自己复制粘贴输出)。将所有这些添加到 bug 报告中,开发人员会很感激的。如果回溯很小,您可能会错过几个调试包,见上文。

更多信息请看 ​​here​​。

不截获信号

默认情况下,X 服务器将截获信号,例如截获自己的崩溃信息,并在 /var/log/Xorg.0.log 中转储堆栈跟踪。但是这个堆栈跟踪是由信号处理程序本身修改的。要禁用此信号拦截,请将其添加到 /etc/X11/xorg.conf 文件:

Section "ServerFlags"
Option "NoTrapSignals" "true"
EndSection

然后重启 X 服务器。