Linux aarch64交叉编译之 mesa图形库

网友投稿 851 2022-09-03

Linux aarch64交叉编译之 mesa图形库

对于mesa的交叉编译。该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,接下来就开始趟坑。老套路,先把linux桌面版搞好,然后 移植到嵌入式Linux Debian 板子上。

1 mesa简介

Mesa 3D是一个在MIT许可证下开放源代码的三维计算机图形库,以开源形式实现了OpenGL的应用程序接口。OpenGL的高效实现一般依赖于显示设备厂商提供的硬件,而Mesa 3D是一个纯基于软件的图形应用程序接口。由于许可证的原因,它只声称是一个“类似”于OpenGL的应用程序接口。

简而言之,mesa就是一套OpenGL标准的实现库,接口都是一样的。

附上mesa的github项目下载地址:​​GitHub - projectmesa/mesa: Mesa​​

2 Linux 本地编译 & 交叉编译

2.1 Linux(ubuntu20.04)上mesa的编译

mesa是使用meson进行编译的,根据README.md的提示,编译关键步骤如下:

$meson build$ninja -C build$ninja -C build install

这里关于安装位置,可以通过--prefix=具体路径来设置。mesa编译后生成的是就是我们常见的OpenGL 的那种库,如下所示:

├── dri│ ├── armada-drm_dri.so│ ├── asahi_dri.so│ ├── etnaviv_dri.so│ ├── exynos_dri.so│ ├── hx8357d_dri.so│ ├── i830_dri.so│ ├── i915_dri.so│ ├── i965_dri.so│ ├── ili9225_dri.so│ ├── ili9341_dri.so│ ├── imx-dcss_dri.so│ ├── imx-drm_dri.so│ ├── ingenic-drm_dri.so│ ├── kgsl_dri.so│ ├── kms_swrast_dri.so│ ├── lima_dri.so│ ├── mcde_dri.so│ ├── mediatek_dri.so│ ├── meson_dri.so│ ├── mi0283qt_dri.so│ ├── msm_dri.so│ ├── mxsfb-drm_dri.so│ ├── nouveau_vieux_dri.so│ ├── panfrost_dri.so│ ├── pl111_dri.so│ ├── r200_dri.so│ ├── r300_dri.so│ ├── r600_dri.so│ ├── r600_drv_video.so│ ├── radeon_dri.so│ ├── repaper_dri.so│ ├── rockchip_dri.so│ ├── st7586_dri.so│ ├── st7735r_dri.so│ ├── stm_dri.so│ ├── sun4i-drm_dri.so│ ├── swrast_dri.so│ ├── v3d_dri.so│ ├── vc4_dri.so│ ├── virtio_gpu_dri.so│ └── zink_dri.so├── libEGL.so -> libEGL.so.1├── libEGL.so.1 -> libEGL.so.1.0.0├── libEGL.so.1.0.0├── libgbm.so -> libgbm.so.1├── libgbm.so.1 -> libgbm.so.1.0.0├── libgbm.so.1.0.0├── libglapi.so -> libglapi.so.0├── libglapi.so.0 -> libglapi.so.0.0.0├── libglapi.so.0.0.0├── libGLESv1_CM.so -> libGLESv1_CM.so.1├── libGLESv1_CM.so.1 -> libGLESv1_CM.so.1.1.0├── libGLESv1_CM.so.1.1.0├── libGLESv2.so -> libGLESv2.so.2├── libGLESv2.so.2 -> libGLESv2.so.2.0.0├── libGLESv2.so.2.0.0├── libGL.so -> libGL.so.1├── libGL.so.1 -> libGL.so.1.2.0├── libGL.so.1.2.0├── libxatracker.so -> libxatracker.so.2├── libxatracker.so.2 -> libxatracker.so.2.5.0├── libxatracker.so.2.5.0└── pkgconfig

说明:这里dri目录下的内容是和平台相关的(比如i915是intel的,lima和panfrost是mali的,只是支持的代数不一样而已。当然,如果该GPU比较新 比如G610这种的,mesa如果不支持会使用swrast驱动来使用CPU模拟绘制 同时 性能会大幅度下降)。如果涉及嵌入式Linux的移植,一般这种dri驱动 留一个即可。

2.2 aarch64交叉编译与移植

2.2.1 交叉编译

因为是用aarch64交叉编译,需要提前配置环境,安装如下软件:

