1 分钟阅读 次阅读

问题

# journalctl -b 0 | grep -i "libGL"
8月 08 13:40:14 user gnome-session[999]: libGL error: failed to create dri screen
8月 08 13:40:14 user gnome-session[999]: libGL error: failed to load driver: rockchip

分析

有报错系统:
  libglx-mesa0 已安装 → Mesa libGL 可用 swrast 提供 GLX visual
  → glXChooseVisual 成功 → 进入 DRI hw 加速尝试
  → 加载 rockchip_dri.so → 失败(Mali 独占 GPU)
  → 输出 "libGL error: failed to create dri screen" + "failed to load driver: rockchip"

无报错系统:
  libgl-dummy → 阻断 libglx-mesa0 → Mesa libGL 无法使用 GLX
  → gl-helper 的 glXChooseVisual 立即失败
  → 输出 "No hardware 3D support."exit 1
  → 从未进入 DRI 初始化流程 → 无 "failed to create dri screen" 错误

本质上两个板的硬件状态是一样的: AIGLX 都失败(Calling driver entry point failed),都回退到了 DRISWRAST swrast(软件 GLX)。区别是“有报错系统”上 swrast 仍能提供 GLX visual(所以就进入了 DRI init → 报错),而“无报错系统”上连 swrast visual 也不可用(所以直接失败,不碰 DRI)。

有报错系统上,有这几个库文件:

  • /usr/lib/aarch64-linux-gnu/libGLX_mesa.so.0 + .0.0.0
  • /usr/lib/aarch64-linux-gnu/libEGL_mesa.so.0 + .0.0.0
  • /usr/share/glvnd/egl_vendor.d/50_mesa.json

删除则不会触发,因为现在GLES 走 Mali,Mesa GLX/EGL/DRI 被阻断,不会再触发 failed to create dri screen 错误。rockchip_dri.so 文件本身还在但不影响(Mesa 不会去加载它了)。

# 1. 删除 Mesa GLX 后端 — 阻断 Mesa 的 GLX 路径
#    这样 gl-helper 的 glXChooseVisual 直接失败,不会进入 DRI 初始化
rm /usr/lib/aarch64-linux-gnu/libGLX_mesa.so.0
rm /usr/lib/aarch64-linux-gnu/libGLX_mesa.so.0.0.0

# 2. 删除 Mesa EGL 后端 — 阻断 Mesa 的 EGL 路径
rm /usr/lib/aarch64-linux-gnu/libEGL_mesa.so.0
rm /usr/lib/aarch64-linux-gnu/libEGL_mesa.so.0.0.0

# 3. 删除 glvnd EGL vendor 注册文件 — 不让 glvnd 尝试加载 Mesa EGL
rm /usr/share/glvnd/egl_vendor.d/50_mesa.json

还有一个方式是安装个假包,方便后续维护,查看《RK3588 移除 Mesa GLX、EGL 后端 —— libgl-dummy》。

留下评论