请问RDK X5上如果希望通过OpenGL ES来使用3D GPU进行画面渲染和显示,请问RDK X5是否支持OpenGL ES,是否完成对OpenGL ES的软件适配,可以直接使用QT开发调用OpenGL ES进行渲染显示吗,就是不使用CPU进行渲染,使用GPU进行渲染加速
关于 RDK X5 OpenGL ES 支持的结论
根据社区现有信息,给你直接结论:
硬件支持
- RDK X5 硬件上支持 OpenGL ES(嵌入式 GPU,仅支持 OpenGL ES,不支持 CUDA/GPGPU)
- 加速计算建议优先使用 X5 BPU(而非 GPU)
软件适配现状
- Qt + OpenGL ES 的软件适配不完善,社区多用户反馈类似问题
- 目前暂无官方提供的板端 GPU 渲染教程或示例
- 有用户反馈 RDK OS 3.3.1 版本中 GLES 可能无法正常使用
- Qt 默认可能未启用 GPU 加速(需检查
QSG_INFO环境变量)
建议排查步骤
1. 确认系统版本和 GLES 库
# 检查系统版本
cat /etc/os-release
# 检查 GLES 库是否存在
ldconfig -p | grep -i gles
ls -la /usr/lib/*/libGLES*
# 检查 EGL 库
ldconfig -p | grep -i egl
2. 验证 Qt 是否启用 GPU 加速
# 设置环境变量后运行 Qt 程序
export QSG_INFO=1
export QT_LOGGING_RULES="qt.scenegraph.*=true"
./your_qt_app
# 观察输出中是否有 "Using OpenGL ES" 或 "Render loop" 相关信息
3. 检查必要的图形库
# 检查是否缺少 libOpenVG(社区有用户反馈此问题)
ldconfig -p | grep -i openvg
# 如缺少,尝试安装或联系官方确认
4. 简单 GLES 测试程序
// 创建最小 GLES 测试程序,不依赖 Qt
#include <GLES2/gl2.h>
#include <EGL/egl.h>
// 编译测试
g++ -o gles_test test.cpp -lGLESv2 -lEGL
替代方案建议
| 方案 | 说明 | 推荐度 |
|---|---|---|
| Web 端渲染 | 官方示例主要采用 Web 输出方式 | |
| BPU 加速计算 + CPU 渲染 | 计算用 BPU,渲染用 CPU | |
| 等待官方更新 | 关注 RDK OS 后续版本对 GLES 的完善 |
相关社区资源
建议参考以下已有讨论:
- RDK X5 的 GPU 如何使用? - GPU 基本说明
- 缺少 libOpenVG 导致无法调用 GPU 进行加速 - Qt+QML GPU 加速问题
- 请问下 x5 的 rdkos-3.3.1 是否支持 gles 了? - GLES 支持情况
- 使用 RDK X5 板端 GPU 进行本地渲染 - 你之前的类似问题
下一步建议
- 先确认你的 RDK OS 版本,不同版本 GLES 支持情况可能不同
- 尝试最小化 GLES 测试(不依赖 Qt),确认底层 GLES 是否可用
- 如急需渲染功能,建议先用 Web 端方案(官方有示例)
- 将你的排查结果反馈到原帖,帮助社区完善文档
需要我帮你查找特定版本的系统镜像信息或官方文档链接吗?
oot@ubuntu:/userdata/sample_rectangle_fill# cat /etc/os-release
PRETTY_NAME=“Ubuntu 22.04.5 LTS”
NAME=“Ubuntu”
VERSION_ID=“22.04”
VERSION=“22.04.5 LTS (Jammy Jellyfish)”
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL=“https://www.ubuntu.com/”
SUPPORT_URL=“https://help.ubuntu.com/”
BUG_REPORT_URL=“https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=“https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
UBUNTU_CODENAME=jammy
root@ubuntu:/userdata/sample_rectangle_fill# ldconfig -p | grep -i gles
ls -la /usr/lib//libGLES
libGLESv2.so.2 (libc6,AArch64) => /lib/aarch64-linux-gnu/libGLESv2.so.2
libGLESv2.so.2 (libc6,AArch64) => /usr/hobot/lib/libGLESv2.so.2
libGLESv2.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libGLESv2.so
libGLESv2.so (libc6,AArch64) => /usr/hobot/lib/libGLESv2.so
libGLESv1_CM.so.1 (libc6,AArch64) => /lib/aarch64-linux-gnu/libGLESv1_CM.so.1
libGLESv1_CM.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libGLESv1_CM.so
libGLESv1_CM.so (libc6,AArch64) => /usr/hobot/lib/libGLESv1_CM.so
libGLESv1_CL.so (libc6,AArch64) => /usr/hobot/lib/libGLESv1_CL.so
libGLES_CM.so (libc6,AArch64) => /usr/hobot/lib/libGLES_CM.so
libGLES_CL.so (libc6,AArch64) => /usr/hobot/lib/libGLES_CL.so
lrwxrwxrwx 1 root root 17 1月 4 2022 /usr/lib/aarch64-linux-gnu/libGLESv1_CM.so → libGLESv1_CM.so.1
lrwxrwxrwx 1 root root 21 1月 4 2022 /usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1 → libGLESv1_CM.so.1.2.0
-rw-r–r-- 1 root root 141408 1月 4 2022 /usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1.2.0
lrwxrwxrwx 1 root root 14 1月 4 2022 /usr/lib/aarch64-linux-gnu/libGLESv2.so → libGLESv2.so.2
lrwxrwxrwx 1 root root 18 1月 4 2022 /usr/lib/aarch64-linux-gnu/libGLESv2.so.2 → libGLESv2.so.2.1.0
-rw-r–r-- 1 root root 149600 1月 4 2022 /usr/lib/aarch64-linux-gnu/libGLESv2.so.2.1.0
lrwxrwxrwx 1 root root 17 1月 4 2022 /usr/lib/aarch64-none-linux-gnu/libGLESv1_CM.so → libGLESv1_CM.so.1
lrwxrwxrwx 1 root root 21 1月 4 2022 /usr/lib/aarch64-none-linux-gnu/libGLESv1_CM.so.1 → libGLESv1_CM.so.1.2.0
-rw-r–r-- 1 root root 141408 1月 4 2022 /usr/lib/aarch64-none-linux-gnu/libGLESv1_CM.so.1.2.0
lrwxrwxrwx 1 root root 14 1月 4 2022 /usr/lib/aarch64-none-linux-gnu/libGLESv2.so → libGLESv2.so.2
lrwxrwxrwx 1 root root 18 1月 4 2022 /usr/lib/aarch64-none-linux-gnu/libGLESv2.so.2 → libGLESv2.so.2.1.0
-rw-r–r-- 1 root root 149600 1月 4 2022 /usr/lib/aarch64-none-linux-gnu/libGLESv2.so.2.1.0
root@ubuntu:/userdata/sample_rectangle_fill# ldconfig -p | grep -i egl
libwayland-egl.so.1 (libc6,AArch64) => /lib/aarch64-linux-gnu/libwayland-egl.so.1
libQt5EglFsKmsSupport.so.5 (libc6,AArch64) => /lib/aarch64-linux-gnu/libQt5EglFsKmsSupport.so.5
libQt5EglFsKmsSupport.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libQt5EglFsKmsSupport.so
libQt5EglFSDeviceIntegration.so.5 (libc6,AArch64) => /lib/aarch64-linux-gnu/libQt5EglFSDeviceIntegration.so.5
libQt5EglFSDeviceIntegration.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libQt5EglFSDeviceIntegration.so
libEGL_mesa.so.0 (libc6,AArch64) => /lib/aarch64-linux-gnu/libEGL_mesa.so.0
libEGL.so.1 (libc6,AArch64) => /lib/aarch64-linux-gnu/libEGL.so.1
libEGL.so.1 (libc6,AArch64) => /usr/hobot/lib/libEGL.so.1
libEGL.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libEGL.so
libEGL.so (libc6,AArch64) => /usr/hobot/lib/libEGL.so
root@ubuntu:/userdata/sample_rectangle_fill# ldconfig -p | grep -i openvg
这是在板端查找到的库,所以现在板端GPU可以支持加速画面渲染吗
结论:底层 GLES 库存在,但需验证实际可用性
从你提供的库信息来看:
| 检查项 | 结果 | 说明 |
|---|---|---|
| libGLESv2 | /lib/aarch64-linux-gnu/libGLESv2.so.2 |
|
| libEGL | /lib/aarch64-linux-gnu/libEGL.so.1 |
|
| Qt EGL 支持 | libQt5EglFSDeviceIntegration.so |
|
| libOpenVG | 可能不需要,或确实缺失 |
底层库是完整的,但是否能真正使用 GPU 加速渲染,还需要进一步验证。
下一步验证步骤
1. 运行 Qt 程序并检查渲染后端
# 设置环境变量,强制 Qt 使用 EGLFS(嵌入式 EGL 平台)
export QT_QPA_PLATFORM=eglfs
export QSG_INFO=1
export QT_LOGGING_RULES="qt.scenegraph.*=true"
# 运行你的 Qt 程序
./your_qt_app
关键输出判断:
看到 Using OpenGL ES 2.0或EGLFS→ GPU 加速已启用
看到 Using software renderer或llvmpipe→ 仍在使用 CPU 渲染
2. 检查当前 Qt 默认平台
# 不设置任何环境变量,直接运行
./your_qt_app --help
# 或查看 Qt 平台插件
ls /usr/lib/aarch64-linux-gnu/qt5/plugins/platforms/
3. 创建最小 GLES 测试程序(不依赖 Qt)
// test_gles.cpp
#include <GLES2/gl2.h>
#include <EGL/egl.h>
#include <stdio.h>
int main() {
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY) {
printf("Failed to get EGL display\n");
return -1;
}
eglInitialize(display, NULL, NULL);
const char* glVersion = (const char*)glGetString(GL_VERSION);
const char* glRenderer = (const char*)glGetString(GL_RENDERER);
printf("GL Version: %s\n", glVersion);
printf("GL Renderer: %s\n", glRenderer);
eglTerminate(display);
return 0;
}
# 编译并运行
g++ -o test_gles test_gles.cpp -lGLESv2 -lEGL
./test_gles
预期输出:
GL Renderer: Mali-G...或类似 GPU 名称 → GPU 可用
GL Renderer: llvmpipe或softpipe→ 仍在使用 CPU 软渲染
4. 检查 DRM/KMS 设备
# 检查 DRM 设备是否存在
ls -la /dev/dri/
# 检查 GPU 驱动是否加载
dmesg | grep -i mali
# 或
dmesg | grep -i gpu
常见问题及解决
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| Qt 仍用 CPU 渲染 | 默认平台不是 eglfs | export QT_QPA_PLATFORM=eglfs |
| EGL 初始化失败 | 缺少 DRM 权限 | chmod 666 /dev/dri/* 或加入 video 组 |
| GLES 测试黑屏 | 无显示输出 | 需连接 HDMI/DSI 屏幕 |
| 库冲突 | /usr/hobot/lib 与系统库冲突 |
检查 LD_LIBRARY_PATH 顺序 |
建议
- 先运行上面的 GLES 测试程序,确认底层 GPU 驱动是否正常工作
- 如 GLES 测试通过,再配置 Qt 使用
eglfs平台 - 将测试结果反馈到原帖,这对社区很有价值(目前缺少实际可用的验证案例)
需要我帮你找一个完整的 Qt+GLES 示例代码吗?
root@ubuntu:/userdata/sample_rectangle_fill# ls /usr/lib/aarch64-linux-gnu/qt5/plugins/platforms/
libqeglfs.so libqlinuxfb.so libqminimalegl.so libqminimal.so libqoffscreen.so libqvnc.so libqxcb.so
root@ubuntu:/userdata/sample_rectangle_fill# ls -la /dev/dri/
总计 0
drwxr-xr-x 3 root root 100 1月 1 2000 .
drwxr-xr-x 15 root root 5840 7月 25 16:38 ..
drwxr-xr-x 2 root root 80 1月 1 2000 by-path
crw-rw----+ 1 root video 226, 0 1月 1 2000 card0
crw-rw----+ 1 root render 226, 128 1月 1 2000 renderD128
root@ubuntu:/userdata/sample_rectangle_fill# dmesg | grep -i mali
root@ubuntu:/userdata/sample_rectangle_fill# dmesg | grep -i gpu
[ 0.314775] axi_monitor 38100000.axi-mon: Got new axi-port:gpu, idx:4
[ 3.788134] dr-power-domain 31030000.power-controller: Looking up gpu-supply from device tree
[ 3.797774] VCC_GPU: 800 mV, disabled
[ 3.885183] dr-power-domain 31030000.power-controller: Looking up gpu-supply from device tree
[ 3.973492] noc_qos 20540080.gpu3d_qos: noc qos init finished.
[ 3.987407] noc_qos 20540000.gpu2d_qos: noc qos init finished.
[ 12.796318] Config 20540080.gpu3d_qos qos read: 0 write: 0 done
[ 12.827459] Config 20540000.gpu2d_qos qos read: 0 write: 0 done
[ 13.533078] gpu_parse_dt: register base(3c010000), irq(78).
[ 13.640869] drivers/gpu/drm/verisilicon/dc/dc_proc/gc_proc.c: 593
[ 13.645393] drivers/gpu/drm/verisilicon/dc/dc_proc/gc_proc.c: 604
root@ubuntu:/userdata/sample_rectangle_fill# export QT_QPA_PLATFORM=eglfs
root@ubuntu:/userdata/sample_rectangle_fill# export QSG_INFO=1
root@ubuntu:/userdata/sample_rectangle_fill# export QT_LOGGING_RULES=“qt.scenegraph.*=true”
root@ubuntu:/userdata/sample_rectangle_fill# g++ -o test_gles test_gles.cpp -lGLESv2 -lEGL
./test_gles
cc1plus: fatal error: test_gles.cpp: 没有那个文件或目录
compilation terminated.
bash: ./test_gles: 没有那个文件或目录
root@ubuntu:/userdata/sample_rectangle_fill# cd /userdata/test_gles.cpp
bash: cd: /userdata/test_gles.cpp: 不是目录
root@ubuntu:/userdata/sample_rectangle_fill# cd ..
root@ubuntu:/userdata# g++ -o test_gles test_gles.cpp -lGLESv2 -lEGL
./test_gles
GL Version: (null)
GL Renderer: (null)
root@ubuntu:/userdata# ./test_gles
GL Version: (null)
GL Renderer: (null)
root@ubuntu:/userdata#
可以使用GPU加速渲染吗
结论:库存在但 EGL 初始化失败
从你的测试结果看:
- GLES 库、EGL 库都存在

- DRM 设备
/dev/dri/card0存在
- GPU 驱动已加载(Verisilicon,非 Mali)

- 但
glGetString()返回 null
→ EGL 初始化失败
问题诊断:改进版测试代码
创建一个带详细错误输出的测试程序:
// test_gles_debug.cpp
#include <GLES2/gl2.h>
#include <EGL/egl.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY) {
printf("❌ eglGetDisplay failed\n");
return -1;
}
printf("✅ eglGetDisplay OK\n");
EGLint major, minor;
if (!eglInitialize(display, &major, &minor)) {
printf("❌ eglInitialize failed: 0x%x\n", eglGetError());
return -1;
}
printf("✅ eglInitialize OK, version: %d.%d\n", major, minor);
EGLint numConfigs;
EGLConfig config;
EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_NONE
};
if (!eglChooseConfig(display, attribs, &config, 1, &numConfigs)) {
printf("❌ eglChooseConfig failed: 0x%x\n", eglGetError());
return -1;
}
printf("✅ eglChooseConfig OK, numConfigs: %d\n", numConfigs);
EGLSurface surface = eglCreateWindowSurface(display, config, NULL, NULL);
if (surface == EGL_NO_SURFACE) {
printf("❌ eglCreateWindowSurface failed: 0x%x\n", eglGetError());
// 尝试创建 pbuffer surface
EGLint pbufferAttribs[] = {
EGL_WIDTH, 100,
EGL_HEIGHT, 100,
EGL_NONE
};
surface = eglCreatePbufferSurface(display, config, pbufferAttribs);
if (surface == EGL_NO_SURFACE) {
printf("❌ eglCreatePbufferSurface also failed: 0x%x\n", eglGetError());
return -1;
}
printf("✅ eglCreatePbufferSurface OK (fallback)\n");
} else {
printf("✅ eglCreateWindowSurface OK\n");
}
EGLContext context;
EGLint ctxAttribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
context = eglCreateContext(display, config, EGL_NO_CONTEXT, ctxAttribs);
if (context == EGL_NO_CONTEXT) {
printf("❌ eglCreateContext failed: 0x%x\n", eglGetError());
return -1;
}
printf("✅ eglCreateContext OK\n");
if (!eglMakeCurrent(display, surface, surface, context)) {
printf("❌ eglMakeCurrent failed: 0x%x\n", eglGetError());
return -1;
}
printf("✅ eglMakeCurrent OK\n");
const char* glVersion = (const char*)glGetString(GL_VERSION);
const char* glRenderer = (const char*)glGetString(GL_RENDERER);
const char* glVendor = (const char*)glGetString(GL_VENDOR);
printf("\n=== GPU Info ===\n");
printf("GL Version: %s\n", glVersion ? glVersion : "(null)");
printf("GL Renderer: %s\n", glRenderer ? glRenderer : "(null)");
printf("GL Vendor: %s\n", glVendor ? glVendor : "(null)");
eglTerminate(display);
return 0;
}
# 编译并运行
cd /userdata
g++ -o test_gles_debug test_gles_debug.cpp -lGLESv2 -lEGL
./test_gles_debug
同时尝试以下配置
1. 设置 DRM 设备权限
# 临时修改权限
chmod 666 /dev/dri/card0
chmod 666 /dev/dri/renderD128
# 或将用户加入 video 组
usermod -aG video root
2. 指定 DRM 设备(关键!)
# 设置 EGLFS 使用的 DRM 设备
export QT_QPA_EGLFS_DRM_DEVICE=/dev/dri/card0
export QT_QPA_PLATFORM=eglfs
export QSG_INFO=1
# 运行 Qt 程序测试
./your_qt_app
3. 检查可用的 DRM 设备
# 查看 DRM 设备详情
ls -la /dev/dri/by-path/
# 查看 GPU 驱动信息
cat /sys/kernel/debug/dri/0/name 2>/dev/null
4. 检查库路径冲突
# 查看当前库加载顺序
ldd ./test_gles_debug | grep -i "gles\|egl"
# 如 /usr/hobot/lib 优先,尝试调整
export LD_LIBRARY_PATH=/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH
快速判断表
| 测试输出 | 含义 | 解决方案 |
|---|---|---|
eglInitialize failed |
EGL 初始化失败 | 检查 DRM 设备/权限 |
eglCreateWindowSurface failed |
无显示输出 | 需接屏幕或用 pbuffer |
eglMakeCurrent failed |
上下文绑定失败 | 驱动/库版本不匹配 |
GL Renderer: (null) |
GLES 未就绪 | 检查驱动加载 |
GL Renderer: Vivante/Verisilicon |
可继续开发 |
建议执行顺序
- 先运行
test_gles_debug.cpp→ 定位具体哪一步失败 - 根据错误码调整配置 → 参考上表
- 如 EGL 测试通过 → 再配置 Qt 使用 eglfs
- 将完整输出反馈到原帖 → 帮助社区完善文档
请运行上面的调试代码,把完整输出发出来,我可以帮你分析具体卡在哪一步。
root@ubuntu:/userdata# g++ -o test_gles_debug test_gles_debug.cpp -lGLESv2 -lEGL
./test_gles_debug
test_gles_debug.cpp: In function ‘int main()’:
test_gles_debug.cpp:40:66: warning: passing NULL to non-pointer argument 3 of ‘void* eglCreateWindowSurface(EGLDisplay, EGLConfig, EGLNativeWindowType, const EGLint*)’ [-Wconversion-null]
40 | EGLSurface surface = eglCreateWindowSurface(display, config, NULL, NULL);
| ^~~~
In file included from test_gles_debug.cpp:3:
/usr/include/EGL/egl.h:136:109: note: declared here
136 | EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
| ~~~~~~~~~~~~~~~~~~^
eglGetDisplay OK
eglInitialize failed: 0x3001
root@ubuntu:/userdata# chmod 666 /dev/dri/card0
root@ubuntu:/userdata# chmod 666 /dev/dri/renderD128
root@ubuntu:/userdata# export QT_QPA_EGLFS_DRM_DEVICE=/dev/dri/card0
root@ubuntu:/userdata# export QT_QPA_PLATFORM=eglfs
root@ubuntu:/userdata# export QSG_INFO=1
root@ubuntu:/userdata# ls -la /dev/dri/by-path/
总计 0
drwxr-xr-x 2 root root 80 1月 1 2000 .
drwxr-xr-x 3 root root 100 1月 1 2000 ..
lrwxrwxrwx 1 root root 8 1月 1 2000 platform-3e000000.disp_apb:display-subsystem-card → ../card0
lrwxrwxrwx 1 root root 13 1月 1 2000 platform-3e000000.disp_apb:display-subsystem-render → ../renderD128
root@ubuntu:/userdata# cat /sys/kernel/debug/dri/0/name 2>/dev/null
vs-drm dev=3e000000.disp_apb:display-subsystem unique=3e000000.disp_apb:display-subsystem
root@ubuntu:/userdata# ldd ./test_gles_debug | grep -i “gles|egl”
libGLESv2.so.2 => /lib/aarch64-linux-gnu/libGLESv2.so.2 (0x0000ffff865b0000)
libEGL.so.1 => /lib/aarch64-linux-gnu/libEGL.so.1 (0x0000ffff86580000)
关键问题:EGL 初始化失败 (0x3001)
错误码 0x3001 = EGL_NOT_INITIALIZED,说明显示子系统未就绪。
原因分析
| 检查项 | 状态 | 说明 |
|---|---|---|
| GLES/EGL 库 | 库文件完整 | |
| DRM 设备 | /dev/dri/card0 可用 |
|
| GPU 驱动 | Verisilicon (芯原) | |
| EGL 初始化 | 缺少有效显示输出 |
核心问题:EGL 需要有效的显示输出才能初始化,但当前可能:
- 未连接物理屏幕(HDMI/DSI)
- 显示子系统未正确配置
- 板端 GPU 渲染功能本身不完善(社区多用户反馈类似问题)
尝试解决方案
方案 1:使用 Pbuffer Surface(无头模式)
修改测试代码,不使用 Window Surface:
// test_gles_headless.cpp
#include <GLES2/gl2.h>
#include <EGL/egl.h>
#include <stdio.h>
int main() {
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY) {
printf("❌ eglGetDisplay failed\n");
return -1;
}
if (!eglInitialize(display, NULL, NULL)) {
printf("❌ eglInitialize failed: 0x%x\n", eglGetError());
return -1;
}
// 使用 EGL_NO_SURFACE + pbuffer 配置
EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, // 关键:用 PBUFFER
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_NONE
};
EGLConfig config;
EGLint numConfigs;
if (!eglChooseConfig(display, attribs, &config, 1, &numConfigs)) {
printf("❌ eglChooseConfig failed: 0x%x\n", eglGetError());
return -1;
}
// 创建 pbuffer surface(不需要物理屏幕)
EGLint pbufferAttribs[] = {
EGL_WIDTH, 100,
EGL_HEIGHT, 100,
EGL_NONE
};
EGLSurface surface = eglCreatePbufferSurface(display, config, pbufferAttribs);
if (surface == EGL_NO_SURFACE) {
printf("❌ eglCreatePbufferSurface failed: 0x%x\n", eglGetError());
return -1;
}
EGLContext context;
EGLint ctxAttribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
context = eglCreateContext(display, config, EGL_NO_CONTEXT, ctxAttribs);
if (context == EGL_NO_CONTEXT) {
printf("❌ eglCreateContext failed: 0x%x\n", eglGetError());
return -1;
}
if (!eglMakeCurrent(display, surface, surface, context)) {
printf("❌ eglMakeCurrent failed: 0x%x\n", eglGetError());
return -1;
}
const char* glRenderer = (const char*)glGetString(GL_RENDERER);
printf("✅ GPU Renderer: %s\n", glRenderer ? glRenderer : "(null)");
eglTerminate(display);
return 0;
}
cd /userdata
g++ -o test_gles_headless test_gles_headless.cpp -lGLESv2 -lEGL
./test_gles_headless
方案 2:尝试不同的 EGL 平台
# 尝试使用 Mesa EGL
export EGL_PLATFORM=drm
./test_gles_headless
# 或尝试 wayland
export EGL_PLATFORM=wayland
./test_gles_headless
方案 3:检查显示服务状态
# 检查是否有显示服务运行
ps aux | grep -i "weston\|kwin\|X11"
# 检查 DRM 连接器状态
cat /sys/class/drm/card0/card0-*/status 2>/dev/null
# 查看 DRM 模式设置
modetest -M versal -c 2>/dev/null | head -20
现实建议
根据社区历史讨论(缺少 libOpenVG、x5 是否支持 gles),RDK X5 板端 GPU 渲染的软件适配确实不完善。
推荐方案对比
| 方案 | 可行性 | 说明 |
|---|---|---|
| 板端 GPU + EGLFS | 需物理屏幕,配置复杂 | |
| Web 端渲染 | 官方有示例,稳定可用 | |
| CPU 渲染 + BPU 计算 | 计算用 BPU,渲染用 CPU | |
| 等待官方更新 | 关注 RDK OS 后续版本 |
下一步建议
- 先运行
test_gles_headless.cpp→ 确认无头模式是否可用 - 如仍失败 → 板端 GPU 渲染当前不可用,建议用替代方案
- 将测试结果反馈到原帖 → 帮助社区完善文档(目前缺少明确结论)
需要我帮你找 Web 端渲染的官方示例链接吗?
root@ubuntu:/userdata# ps aux | grep -i “weston|kwin|X11”
sunrise 1890 0.0 1.0 374688 73204 ? Sl 16:36 0:00 /usr/libexec/ibus-x11 --kill-daemon
root 3190 0.0 0.0 26044 6872 ? Ss 16:36 0:00 /usr/bin/x11vnc -auth guess -forever -loop -capslock -nomodtweak -noxdamage -repeat -rfbauth /etc/.vnc/passwd -rfbport 5900 -shared
root 3251 0.1 0.1 32620 13896 ? S 16:36 0:22 /usr/bin/x11vnc -auth guess -forever -loop -capslock -nomodtweak -noxdamage -repeat -rfbauth /etc/.vnc/passwd -rfbport 5900 -shared
root 34966 0.0 0.0 9156 1992 pts/0 S+ 20:42 0:00 grep --color=auto -i weston|kwin|X11
root@ubuntu:/userdata# cat /sys/class/drm/card0/card0-*/status 2>/dev/null
connected
unknown
unknown
root@ubuntu:/userdata# modetest -M versal -c 2>/dev/null | head -20
root@ubuntu:/userdata# cd /userdata
g++ -o test_gles_headless test_gles_headless.cpp -lGLESv2 -lEGL
./test_gles_headless
eglInitialize failed: 0x3001
root@ubuntu:/userdata# export EGL_PLATFORM=drm
./test_gles_headless
MESA-LOADER: failed to open vs-drm: /usr/lib/dri/vs-drm_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/aarch64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
eglCreatePbufferSurface failed: 0x3005
root@ubuntu:/userdata# export EGL_PLATFORM=wayland
./test_gles_headless
eglInitialize failed: 0x3001
最终结论:板端 GPU 渲染当前不可用
从你的测试结果可以明确:
| 测试项 | 结果 | 含义 |
|---|---|---|
eglInitialize |
显示子系统未就绪 | |
vs-drm_dri.so |
Verisilicon DRM 驱动库不存在 | |
| X11 环境 | x11vnc 运行中 | |
| DRM 连接器 | 有显示设备 |
核心问题:缺少 vs-drm_dri.so 驱动库,导致 Mesa EGL 无法加载 Verisilicon GPU 驱动。
问题根源
MESA-LOADER: failed to open vs-drm: /usr/lib/dri/vs-drm_dri.so: cannot open shared object file
这是 RDK X5 软件适配的已知限制,社区多用户反馈类似问题:
推荐替代方案
方案 1:Web 端渲染(官方推荐)



