diff --git a/docs/Disaggregated/notes/DEBTS.md b/docs/Disaggregated/notes/DEBTS.md index 614cbf31..ffbcfe0e 100644 --- a/docs/Disaggregated/notes/DEBTS.md +++ b/docs/Disaggregated/notes/DEBTS.md @@ -23,7 +23,7 @@ | P8 转出(B):`PipeCalls.def:260` `GenerateMipmap` 仍是 `kWaitApplied`,裁定 14 的理由(CPU 滤波碰 client 影子)已不成立,可改 `kWaitNone` | 性能工作(协议行为变更,需单独裁定) | | P8 转出(C):server SSBO 标记过近似(窗口内每个绑定的 SSBO 都标);一个留在 SSBO 绑定上又当 restart EBO 用的 buffer 每次 draw 都回读 | 性能工作 | | P13 转出(W5 翻转后,ID-P13-2 记录项,用户裁定记为债务):Magma monolith 走记录臂比前端臂慢约 16%——Y700 上 FCL MC 1.21.5、RD2 小场景、时钟未钉:记录臂 168 / 176 fps,同库强制前端臂 206 / 204 fps,即每帧 CPU 约 5.8 ms 对 4.9 ms(渲染线程都约占满一核);Espryt 持平(224 / 226 对 222)。疑因:`VulkanRenderer::SetupDraw` 在记录臂直接进 `SetupWireDraw`,绕过只在前端臂跑的 `TrySetupDrawFastPath`(PLAN-P13 §1.3 已提示「换臂前先量」)。W6 删前端臂后这部分成本固定下来 | P13 收官后:设备上钉时钟 profile Magma monolith 每 draw 成本(simpleperf,对比 W5 前端臂数据),再决定给 wire draw 臂补快路径;P13 内不优化 | -| P13 转出(FCL 浸泡,用户裁定:FCL 暂不改、MobileGL 不做规避):FCL game process can die silently (exit SIGNALED status=34, SIGRTMIN+2): the JVM signal reset after renderer selection drops libcore's AsynchronousCloseMonitor handler, and FCL's okhttp/Okio watchdog then kills the process; renderer-independent (reproduced on P12 and P13 libraries, both backends; untested with other renderers)。浸泡:P13 库 30 次(Magma 22 / Espryt 8)死 18 次、P12 库 10 次死 2 次,全部 status=34,无 tombstone、无 kgsl;证据与机理见 [`p13/fcl-soak/README.md`](p13/fcl-soak/README.md) | fix belongs in FCL (save/restore libcore's SIGRTMIN+2 sigaction around JVM creation); left for the user | +| P13 转出(FCL 浸泡,用户裁定:FCL 暂不改、MobileGL 不做规避):FCL game process can die silently (exit SIGNALED status=34, SIGRTMIN+2): the JVM signal reset after renderer selection drops libcore's AsynchronousCloseMonitor handler, and FCL's okhttp/Okio watchdog then kills the process; renderer-independent (reproduced on P12 and P13 libraries, both backends; untested with other renderers)。浸泡:P13 库 30 次(Magma 22 / Espryt 8)死 18 次、P12 库 10 次死 2 次;P12 / P13 逐次交替的对照(同场景同网络时段)P12 4/10、P13 2/10,时间线(`Renderer:` 行到 MobileGL 首行约 6.2 s、晚死固定在其后约 9.4 s)两库相同,无证据表明 MobileGL 拉高概率;全部 status=34,无 tombstone、无 kgsl;证据与机理见 [`p13/fcl-soak/README.md`](p13/fcl-soak/README.md) | fix belongs in FCL (save/restore libcore's SIGRTMIN+2 sigaction around JVM creation); left for the user | | P8 转出(monolith,ID-P8-13):9 条 monolith 缺陷真实内容 0 命中,不在 dev 上修——Espryt `*IndirectCount` / 原生 indirect `gl_BaseVertex` / fp64 收窄读未同步影子;Magma `glMultiDrawArraysIndirectCount` CPU 臂同病;Magma 录制中途 `SyncGpuWrites` → SIGSEGV;Espryt RGB16F / RGB32F CPU 滤波读陈旧影子、R11F / 深度链无视 BASE / MAX;Magma 无 BLIT 颜色格式缺着色器 mip 臂;Espryt 拷贝后 `glGetTexImage` 读拷贝前影子(证据见 `notes/p8/{B,C,D,E}.md`) | P13(monolith 换到已修好的记录臂) | | P8 转出(monolith,feat,ID-P8-14):feat 的 monolith 臂每次 indirect draw 在命令缓冲有 GPU 写时整 buffer 同步回读(`SyncClientSideVertexArraysForIndirectFetch`,`62bfe461`,dev 无);Magma 的 split 构建 monolith 深度 mip 不传 view 类型,无深度 `BLIT_DST` 的设备上 1D 深度链会拿到 2D view(推断,Release 下断言编译掉,SV) | P13(monolith 换臂) | | P8 转出(MD):dev 的 `RingAllocateSlow` 在出错的上下文上无上限地排水(设备上挂在 `glFinish`) | 小修(dev) | diff --git a/docs/Disaggregated/notes/p13/README.md b/docs/Disaggregated/notes/p13/README.md index 97f0d180..9b3a0632 100644 --- a/docs/Disaggregated/notes/p13/README.md +++ b/docs/Disaggregated/notes/p13/README.md @@ -25,6 +25,12 @@ | W5 S5 | 本地完成 | `b13af729` `b1978890` | 记录臂三旋钮进 `RecordArmTable`;`DataArmIsRecord` / `RecordArmAliasesFrontend`、`MonolithTakesRecordArm`、`MOBILEGL_PIPE_DATA_ARM` 跟 `RECORD_ARM`(不再跟传输) | | W5 S6 | 本地完成 | `dd7fbbd7` | 集成 peek 在无传输构建里也答 `dataArmIsRecord`;跟踪器探针跟 `RECORD_ARM` | | W5 S7 | 本地完成(CI 待跑) | `19610290` `23593c9f`…`e9a353c3` | **翻转**:`MOBILEGL_BUILD_RECORD_ARM` 恒 ON,无 MG_Remote 的库(FCL 形态)也跑记录臂。`MOBILEGL_PIPE_PERSISTENT_MPROTECT=0` 关掉跟踪器的 SIGSEGV 处理器(FCL 是 JVM;启动打日志;单元 `TheMprotectSwitchSendsEveryNewMapToTheHashScan`),mprotect 臂只在 Linux / Android 编。`runtime_mode_proof` 加正半:两形态都要 `MG_Record` 符号(push 294、split 300),自测含两条无 `MG_Record` 的红例。翻转后 push 单元暴露的残留误分类(记录动词的 verb 状态盖章、按记录读的顶点 / IBO / 绑定点 / 采样器路径、XFB 捕获回落、视图窗口 mip、镜像可绑定重铸、暂存库跟随、跟踪器成员资格、测试的前端臂钉)全部改跟 `RECORD_ARM`;push 单元 2028/2028 | +| W5 S8 | 已推(CI 37515697754:382 绿、2 红均已归类并修) | `7fb18840` `c1e985c8` | `MOBILEGL_BUILD_RECORD_ARM` 被 unifdef 掉,`retired_switches` 禁止它回到 `#if`。verify 车道的阴性对照 B 改省略 `ReadPixels:GetPixelStoreParameters`(monolith 记录臂不再读 GenerateMipmap 的活动单元);monolith 启动时记一行数据臂 | +| W6a | 已推(`887547c7`,CI 37534648608 / 37534648624) | `d61a4240` `740dd301` | 记录臂是唯一数据臂:`DataArmIsRecord()` 恒 true(constexpr),`MOBILEGL_PIPE_DATA_ARM` / `InitDataArm` / `ScopedMonolithFrontendArm` 删;`HandleRecycle.AbaControlHandles` 车道退役;立方面读回两条规则移到 `CubeFaceReadbackScenario` | +| W6b | 已推(同上) | `742d43ae` `e0113503` `3aed7ae0` `e822c933` | 数据臂谓词从两后端所有分支折掉,记录臂 return 之后的前端臂代码删;XFB 角色状态只留一份;10 个前端臂单元用例删(逐条记入 `docs/ci/ci-cleanup-log.md`),两条 GL 采样规则移到 `TextureUnitSamplingScenario` | +| W6c | 本地完成 | `dc1e95b4` | Magma 前端臂:前端 `MagmaProgramSource` 构造与 `IsWire()` 折掉,前端采样集遍历、占位纹理、VAO draw memo、`MagmaPipeIdentityTables` 与 ABA 旋钮、`TrySetupDrawFastPath` 与快照、前端 fallback 纹理删(约 7100 行) | +| W6d | 本地完成 | `8abae647` `8bc39c79` | Espryt 各族臂谓词(framebuffer / texture / sampler / program / buffer / vertex input 及其别名)折为记录臂,`g_fboTextureSyncList` 等前端遍历删;启动时只查色彩附件上限(`ResolveRecordArmFamilies`);未迁移仿真名单清空(审计保留,守 0) | +| W6e | 本地完成 | `dab827d5` `737ef5e9` | 后端表里 verb port 在各模式都覆盖的前端对象入口(`ClearNamedFramebuffer*`、`BlitNamedFramebuffer`、`GetTex(ture)Image`、`MultiDrawElements`)及其实现删;Magma 前端 render pass、pending clear、renderbuffer 半边删。link ratchet 171 → 58,`# P13` 95 → 11(余下 11 条:Espryt 以前端对象铸句柄的 slot 表入口与 apply 线程拒绝函数 7 条、`PipeInputs` 访问器 3 条、FBO 附件 `IsComplete` 1 条) | ### G1 退役读数(ID-P13-4,2026-10-06) diff --git a/docs/Disaggregated/notes/p13/fcl-soak/README.md b/docs/Disaggregated/notes/p13/fcl-soak/README.md index aa45c6f3..4fd84791 100644 --- a/docs/Disaggregated/notes/p13/fcl-soak/README.md +++ b/docs/Disaggregated/notes/p13/fcl-soak/README.md @@ -42,6 +42,18 @@ after (or do not reset that signal). Left for the user. | clean (`soak-p13-clean-summary.txt`, `soak2.sh` with the SigCgt sampler and per-run ftrace) | P13 FCL lib at `c1e985c8` | 30 (22 Magma, 8 Espryt) | 18: Magma 13/22, Espryt 5/8 | | P12 control (`soak-p12-control-summary.txt`) | P12 end `743f4e8e` | 10 Magma | 2 | +| matched A/B (`soak-ab-p12-p13-summary.txt`, `soak3.sh`): P12 and P13 libraries alternated launch by launch, Magma, same world, settings and network window, 40 s in-world | P12 `743f4e8e` / P13 `c1e985c8` | 10 + 10 | P12 4/10, P13 2/10 | + +**Does the P13 library raise the rate?** No evidence it does. The clean soak's 18/30 against the +first P12 control's 2/10 was not a comparable pair: the two ran at different times (the rate tracks +whether FCL's background request is still pending, i.e. network conditions), and the P12 control +overlapped the contaminated P13 runs below. In the matched, interleaved A/B the P12 library died +more often (4/10) than the P13 one (2/10). The timeline is library-independent too: in every death +logcat FCL's `Renderer:` line is followed by the JVM's signal reset after 0.2-0.6 s and by +MobileGL's first log line after about 6.2 s for both libraries (P12 deaths: 6.3 s and 6.2 s), and +the late deaths land at a fixed ~9.4 s after the `Renderer:` line on both libraries - a timeout +started before MobileGL is loaded, not a window MobileGL's start-up widens. + Earlier P13 runs (first 5-run soak) are not counted: two soak scripts were found driving the phone at once and force-stopping each other's runs; `soak2.sh` now takes a lock. diff --git a/docs/Disaggregated/notes/p13/fcl-soak/soak-ab-p12-p13-summary.txt b/docs/Disaggregated/notes/p13/fcl-soak/soak-ab-p12-p13-summary.txt new file mode 100644 index 00000000..aea68209 --- /dev/null +++ b/docs/Disaggregated/notes/p13/fcl-soak/soak-ab-p12-p13-summary.txt @@ -0,0 +1,22 @@ +# run backend result mgl arm inworld deathTime exit sig34CaughtAtLaunch sig34CaughtInGame firstUncaught firstMGL ftraceFatal34 tomb+ kgsl +1 p12 ok mgl=3 arm=? inworld=0 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=06:52:04.390 firstMGL=06:53:18.552 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +2 p13 ok mgl=310 arm=record inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=06:53:36.454 firstMGL=06:53:25.896 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +3 p12 ok mgl=284 arm=? inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=06:55:08.172 firstMGL=06:54:58.992 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +4 p13 ok mgl=310 arm=record inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=06:56:47.522 firstMGL=06:56:37.813 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +5 p12 ok mgl=284 arm=? inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=06:58:11.427 firstMGL=06:58:01.955 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +6 p13 ok mgl=310 arm=record inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=06:59:44.626 firstMGL=07:00:03.119 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +7 p12 ok mgl=284 arm=? inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:01:18.188 firstMGL=07:01:08.751 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +8 p13 ok mgl=310 arm=record inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:02:50.811 firstMGL=07:03:27.619 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +9 p12 ok mgl=284 arm=? inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:04:24.047 firstMGL=07:04:14.084 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +10 p13 DIED mgl=310 arm=record inworld=0 death=07:07:09.837 exit=[reason=2 (SIGNALED) reason=0 (UNKNOWN) status=34 ] launch34=yes game34=no firstUncaught=07:05:56.650 firstMGL=07:06:50.825 sig34gen/deliv=1/0 tomb+=0 kgsl=0 +11 p12 DIED mgl=284 arm=? inworld=0 death=07:07:37.670 exit=[reason=2 (SIGNALED) reason=0 (UNKNOWN) status=34 ] launch34=yes game34=yes firstUncaught=07:07:28.471 firstMGL=07:07:18.998 sig34gen/deliv=3/2 tomb+=0 kgsl=0 +12 p13 ok mgl=3 arm=? inworld=0 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:09:01.657 firstMGL=07:10:14.637 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +13 p12 DIED mgl=4 arm=? inworld=0 death=07:10:33.932 exit=[reason=2 (SIGNALED) reason=0 (UNKNOWN) status=34 ] launch34=yes game34=yes firstUncaught=07:10:33.186 firstMGL=07:10:23.982 sig34gen/deliv=2/1 tomb+=0 kgsl=0 +14 p13 ok mgl=310 arm=record inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:12:05.450 firstMGL=07:11:56.252 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +15 p12 ok mgl=284 arm=? inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:13:49.067 firstMGL=07:13:38.913 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +16 p13 ok mgl=310 arm=record inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:15:09.245 firstMGL=07:14:59.248 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +17 p12 DIED mgl=4 arm=? inworld=0 death=07:17:11.665 exit=[reason=2 (SIGNALED) reason=0 (UNKNOWN) status=34 ] launch34=yes game34=yes firstUncaught=07:16:39.632 firstMGL=07:17:00.892 sig34gen/deliv=3/2 tomb+=0 kgsl=0 +18 p13 DIED mgl=310 arm=record inworld=9 death=07:18:27.221 exit=[reason=2 (SIGNALED) reason=0 (UNKNOWN) status=34 ] launch34=yes game34=yes firstUncaught=07:18:10.349 firstMGL=07:18:01.124 sig34gen/deliv=3/2 tomb+=0 kgsl=0 +19 p12 DIED mgl=288 arm=? inworld=9 death=07:19:57.934 exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=yes firstUncaught=07:19:41.110 firstMGL=07:19:31.642 sig34gen/deliv=1/0 tomb+=0 kgsl=0 +20 p13 ok mgl=310 arm=record inworld=9 death=- exit=[reason=10 (USER REQUESTED) reason=21 (FORCE STOP) status=0 ] launch34=yes game34=no firstUncaught=07:21:11.922 firstMGL=07:21:02.057 sig34gen/deliv=0/0 tomb+=0 kgsl=0 +soak done diff --git a/docs/Disaggregated/notes/p13/fcl-soak/soak3.sh b/docs/Disaggregated/notes/p13/fcl-soak/soak3.sh new file mode 100644 index 00000000..ac6e06d6 --- /dev/null +++ b/docs/Disaggregated/notes/p13/fcl-soak/soak3.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# soak3.sh : matched A/B, alternating the P12 and P13 FCL libraries on Magma (same world, settings, network window).: FCL launch soak (ONE instance at a time - it takes a +# lock) with diagnostics, plus a device-side sampler of the FCL process's caught-signal mask (SigCgt), so a +# death by signal 34 can be tied to whether bionic/libcore's SIGRTMIN+2 handler is still installed. +export MSYS_NO_PATHCONV=1 +NP=${1:-10}; SECS=${2:-40} +BASE=${SOAK_DIR:?set SOAK_DIR} +LOCK=/c/Users/yello/AppData/Local/Temp/claude/C--Users-yello-AndroidStudioProjects-FoldCraftLauncher-MobileGL/0e0e570f-5721-41d8-9d0f-80fcde638a84/scratchpad/soak.lock +if ! mkdir "$LOCK" 2>/dev/null; then echo "another soak holds $LOCK"; exit 1; fi +trap 'rmdir "$LOCK"' EXIT +mkdir -p "$BASE" +PKG=com.tungsten.fcl.mgdebug.debug +CFG=/data/data/$PKG/files/config.json +SUM=$BASE/summary.txt +echo "# run backend result mgl arm inworld deathTime exit sig34CaughtAtLaunch sig34CaughtInGame firstUncaught firstMGL ftraceFatal34 tomb+ kgsl" >> "$SUM" +adb logcat -G 16M >/dev/null 2>&1 +# The sampler: every 0.5 s, "