[Docs] (P11): rulings ID-P11-1..9 with the integration gate, A-DEVICE (T0 is GO from the app domain on both backends; adoption buys RSS not frame time on the Adreno; split T2 costs RSS and p99), the debts the dev merge closes and the ones P11 hands on, and W2-REMINT marking the monolith re-mint fixed

This commit is contained in:
2026-09-29 08:03:09 -04:00
parent 82467823ef
commit 26de2b60fc
4 changed files with 63 additions and 5 deletions
+7 -4
View File
@@ -1,6 +1,6 @@
# 仍开放的债务(跨阶段)
> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 [`p5b/README.md`](p5b/README.md) 末节。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-29(P10 收官)。
> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 [`p5b/README.md`](p5b/README.md) 末节。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-29(P10 收官;P11 进行中)。
| 债务 | 去向 |
|---|---|
@@ -8,14 +8,17 @@
| 仿真路径的具名拒绝:multi-draw client indices、RGB CPU mip 等(class C 已于 P10 清零) | P8 |
| P10 转出:`GL_ARB_gpu_shader_fp64` 按 server 的 `MOBILEGL_ADVERTISE_FP64` 宣告,fp64 收窄却在 client 的编译里;tcp 下 server 环境不同时两者不一致(与已修的 `GL_KHR_parallel_shader_compile` 同类,挂点 `CapsMirror::Adopt`,ID-P10-10) | 小修,无触发报告 |
| P10 转出(性能):设备上 tcp loopback 的 rd12 每帧 19.4 ms 中 ~11.2 ms 是生产者在 stream 传输里的停车(发送 + 环 / stage / ack 等待),credit 等待只有 ~0.2 ms(`notes/p10/C-MEASUREMENTS.md` §2,ID-P10-13) | 路线图推完后的性能工作 |
| P10 转出:Magma 没有注册 `SetSwapInterval`,monolith 与 split 下 `eglSwapInterval` 都是空操作(ID-P10-10) | dev(独立任务) |
| P11 转出(性能):设备上 MC 26.3,split T2 相对单进程采纳的 p99 Espryt +37–42%、Magma 约 2.5×,RSS 1.4–2×;其中一部分是线程落位——server apply 线程钉在 6–7 核,client GL 线程多半落到慢核,每帧 CPU 约 2.3×(`notes/p11/A-DEVICE.md`) | 路线图推完后的性能工作;RSS 由 B(T0)处理 |
| P11 转出:Espryt 对零散写入按并集框上传,把影子里的旧纹素盖到框内 GPU 写过的空隙上(8×8 探针 41 个错,pull 与全部 Espryt 臂;Magma 对);dev `568090f0` 的 `AdoptDriverLevelIntoShadow` 有同样的并集框近似(读代码) | dev(独立任务) |
| P11 转出:Magma 单进程重放 rd12 在加载帧耗尽 `vm.max_map_count`(65530,其中 57–60k 是 `/dev/kgsl-3d0` 映射)而 abort;split 的 Magma 与 Espryt 都正常 | dev(独立任务) |
| P11 转出:client 与 server 共用日志前缀时,client 以 `"w"` 打开 `<base>.server.log` 写转发来的 server 日志,会截断 server 自己的文件(依赖 server 日志行的 P12 装置测试可能受影响) | 小修 |
| P11 转出:pull 构建没有任何门跑集成测试(`TextureRemintPullScenario` 在 pull 上自 P9 起就是红的,P11 M 修) | CI / 门的覆盖,需裁定 |
| `GetCaps` 的两个 blobref | 一旦运输,必须有 server → client 的 carrier rule,不能套 `SEG_STAGE` |
| E1 对照的重定义(ID-122) | 无主(开放问题 24) |
| `MOBILEGL_IPC_IDLE_EXIT_S` 未解析;`CONTRACT-P6.md` 仍把 `DynamicBackendParameters` 定宽记在 P7 名下(已由 P6.5 wf 落地) | 文档 / 小修 |
| P12 未做(2026-09-29 收官时转入):DirectGLES `g_Display` / `g_Surface` / `g_Context` 仍是全局(每进程一个会话时不需要);cached-app freezer 的完整处理(文档从未定义);多 context;D8 窗口种类白名单(X11 / Win32Hwnd / None 仍被接受并把 token 强转为指针);TLS;server 窗口不转发输入;修后的横屏 server 窗口未重测 | 无主;D8 等 Windows / X11 client,其余等出现第二个会话 / 第二个 context 的需求 |
| P9 转出(2026-09-29 收官):monolith Espryt 重铸重放 client 影子、覆盖 GPU 写过的纹素(iris-derivative 的系统差;修法改 pull `.text`,ID-P9-8) | dev(独立任务) |
| P9 转出:`TCP_USER_TIMEOUT` = 5000 ms——client 停读控制超过 5 s 且有待发日志字节时内核仍断开连接;`PublishSessionFault` 的阻塞写对停读的 client 最多等同样 5 s(ID-P9-10) | 传输策略,需裁定 |
| P9 转出:Espryt 重铸保留路径上 framebuffer clear 后 `imageLoad` 偶读旧值(主机 3/30,加 barrier 后 0/30;`TextureRemintPullScenario` case C 暂钉 barrier),疑 llvmpipe(ID-P9-11) | 待归因 |
| P9 转出:Espryt 重铸保留路径上 framebuffer clear 后 `imageLoad` 偶读旧值(主机 3/30,加 barrier 后 0/30;`TextureRemintPullScenario` case C 暂钉 barrier),疑 llvmpipe(ID-P9-11);P11 合并 dev 后 push 单进程臂上也见过一次,`ImageBindableRemintScenario` 同样钉 barrier(ID-P11-6) | 待归因 |
| P9 转出:Magma 每次 draw 对可写 SSBO / texel buffer / XFB 目标发整 buffer 的 `OnGpuWritten`(create-indirect 首帧 7,093 条),client 已自标同一批,冗余无害;`OnTextureWriteback`、`OnMipLevelsGenerated`、`OnCapsInvalidated` 仍无生产者 | 以后的收窄 / 清理候选(ID-P9-7) |
| `MOBILEGL_PIPE_TEXEL_RETAIN_MB` 已无消费者,但在 pull 构建里 | P13(G1) |
| 树外脚本:普查跑器、`wsl_p5_gate.sh` 等在 `~/w7/notes/`,git merge 不会传播 | 需要时入库 |
+38
View File
@@ -0,0 +1,38 @@
# P11 A3 / A4:app 域外存探针与采纳基线(真机)
2026-09-29,Redmi `2f7cbe2e`(Adreno 830,GLES 3.2 V@0800.71,Vulkan 1.3.284 / 512.800.71)。代码 `ffeed0da` + 三个只动工具的提交(`p11/d`:`ea410991`、`1082ff5e`、`f4ead90a`)。CPU 定频并回读核验,GPU 未定频。只记录、不设门。原始数据 `~/w7/notes/p11/evidence/d/`,报告 `~/w7/notes/p11/d-report.md`。
## A3:T0 在 app 域能不能用(开放问题 3)
同一个探针 `.so`,shell 域(`u:r:shell:s0`)与经 trace app 的 exec 钩子在 `untrusted_app`(`u:r:untrusted_app:s0:c83,c257,c512,c768`)里各跑 5 组配置 × 2 次,交错进行。
| 路线 | shell / app |
|---|---|
| T0 AHB:交接、CPU 锁、Vulkan 导入、GPU 访问、GLES 导入、写回 client(64 KiB、128 MiB 两端区域) | OK / OK |
| **T0S 持续锁定**(client 从不解锁;8 轮 GPU 读 CPU 写、CPU 经持有的指针读 GPU 填充),Vulkan 与 GLES、64 KiB 与 128 MiB | OK / OK |
| T1 opaque-fd | OK / OK |
| T1-GLES memobj | FAIL / FAIL(与 spike B 同) |
| T3 | UNSUPPORTED / UNSUPPORTED |
**结论:两域逐行无差别;Vulkan 导入与 GLES `glBufferStorageExternalEXT` 导入都是 GO。** 局限:一台设备;持续锁定是顺序的乒乓,不是真正并发的 CPU / GPU 访问。
## A4:采纳基线(中位数,5 次交错)
只有 MC 26.3(`improved-transparency-minecraft-26.3`)会触发 ≥ 16 MiB 采纳;rd12 不会,Create 的 fixture 只有 2 帧。
| MC 26.3 | 单进程(采纳) | 单进程(关采纳) | spawn+shm(T2) | inproc(T2) |
|---|---|---|---|---|
| Espryt 稳态 p99 ms | 32.6 | 33.3 | 44.8 | 46.2 |
| Espryt 峰值 RSS MB(client + server) | 1098 | 1578 | 2205 | 2108 |
| Magma 稳态 p99 ms | 30.4 | 30.6 | 77.0 | 78.6 |
| Magma 峰值 RSS MB | 1150 | 1506 | 1751 | 1661 |
- **采纳开 / 关(Adreno)**:帧时没有差别(稳态 p99、世界内 p99、加载尖峰总和都在散布内),Mali 上的"163 → 21 ms"在这里不成立;RSS 省 480 MB(Espryt)/ 356 MB(Magma),与"~400 MB"相符。路线图的三个数由这张表取代。
- **split T2 相对单进程采纳**:RSS Espryt 约 2.0× / 1.9×、Magma 约 1.5× / 1.4×(rd12 上 +200–280 MB);p99 Espryt +37–42%、Magma 约 2.5×(世界内帧约 2.7× 慢)。
- **线程落位扭曲 split 的时间**:server apply 线程钉在 6–7 核,client GL 线程随之大多落到慢核(大核占比 0.19–0.23,单进程 0.87–0.90),每帧 CPU 约 2.3×;唯一落到 7 号核的一次 8.3 ms,与 P10 一致。RSS 不受影响。
- spawn 臂的共享段(约 40 MB)在两个进程的 RSS 里各算一次,去重后的和约少 40 MB。
## 没跑成
- Magma 单进程 rd12(两个单进程臂)在加载帧 abort:`vm.max_map_count`(65530)耗尽,其中 57–60k 是 `/dev/kgsl-3d0` 映射;不带任何 `MOBILEGL_*` 也复现,与采纳无关。split 的 Magma rd12 与单进程 Magma 的 MC 26.3 正常。已转 dev 独立任务(`../DEBTS.md`)。
- tcp 臂按计划不跑(P10 已有 loopback 数)。
@@ -0,0 +1,15 @@
# P11 集成者裁定日志(persistent map 与 ≥16 MiB 采纳)
> 形式沿用 [`../p10/INTEGRATOR-DECISIONS-P10.md`](../p10/INTEGRATOR-DECISIONS-P10.md):一条裁定一个 ID,只记「定了什么、为什么、影响哪些文件」。计划见 [`PLAN-P11.md`](PLAN-P11.md),协议见 `MobileGL/MG_Remote/CONTRACT-P11.md`。
| ID | 日期 | 裁定 | 理由 | 影响 |
|---|---|---|---|---|
| ID-P11-1 | 2026-09-29 | 范围按计划 §1 重划:`gPipeInputs` 版本化(P5e / P5f 已落地)与 T1(两台设备上只有 Adreno Vulkan 可用)关闭;`completedFrameSerial` 生命周期与探针选档并入 B;路线图的采纳基线(163 → 21 ms / 40 → 115 fps / ~400 MB)撤下,由 A4 同会话重测替代,性能与 RSS 只记录。 | 逐项核对 `74ae652e` 的树(审计 `~/w7/notes/p11/AUDIT-P11.md`);基线没有构建号、设备、臂与定频记录,115 疑为 vsync 封顶。 | `PLAN-P11.md` |
| ID-P11-2 | 2026-09-29 | **B 排期**,消费者是同一台设备上从其他 app 里启动的 GL 程序(Termux 一类,用户)。顺序 B0(跨 app 通道探针)→ B1(外部 client 的共享内存数据面)→ B2(T0)。B0 的 client 按用户的说法用 retrace client 实现:先是 adb shell 里跑的可执行文件,再是另一个 app 里的 retrace client;不走 Termux 的路子,通道不通时的后备是 server app 自己的 bound Service。 | 这类 client 今天只能走 TCP loopback(Stream),T0 在上面不可能;P10 实测 rd12 tcp 51 fps 对 shm 120 fps,数据面本身就是最大的收益。 | `PLAN-P11.md` §2 B |
| ID-P11-3 | 2026-09-29 | A1 的形状:不改线上格式。Stream 上两侧都是一行 `Refuse{AdoptTierOnStream}` 然后 T2;共享段上 client 在握手期 `Fatal{UnimplementedAdoptTier}`,server 只警告并服务 T2(档位由 client 定,server 端 Fatal 在 fork 模式下会抢在 client 的具名诊断之前);使用处的 Fatal 留给没有经过握手的调用者。 | 每一侧只判自己的旋钮就够,不需要把档位带过线;`ServerSpawn` 本来就剔除子进程的 `MOBILEGL_IPC_*`(审计 F-K4"spawn 下晚死"不成立,实际是静默 T2)。 | `Transport/AdoptTier.cpp`、`ClientSession.cpp`、`ServerSession.cpp`、`PersistentMapTracker.cpp`、`fatal_census.py` |
| ID-P11-4 | 2026-09-29 | A2 的负控改用"split 车道声明 adopted"(两后端 8 条红);计划里"删 `PipeApply.cpp` 的 R-6 拒绝"那条 red-once 不成立,不用。Magma 同时进 `Arena.` 带状块与 Buffers 车道,两处都留;`.AdoptTier0.` 只登记 tcp(`spawn_lane_parity.py` 的 `MAGMA_TCP_ONLY`)。 | split 下采纳请求经线路走,codec 不调 applier 就答 DECLINED,删 applier 的拒绝什么也不改变。 | `LargeArenaAdoptionScenario.cpp`、`MG_IntegrationTest/CMakeLists.txt`、`spawn_lane_parity.py`、`test.yml` |
| ID-P11-5 | 2026-09-29 | `protocol.fbs:43` 那行把 `Adopt = 6` 写成 T1 形状的注释不改。 | `protocol_revision_pin.py` 对整个文件取哈希,改注释就要升修订号;档位定义以 `design/07` 与 `CONTRACT-P11.md` 为准。 | 无 |
| ID-P11-6 | 2026-09-29 | **合并 dev `c60639db`**(`568090f0` 重铸读回、`8966d5c2` 转换层的局部上传、`b1d60523` Magma 清除后上传排序、`c60639db` Magma `eglSwapInterval`),合并提交 `e0102bad` 加五个跟进提交。规则:句柄臂只在上传字节是未转换的层时才用记录里携带的行 / 片步长(`carriedLayoutApplies`),转换过的层用转换缓冲自己的每纹素字节(强制旧行为的探针在 push 单进程与三臂 8 条红);push 单进程臂上 dev 的重铸丢了一个待上传的 `glTexSubImage`(client 发射时就清了脏标记),修为同时合并 applier 的待上传框(`48a30602`,合并头上红、修后绿);dev 的两个新场景登记到两后端的 Split / Spawn / Tcp(split 侧无需修);`TextureRemintPullScenario` 撤掉 monolith Espryt 的 skip;`ImageBindableRemintScenario` 钉 barrier(ID-P9-11 的同一形状)。G1 换基线:对 P9 基线 +120 / −84 个符号,其中具名的 +34 / −6 与 dev 自己的增量逐个相同,其余是重编号的异常表标签;`.text` 0xa52203 → 0xa56413;新基线 `~/w7/logs/p11/pull-syms-base.txt`。 | 两边改的是同一段 Espryt 代码(单进程的重铸与局部上传 vs P9 的 split 重铸与 pipe-push 的句柄臂),按文本取一边会丢另一边的修复。 | 合并包报告 `~/w7/notes/p11/m-report.md`;`~/w7/notes/p11/gate.sh`(G1 指向新基线) |
| ID-P11-7 | 2026-09-29 | A3 / A4 的结论(`A-DEVICE.md`):T0 在 app 域两后端都是 GO(与 shell 域逐行相同,含 128 MiB 与持续锁定);Adreno 上采纳只省 RSS(Espryt 480 MB、Magma 356 MB)、不改帧时;split T2 相对单进程采纳在 MC 26.3 上 RSS 1.4–2×、p99 Espryt +37–42% / Magma 约 2.5×(部分来自线程落位)。 | 这是 B2 的可行性与价值依据。 | `A-DEVICE.md`、`DEBTS.md` |
| ID-P11-8 | 2026-09-29 | 本阶段查出、不在 P11 修的:Espryt 零散写入按并集框上传覆盖 GPU 纹素(dev 独立任务);Magma 单进程 rd12 耗尽 `vm.max_map_count`(dev 独立任务);client 与 server 共用日志前缀时截断 server 日志(小修);pull 构建没有门跑集成测试(需裁定);split 的线程落位(性能)。 | 按规矩不顺手修 dev 的缺陷;性能只记录。 | `DEBTS.md` |
| ID-P11-9 | 2026-09-29 | **集成头 `82467823`**(dev 合并 + A-host + 计划文档)整套门:G1 对 P11 基线符号增 0 减 0、`.text` `0xa56413`;fatal census 79、refusal 词 4、link ratchet 171、spawn parity 0、协议修订 3、wire-declines 53/53;卫生 12/12;unit 2654;integration-split / spawn / tcp 392 / 309 / 321;integration-magma-split / spawn / tcp / full-split 214 / 193 / 177 / 613;integration-gpu monolith / inproc 2529 / 2529。verify 构建 unit / integration-verify / integration-verify-split 2654 / 1298 / 1232。主机 retrace 230 / 236(6 项仍是 iterationrp 的宿主 llvmpipe JIT 崩溃,monolith 同挂)。 | — | 全部 |
+3 -1
View File
@@ -19,7 +19,7 @@
| 包 | 内容 |
|---|---|
| W2-a | 回读前问驱动这一层在不在、尺寸对不对(`NativeTextureLevelHasExtent`,`WireTextureReadback.inc:288`,`glGetTexLevelParameteriv`)。不在:store 覆盖就重放 store,否则跳过(GL 定义为未定义内容)。修的是:在最后一次 sync 之后才定义(空数据,或空数据 + 局部上传)的层,旧代码去读它 → FBO 不完整 → `Fatal{ResourceUnavailable, "image-promotion-readback"}`,合法 GL 让会话死掉 |
| W2-a | 回读前问驱动这一层在不在、尺寸对不对(`NativeTextureLevelHasExtent`,`DirectGLES/WireTextureReadback.inc:290`,`glGetTexLevelParameteriv`)。不在:store 覆盖就重放 store,否则跳过(GL 定义为未定义内容)。修的是:在最后一次 sync 之后才定义(空数据,或空数据 + 局部上传)的层,旧代码去读它 → FBO 不完整 → `Fatal{ResourceUnavailable, "image-promotion-readback"}`,合法 GL 让会话死掉 |
| W2-b | 驱动拒绝回读(设备上 SNORM / 16 位 norm / 无 `EXT_color_buffer_float` 的浮点不可渲染)而 store 覆盖该层 → 重放 store(= monolith 的答案),`MGLOG_W_ONCE` 带 `remint-readback-fallback`;store 也不覆盖才保留原 Fatal。测试旋钮 `MGITEST_ESPRYT_FORCE_REMINT_READBACK_FAILURE`(server 读) |
| W2-c | 删两处 `texture-remint-pull` 标记(transport 专用的提前标记块 + 循环内标记);`PipeCatalogue.EveryUnmigratedEmulationIsNamedOnce` 5 → 4;「remint stall class」注释改写 |
| W2-d | `TextureRemintPulls`(`trp=`)在 server 路径也计:ByHandle 重铸已有存储时 +1(keep 不计),名字不改 |
@@ -74,6 +74,8 @@ Magma 的 7,093 条是冗余的:transport 臂每次 draw / dispatch 对每个
## 6. dev 缺陷:monolith Espryt 重铸重放过期影子(不在 P9 修,单独立项)
> **2026-09-29 已修**:dev `568090f0`(重铸前先把驱动上的各层读回影子,immutable 且无需加宽的分配直接保留),P11 合并进本线(`notes/p11/INTEGRATOR-DECISIONS-P11.md` ID-P11-6);`TextureRemintPullScenario` 对 monolith DirectGLES 的 7 例 skip 已撤,iris-derivative 的 monolith SSIM 0.996196817 → 0.996376498,与 split 各臂相同。下文是当时的记录。
- **一句话原因**:前端臂 `RequireImageBindableStorage`(`Managers.cpp:6459`)把每个已定义层标脏、从 client `MipmapStorage` 重放进新 carrier,而影子从没见过 GPU 写的内容(渲染目标、clear、`glGenerateMipmap` 的层、`imageStore`);immutable RGBA8 也走这条(monolith 没有 split 的 keep)。
- **复现**:本场景的 B、C、D、E、F、F2、H 在 `DirectGLES.TextureRemintPullScenario.*`(monolith)和 pull 构建(`build-linux`)逐例同错(B:读到上传的图案而不是 clear 的绿;D、F:读到零)。Magma 两臂全对。场景对 monolith DirectGLES 这 7 例按名 skip,理由指向本节。
- **真实证据**:`iris-derivative` × DirectGLES,P7 普查 §3 #6 那个「未归因」的 ~26.9k px 系统差。monolith 在该 trace 重铸一张 854×480 RGBA16F(GPU ≠ 影子);把前端臂改成重放 GPU 字节(临时实验)后 monolith 的 `actual.png` 与 split 逐字节相同(sha `ebbe8e9d…`),SSIM 0.996196552 → 0.996376198(更近 golden)。`iris-photon-v1.3b` 同样重铸一次,但纹理随后被整张覆盖,无可见差。