Files
MobileGL/docs/Disaggregated/notes/p5f/fcl-e2e-report.md
T

6.7 KiB
Raw Blame History

P5f FCL / Minecraft 端到端补测

本文是 aa78f102 的历史失败记录。后续 38919d45 已修复应用 buffer 消费及 Android 90° window blit,Magma inproc 已能正常进入同一世界;见 magma-inproc-fix.md。

2026-09-20,Redmi 2f7cbe2e,FCL com.tungsten.fcl.mgdebug.debug,Minecraft 26.3-rc-3,现有单人世界 test。此前 device-report.md 是公开 GL 像素 runner,不是 FCL E2E;本文是用户要求后新增的真实游戏测试。

两个后端均已实际启动测试;Magma inproc 失败,不能表述为两后端 split 均可玩。 GLES inproc、GLES monolith 与 Magma monolith 进入世界并完成至少 60 秒连续运行,截图人工复核。 Magma inproc 在加载阶段触发明确的 P7 buffer-consumer 拒绝,未到进世界阶段。

被测制品与安装

  • MobileGL 源头:aa78f102ff8ecbe32be34b79d1d654c039867d19,已推至 origin/feat/disaggregated。相对上一份验证库源头 cfca93c7 没有 C++ 行为变化。
  • 正常 Gradle 构建 :FCL:assembleFordebug,-Darch=arm64 与 mobilegl.pipePush=ON、mobilegl.buildDisaggregated=ON、 mobilegl.buildDisaggregatedInproc=ON;BUILD SUCCESSFUL in 52s。
  • settings.gradle.kts 的已有测试接线指向 MobileGL-disagg;NDK 27.3.13750724、 arm64、RelWithDebInfo。FCL 原有 Java / Kotlin 任务复用有效增量产物;未修改其源代码。
  • APK:FCL/build/outputs/apk/fordebug/FCL-fordebug-1.3.3.2-arm64-v8a.apk,326039983 bytes, applicationId 精确为 com.tungsten.fcl.mgdebug.debug,versionCode 1332。
  • APK SHA256:864fb685893abd346ac62aef1921dddddb6cd49c616ff0812ba9225cc90d11d7。
  • libMobileGL.so SHA256:76c61d5990f52e5ffcad9741532ea2dec443d6677f97b55585df886df0f1a1e7。
  • APK 与设备实际 nativeLibraryDir 的 MobileGL / libc++ hash 逐项一致;libc++ 为 46b51d661454b9cfaf42c1dc90893b5ad601b7a7ffc2e09d44bb3cc9d20e7ae2。 这是本轮 Windows/Gradle 的实际产物,不混用先前 WSL pixel runner 的库 hash。
  • 签名沿用已有 FCL debug key,证书 SHA256 b8f82162dbfd193d2c8383bda495d5d5cdbabcd00c4e9064bc59483422a8b765;adb install -r 成功,设备 lastUpdateTime 2026-09-20 13:49:19。配置、options 与 55 MiB 的 test 世界已备份, 没有清应用数据或改其他 FCL 包。

实际运行结果

后端 / transport 入世界 稳定窗口 窗口内帧增量 轮询近似 FPS(仅记录) 判定
GLES / inproc,strict=1、role-split=1 32.029 s 64.005 s 14280 223.109 PASS,真实 apply verbs、所有128个统计窗口 rsp=0
Magma / inproc,strict=1、role-split=1 未进入 — — — FAIL,21.454 s 内退出,P7 buffer consumer
Magma / monolith 28.435 s 62.251 s 10560 169.636 PASS,90个统计窗口 rsp=0、vbs=0
GLES / monolith 38.864 s 60.696 s 6840 112.692 PASS,64个统计窗口 rsp=0、vbs=0

