qt与egl的那些事儿

目录

缘起

[qt 安装命令](#qt 安装命令)

[gl egl信息查询](#gl egl信息查询)

gl和egl基本概念及应用

eglinfo命令查询

es2info

egl测试工具

glmark2-es2

X11与wayland

[X11 structure in Linux OS](#X11 structure in Linux OS)

[Wayland structure in Linux OS](#Wayland structure in Linux OS)

[SOC 的支持情况](#SOC 的支持情况)

查看系统

开发EGL程序

基于已有QT环境

带EGL配置编译qt

源码下载

参数配置

安装依赖

configure配置

总结

参考资料


缘起

为什么要记录?

1) 因为太多soc不支持OPENGL ,而仅支持egl。

2) 还有些平台不支持X11,只支持wayland。

于是我们采用GPU时可能存在问题。

qt 安装命令

1)Kylin V10 SP1软件源中提供的Qt框架版本为 5.15.13 ,这是一个 LTS 版本

复制代码
$ sudo apt update
$ sudo apt install build-essential git gdb cmake
$ sudo apt install qt5-default qtcreator

其中 qt5-default 包中主要包括:

  • qtbase: Qt 基础模块的集合,比如 widgets, Gui 等;
  • qmake: qmake 是 Qt 项目的构建工具,通过 qmake 将 .pro 文件生成 make 文件,进而完成项目的编译;

2) qt 版本查询

复制代码
qmake -v
  1. 例程运行

    sudo apt-get install qtbase5-examples

以下命令在桌面运行时,可以看到图形在转动。同时在系统下可以看到GPU占用率。

复制代码
/usr/lib/aarch64-linux-gnu/qt5/examples/opengl/textures/textures

GPU占用率信息

复制代码
cat /sys/class/misc/mali0/device/work_state
---------Vendor GPU Info---------
Frequency                :200000(kHz)
Voltage                  :810000(uV)
Utilization              :31(percent)
Power Status             :power up

gl egl信息查询

gl和egl基本概念及应用

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

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

功能和特性:

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

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

比如 瑞芯微、海思、芯动显卡等仅仅支持GL ES。

如第一章安装命令及examples的测试命令,在上述三平台上运行时,是看不到图形的,虽然可以看到GPU实际的占用率,由于例程采用了GL。

eglinfo命令查询

习惯用的glxinfo命令查询不到egl 的硬件支持情况。通过eglinfo查询出硬件支持情况。示例如下。

复制代码
GBM platform:
eglinfo: eglInitialize failed

Wayland platform:
EGL API version: 1.4
EGL vendor string: ARM
EGL version string: 1.4 Bifrost-"r35p0-01eac0"
EGL client APIs: OpenGL_ES
EGL extensions string:

es2info

复制代码
sudo apt-get install mesa-utils-extra

$ 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, 

GL_VERSION: OpenGL ES 3.2 v1.g13p0-01eac0.68603db295fbf2c59ac6b927fdfb1c32
GL_RENDERER: Mali-G610    # GPU 型号

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

在许多项目需求中,需要明确是否支持WEBGL2,可以在环境中通过上述命令确认

egl测试工具

apt install glmark2-es2-wayland 此测试只有在wayland环境中能用。

补充测试实际数据

apt install glmark2-es2-drm

glmark2-es2

此工具可以在X11上运行。但是这个工具在统信UOS操作系统上安装起来比较麻烦。默认的源没有此安装包。

复制代码
 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

以上几个测试程序都会输出测试用的GPU信息,如果环境不支持GPU ,而采用CPU渲染,则会用例如softpipe等。对于瑞芯微、海思等平台 这就是表示没有配置好,因为这些平台本身是支持GPU的

X11与wayland

X11 structure in Linux OS

Wayland structure in Linux OS

SOC 的支持情况

|--------|-------------------------------|-----------------------------------------------------------|
| | | |
| RK3288 | Mali-T760 GPU | wayland, gbm , x11 , fbdev |
| RK3399 | Mali-T860 GPU | wayland, gbm , x11 , fbdev |
| RK3326 | Mali-G31 (1 core - 2 EE ) GPU | wayland, gbm |
| RK3900 | Mali-G52 MC6 GPU | WAYLAND EGL_PLATFORM_WAYLAND_KHR GBM EGL_PLATFORM_GBM_KHR |
| RK3588 | Mali-G610 MP4 | |

GPU型号 GPU架构 推出年代/时期 性能层级 (发布时定位) 主要应用方向 (官方描述)
Mali-T760 Midgard 2013-2014年 高端 (面向高端平板和智能手机) 高端移动设备、复杂图形处理
Mali-T860 Midgard 2014-2015年 高端 (T760的继任者,定位高端) 高端智能手机、平板电脑,支持4K、H.265内容
Mali-G31 (1核) Bifrost 2018年 超高效率/入门 (面向成本受限装置) 低成本手机、智能电视、要求能效的嵌入式设备
Mali-G52 MC6 Bifrost 2018年 主流中端 (为主流移动装置带来优质视觉体验) 主流智能手机、注重AI和机器学习效能的设备
Mali-G610 MP4 Valhall 2021年 中高端 (G710的性能调整版,覆盖中高端市场) 高性能智能手机、平板电脑,支持先进的图形和AI应用

以麒麟系统为例:

1) 有的麒麟采用X11, 即有此进程,ukui-kwin-x11,如果采用3326和3900的芯片,则GPU实际不能被用到,除非采用GBM直接访问GPU资源。而许多应用都是基于X11接口开发,此时就不能用到GPU资源。

