本文中涉及到产品的实际操作,该操作都是再盈鹏飞嵌入式AHD-X527主板上进行执行,AHD-X527介绍如下:
AHD-X527产品特性:
2.1、GPU简介 GPU提供了一个基于开放标准的完整图形加速平台,支持2D/3D图形渲染硬件加速。GPU的作用是为计算机系统提供强大的图形处理和计算能力,能够处理大量的图形数据并进行高效的计算,从而实现各种应用的图形渲染、数据处理和加速等功能。T527是使用Mali-G57,支持OpenGL ES1.1/2.0/3.0,Vulkan 以及OpenCL。和Rk356x系列使用的虽有区别,但是性能区别不大。Rk356x是使用Mali-G52,支持OpenGL ES1.1/2.0/3.0,Vulkan 以及OpenCL。 这里不得不提RK3576,RK3576也是8核处理器,它使用大小核异构形式,RK3576虽然也是使用Mali-G52,但是它是使用G52 MC3。
注意看下G57 可以跑到850Mhz, 后续介绍T527 GPU 使用的时候,全部把这个限制在700MHZ 。 以下是RK3576 的GPU 的具体参数
RK3576 的处理单元是3 个,而T527 的处理单元只有一个。T527 的Pixelfillrate 是1.7G ,而RK3576 是5.1G 。看似小小的区别,其实区别很大。 当然了,如果是GPU的代差上看,RK3576是老了一代,Mali其实是ARM的Mali系列IP核,ARM maligpu目前有四大架构,每一代架构在性能上都有提升和更高效的能耗管理: (1)第一代微架构Utgard(北欧神话人物:乌特加德),2007年推出,主要系列有:mali-200, mali-400, mali-450, mali-470 (2)第二代微架构Midgard(北欧神话人物:米德加德),主要系列有:mali-t6xx, mali-t7xx, mali-t8xx (3)第三代微架构Bifrost(北欧神话中连接天宫和大地的:彩虹桥),2016年推出,主要系列有:mali-g31, mali-g51, mali-g71, mali-g52, mali-g72, mali-g76 (4)第四代微架构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公司已经承认了他们,并与他们合作了),然后重写了针对 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驱动 (闭源的驱动可以通过下面途径获取到) (1) 通过ARM官方的SDK编译下载,需要在buildroot中使能 valhall-mali,
(全志公司已经编译好了,不需要我们再编译了,并且已经集成到了SDK中)
GPU库看似只能选择wayland/和fbdev,但是实际上在配置脚本中可以看到KMS选项,需要去掉BR2_PACKAGE_WAYLAND/ BR2_PACKAGE_WESTON_DRM,才可以选择KMS。 config BR2_PACKAGE_GPU_UM_PUB_DEFAULT_KMS
bool "kms(gbm + drm)"
depends on !BR2_PACKAGE_WAYLAND && !BR2_PACKAGE_WESTON_DRM
最后会全志编译好的库复制到rootfs中,以下是支持wayland的库,也有支持KMS的库。 ping@embfly-server:/sda7/allwinner_a527/A527_Tina5.0_AIOT_V1.4.6/1.SDK/A527_Tina5.0_AIOT_V1.4.6/tina/platform/allwinner/display/libgpu/mali-g57/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/wayland/aarch64-none-linux-gnu/lib64$ tree -L 2
.
├── cl
│ ├── libOpenCL.so -> libOpenCL.so.2
│ ├── libOpenCL.so.2 -> libOpenCL.so.2.1.0
│ └── libOpenCL.so.2.1.0
├── egl
│ ├── libEGL.so -> libEGL.so.1
│ ├── libEGL.so.1 -> libEGL.so.1.4.0
│ └── libEGL.so.1.4.0
├── gbm
│ ├── libgbm.so -> libgbm.so.1
│ ├── libgbm.so.1 -> libgbm.so.1.0.0
│ └── libgbm.so.1.0.0
├── gles1
│ ├── libGLESv1_CM.so -> libGLESv1_CM.so.1
│ ├── libGLESv1_CM.so.1 -> libGLESv1_CM.so.1.1.0
│ └── libGLESv1_CM.so.1.1.0
├── gles2
│ ├── libGLESv2.so -> libGLESv2.so.2
│ ├── libGLESv2.so.2 -> libGLESv2.so.2.1.0
│ └── libGLESv2.so.2.1.0
├── mali
│ ├── libmali.so -> libmali.so.0
│ ├── libmali.so.0 -> libmali.so.0.32.0
│ └── libmali.so.0.32.0
├── vulkan
│ ├── libvulkan.so -> libvulkan.so.1
│ ├── libvulkan.so.1 -> libvulkan.so.1.3.296
│ └── libvulkan.so.1.3.296
├── vulkan_wsi
│ └── libVkLayer_window_system_integration.so
└── wayland-egl
├── libwayland-egl.so -> libwayland-egl.so.1
├── libwayland-egl.so.1 -> libwayland-egl.so.1.0.0
└── libwayland-egl.so.1.0.0
其实,这些库是有版本的,只是全志把他们封闭起来了,参考RK_libmali的命名规则:gpu型号-软件版本-硬件版本(如果有的话,比如说r1p0区分3288和3288w)-编译选项。 注意gbm是配置drm使用的memory机制,如果不是3.10的kernel,不要用fbdev的。 (1)gbm:是给qt+eglfs这样的程序用的,不依赖x11,wayland。 (2)wayland: 给wayland使用。 (3)X11:是给xorg使用的。 2.3.2、方案二:使用开源的mesa
这种方案要利用 linux kernel 的 Panfrost 驱动 + userspace 的 mesa 来解锁 3D 图形加速功能。但是这种方案对内核版本有要求,需要在5.2以上,但是瑞芯微提供的4.19的kernel版本还没有支持Panfrost 驱动,需要使用5.10内核版本的 进一步深究,这个mesa库编译出来库都有什么呢?以下是编译出来的内容: ├── 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的,只是支持的代数不一样而已)。T527平台就是选择的panfrost驱动。同时我们也可以看到libGLESv2.so/libGL.so/ libEGL.so/ libgbm.so等身影,其实他们和ARM官方提供库名字是一致的。不过ARM官方提供的功能更全,而mesa只能算是阉割版本。
|