ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何让Chromium 126合成路径在Madeira中可独立测试:离线复现oracle设计

如何让Chromium 126合成路径在Madeira中可独立测试:离线复现oracle设计 如何让Chromium 126合成路径在Madeira中可独立测试离线复现oracle设计【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/MadeiraMadeira 是一个让 iPhone 免越狱运行 Windows PC 游戏的开源项目核心链路是 FEX-Emu 指令翻译 Wine 11.4 Metal 渲染。当 Chromium 浏览器以客端应用身份跑在 Madeira 里时它的进程内 GPU/合成线程会向 D3D 层持续提交渲染负载——这正是 ContentView.swift 中记录的Chrome in-proc GPU 线程场景。问题是怎么在不上真机、不占一次昂贵的设备运行的前提下独立验证这条合成路径答案是 Madeira 采用的离线 oracle预言机设计先写死期望像素再让程序去证明自己。为什么 Chromium 合成路径无法只靠真机验证先理解成本结构。Madeira 依赖 iOS 的 JIT 能力而 iOS 只允许在调试器挂载时执行 JIT签名每周过期未签名的二推送到设备上会被 AMFI 直接杀掉。README 里有一句被反复引用的经验一次设备运行a device run贵到值得为它单独设计测试。而合成路径的验证天然是像素级的Chromium 的合成线程提交 D3D 调用 → 经 DXMTD3D11或 madeira-d3d12D3D12 on Metal→ 最终由 Apple 的 Metal Shader Converter 把 DXIL 转成 Metal 库 → 出像素。任何一环错位——参数缓冲区偏移错、绑定点对不上、缓存键漏了变量——屏幕上都看起来还行实则颜色是错的。如果每次验证都要构建 → 签名 → 推送 iPhone → 挂调试器 → 看屏幕一天迭代不了几次更不可能在 CI 里跑。所以 Madeira 把验证拆成了可独立测试的单元且每个单元都配了一个 oracle。Oracle 设计先写死期望像素再跑转换Oracle 的核心思想只有一句话不验证画面合理只验证画面等于预先算好的那个值。msc_canary.mm 是 M1 里程碑的守门测试canary金丝雀它在任何 D3D12 COM 对象动工之前就必须通过注释里写得很直白如果一个转换后的着色器无法通过顶层参数缓冲区读回我们放入的颜色就没有必要在它的上面继续实现 D3D12 对象。它按顺序证明六件事#Oracle 断言为什么能抓错1转换器可加载API 与钉死的包头一致依赖漂移立刻报错2显式构造的 root signature 驱动参数缓冲区布局不信任编译器内嵌数据3产出的 metallib 能在执行设备加载转换成功 ≠ 可执行4两种常量化状态 →两个精确预测的图像如(255,0,0,255)偏移或绑定点错一个字节颜色就错而不是貌似合理5相同输入重编译 → 字节级一致着色器缓存可以安全按键复用6非法 DXIL / 截断 blob / 未知入口点 → 有界、具名的错误失败路径不崩溃第 4 条就是 oracle 的灵魂错出的是错的颜色而不是貌似合理的颜色。夹具着色器在 canary.hlsl 和 canary_layout.hlsl编译产物.dxil直接入库保证每次跑的都是同一份输入。离线复现三步走夹具、主机环、假设杀手第一步把输入钉成文件可独立测试的前提是输入可复现。着色器夹具HLSL 源码 DXIL root signature全部在 madeira-d3d12/shaders/ 下测试程序在 tests/native/ 与 tests/windows/谁都不需要 iPhone 就能编译运行。第二步在 macOS 主机上建主机环iOS 与 macOS 的转换器导出完全相同的 116 个符号、零差异所以 macOS 循环是 API 形状的公平代理M4 Max 上首次转换 0.9 ms、缓存重编译 0.4 ms而一次真机运行按小时计。canary 在主机上26/26 通过之后才有资格谈上设备。第三步为每个假设写一个杀手测试tests/offline/README.md 的开篇是整篇文章最值得抄的一句话每一个测试都是为杀死一个关于 D3D12 运行时的具体假设而写的——而且每一个都做到了。这些测试回答的都是Metal 或转换器到底会做什么这类无法靠文档确定的问题测试被杀死的假设结论rg11b10/计算着色器经 UAV 写RG11B10Float会失败四种格式全部写对attachless/无附件渲染 pass 越界写会触发页错误100 MB 越写 16 KB 缓冲也完成越界片段写被丢弃tex3d/经 MSC 转换后 UAV 写 3D 纹理会丢失8 个深度切片全部精确atomic64/64 位InterlockedMax经转换不可用16/16 竞争格精确转换器会拒绝读取结果的着色器注意一个工程细节README 用 ⚠️ 标注过结果必须打到stderr或setbuf(stdout, NULL)——这些测试在析构阶段 abort块缓冲的 stdout 会把答案直接丢掉。钉死依赖SHA-256 与缓存键离线可复现还有两个容易被忽略的前提Madeira 都做了依赖钉死哈希。Metal Shader Converter 4.0 beta 2 的 pkg 不在 git 里deps.sh 使用前先校验 SHA-256不匹配直接拒绝继续——因为编译器包本身是缓存键的一部分。缓存键按编译器被允许变化的东西设计。一个真实教训同一着色器GPU family 取 Apple9 与 Metal3 时macOS 上产物字节一致iOS 上却不同。在 macOS 上没变化不是可以从缓存键里删掉的理由。最终策略保守而清晰按转换器构建 编译平台 目标 OS GPU family 命名空间隔离跨位置共享条目必须有显式兼容策略。从 macOS 到 iPhone 的验证阶梯离线 oracle 通过后同一条路径逐级升级到真机每级都有独立计数失败时能精确定位是哪一级坏了关卡位置结果M1 canarymacOS M4 Max 主机26/26M1 canaryvphone VMiOS 17旁路虚拟化 GPU26/26M1 in-app打包进 app、Madeira 自己的签名与沙箱内dlopen27/27M1 真机iPhone 13 ProA15 GPU27/27首次转换 16.8 msM2 COM ABIm2_abi.c x86-64 客端走 FEX 调 ARM64EC 代码41/41M3a 拷贝回读GPU 拷贝 每跳不同偏移 哨兵预填54/54M3 离屏渲染三角形 深度测试立方体像素在客端读回77/77M4 呈现屏幕上翻滚的立方体双设备通过还有一条常被低估的隔离同一 canary 先作为普通二进制在 vphone 上 SSH 跑通才分别回答转换器在 iOS 能不能用 / 打包签名对不对 / 启动路径能不能驱动它三个问题——它们值得各自独立的失败而不是糊在一起。新手复现清单离线跑通 oracle 的最小步骤拿到代码git clone --recurse-submodules https://gitcode.com/GitHub_Trending/mad/Madeira按 docs/BUILDING.md 准备工具链并把转换器 pkg 解包到本地SDK 不在 git 中pkgutil --expand-full Metal Shader Converter 4.0 beta 2.pkg /tmp/msc构建并运行 M1 canary一行构建脚本 一行运行主机环全程分钟级bash build/madeira-d3d12/build-canary.sh ./build/madeira-d3d12/out/msc_canary想深入单个假设tests/offline/README.md 给每个测试都配好了独立构建命令用clang而非clang需要 ObjC 异常运行时。复现成功后你会得到与 README 中完全相同的判定两种常量状态读回两个精确预测的图像重编译字节一致非法输入报具名错误——这就是Chromium 这类客端应用的合成路径可以被独立测试的全部含义路径上每个单元都有先写好的答案且答案可以在没有 iPhone 的机器上被核对。小结把 oracle 模式迁移到你的渲染栈这套设计可以抽象成四条通用实践分层设卡转换层M1与对象层M2分开验收COM 失败不会被 GPU 问题污染期望先行oracle 在断言里不在眼睛里看起来对不算通过假设驱动每个离线测试只杀一个假设测完在文档里登记问题 → 答案输入钉死夹具入 git、依赖钉哈希、缓存键覆盖编译器被允许变化的全部维度。当你的应用里也跑着 Chromium 这样的合成大户而真机又贵、签名又难时——先问自己我的 oracle 写好了吗更多构建细节见 docs/BUILDING.mdD3D12 运行时全貌见 madeira-d3d12/README.md32 位客端Chromium 常见场景见 docs/WOW64.md。【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表