From de33d4017375679339ff83cce6cfb599c38d4335 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 29 Sep 2026 03:36:45 -0400 Subject: [PATCH] [Docs] (P9): close the phase - the contract's remint section and invariants, rulings ID-P9-11..12 with the integration gate, the roadmap row, the debts P9 hands on, the phase README and the status page --- MobileGL/MG_Remote/CONTRACT-P9.md | 14 +++++- docs/Disaggregated/ARCHITECTURE.md | 2 +- docs/Disaggregated/CURRENT_STAGE_PROGRESS.md | 46 ++++++------------- docs/Disaggregated/ROADMAP.md | 6 +-- .../design/04-reverse-channel.md | 7 ++- docs/Disaggregated/notes/DEBTS.md | 8 +++- .../notes/p9/INTEGRATOR-DECISIONS-P9.md | 2 + docs/Disaggregated/notes/p9/README.md | 16 ++++++- 8 files changed, 57 insertions(+), 44 deletions(-) diff --git a/MobileGL/MG_Remote/CONTRACT-P9.md b/MobileGL/MG_Remote/CONTRACT-P9.md index 49c23480..f13f54fb 100644 --- a/MobileGL/MG_Remote/CONTRACT-P9.md +++ b/MobileGL/MG_Remote/CONTRACT-P9.md @@ -4,7 +4,7 @@ ## 范围 -server → client 的结果回传在 split 下不阻塞、不丢、不乱序。本阶段落地:PACK-PBO 回读不等回复(§1);server 日志按级别转发、不阻塞(§2);`OnGlError` 的观察时点写成契约(§3);两条故障注入(§4)。路线图原文里已由前序阶段做完的(异步 reply、2 MiB 回复槽与分带回读、XFB 删除)不重做,见交接 §2。 +server → client 的结果回传在 split 下不阻塞、不丢、不乱序。本阶段落地:PACK-PBO 回读不等回复(§1);server 日志按级别转发、不阻塞(§2);`OnGlError` 的观察时点写成契约(§3);两条故障注入(§4);纹理重铸不需要拉取(§5)。事件量的批处理 / 收窄没有实测需求,不做(ID-P9-7)。路线图原文里已由前序阶段做完的(异步 reply、2 MiB 回复槽与分带回读、XFB 删除)不重做,见交接 §2。 ## 1. 读进 pack buffer 的回读(W1) @@ -53,7 +53,19 @@ server → client 的结果回传在 split 下不阻塞、不丢、不乱序。 - **F2**:client 停读控制 socket(`ClientSession::PauseControlReaderForTest`),server 以测试旋钮 `MOBILEGL_TEST_APPLY_LOG_FLOOD=` 让 apply 线程每条记录打 n 行 WARN + 1 行 ERROR。apply 线程不被日志卡住(约 16 MiB / 400 条记录 0.4 s 过完,单行交接最长 53–148 µs);≤ WARN 的丢弃全部有流内说明;≥ ERROR 全部按序到达。控制与 SEG_EVENT 都不排空时,会话经既有 `ReverseChannelForfeit{NotDraining}` 以 exit 0 结束,同一 supervisor 接下一个连接。门:`LogForwardTest`(15 例)、`EventForfeitPeer.StreamLogFlood*`(2 例)。 +## 5. 纹理重铸(W2) + +- **没有纹理拉取**。重铸(为 image 绑定把纹理升级成可绑定存储)是 server 本地路径,反向通道不含任何"向 client 要纹素"的请求: + - Espryt(`RequireImageBindableStorageByHandle`):只读回驱动上**确实存在且尺寸相符**的层(`NativeTextureLevelHasExtent`),pending 盒用 `StagedTextureStore` 合并;驱动没有的层——store 覆盖就重放 store,否则跳过(GL 里其内容本就未定义);驱动拒绝读回而 store 覆盖该层时退回 store(记一次 `remint-readback-fallback`),两者都没有才 `Fatal`;已 immutable 且无需加宽的核心格式原样保留。 + - Magma:重建带 `STORAGE` 用途的 VkImage,`PreserveTextureContentsOnRecreate` GPU→GPU 拷贝。 +- `TextureRemintPulls`(`trp=`)在 server 路径计数(重铸了已持有的存储时;保留路径不计)。 +- `MGPipeCallbacks` 删去 `OnTexturePullRequest`;op 50 `ResourceSubDataComplete` 留作退役行(解码仍拒收),`protocol.fbs` 不变。两处 `Fatal{UnmigratedEmulation, "texture-remint-pull"}` 删除(`EveryUnmigratedEmulationIsNamedOnce` 5 → 4)。 +- 测试旋钮 `MGITEST_ESPRYT_FORCE_REMINT_READBACK_FAILURE`(server 读)强制读回失败,驱动 fallback 用例。 +- 门:`TextureRemintPullScenario`(14 例)× 两后端 × monolith/Split/Spawn/Tcp,外加 Espryt Split/Spawn 的 4 条强制失败条目;monolith Espryt 上 7 个 GPU 写过的用例按名跳过,指向 dev 缺陷(ID-P9-8)。 + ## 不变量 - G1:pull 构建符号增 0 减 0、`.text` 不变(新代码全在 `MOBILEGL_BUILD_DISAGGREGATED` 下;`GL_Texture.cpp` 的宏在 pull 构建里为空)。 - 目录只追加:`MGP_CALL_LIST_DOCUMENTED_COUNT` 81 → 83,`kMGPipeVerifiedPayloadCount` 82 → 83,stamp 表 32 → 34 行。 +- 回调 9 → 7(`OnLog`、`OnTexturePullRequest` 删除;剩 `OnGlError`、`OnGpuWritten`、`OnBufferWriteback`、`OnTextureWriteback`、`OnMipLevelsGenerated`、`OnSurfaceChanged`、`OnCapsInvalidated`,其中后三个仍无生产者,不在本阶段)。 +- 控制协议修订号不变(3);`protocol.fbs` 未改。 diff --git a/docs/Disaggregated/ARCHITECTURE.md b/docs/Disaggregated/ARCHITECTURE.md index 0a9bd176..d6367180 100644 --- a/docs/Disaggregated/ARCHITECTURE.md +++ b/docs/Disaggregated/ARCHITECTURE.md @@ -26,7 +26,7 @@ | 1–2 | 边界:两张表、三种拓扑;对象模型:句柄、两种代数、CSO | [`design/01-boundary-and-objects.md`](design/01-boundary-and-objects.md) | | 3–4 | 调用目录、生成器 G1–G8、能力位;记录与 payload 格式 | [`design/02-catalogue-and-records.md`](design/02-catalogue-and-records.md) | | 5–7 | 前端 tracker(何时推、推什么、怎么去重);纹理上传;着色器 | [`design/03-frontend.md`](design/03-frontend.md) | -| 8 | 反向通道:八个回调、有序性、错误与 ack、纹理重铸拉取、XFB | [`design/04-reverse-channel.md`](design/04-reverse-channel.md) | +| 8 | 反向通道:七个回调、有序性、错误与 ack、纹理重铸(server 本地,无拉取)、XFB | [`design/04-reverse-channel.md`](design/04-reverse-channel.md) | | 9–10 | 后端改造(`PipeInputs`、memo 重键、A/B 臂);server 侧 applier | [`design/05-backend-and-server.md`](design/05-backend-and-server.md) | | 11 | 传输:共享段、环、门铃、控制面、背压、等待规则、事件、两根轴 | [`design/06-transport.md`](design/06-transport.md) | | 12–13 | persistent map 与大缓冲采纳;回读、往返清单、五部分验证门 | [`design/07-memory-readback-verification.md`](design/07-memory-readback-verification.md) | diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index 7c5531ac..fd17348e 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -1,48 +1,32 @@ -# 当前阶段:P12 已收官(2026-09-29);下一阶段 P9 / P8 待排 +# 当前阶段:P9 已收官(2026-09-29);下一阶段 P10 / P8 待排 -> **更新 2026-09-28**(含五臂传输性能对比,见 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md))。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。P12 审查后的定向主机与真机复测已完成;验收 A、B 都已通过(B 于 2026-09-28,A 于 2026-09-29)。上一阶段 P7 已于 2026-09-23 完成。 +> **更新 2026-09-29**。这一页只有摘要;裁定明细、包报告与证据在 [`notes/p9/README.md`](notes/p9/README.md)(范围重划与交接 [`HANDOFF-P9.md`](notes/p9/HANDOFF-P9.md))。上一阶段 P12 同日收官,其状态与五臂性能对比见 [`notes/p12/README.md`](notes/p12/README.md)、[`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md)。 ## 目标 -Android 上的 server 应用自己开一个全屏窗口,把收到的渲染流直接画到屏幕上;client 不需要有窗口(完全无头)。窗口没了(比如按 HOME)时,client 干净地得到"设备丢失",server 继续等下一个连接。 +server → client 的结果回传在 split 下不阻塞、不丢、不乱序:回读、日志、纹理重铸都不再让一方同步等另一方。 ## 完成情况 | 项 | 状态 | |---|---| -| 功能:server 自有窗口、无头 client、窗口丢失处理、一台设备同时只一个 server | ✅ 已并入主分支 | -| 代码审查发现的 10 个问题 | ✅ 已修 | -| 主机门与单进程构建二进制不变(G1) | ✅ 原主机门 / G1 见 ID-P12-14/15;审查后 P12 定向 CTest **46/46**(`1fb18d9e`) | -| 真机 7 项检查(两个后端上屏、排队与拒绝、窗口丢失、离屏不受影响……) | ✅ 审查后在 Redmi `2f7cbe2e` 复测通过(`1fb18d9e`);明细见 [`notes/p12/README.md`](notes/p12/README.md) | -| 验收 A:同一台手机上用 FCL 以两个后端进游戏,杀掉 server 后干净报"设备丢失" | ✅ 2026-09-29:Render Server 屏 + FCL(新增版本设置「游戏退到后台时不暂停」),双后端入世界,杀 server 后 33–54 ms 闩住 device-lost,FCL 不崩;[`notes/p12/FCL-ACCEPTANCE.md`](notes/p12/FCL-ACCEPTANCE.md)。竖屏 server 窗口里画面被裁的问题已查明并修复(client 请求尺寸为 0×0,现在取 native window 的大小) | -| 验收 B:另一台电脑经 TCP 连手机进游戏,并记录链路数据 | ✅ 2026-09-28:WSL client 经 Wi-Fi 重放 rd12 世界内 trace,ssim 0.999883、251/251 帧;必测数见 [`notes/p12/CROSSHOST-ACCEPTANCE.md`](notes/p12/CROSSHOST-ACCEPTANCE.md)(client 是 trace 重放器,不是活的 Minecraft) | - -## 性能现状(2026-09-28,Redmi 未定频交错 A/B) - -| 臂 | rd12 重负载 | openra 轻负载 | -|---|---|---| -| monolith | 131 fps | 101 fps | -| inproc | 176 fps(+34%) | 100 fps | -| spawn+shm | 178 fps(+36%) | 89 fps(−12%) | -| spawn+tcp localhost | 21–23 fps | 77 fps(−24%) | -| tcp localhost + `SPIN_US=2000` | 63.6 fps(2.9×) | — | -| tcp over Wi-Fi(WSL → 手机) | 稳态 17–22 fps(加载帧 52 s) | 稳态 105–133 fps | - -- inproc / shm 重负载比 monolith 快(run-ahead 并行 + 探针更少);轻负载只付固定握手成本。 -- tcp 慢的主因:present credit=1 串行等待 ~74% + futex 唤醒税;不是带宽。 -- 原先记录的「跨主机 TCP 在 `eglMakeCurrent` 挂死」**不是源码 bug**:WSL 流量被主机 v2rayN 的 `xray_tun` 终结后中继卡住。绕开后 rd12 / openra 都跑通;跨机测试前先跑 `tools/device_bench/disagg/tcp_path_check.sh`。 -- Wi-Fi 上加载帧(2.7 GB)受带宽约束(server 实测 52 MB/s 持续),稳态不受(20–24 MB/s,受往返延迟);`PRESENT_CREDIT` 1→2 稳态 +26%,2→3 +4%。此前的「带宽上限 18–26 fps」结论已撤回(`toybox nc` 汇点低估了链路)。 +| W1:`glReadPixels` / `glGetTexImage` 读进 pack buffer 不等回复 | ✅ 两后端;新 op 82/83,server 经 buffer 写入口落行,client 标"GPU 写过";UNPACK 源在 split 下先同步 | +| W2:纹理重铸 | ✅ 不需要拉取协议(Espryt 读回驱动上存在的层 + server 暂存,Magma GPU→GPU);修"只定义未上传的层"的 Fatal;`OnTexturePullRequest` 删 | +| W3:server 日志按级别转发 | ✅ 队列 + 发送线程:≤WARN 有损计数、ERROR 无损限速、FATAL 有界;`OnLog` 删 | +| W4:事件批处理 / 收窄 | 不做:全语料 0 丢弃、0 阻塞 | +| W5:`OnGlError` 有序 | 保持 P5e 放宽,写进契约 | +| 故障注入 F1(device lost 时 PBO 读还欠着)/ F2(client 停读、server 狂打日志) | ✅ 各有门,各真红过一次 | +| 主机门与单进程构建二进制不变(G1) | ✅ 符号增 0 减 0,`.text` `0xa52203`;全部车道绿(数字见裁定 ID-P9-12) | +| 真机 | 未做(本阶段无真机门;主机覆盖两后端,CI 兜底) | ## 收官(2026-09-29) -- 出口门 A、B 都过;契约 [`MG_Remote/CONTRACT-P12.md`](../../MobileGL/MG_Remote/CONTRACT-P12.md) 已写;`gate.sh` 的 G1 只在同机基线上比较;G1 在 Arch 上成立(pull 构建 `.text` 与基线同为 `0xa52203`,符号增 0 减 0)。 -- 没做、转入 [`notes/DEBTS.md`](notes/DEBTS.md):DirectGLES 去全局、freezer、多 context、D8 窗口种类白名单、TLS。 -- 收官审查:用户裁定不派 agent / Codex;契约断言由本人对照代码核过。 -- FCL fork 的「游戏退到后台时不暂停」在 FCL 仓库,已提交并推送(`Swung0x48/FoldCraftLauncher` 的 `merge-upstream-surfaceview`,`241471515`)。 +- 契约 [`MG_Remote/CONTRACT-P9.md`](../../MobileGL/MG_Remote/CONTRACT-P9.md);回调 9 → 7;目录追加 2 个 op;控制协议修订号不变。 +- 转入 [`notes/DEBTS.md`](notes/DEBTS.md):monolith Espryt 重铸覆盖 GPU 写过的纹素(dev,已开独立任务);`TCP_USER_TIMEOUT` 5 s 与 `PublishSessionFault` 阻塞写;Espryt 保留路径 clear 后 `imageLoad` 偶读旧值(待归因);Magma 冗余 `OnGpuWritten`。 +- 收官审查沿用 P12 的做法:不派 agent / Codex,契约断言由本人对照代码核过,G1 同机复核。 ## 下一步 -1. 零代码 knob A/B:`PRESENT_CREDIT=2`、shm 臂 server `SPIN_US` 降到 20–35、`SERVER_AFFINITY`;代码级:client doorbell 换 futex/eventfd、applier 自适应 spin、sendmsg 跨 Flush 合批。 -2. 之后按 [`ROADMAP.md`](ROADMAP.md):P9 → P10 → P11(IPC 跑道);P8(monolith 跑道);P6.5 残余(39 例 device 矩阵)与 P3b/P4b 余项并行。 +按 [`ROADMAP.md`](ROADMAP.md):P10(同步对象、查询与帧节奏;FCL 里 Minecraft 稳态每帧约 1 次的 `FenceWait` 回包在这里)→ P11(IPC 跑道);P8(monolith 跑道);P6.5 残余(39 例 device 矩阵)与 P3b/P4b 余项并行。 **阻塞**:没有需要决策的事项。 diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index 59aba69f..d9e46eb3 100644 --- a/docs/Disaggregated/ROADMAP.md +++ b/docs/Disaggregated/ROADMAP.md @@ -1,6 +1,6 @@ # 路线图(索引) -> **2026-09-29**:P0 到 P7、P12 已完成(P12:server 自己开窗口上屏,两个出口门都过:B [跨机 TCP](notes/p12/CROSSHOST-ACCEPTANCE.md)、A [FCL 同机](notes/p12/FCL-ACCEPTANCE.md),契约已写,G1 成立);下一阶段 **P9**(IPC 跑道)与 **P8**(monolith 跑道)。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 +> **2026-09-29**:P0 到 P7、P12、**P9** 已完成(P9:读进 PBO 的回读不再等回复、server 日志按级别转发不阻塞、纹理重铸不需要拉取协议,两条故障注入,契约 `MG_Remote/CONTRACT-P9.md`,G1 成立);下一阶段 **P10**(IPC 跑道)与 **P8**(monolith 跑道)。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 ## 目标 @@ -9,7 +9,7 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不 ## 两条路线 - **单进程路线**:先把接口建起来,让单进程版本也受益(后端拥有自己的状态、可以挪到渲染线程)。P0 → P0.5 → P1 → P2 → P3a → P4a → P3b/P4b → P7 → P8 → P13。 -- **拆分路线**:在接口之上逐步拆开前后端。P5 → P5b → P5c → P5d → P5e → P5f → P6 → P6.5 → Ph → **P12** → P9 → P10 → P11。 +- **拆分路线**:在接口之上逐步拆开前后端。P5 → P5b → P5c → P5d → P5e → P5f → P6 → P6.5 → Ph → P12 → **P9** → P10 → P11。 ## 阶段一览 @@ -34,7 +34,7 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不 | [P7](notes/p7/README.md) | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 | | [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | ✅ 09-29:出口门 B(跨机 TCP)✅ 09-28、A(FCL + 杀 server)✅ 09-29;契约 `MG_Remote/CONTRACT-P12.md`;G1 成立;余项进 [`DEBTS.md`](notes/DEBTS.md) | | [P8](notes/p8/README.md) | 把剩余的仿真路径挪到正确的一侧,补齐协议 | 待排 | -| [P9](notes/p9/README.md) | 反向通道异步化(回读、写回不再同步等待) | 待排;范围已按现状重划,交接见 [`HANDOFF-P9.md`](notes/p9/HANDOFF-P9.md) | +| [**P9**](notes/p9/README.md) | **反向通道:回读、日志、重铸不再同步等待 client** | ✅ 09-29:PACK-PBO 回读 fire-and-forget(两后端)、日志分级转发、重铸无拉取(`OnLog` / `OnTexturePullRequest` 删,回调 9 → 7),F1 / F2;契约 `MG_Remote/CONTRACT-P9.md`;G1 成立;事件量批处理无实测需求不做;余项进 [`DEBTS.md`](notes/DEBTS.md) | | [P10](notes/p10/README.md) | 同步对象、查询与帧节奏 | 待排 | | [P11](notes/p11/README.md) | 同机大缓冲零拷贝共享 | 待排 | | [P13](notes/p13/README.md) | 删掉旧的"后端直接读前端"路径 | 待排 | diff --git a/docs/Disaggregated/design/04-reverse-channel.md b/docs/Disaggregated/design/04-reverse-channel.md index fdf6c2a9..e8cdc566 100644 --- a/docs/Disaggregated/design/04-reverse-channel.md +++ b/docs/Disaggregated/design/04-reverse-channel.md @@ -6,7 +6,7 @@ ### 8.1 `MGPipeCallbacks`(`MG_Pipe/MGPipeCallbacks.h`) -八个具名回调 + 一个正向终止符(`ResourceSubDataComplete`),取代后端直接 poke 前端对象的 95 个调用点(具名化是有意偏离 D8)。monolith 下直调,split 下是 `SEG_EVENT` 上的记录。 +七个具名回调,取代后端直接 poke 前端对象的 95 个调用点(具名化是有意偏离 D8)。monolith 下直调,split 下是 `SEG_EVENT` 上的记录。 | 回调 | 作用 | |---|---| @@ -14,12 +14,11 @@ | `OnGpuWritten` | GPU 写过的 buffer 范围(收窄 client 保守自建的 pending 集) | | `OnBufferWriteback` | PBO 回读、XFB 捕获结果;必须与 epoch bump 有序 | | `OnTextureWriteback` | CPU 回退生成 mip 的纹素 | -| `OnTexturePullRequest` | §8.4 | | `OnMipLevelsGenerated` | 只带形状 | | `OnSurfaceChanged` | 默认帧缓冲的格式与尺寸(server 拥有显示时 client 靠它得知窗口尺寸) | | `OnCapsInvalidated` | 取代 `InvalidateCompileEnv` | -`OnLog` 已删除(P9 W3,回调 9 → 8):零生产者、零消费者、无 `EventKind`。server 日志走控制面 `LogLine`(带 `level`),由 `MG_Remote/Transport/LogForward.h` 的队列 + 发送线程转发:≤WARN 有损(队列满即丢、计数、流内 `LogForward{Dropped}` 标出缺口),≥ERROR 无损 + 限速(超速排队延迟;超出错误字节上限时合并成一条 `LogForward{Coalesced}`),FATAL 有界等待写出;日志线程永不等 socket。 +`OnLog` 已删除(P9 W3;与 W2 删除的 `OnTexturePullRequest` 合计,回调 9 → 7):零生产者、零消费者、无 `EventKind`。server 日志走控制面 `LogLine`(带 `level`),由 `MG_Remote/Transport/LogForward.h` 的队列 + 发送线程转发:≤WARN 有损(队列满即丢、计数、流内 `LogForward{Dropped}` 标出缺口),≥ERROR 无损 + 限速(超速排队延迟;超出错误字节上限时合并成一条 `LogForward{Coalesced}`),FATAL 有界等待写出;日志线程永不等 socket。 后端凭空造的前端对象(Magma 占位纹理、swapchain 默认 FB 占位)改为 server 原生;pull 构建里的 `m_backend` 类成员真删会动 `sizeof`(G1),随 P13 退役(D-K)。 @@ -43,7 +42,7 @@ - 只改读 store 不够:GPU 写过的层 store 里是旧字节或没有字节;语料里 Espryt 的两次重铸(`iris-photon`、`iris-derivative`)都是 store 无字节的渲染目标。 - 「整格式再生」两臂都只上传 pending 层、不回读也不拉取;「view 源重铸」只剩源需要加宽,走同一条 ByHandle 路径。 -- 删除:`OnTexturePullRequest`(回调 9 → 8)、`texture-remint-pull` 标记。op 50 `ResourceSubDataComplete` 只追加不删,留作退役行(解码拒收)。`MOBILEGL_PIPE_TEXEL_RETAIN_MB` 已无消费者,但在 pull 构建里,随 P13 删(G1)。 +- 删除:`OnTexturePullRequest`(与 W3 删除的 `OnLog` 合计,回调 9 → 7)、`texture-remint-pull` 标记。op 50 `ResourceSubDataComplete` 只追加不删,留作退役行(解码拒收)。`MOBILEGL_PIPE_TEXEL_RETAIN_MB` 已无消费者,但在 pull 构建里,随 P13 删(G1)。 - `ImageBindableHint` 仍是预防:hint 在第一次 sync 前到达就直接按 image-bindable 分配,省掉一次 server 回读 + 重传。 - 已知 dev 缺陷(非 P9):monolith Espryt 的前端臂重放 client 影子,覆盖 GPU 写过的纹素。 - 普查、覆盖矩阵、门与 red-once:[`notes/p9/W2-REMINT.md`](../notes/p9/W2-REMINT.md)。 diff --git a/docs/Disaggregated/notes/DEBTS.md b/docs/Disaggregated/notes/DEBTS.md index 2522442f..bdfecd78 100644 --- a/docs/Disaggregated/notes/DEBTS.md +++ b/docs/Disaggregated/notes/DEBTS.md @@ -4,13 +4,17 @@ | 债务 | 去向 | |---|---| -| `SEG_REPLY` 2 MiB 单槽 payload cap、PACK-PBO 回读的 fire-and-forget | P9(ID-47、ID-57);stream 链路上 cap 变成 `maxReplyBytes` 窗口 | | 未接入内容分块的 record 类型:program archive 与 `draw_vbo` range 尾 | P6.5 sl 与 P8 共用的分片(开放问题 11) | -| class-C 余项与仿真路径:`SetSwapInterval`(P10)、`DeleteTransformFeedback`(P9);multi-draw client indices、RGB CPU mip、`texture-remint-pull` 等具名拒绝 | P8 / P9 | +| class-C 余项与仿真路径:`SetSwapInterval`(P10);multi-draw client indices、RGB CPU mip 等具名拒绝 | P8 / P10 | | `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 转出: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 不会传播 | 需要时入库 | | 临时 CI trigger | 合入 `dev` 前删除 `test.yml` / `apk.yml` 的 `feat/disaggregated` 触发器 | diff --git a/docs/Disaggregated/notes/p9/INTEGRATOR-DECISIONS-P9.md b/docs/Disaggregated/notes/p9/INTEGRATOR-DECISIONS-P9.md index 93fcba1d..f16728d0 100644 --- a/docs/Disaggregated/notes/p9/INTEGRATOR-DECISIONS-P9.md +++ b/docs/Disaggregated/notes/p9/INTEGRATOR-DECISIONS-P9.md @@ -14,3 +14,5 @@ | ID-P9-8 | 2026-09-29 | W2 普查查出 monolith Espryt 重铸用陈旧 / 零的 client 纹素覆盖 GPU 写过的级(14 例探针中 7 例错),即 P7 普查 §3 #6 未归因的 iris-derivative × DirectGLES ~26.9k px 差异。**不在 P9 修**,另开独立任务(改 pull 构建 `.text`,属 dev 线)。 | 交接 §6:不顺手修 dev 上的 bug,记成独立条目。 | 过程(独立任务) | | ID-P9-9 | 2026-09-29 | W3:`OnLog` 删除(零生产者、零消费者、无 `EventKind`;日志一直走控制面 `LogLine`)。转发器带级别,由 `Log()` 已收的 Android 优先级映射,`Log()` 签名不变;server 装队列 + 独立发送线程:≤WARN 1 MiB 后丢并计数、每段缺口一行流内说明;ERROR 无损、256 行/s 突发 1024、8 MiB 外合并成一行;FATAL 有界 2 s 且每次卡顿只等一次。限值为常量,不设 `MOBILEGL_IPC_*` 旋钮;计数走会话结束的一行本地日志,不进 PIPE_STATS。F2 为两例(只停控制;控制 + SEG_EVENT 都停)+ server 旋钮 `MOBILEGL_TEST_APPLY_LOG_FLOOD`。 | 交接 §3 W3 与 §4 F2;`protocol.fbs` 的 `LogLine.level` 本来就在,不必改 schema。旋钮要动配置表与 spawn 环境白名单,无实测需求。计数的家当惯例是日志行(同 `ForfeitDrops`)。 | p9/w3 包:`Transport/LogForward.{h,cpp}`、`Log.{h,cpp}`、`ServerMain.cpp`、`ControlInbox.{h,cpp}`、`ServerLoop.{h,cpp}`、`MGPipeCallbacks.h`、`LogForwardTest.cpp`、`EventForfeitPeerTest.cpp` | | ID-P9-10 | 2026-09-29 | W3 查出、**不在 P9 改**的两项转出为债:(1) `TCP_USER_TIMEOUT` = 5000 ms(`SocketTransport.cpp`)——客户端停读控制超过 5 s 且有待发日志字节时,内核仍会断开连接(W3 之后 apply 线程不再被卡,但会话仍会断);(2) `PublishSessionFault`(`FatalFunnel.cpp`)用阻塞写发 SessionFault,对停读的客户端会排在日志发送线程卡住的写之后最多等同样的 5 s。 | 两者都早于 W3,属于传输策略,改动需另行裁定。 | `DEBTS.md` | +| ID-P9-11 | 2026-09-29 | `TextureRemintPullScenario` case C(immutable 纹理,GPU clear 后绑成 image)在 Espryt split 上 30 次中 3 次读到 clear 前的纹素,server 侧每个决定在通过与失败的运行里都相同;GL 不要求这里有 barrier,加 `glMemoryBarrier` 后 0/30。场景里暂钉 barrier 并注明,缺陷记为"待归因"债(疑 llvmpipe 的 compute image 读不等待光栅化)。保留路径早于 P9(c1bf7e15)。 | 不让门随机红;也不把一个没归因的现象当成修好。 | `TextureRemintPullScenario.cpp`、`DEBTS.md` | +| ID-P9-12 | 2026-09-29 | **P9 收官**。集成头(W1 + W2 + W3)整套门:G1 符号增 0 减 0、`.text` `0xa52203`(同机 clang 22.1.6);fatal census 79、link ratchet 171、spawn parity 0、协议修订 3、wire-declines 53/53;卫生 12/12;unit 2641;integration-split / spawn / tcp 343 / 260 / 264;integration-magma-split / spawn / tcp / full-split 146 / 125 / 110 / 579;integration-gpu monolith / inproc 2301 / 2301。verify 构建(W1 头)unit / integration-verify / integration-verify-split 2626 / 1202 / 1136;主机 retrace(W1 头)230 / 236,6 项为宿主 llvmpipe JIT 崩溃(monolith 同挂)。收官审查沿用 P12:不派 agent / Codex,契约断言由集成者对照代码核过(限值、op 号、载荷大小、回调数、修订号、仿真名单)。未做真机(本阶段无真机门)。 | 交接 §5 的门列表全部通过;ROADMAP 出口门:回读场景 split 下绿、`TextureRemintPullScenario`(含无解用例 G / G3)、拉取计数逐 trace 发布(`notes/p9/W2-REMINT.md`)、两条故障注入。 | 过程 | diff --git a/docs/Disaggregated/notes/p9/README.md b/docs/Disaggregated/notes/p9/README.md index bdfb8597..9c611631 100644 --- a/docs/Disaggregated/notes/p9/README.md +++ b/docs/Disaggregated/notes/p9/README.md @@ -1,6 +1,18 @@ -# P9 — 反向通道(待排,P6.5 之后) +# P9 — 反向通道(已收官,2026-09-29) -> **2026-09-29:范围已按树里现状重划,实现交接见 [`HANDOFF-P9.md`](HANDOFF-P9.md)(先读它的 §2:路线图下面的原文有一半已经做完或前提已变)。** 尚未开工。本页保存该阶段在路线图上的完整范围与出口门(2026-09-24 从 [`ROADMAP.md`](../../ROADMAP.md) 阶段表移入,原文照录);阶段开工后,计划、裁定与报告都放在本目录。 +> **2026-09-29 收官**。协议与行为:`MobileGL/MG_Remote/CONTRACT-P9.md`;裁定 [`INTEGRATOR-DECISIONS-P9.md`](INTEGRATOR-DECISIONS-P9.md)(ID-P9-1..12);包报告 [`W1-PACK-BUFFER-READBACK.md`](W1-PACK-BUFFER-READBACK.md)、[`W2-REMINT.md`](W2-REMINT.md);范围重划与交接 [`HANDOFF-P9.md`](HANDOFF-P9.md)。 +> +> | 包 | 结果 | +> |---|---| +> | W1 PACK-PBO 回读 | 读进 pack buffer 走 op 82/83,client 不等、标 GPU 写过;server 经 buffer 写入口落行(两后端);UNPACK 源在 split 下先同步;F1 | +> | W2 纹理重铸 | 不需要拉取协议:Espryt 读回驱动上存在的层 + store,Magma GPU→GPU;修"只定义未上传的层"的 Fatal;`OnTexturePullRequest` 删;`TextureRemintPullScenario` 14 例 × 两后端 × 四臂 | +> | W3 日志分级 | 转发带级别、队列 + 发送线程:≤WARN 有损计数、ERROR 无损限速、FATAL 有界;`OnLog` 删;F2 | +> | W4 事件量 | 不做:全语料 0 丢弃、0 阻塞(ID-P9-7) | +> | W5 `OnGlError` 有序 | 保持 P5e 放宽,写进契约 §3 | +> +> 门(集成头):G1 符号增 0 减 0、`.text` 0xa52203;fatal census 79、link ratchet 171;unit、split / spawn / tcp、三条 Magma 双进程车道、integration-gpu 两臂全绿(数字见 ID-P9-12);verify 构建三车道全绿;主机 retrace 230 / 236(6 项为宿主 llvmpipe JIT 崩溃,monolith 同挂)。未做真机。 +> +> 下面是该阶段在路线图上的原始范围与出口门(2026-09-24 从 `ROADMAP.md` 移入,原文照录)。本页保存该阶段在路线图上的完整范围与出口门(2026-09-24 从 [`ROADMAP.md`](../../ROADMAP.md) 阶段表移入,原文照录);阶段开工后,计划、裁定与报告都放在本目录。 ## 摘要