前言

图形性能,是这段时间我的主要工作内容,需要尽可能发掘性能优化点, 对于OpenGL、3D加速相关的话题我们在另外的文章中聊。

由于GTK3+已经全面使用Cairo来绘图, GTK2+中也有大量使用Cairo, Cairo在2D绘图方面应用颇广,比如firefox,Cairo绘图性能的重要性不言而喻,Cairo的性能提升可能是一个关键突破点,前端时间曾将gtkperf工具一直到GTK3+环境中,测试结果发现画线和画圆的性能相比GTK2+来说,差了很多,Cairo中的绘图性能应该有较大的提升空间,相关话题在其他文章中继续聊。

这里仅关注Cairo的DRM后端,关注DRM后端是源于Intel某专家(是Cairo的最初贡献者)的一个PPT,根据他做的过试验,使用Cairo DRM后端能提升很大的性能,而使用gl和egl后端,相对与xlib来说,性能反而下降不少。

先不论环境差异以及具体原因,对于我们来说Cairo的DRM的后端都值得一试,但是查看相关代码和说明,DRM后端一直处于experimental状态(gl后端也一样),说明可能不稳定,问题可能很多,但没关系了,只要有代码就好办,只是时间问题。

但经过后期的实践,证明问题比想象中的还多,Intel和AMD在这方面投入恨少,基本处于不维护的状态。

闲话不多说了,开始正题吧。

Cairo重新编译

如前面所说,DRM后端目前作为experimental的后端,并没有在Cairo中默认启用,需要打开相应的编译选项,重新编译Cairo。

编译选项为–enable-drm,在configure时加上即可,看起来比较简单明了,但实际操作起来问题多多,原因还是drm模块中的代码问题太多。

打开选项后开始编译,便发现intel显卡相关的drm代码报错,而且很多错误,有些简单的是头文件包含问题,复杂的还涉及代码逻辑问题,尝试解决了一番,但由于错误太多,最终还是放弃了。

由于我的环境用的是AMD显卡,也不会针对Intel显卡调优,于是决定将intel相关的代码都删掉,然后重新生成Makefile,重新编译,但这个过程也很不顺利,由于需要修改Makefile.in文件,导致需要用到automake重新生成,但automake开始报版本错误,更新版本后,又报版本太老的错误,重新更新,折腾反复了几次,还是不行。

然后采用autoreconf重新配置了一下,没有报automake版本的问题,但是编译过程中总是有未定义符号,开始以为是头文件问题,但确认头文件都是包含的,而且相应的库(静态)都已经生成了,还是不行。

尝试修改各目录的Makefile,加上rpath将相关的静态库重新编译为动态库,编译到最后一步,还是报符号错误,哎,坑太大,实在跨不过去。不得不重新思考,变换思路。这次决定不修改makefile了,而仅将所有的intel相关的代码文件内容注释掉,这次仍然是未定义符号的问题。

再次变换思路,在注释掉Intel代码的基础上,依赖rpmbuild重新编译,因为印象中之前用rpmbuild是编译成功过的,结果果然成功了,原因应该还在于rpm包的spec文件中做了几步libtool和cflag设置的操作,具体原因不详,暂时没时间研究了,待后续考证吧。

效果

DRM后端效果的验证,需要依赖于cairo-perf-trace工具,这个工具也比较坑,具体另外再聊了。

目前验证的结果是不停的有段错误、断言错误等,坑实在多,只能慢慢分析解决了。