GPU

OpenGL 与 QpenGL ES

OpenGL(Open Graphics Library)是一个跨语言,跨平台的应用程序接口,提供2D,3D图形渲染接口,操作在GPU之上,实现硬件加速渲染。OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,各显卡制造商和系统制造商来实现这组 API。

两者主要区别如下:

  1. 目标平台:

OpenGL:主要用于桌面平台,如Windows、macOS和Linux。它针对的是高性能图形处理,需要较强的硬件支持,一般嵌入式设备都不支持OpenGL,除非GPU厂家有针对性的适配。

OpenGL ES:专为嵌入式系统和移动设备(如智能手机、平板电脑和车载系统)设计,适用于资源有限的硬件环境。目前瑞芯微系列的所有开发板,带GPU的芯片,都只支持 OpenGLES,不支持OpenGL

  1. 功能和特性:

OpenGL:提供了更全面和强大的图形渲染功能,包括更丰富的高级功能和扩展。

OpenGL ES:是OpenGL的简化版,删除了一些复杂和不常用的功能,以减少资源占用和提升性能。例如,OpenGL ES不支持某些OpenGL的固定功能管线特性,更倾向于使用可编程管线。由于这些原因,OpenGL ES 是无法兼容 OpenGL 的应用程序的,故不要再将PC的上OpenGL应用,直接移植到开发板上运行。

WebGL

WebGL(Web Graphics Library)是一个JavaScript API,用于在网页中渲染2D和3D图形。WebGL基于OpenGL ES 2.0,专为在浏览器中使用而设计,无需在系统中再安装任何插件。

开发说明

XNIUPI系列主板支持OpenGL ES 2.0,但是不支持OpenGL。

OpenGL

由于开发板不支持OpenGL,所以如果在开发板上运行OpenGL的程序会出现以下两种情况

  1. 程序能运行,但是是调用了CPU处理 相当于所有 3D 和 2D 图像都由 CPU 绘制,会出现 CPU 占用高或者卡顿现象,典型的案例就是在系统上运行 glmark2,glmark2 是针对OpenGL标准环境测试工具,运行该工具可以测试当前系统是否支持OpenGL调用GPU。如果系统不支持OpenGL调用GPU,而系统上又存在libGL标准库,则会调用CPU进行渲染,如下log信息:

$ glmark2
libGL error: failed to create dri screen
libGL error: failed to load driver: rockchip
libGL error: failed to create dri screen
libGL error: failed to load driver: rockchip
** GLX does not support GLX_EXT_swap_control or GLX_MESA_swap_control!
** Failed to set swap interval. Results may be bounded above by refresh rate.
=======================================================
    glmark2 2023.01
=======================================================
    OpenGL Information
    GL_VENDOR:      Mesa/X.org
    GL_RENDERER:    llvmpipe (LLVM 12.0.0, 128 bits) #软件渲染器
    GL_VERSION:     3.1 Mesa 21.2.6
    Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=32 stencil=0 samples=0
    Surface Size:   800x600 windowed
=======================================================
** GLX does not support GLX_EXT_swap_control or GLX_MESA_swap_control!
** Failed to set swap interval. Results may be bounded above by refresh rate.
[build] use-vbo=false:

从 log 信息中可以看出,libGL 有报错找不到 rockchip 的driver,是因为瑞芯微的GPU没有适配 libGL,故调用失败,继而使用软件渲染器 (llvmpipe)来渲染,而不是GPU。

  1. 程序不能运行,提示找不到库文件 由于芯片不支持OpenGL,所以我司在适配系统的时候,会将 OpenGL的一些库文件删除掉,防止占用不必要的空间,如下log:

$ glmark2
Error: GLX version >= 1.3 is required
Error: Error: Couldn't get GL visual config!
Error: main: Could not initialize canvas

当提示找不到 GLX 的时候,可以重新安装 libgl1-mesa-dri 恢复库文件,但是注意,即使恢复库文件了,也是和第一种情况一样,调用软件渲染器渲染。

sudo apt-get install --reinstall libgl1-mesa-dri

综上所述:如果客户需要使用OpenGL渲染的3D或2D图形是很简单的,不是很复杂,而且CPU有充足的空闲率,可以使用OpenGL来渲染,否则不推荐使用OpenGL。