# 官方 TTS 示例采用 Web 输出
# 参考:https://developer.d-robotics.cc/rdk_doc/Robot_development/quick_demo/hobot_tts
# 使用 Flask/FastAPI + HTML5 Canvas 渲染
# 或 Qt WebEngine 嵌入 Web 界面
优点:官方有示例,稳定可用
缺点:需要浏览器环境
方案 2:X11 + CPU 渲染 


既然系统有 X11 环境(x11vnc 运行中),可以尝试:
# 使用 X11 平台而非 eglfs
export QT_QPA_PLATFORM=xcb
export QSG_INFO=1
./your_qt_app
# 或使用 OpenGL ES + X11
export QT_QPA_PLATFORM=xcb
export QT_XCB_GL_INTEGRATION=glx
./your_qt_app
优点:X11 环境已存在,配置简单
缺点:渲染用 CPU,但计算可用 BPU
方案 3:BPU 计算 + CPU 渲染 



# 典型架构
# BPU: 模型推理 (YOLO/检测/识别)
# CPU: 结果渲染 (OpenCV/Qt)
# 示例:使用 Hobot DNN 库进行 BPU 推理
# 使用 OpenCV 进行 CPU 渲染绘制
优点:BPU 计算效率高,CPU 渲染足够应对 GUI
缺点:3D 复杂渲染性能有限
建议行动
1. 将测试结果反馈到原帖
你已经在 RDK X5 上 3D GPU,OpenGL ES 的使用 发帖,建议补充:
## 测试结论
- GLES/EGL 库存在,但 eglInitialize 失败 (0x3001)
- 缺少 vs-drm_dri.so 驱动库
- 板端 GPU 渲染当前不可用
## 环境信息
- 系统:Ubuntu 22.04.5 LTS
- DRM 设备:/dev/dri/card0 (vs-drm)
- X11 环境:x11vnc 运行中
这对社区非常有价值!
2. 联系官方确认
如需明确答复,建议:
- 在地瓜机器人开发者社区发帖 @官方人员
- 或通过官方技术支持渠道咨询
- 询问
vs-drm_dri.so是否有单独安装包
3. 临时开发建议
| 需求 | 推荐方案 |
|---|---|
| 2D 界面显示 | Qt + X11 (xcb 平台) |
| 模型推理 | BPU (Hobot DNN 库) |
| 结果绘制 | OpenCV (CPU) |
| 3D 渲染 | Web 端 或 等待官方更新 |
需要进一步帮助吗?
我可以帮你:
- 找 Web 端渲染的官方示例代码
- 配置 Qt + X11 的渲染方案
- 整理 BPU 计算 + CPU 渲染的完整示例
你当前的具体应用场景是什么?(如:检测结果显示/3D 可视化/其他)
测试结论
- GLES/EGL 库存在,但 eglInitialize 失败 (0x3001)
- 缺少 vs-drm_dri.so 驱动库
- 板端 GPU 渲染当前不可用
环境信息
- 系统:Ubuntu 22.04.5 LTS
- DRM 设备:/dev/dri/card0 (vs-drm)
- X11 环境:x11vnc 运行中
测试结论已确认
你的排查非常完整,结论清晰:RDK X5 板端 GPU 渲染当前因缺少 vs-drm_dri.so 驱动库而不可用。
这个测试结果对社区很有价值,已经帮后续遇到同样问题的开发者避坑了。
接下来怎么做?
根据你的应用场景,推荐以下方案:
| 需求 | 推荐方案 | 复杂度 |
|---|---|---|
| 2D 界面/检测框绘制 | Qt + X11 (xcb) + OpenCV | |
| 模型推理加速 | BPU (Hobot DNN) | |
| 3D 可视化 | Web 端 (Three.js) | |
| 等待官方支持 | 关注 RDK OS 更新 | - |
我可以帮你
请告诉我你的具体应用场景,我可以提供针对性方案:
- 如果是检测结果显示 → BPU 推理 + OpenCV 绘制示例
- 如果是 2D 界面开发 → Qt + X11 配置指南
- 如果是 3D 可视化 → Web 端渲染方案
- 如果需要联系官方 → 帮你整理问题描述模板
你当前想实现什么功能?