sudo apt install binutils-aarch64-linux-gnu-dbg binutils-aarch64-linux-gnu cpp-aarch64-linux-gnu \g++-10-aarch64-linux-gnu g++-9-aarch64-linux-gnu g++-aarch64-linux-gnu g++ \gcc-10-aarch64-linux-gnu-base gcc-9-aarch64-linux-gnu-base gcc-aarch64-linux-gnu \pkg-config-aarch64-linux-gnu qemu-efi-aarch64 gcc arch-test

构建一个sysroot路径需要用到的aarch64虚拟机,方式如下:

#创建一个虚拟fs文件系统$sudo qemu-debootstrap --arch arm64 bullseye /mnt/data/arm64 chroot /mnt/data/arm64/#退出文件系统$exit

在mesa目录下构建一个arm64文件,内容如下:

[binaries]c = 'aarch64-linux-gnu-gcc'cpp = 'aarch64-linux-gnu-g++'ar = 'aarch64-linux-gnu-gcc-ar'strip = 'aarch64-linux-gnu-strip'pkgconfig = 'aarch64-linux-gnu-pkg-config'ld = 'aarch64-linux-gnu-ld'pcap-config = ''cmake = 'cmake'[properties]skip_sanity_check = truesys_root = '/mnt/data/arm64'# Generate binaries that are portable across all Armv8 machinesplatform = 'generic'pkg_config_libdir ='/mnt/data/arm64/usr/lib/aarch64-linux-gnu/pkgconfig:/mnt/data/arm64/usr/share/pkgconfig'[built-in options]c_args = ['--sysroot', '/mnt/data/arm64']c_link_args = ['-Wl,-rpath', '/mnt/data/arm64/usr/lib/aarch64-linux-gnu/', '-Wl,--as-needed'][host_machine]system = 'linux'cpu_family = 'aarch64'cpu = 'armv8-a'endian = 'little'

之后在mesa目录下执行:

$meson build --cross-file arm64.txt $ninja -C build$ninja -C build install

注意:这个时候编译有可能出现各种缺库的问题,和之前编译weston时一样,我们需要执行:

$sudo chroot /mnt/data/arm64/$apt search [缺的库 关键字检索]$apt-file search [缺少的头文件之类的关键字检索]$apt install [相关的库]

2.2.2 解决移植中的库链接问题

通过前面的操作,编译成功后可以将mesa其移动到debian开发板上(注意:开发版的库 需要和 虚拟机运行时缺少的库作同步)。但是这时候发现会有很多链接的错误,找不到库,我们这样调整

mesa在链接库的时候走search_paths变量,因此我们的思路就是调整search_paths变量,mesa的配置文件meson_options.txt,修改内容如下:

diff --git a/meson_options.txt b/meson_options.txtindex 33471f0..95c47bb 100644--- a/meson_options.txt+++ b/meson_options.txt@@ -467,3 +467,10 @@ option( value : true, description : 'use msse2 flag for mingw x86. Default: true', )+option(+ 'x-default-drv-dir',+ type: 'string',+ value: 'default',+ description: 'x define for different moduledir path'+)

接下来修改weston配置文件meson.build,将dri-search-path替换成x-default-drv-dir,如下所示:

diff --git a/meson.build b/meson.buildindex 0c3d0c7..4d8b589 100644--- a/meson.build+++ b/meson.build@@ -83,7 +83,8 @@ dri_drivers_path = get_option('dri-drivers-path') if dri_drivers_path == '' dri_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'dri') endif-dri_search_path = get_option('dri-search-path')+#dri_search_path = get_option('dri-search-path')+dri_search_path = get_option('x-default-drv-dir') if dri_search_path == '' dri_search_path = dri_drivers_path endif

修改好代码后,这次我们重新编译,执行meson时候多了一个宏的设置,详细如下:

$meson build --prefix=[交叉编译输出路径] \-Dx-default-drv-dir=[开发板 库路径] \--cross-file arm64.txt $ninja -C build$ninja -C build install

之后编译出来的库文件放到开发板对应位置就可以使用啦~。当然这里dri的库 需要根据开发板实际情况调整(比如 RK3399的板子,GPU是T860,拷贝panfrost_dri.so即可,其他的可以不用拷贝)。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:撬动流量与话语权的秘诀:事件营销!
下一篇:Python 把图片拆分成宫格图片组
相关文章

 发表评论

暂时没有评论,来抢沙发吧~