DXMT如何把几何着色器变计算着色器DXBC→AIR→Metal完整路径【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/MadeiraMadeira 项目让 x86-64 Windows PC 游戏跑在 iOS 上其中的关键功臣 DXMT 负责把 Direct3D 11 绘制翻译成 Metal。Direct3D 的几何着色器Geometry Shader在 Metal 上无法直接表达DXMT 通过 DXBC 解析、AIR 中间表示改写、编译到 Metal 这条完整路径把它变成一段计算着色器。本文带你看懂这条链路的每一步 。为什么要把几何着色器变成计算着色器Direct3D 管线里几何着色器运行在顶点着色器之后可以动态增删图元、裂变三角面片——很多 PC 老游戏粒子、水面、阴影体积重度依赖它。而 Metal 的原生管线对这类输入 N 个顶点、输出 M 个图元的灵活变换支持有限DXMT 的做法是不再依赖硬件几何着色器而是把 GS 的逻辑装进一个计算着色器Compute Shader里跑每个工作组处理一个输入图元GS 输出的新顶点写入中间顶点缓冲区和索引缓冲区随后用一次普通的drawIndexed把结果画出来。这样兼容性拉满无论 iPhone 哪一代 GPU 都能跑代价只是多一次中间缓冲区的写入 。第一步解析 DXBC定位几何着色器游戏里的着色器以DXBC 字节码形式存在文件头 4 字节就是魔数DXBC。DXMT 先用 DXBCParser 把字节码拆开识别出着色器类型——几何着色器走专用的转换分支几何着色器转换器dxbc_converter_gs.cpp与裁剪/像素转换并列在 build/dxmt-ios/build.sh 的 airconv 编译清单里可以清楚看到dxbc_converter_gs.cpp、dxbc_converter_ts.cpp等文件指令级解析dxbc_instructions.cppdxbc_signature.cpp负责读懂 GS 的输入/输出签名第二步DXBC 转 AIR 中间表示DXBC 是 Windows 侧的字节码不能直接喂给 Apple 的编译器。DXMT 内置的airconv 转换器先把它翻译成自有中间表示AIRair_type.cpp、air_operations.cpp、air_signature.cpp定义了 AIR 的类型系统、运算和签名随后 air_builder.cpp 在 AIR 上重建控制流把图元展开这类 GS 语义改写为可并行执行的计算路径——这就是GS 变 CS真正发生的地方。这一步还依赖 LLVM 15 的静态库参与 AIR→Metal 的最终编译见 build/dxmt-ios/README.md 中 airconv shader translator LLVM 15 static libs 的说明。第三步AIR 编译到 Metal产出 metallibAIR 程序最终由metallib_writer.cpp写出Metal 库metallib和 DXMT 的 unix 侧一起打包进libdxmt_combined.a由 Xcode 直接链进 app。运行时 DXMT 在命令缓冲区里排布计算 pass执行几何着色器其实是计算着色器填充中间顶点/索引缓冲图形 pass用普通管线消费中间缓冲输出画面⚙️ 顺带一提D3D12的着色器走的是另一条岔路Apple 官方 Metal Shader Converter 只认 DXIL所以 madeira_ir_unix.mm 会先判断容器类型——SM 5.x 的 DXBC 交给上面这套 AIR 编译器SM 6 的 DXIL 才交给 Apple 转换器。像《荒野大镖客2》里 189 个 SM 5.1 着色器正是靠这条 DXBC→AIR 路径才得以渲染。动手验证dump 一个 DXBC 看看 想亲眼看看 GS 的字节码长什么样可以在madeira.cfg里打开dump-shaders配置说明见 ConfigCatalog.generated.swift着色器会在缓存查找之前被转储到Documents/capture/shader_name.dxbc再用仓库自带的反汇编脚本 build/tools/dxbc-disasm.py 就能把 DXBC 还原成可读指令。配套的 D3D9 后端测试见 tests/dxmt/bcn-host-test.cppDXBC 的最小示例构建流程参考 build/d3d11-triangle/build.sh。关键文件路径速查表环节文件DXBC 解析dxmt/libs/DXBCParser/BlobContainer、ShaderBinary几何着色器转换build/dxmt-ios/build.sh 中的dxbc_converter_gs.cppAIR 中间表示dxmt/src/airconv/air_type.cpp、air_operations.cppmetallib 写出dxmt/src/airconv/metallib_writer.cppD3D12 DXIL/DXBC 分流madeira-d3d12/src/unix/madeira_ir_unix.mm构建说明build/dxmt-ios/README.md小结一条着色器在 Madeira 里的旅程DXBC 字节码 → DXBCParser 解析 → airconv 转为 AIR → GS 语义改写为计算 pass → 编译进 metallib → 运行时分两拍compute draw渲染。正是这条 DXBC→AIR→Metal 的完整路径让依赖几何着色器的 Windows 老游戏在 iOS 的 Metal 世界里变形后继续跑得飞快 。【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?