2) 有的麒麟、ubuntu、UOS等,采用Wayland,则上述几款SOC都能正常使用GPU.

查看系统

复制代码
echo $XDG_SESSION_TYPE
结果解读
x11 → 传统X窗口系统

wayland → 新一代Wayland协议

开发EGL程序

基于已有QT环境

增加代码

复制代码
QSurfaceFormat f = QSurfaceFormat::defaultFormat();
    f.setRenderableType(QSurfaceFormat::OpenGLES);

示例

复制代码
#include "mainwindow.h"

#include <QApplication>

#include <QSurfaceFormat>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSurfaceFormat f = QSurfaceFormat::defaultFormat();
    f.setRenderableType(QSurfaceFormat::OpenGLES);
    QSurfaceFormat::setDefaultFormat(f);
    MainWindow w;
    w.show();
    return a.exec();
}

完整项目工程下载:

qtegl测试程序,用于在没有gles2编译选项的环境中使用资源-CSDN下载

带EGL配置编译qt

在 x86上交叉编译 arm下面的qt会有各种各样的问题。我们直接在3588单板上编译需要版本的qt。

源码下载

官网不能下载5.X的版本了,通过迅雷下载。5.14.2地址如下:

复制代码
https://download.qt.io/archive/qt/5.14/5.14.2/submodules/qtbase-everywhere-src-5.14.2.tar.xz
https://download.qt.io/archive/qt/5.14/5.14.2/single/qt-everywhere-src-5.14.2.tar.xz

参数配置

重新编译qt时,配置哪些参数比较麻烦。

在3588直接编译,采用如下最简单的命令,很容易编译通过。

复制代码
./configure         -xplatform linux-aarch64-rk3588 -prefix /mnt/install        -confirm-license -release -opensource -no-opengl

-sysroot = 目标系统根目录 (配置了这个选项,就代码是交叉编译了,在3588上编译时不用配置)

告诉Qt:"这是目标设备的完整系统文件,找头文件和库都在这里找"

-platform = 编译主机平台

告诉Qt:"我在什么系统上编译,用哪个本机编译器

安装依赖

复制代码
sudo apt install -y libgl1-mesa-glx libgl1-mesa-dev libglu1-mesa-dev libgles2-mesa-dev libgbm-dev libdrm-dev
 
sudo apt-get install \
libfontconfig1-dev       \
libfreetype6-dev         \
libx11-dev               \
libx11-xcb-dev           \
libxext-dev              \
libxfixes-dev            \
libxi-dev                \
libxrender-dev           \
libxcb1-dev              \
libxcb-glx0-dev          \
libxcb-keysyms1-dev      \
libxcb-image0-dev        \
libxcb-shm0-dev          \
libxcb-icccm4-dev        \
libxcb-sync0-dev         \
libxcb-xfixes0-dev       \
libxcb-shape0-dev        \
libxcb-randr0-dev        \
libxcb-render-util0-dev  \
libxcb-xinerama0-dev     \
libxkbcommon-dev         \
libxcb-cursor0  \
libxkbcommon-x11-dev

sudo apt install libxkbcommon-dev libxkbcommon-x11-dev

configure配置

每次执行./configure 前 执行 rm -f config.cache

如下配置gl es2

复制代码
./configure -prefix /root/qt/install \
-confirm-license \
-opensource \
-release \
-make libs \
-nomake examples \
-nomake tests \
-no-compile-examples \
-skip qtwayland \
-skip qtwebengine \
-opengl es2 \
-eglfs \
-xcb \
-skip qtscript \
-skip qtwebengine  \
-v \
-recheck-all

Configure summary:

Build type: linux-g++ (arm64, CPU features: cx16 neon)
Compiler: gcc 9.4.0
Configuration: enable_new_dtags largefile neon precompile_header shared shared rpath release c++11 c++14 c++1z concurrent dbus reduce_exports stl
Build options:
  Mode ................................... release
  Optimize release build for size ........ no
  Building shared libraries .............. yes
  Using C standard ....................... C11
  Using C++ standard ..................... C++17
  Using ccache ........................... no
  Using new DTAGS ........................ yes
  Relocatable ............................ yes
  Using precompiled headers .............. yes
  Using LTCG ............................. no
  Target compiler supports:
    NEON ................................. yes
  Build parts ............................ libs
Qt modules and options:
  Qt Concurrent .......................... yes
  Qt D-Bus ............................... yes
  Qt D-Bus directly linked to libdbus .... no
  Qt Gui ................................. yes
  Qt Network ............................. yes
  Qt Sql ................................. yes
  Qt Testlib ............................. yes
  Qt Widgets ............................. yes
  Qt Xml ................................. yes
Support enabled for:
  Using pkg-config ....................... yes
  udev ................................... no
  Using system zlib ...................... yes
  Zstandard support ...................... no
Qt Core:
  DoubleConversion ....................... yes
    Using system DoubleConversion ........ no
  GLib ................................... yes
  iconv .................................. yes
  ICU .................................... no
  Built-in copy of the MIME database ..... yes
  Tracing backend ........................ <none>
  Logging backends:
    journald ............................. no
    syslog ............................... no
    slog2 ................................ no
  PCRE2 .................................. yes
    Using system PCRE2 ................... yes
Qt Network:
  getifaddrs() ........................... yes
  IPv6 ifname ............................ yes
  libproxy ............................... no
  Linux AF_NETLINK ....................... yes
  OpenSSL ................................ no
    Qt directly linked to OpenSSL ........ no
  OpenSSL 1.1 ............................ no
  DTLS ................................... no
  OCSP-stapling .......................... no
  SCTP ................................... no
  Use system proxies ..................... yes
  GSSAPI ................................. no
Qt Gui:
  Accessibility .......................... yes
  FreeType ............................... yes
    Using system FreeType ................ yes
  HarfBuzz ............................... yes
    Using system HarfBuzz ................ no
  Fontconfig ............................. no
  Image formats:
    GIF .................................. yes
    ICO .................................. yes
    JPEG ................................. yes
      Using system libjpeg ............... no
    PNG .................................. yes
      Using system libpng ................ yes
  Text formats:
    HtmlParser ........................... yes
    CssParser ............................ yes
    OdfWriter ............................ yes
    MarkdownReader ....................... yes
      Using system libmd4c ............... no
    MarkdownWriter ....................... yes
  EGL .................................... yes
  OpenVG ................................. no
  OpenGL:
    Desktop OpenGL ....................... no
    OpenGL ES 2.0 ........................ yes
    OpenGL ES 3.0 ........................ yes
    OpenGL ES 3.1 ........................ yes
    OpenGL ES 3.2 ........................ yes
  Vulkan ................................. yes
  Session Management ..................... yes