成功项同时核对:实际 backend 日志、inproc 的 capability/strict/role 配置、fresh 游戏日志 中的玩家进入世界、持续递增的 frames、进程存活与截图。GLES inproc 已 ARMED;Magma inproc 明确运行 lockstep,没有以界面选项或环境文件代替运行臂证明。每组前重启;GLES inproc 首次启动失败后的重试在同一次 boot 内完成。

画面人工检查范围是地形、树木、天空、手部、快捷栏与正常菜单;未见黑屏或明显纹理破坏。 场景时间/视角在运行中有变化,未定频,也不是固定帧像素比对;表中 FPS 不能用于后端性能 比较或回归判定。只验证这个版本、这个世界及数分钟内的游戏流程,不宣称完整功能覆盖。

Magma inproc 的真实失败

[13:58:45] [Android mgl-srv-apply/FATAL]: MGPipe: Fatal{RoleViolation, "buffer-legacy-arm"} (Magma P7 buffer consumer)

同次日志先报告 subsystem 0x80 没有 server consumer,随后在 apply 线程拒绝 legacy buffer 路径。该文案对应 Magma draw / indirect buffer 的 P7 守卫,区别于 UniformManager 的另一条 buffer descriptors remain P7 文案。现有抓取没有 native PC / tombstone,不能进一步指定 是哪一个 GL draw 或 VBO/EBO 触发;FCL 自身的 SIGABRT hook 会接管退出。 这不是测试跳过,也没有通过关闭 strict / dualblock 绕过拒绝。Magma monolith 成功仅说明 该库的单体路径能跑此游戏,不能代替 split 支持。P5f 的已完成范围仍以 wire ownership 门 为准,完整 Magma 应用缓冲消费继续属于 P7。

其余诊断没有隐去

GLES 首次启动 PID 12166 在 MobileGL 初始化前被 signal 34 结束,没有生成 library log; 根因未定位。原始日志保留在 GLES-inproc/,同配置重试保留在 GLES-inproc-retry/。 两次都有 ClassNotFoundException: sun/java2d/SurfaceManagerFactory,成功重试证明不能 把这条被处理的 CTC agent 警告认作首轮退出原因。

成功运行仍有初始化诊断:GLES 的 eglSwapBuffersWithDamageEXT 动态入口缺失带历史 FATAL 日志级别,但没有导致 abort;还有 glShaderStorageBlockBinding 入口缺失、两后端的 GL_STENCIL_INDEX8 归一化诊断,Magma 的 separate depth/stencil 不支持提示。 因此本文不宣称“日志零错误”;通过项是本场景实际进世界、运行与画面检查,且无 wire Fatal{...} / 进程退出。Magma 的具名 P7 拒绝单列为失败。

复现与证据

证据根:C:/Users/geekerwan/.codex/tmp/p5f-fcl-e2e-aa78f102/。其中有 Gradle 日志、 artifact-identity.json、设备库 hash、构建接线快照、备份,以及每臂的 library/latest/logcat、 boot-id、逐次 pid/统计采样、summary 和截图。run_fcl_arm.py 只负责测试采样,未清 logcat、 未 pin 时钟;机器成功状态需经过人工截图检查再判 PASS。

FCL 当前的 mg_transport.txt / mg_env.txt 接线只在内置 Espryt renderer 分支执行;因此四臂 保持该入口,通过 MOBILEGL_BACKEND_TYPE 明确覆盖后端,并核运行日志。直接点内置 Magma 选项默认走 monolith,不能把这种操作误记成 Magma inproc。两后端加载同一个 libMobileGL.so。 所有 inproc 组使用 stage=256 MiB、strict=1、role-split-state=1、run-ahead=1、stats period=120; monolith 对照明确设 transport=monolith、role-split-state=0。

测试结束已从游戏菜单保存退出,恢复原 mg_transport.txt=inproc 与空 mg_env.txt, 核对文件 hash 一致。新 APK 保留安装;未改系统时钟/定频设置,未回滚运行中发生的世界变更。 完整 test 世界备份仍在证据根的 backup/test/。父仓原有冲突索引和未提交构建配置未改动。