OpenGL ES

系统默认适配了 OpenGL ES,OpenGL ES 的开发一般可以使用 EGL、SDL 或 QT 等,确认当前系统 OpenGL ES 环境是否正常可以使用如下方法:

  1. 运行 glmark2-es2 在瑞芯微平台上,如果运行glmark2-es2 时,提示 arm_release_ver: g13p0-01eac0, rk_so_ver: 10 ,表示调用到了瑞芯微GPU库文件,提示 GL_RENDERER: Mali-G610, 表示读取当当前 GPU 型号为 Mali-G610,GL_RENDERER 在不同的芯片上,会读取到不同的型号,但只要不是 llvmpile 就行。

$ glmark2-es2
arm_release_ver: g13p0-01eac0, rk_so_ver: 10  # 表示调用到了RK的GPU库文件
=======================================================
    glmark2 2023.01
=======================================================
    OpenGL Information
    GL_VENDOR:      ARM
    GL_RENDERER:    Mali-G610  # GPU 型号: Mali-G610
    GL_VERSION:     OpenGL ES 3.2 v1.g13p0-01eac0.68603db295fbf2c59ac6b927fdfb1c32
    Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0
    Surface Size:   800x600 windowed
=======================================================
[build] use-vbo=false:
  1. 运行 es2_info 运行之前先安装如下工具

sudo apt-get install mesa-utils-extra

然后运行 es2_info 打印 OpenGL ES 的所有上下文信息:

$ es2_info 
arm_release_ver: g13p0-01eac0, rk_so_ver: 10   # 调用到rk GPU 库文件
EGL_VERSION: 1.4 Valhall-"g13p0-01eac0"
EGL_VENDOR: ARM
EGL_EXTENSIONS:
    EGL_NV_context_priority_realtime, EGL_KHR_image_pixmap, 
    EGL_KHR_partial_update, EGL_EXT_image_dma_buf_import, 
    EGL_KHR_config_attribs, EGL_KHR_image, EGL_KHR_image_base, 
    EGL_KHR_fence_sync, EGL_KHR_wait_sync, EGL_KHR_gl_colorspace, 
    EGL_KHR_get_all_proc_addresses, EGL_IMG_context_priority, 
    EGL_KHR_no_config_context, EGL_EXT_image_dma_buf_import, 
    EGL_EXT_image_dma_buf_import_modifiers, EGL_EXT_yuv_surface, 
    EGL_EXT_pixel_format_float, EGL_ARM_pixmap_multisample_discard, 
    EGL_ANDROID_native_fence_sync, EGL_KHR_gl_texture_2D_image, 
    EGL_KHR_gl_renderbuffer_image, EGL_KHR_create_context, 
    EGL_KHR_surfaceless_context, EGL_KHR_gl_texture_cubemap_image, 
    EGL_EXT_image_gl_colorspace, EGL_EXT_create_context_robustness
EGL_CLIENT_APIS: OpenGL_ES
GL_VERSION: OpenGL ES 3.2 v1.g13p0-01eac0.68603db295fbf2c59ac6b927fdfb1c32
GL_RENDERER: Mali-G610    # GPU 型号
GL_EXTENSIONS:
    GL_ARM_rgba8, GL_ARM_mali_shader_binary, GL_OES_depth24, 
    GL_OES_depth_texture, GL_OES_depth_texture_cube_map, 
    ......

QTOpenGL

我司默认重新交叉编译了 QT 库文件,可以支持 OpenGL ES,使用 QT 调用 GPU 可以参考 QT 官方 demo 和文档

sudo apt-get install qtbase5-examples

然后运行qtdemo

/usr/lib/aarch64-linux-gnu/qt5/examples/opengl/textures/textures

如果 QT demo 运行失败,请更新到最新的文件系统或联系技术支持。

文件系统版本确认,开发板上执行 release_version 指令 提供对应的打印

release_version

WebGL

目前瑞芯微平台上仅 chrome 浏览器适配了 WebGL,系统默认安装了 chrome 浏览器,打开浏览器,在浏览器地址栏中输入 chrome://gpu 可以查看GPU相关信息。