Features used by QPA backends:
  evdev .................................. yes
  libinput ............................... no
  INTEGRITY HID .......................... no
  mtdev .................................. no
  tslib .................................. no
  xkbcommon .............................. yes
  X11 specific:
    XLib ................................. yes
    XCB Xlib ............................. yes
    EGL on X11 ........................... yes
QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes
  EGLFS details:
    EGLFS OpenWFD ........................ no
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS RCAR ........................... no
    EGLFS EGLDevice ...................... yes
    EGLFS GBM ............................ yes
    EGLFS VSP2 ........................... no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no
    EGLFS X11 ............................ yes
  LinuxFB ................................ yes
  VNC .................................... yes
  XCB:
    Using system-provided XCB libraries .. no
    XCB XKB .............................. yes
    XCB XInput ........................... yes
    Native painting (experimental) ....... no
    GL integrations:
      GLX Plugin ......................... no
      EGL-X11 Plugin ..................... yes
Qt Sql:
  SQL item models ........................ yes
Qt Widgets:
  GTK+ ................................... no
  Styles ................................. Fusion Windows
Qt PrintSupport:
  CUPS ................................... no
Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. no
  OCI (Oracle) ........................... no
  ODBC ................................... no
  PostgreSQL ............................. no
  SQLite2 ................................ no
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (Sybase) ........................... no
Qt Testlib:
  Tester for item models ................. yes

Note: Also available for Linux: linux-clang linux-icc

Note: Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing.

WARNING: Command line option -skip is only effective in top-level builds.

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into '/root/qt/install'.

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

上述配置的结果可以看到EGL已经配置,但是有很多X11的配置,那么据此编译出来的QT是否能在 3900和3326上使用到GPU呢?下回分解。

总结

1) GPU 支持GL 还是egl,对qt使用影响。

2) 显示后端采用wayland or X11,受GPU限制

3) QT的交叉编译需要交叉工具链库完备。否则只能本机编译。

同时编译的参数需要详细处理,这里只是示意es2的编译。

参考资料

1)瑞芯微mali wiki

Mali - Rockchip open source Document

2)瑞芯微QT编译,实际这个没有参考,仅仅记录。

Rockchip RK3588 - linux下Qt和opencv交叉编译环境搭建 - 大奥特曼打小怪兽 - 博客园

Mali GPU User-Space Binary Drivers

3)egl使用讨论

[QTBUG-92059] crash on egl platform: Cannot find EGLConfig, returning null config - Qt Bug Tracker

4)交叉编译,实际这篇没参考到,作者用的工具链内容丰富

RK3588 Qt 交叉编译之三:编译 eglfs_kms 版本 - fengMisaka - 博客园

toolchain/aarch64-none-linux-gnu/libc这个目录下存放了所有配置需要的动态库,例如 eglfs、mali、kms、drm 等等动态库。而我们用的工具链无这些包,导致编译时各种缺。

5) 这里面两张图记录下,备查询。

ARM GPU(Mali G610)及其驱动、OpenGLES、性能测试相关 - ArnoldLu - 博客园

相关推荐
xmRao2 小时前
Qt 结合 SDL2 实现 PCM 音频文件播放
开发语言·qt·pcm
枫叶丹42 小时前
【Qt开发】Qt系统(九)-> Qt TCP Socket
c语言·开发语言·网络·c++·qt·tcp/ip
IOT-Power12 小时前
QT构建构建DataBus总线
开发语言·qt
SNAKEpc1213814 小时前
深入理解PyQtGraph核心组件交互
python·qt·pyqt
Henry Zhu12314 小时前
Qt Model/View架构详解(四):高级特性
开发语言·qt·架构
Henry Zhu12316 小时前
Qt Model/View架构详解(五):综合实战项目
开发语言·qt·架构
张健115640964817 小时前
Qt的面向接口编程和运行时动态加载
qt
Henry Zhu12317 小时前
Qt Model/View架构详解(二):内置视图与模型
开发语言·qt
chao18984417 小时前
在Qt中实现任意N阶贝塞尔曲线的绘制与动态调节
开发语言·qt