环境
- 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
证据
- 已安装的包内容 ~/.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
- 没有 d3d12_dri.so。(mesa.lua 注释声称 lib/dri/ 下有"十二个驱动模块",实际发货包里只有六个条目,且配方里驱动列表是 llvmpipe/softpipe/radeonsi/nouveau/zink——d3d12 压根没在列表里。)
- 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 包不成立。
- 已按上述复现;并确认强制驱动就是根因:同一二进制、同一 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 存在)
环境
问题描述
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
证据
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
根因
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 应用逻辑。)
建议修复
相关文件