RDK X5上3D GPU,OpenGL ES的使用

请问RDK X5上如果希望通过OpenGL ES来使用3D GPU进行画面渲染和显示,请问RDK X5是否支持OpenGL ES,是否完成对OpenGL ES的软件适配,可以直接使用QT开发调用OpenGL ES进行渲染显示吗,就是不使用CPU进行渲染,使用GPU进行渲染加速

关于 RDK X5 OpenGL ES 支持的结论

根据社区现有信息,给你直接结论:

:white_check_mark: 硬件支持

  • RDK X5 硬件上支持 OpenGL ES(嵌入式 GPU,仅支持 OpenGL ES,不支持 CUDA/GPGPU)
  • 加速计算建议优先使用 X5 BPU(而非 GPU)

:warning: 软件适配现状

  • 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 输出方式 :star::star::star::star:
BPU 加速计算 + CPU 渲染 计算用 BPU,渲染用 CPU :star::star::star:
等待官方更新 关注 RDK OS 后续版本对 GLES 的完善 :star::star:

相关社区资源

建议参考以下已有讨论:


下一步建议

  1. 先确认你的 RDK OS 版本,不同版本 GLES 支持情况可能不同
  2. 尝试最小化 GLES 测试(不依赖 Qt),确认底层 GLES 是否可用
  3. 如急需渲染功能,建议先用 Web 端方案(官方有示例)
  4. 将你的排查结果反馈到原帖,帮助社区完善文档

需要我帮你查找特定版本的系统镜像信息或官方文档链接吗?

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可以支持加速画面渲染吗

:white_check_mark: 结论:底层 GLES 库存在,但需验证实际可用性

从你提供的库信息来看:

检查项 结果 说明
libGLESv2 :white_check_mark: 存在 /lib/aarch64-linux-gnu/libGLESv2.so.2
libEGL :white_check_mark: 存在 /lib/aarch64-linux-gnu/libEGL.so.1
Qt EGL 支持 :white_check_mark: 存在 libQt5EglFSDeviceIntegration.so
libOpenVG :cross_mark: 未找到 可能不需要,或确实缺失

底层库是完整的,但是否能真正使用 GPU 加速渲染,还需要进一步验证。


:wrench: 下一步验证步骤

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

关键输出判断:

  • :white_check_mark: 看到 Using OpenGL ES 2.0 或 EGLFS → GPU 加速已启用
  • :cross_mark: 看到 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

预期输出:

  • :white_check_mark: GL Renderer: Mali-G... 或类似 GPU 名称 → GPU 可用
  • :cross_mark: GL Renderer: llvmpipe 或 softpipe → 仍在使用 CPU 软渲染

4. 检查 DRM/KMS 设备

# 检查 DRM 设备是否存在
ls -la /dev/dri/

# 检查 GPU 驱动是否加载
dmesg | grep -i mali
# 或
dmesg | grep -i gpu

:warning: 常见问题及解决

问题 可能原因 解决方案
Qt 仍用 CPU 渲染 默认平台不是 eglfs export QT_QPA_PLATFORM=eglfs
EGL 初始化失败 缺少 DRM 权限 chmod 666 /dev/dri/* 或加入 video 组
GLES 测试黑屏 无显示输出 需连接 HDMI/DSI 屏幕
库冲突 /usr/hobot/lib 与系统库冲突 检查 LD_LIBRARY_PATH 顺序

:pushpin: 建议

  1. 先运行上面的 GLES 测试程序,确认底层 GPU 驱动是否正常工作
  2. 如 GLES 测试通过,再配置 Qt 使用 eglfs 平台
  3. 将测试结果反馈到原帖,这对社区很有价值(目前缺少实际可用的验证案例)

需要我帮你找一个完整的 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加速渲染吗

:warning: 结论:库存在但 EGL 初始化失败

从你的测试结果看:

  • GLES 库、EGL 库都存在 :white_check_mark:
  • DRM 设备 /dev/dri/card0 存在 :white_check_mark:
  • GPU 驱动已加载(Verisilicon,非 Mali):white_check_mark:
  • 但 glGetString() 返回 null :cross_mark: → EGL 初始化失败

:magnifying_glass_tilted_left: 问题诊断:改进版测试代码

创建一个带详细错误输出的测试程序:

// 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

:hammer_and_wrench: 同时尝试以下配置

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

:clipboard: 快速判断表

测试输出 含义 解决方案
eglInitialize failed EGL 初始化失败 检查 DRM 设备/权限
eglCreateWindowSurface failed 无显示输出 需接屏幕或用 pbuffer
eglMakeCurrent failed 上下文绑定失败 驱动/库版本不匹配
GL Renderer: (null) GLES 未就绪 检查驱动加载
GL Renderer: Vivante/Verisilicon :white_check_mark: GPU 可用 可继续开发

:light_bulb: 建议执行顺序

  1. 先运行 test_gles_debug.cpp → 定位具体哪一步失败
  2. 根据错误码调整配置 → 参考上表
  3. 如 EGL 测试通过 → 再配置 Qt 使用 eglfs
  4. 将完整输出反馈到原帖 → 帮助社区完善文档

请运行上面的调试代码,把完整输出发出来,我可以帮你分析具体卡在哪一步。

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);
| ~~~~~~~~~~~~~~~~~~^
:white_check_mark: eglGetDisplay OK
:cross_mark: 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)

:warning: 关键问题:EGL 初始化失败 (0x3001)

错误码 0x3001 = EGL_NOT_INITIALIZED,说明显示子系统未就绪。


:magnifying_glass_tilted_left: 原因分析

检查项 状态 说明
GLES/EGL 库 :white_check_mark: 存在 库文件完整
DRM 设备 :white_check_mark: 存在 /dev/dri/card0 可用
GPU 驱动 :white_check_mark: 加载 Verisilicon (芯原)
EGL 初始化 :cross_mark: 失败 缺少有效显示输出

核心问题:EGL 需要有效的显示输出才能初始化,但当前可能:

  1. 未连接物理屏幕(HDMI/DSI)
  2. 显示子系统未正确配置
  3. 板端 GPU 渲染功能本身不完善(社区多用户反馈类似问题)

:hammer_and_wrench: 尝试解决方案

方案 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

:pushpin: 现实建议

根据社区历史讨论(缺少 libOpenVG、x5 是否支持 gles),RDK X5 板端 GPU 渲染的软件适配确实不完善。

推荐方案对比

方案 可行性 说明
板端 GPU + EGLFS :warning: 待验证 需物理屏幕,配置复杂
Web 端渲染 :white_check_mark: 推荐 官方有示例,稳定可用
CPU 渲染 + BPU 计算 :white_check_mark: 推荐 计算用 BPU,渲染用 CPU
等待官方更新 :hourglass_not_done: 观望 关注 RDK OS 后续版本

:light_bulb: 下一步建议

  1. 先运行 test_gles_headless.cpp → 确认无头模式是否可用
  2. 如仍失败 → 板端 GPU 渲染当前不可用,建议用替代方案
  3. 将测试结果反馈到原帖 → 帮助社区完善文档(目前缺少明确结论)

需要我帮你找 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
:cross_mark: 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)
:cross_mark: eglCreatePbufferSurface failed: 0x3005
root@ubuntu:/userdata# export EGL_PLATFORM=wayland
./test_gles_headless
:cross_mark: eglInitialize failed: 0x3001

:warning: 最终结论:板端 GPU 渲染当前不可用

从你的测试结果可以明确:

测试项 结果 含义
eglInitialize :cross_mark: 0x3001 显示子系统未就绪
vs-drm_dri.so :cross_mark: 缺失 Verisilicon DRM 驱动库不存在
X11 环境 :white_check_mark: 存在 x11vnc 运行中
DRM 连接器 :white_check_mark: 1个 connected 有显示设备

核心问题:缺少 vs-drm_dri.so 驱动库,导致 Mesa EGL 无法加载 Verisilicon GPU 驱动。


:clipboard: 问题根源

MESA-LOADER: failed to open vs-drm: /usr/lib/dri/vs-drm_dri.so: cannot open shared object file

这是 RDK X5 软件适配的已知限制,社区多用户反馈类似问题:


:white_check_mark: 推荐替代方案

方案 1:Web 端渲染(官方推荐):star::star::star::star:

# 官方 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 渲染 :star::star::star:

既然系统有 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 渲染 :star::star::star::star:

# 典型架构
# BPU: 模型推理 (YOLO/检测/识别)
# CPU: 结果渲染 (OpenCV/Qt)

# 示例:使用 Hobot DNN 库进行 BPU 推理
# 使用 OpenCV 进行 CPU 渲染绘制

优点:BPU 计算效率高,CPU 渲染足够应对 GUI
缺点:3D 复杂渲染性能有限


:memo: 建议行动

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 端 或 等待官方更新

:speech_balloon: 需要进一步帮助吗?

我可以帮你:

  1. 找 Web 端渲染的官方示例代码
  2. 配置 Qt + X11 的渲染方案
  3. 整理 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 运行中

:white_check_mark: 测试结论已确认

你的排查非常完整,结论清晰:RDK X5 板端 GPU 渲染当前因缺少 vs-drm_dri.so 驱动库而不可用。

这个测试结果对社区很有价值,已经帮后续遇到同样问题的开发者避坑了。


:bullseye: 接下来怎么做?

根据你的应用场景,推荐以下方案:

需求 推荐方案 复杂度
2D 界面/检测框绘制 Qt + X11 (xcb) + OpenCV :star:
模型推理加速 BPU (Hobot DNN) :star::star:
3D 可视化 Web 端 (Three.js) :star::star::star:
等待官方支持 关注 RDK OS 更新 -

:light_bulb: 我可以帮你

请告诉我你的具体应用场景,我可以提供针对性方案:

  1. 如果是检测结果显示 → BPU 推理 + OpenCV 绘制示例
  2. 如果是 2D 界面开发 → Qt + X11 配置指南
  3. 如果是 3D 可视化 → Web 端渲染方案
  4. 如果需要联系官方 → 帮你整理问题描述模板

你当前想实现什么功能?