Skip to content

wsl-gl-host-link 强制 GALLIUM_DRIVER=d3d12,但 xim:mesa 的包内没有 d3d12_dri.so —— WSL2 上 GL 程序报 glx: failed to create drisw screen #382

Description

@FarnaHerry

环境

  • WSL2(内核 6.6.87.2-microsoft-standard-WSL2),/dev/dxg 存在
  • mcpp 2026.8.8.2(mcpp run 已应用 subos_info 环境变量)
  • 图形栈:compat.glx-runtime@2026.08.08 → xim:graphics;mesa 25.0.7.1;wsl-gl-host-link@0.1.0
  • 复现项目:任意 GLFW 应用(如 tinynext),mcpp 构建,mcpp run 运行

问题描述
WSL2 上,wsl-gl-host-link 配方(pkgs/w/wsl-gl-host-link.lua)在 subos 里声明 GALLIUM_DRIVER=d3d12,前提是 mesa 包里带有 d3d12 gallium 驱动模块。但实际上包内没有:xim-x-mesa/25.0.7.1/lib/dri/ 只有 kms_swrast_dri.so、swrast_dri.so、zink_dri.so、nouveau_dri.so、radeonsi_dri.so(全是 libdril_dri.so 的符号链接)。Mesa 被强制指定 d3d12 驱动,找不到驱动模块,又不回退到 swrast → GL 上下文创建失败:

glx: failed to create drisw screen
(退出码 255)

复现步骤
mcpp build
mcpp run

→ "glx: failed to create drisw screen",退出码 255

证据

  1. 已安装的包内容 ~/.mcpp/registry/data/xpkgs/xim-x-mesa/25.0.7.1/lib/dri/:
    kms_swrast_dri.so -> libdril_dri.so
    libdril_dri.so
    nouveau_dri.so -> libdril_dri.so
    radeonsi_dri.so -> libdril_dri.so
    swrast_dri.so -> libdril_dri.so
    zink_dri.so -> libdril_dri.so
  2. 没有 d3d12_dri.so。(mesa.lua 注释声称 lib/dri/ 下有"十二个驱动模块",实际发货包里只有六个条目,且配方里驱动列表是 llvmpipe/softpipe/radeonsi/nouveau/zink——d3d12 压根没在列表里。)
  3. wsl-gl-host-link.lua 第 42–43 / 234–235 行断言与此相反:"libd3d12core.so 由 d3d12_dri.so dlopen,而 d3d12_dri.so 是我们的文件"、"d3d12_dri.so 带的 DT_RPATH 以 subos lib 目录结尾(已在发货包上验证)"——这个前提对当前 mesa 包不成立。
  4. 已按上述复现;并确认强制驱动就是根因:同一二进制、同一 hermetic loader,GALLIUM_DRIVER 不设(或设 llvmpipe)时运行正常(llvmpipe/softpipe);设 GALLIUM_DRIVER=d3d12 时退出 255。把系统 /usr/lib64/dri/d3d12_dri.so 手动加进 LIBGL_DRIVERS_PATH 也无法初始化(宿主的 libd3d12core.so 跑不了 mcpp 私有 glibc 2.39;.wsl-host 里 glibc floor 记录为 unknown)。

根因
xim:graphics 栈内的协调缺口:wsl-gl-host-link 依赖 mesa,但 mesa 的配方/包并没有用 -Dgallium-drivers=d3d12 构建 d3d12 驱动。强制 GALLIUM_DRIVER=d3d12 把"驱动缺失"变成硬失败,而不是优雅回退到 llvmpipe。

次要观察
wsl-gl-host-link.lua 里写的逃生通道("用户自己导出 GALLIUM_DRIVER=llvmpipe 会保留")在 mcpp run 应用 subos env 时不生效:export GALLIUM_DRIVER=llvmpipe; mcpp run 仍然失败,即 subos 的 set 覆盖了用户预先导出的值。(这可能属于 mcpp-community/mcpp 的 subos_info 应用逻辑。)

建议修复

  • 用 -Dgallium-drivers=d3d12 构建 mesa,并在 lib/dri/ 里带上 d3d12_dri.so(修 WSL2 上的强制驱动路径);或
  • 让 wsl-gl-host-link 在驱动模块缺失时不要强制 GALLIUM_DRIVER=d3d12,让 Mesa 回退到 llvmpipe(与非 WSL 主机的 no-op 哨兵逻辑一致);或
  • 两者都做:仅当模块存在时才强制。

相关文件

  • pkgs/m/mesa.lua(驱动集合;包来自 xlings-res/mesa 25.0.7.1)
  • pkgs/w/wsl-gl-host-link.lua(假设 d3d12_dri.so 存在)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions