Files
MobileGL/docs/Disaggregated/notes/p9/INTEGRATOR-DECISIONS-P9.md
T

19 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P9 集成者裁定日志(反向通道)
> 形式沿用 [`../p12/INTEGRATOR-DECISIONS-P12.md`](../p12/INTEGRATOR-DECISIONS-P12.md):一条裁定一个 ID,只记「定了什么、为什么、影响哪些文件」。交接与重划范围见 [`HANDOFF-P9.md`](HANDOFF-P9.md),协议见 `MobileGL/MG_Remote/CONTRACT-P9.md`。
| ID | 日期 | 裁定 | 理由 | 影响 |
|---|---|---|---|---|
| ID-P9-1 | 2026-09-29 | W1 取交接的 (a):读进 pack buffer 时 client 只标"GPU 写过",字节留在 server,CPU 读时经既有 `resource_readback` 取回;不做 server 主动推送 (b)。 | 读的那一刻两者都不等;(a) 零新机制(`GpuWritePending` 第 4 行 P5 已留好)、从不被 CPU 读的 PBO 零字节过线;(b) 要另一套在飞状态。 | `EmitTables.cpp`、`TextureReadbackEmit.inc` |
| ID-P9-2 | 2026-09-29 | 新形式是**两个追加 op**(82 `ReadPixelsToBuffer`、83 `GetTextureImageToBuffer`,共用 104 字节的 `MGPReadbackToBuffer`),不是给 `ReadPixels` 加每记录的免回复标志。 | 目的地要带句柄与 PACK 布局,改 `MGPReadbackInfo` 会同时改两个既有 op 的线上布局;追加 op 是目录的既定做法,且 verb 映射一 op 一 verb。 | `PipeCalls.def`、`MGPipeTypes.h`、`PipeFields.def`、`FieldOwnership.def`、`PipeWireCodec.{h,cpp}`、生成表 |
| ID-P9-3 | 2026-09-29 | server 端不用驱动 PBO 读:读紧排像素(与回复形式同一函数)后,按 client 算好的布局经 `MGPipeApplyResourceSubData` 逐段落进目的 buffer。 | Espryt 的 buffer 有两份存储,驱动写只到 GL buffer,之后从 R-11 暂存影子排空的范围会盖回旧字节;Magma 的 `ReadPixels` 没有 pack 路径。走写入口两后端同形。 | `PipeApplier.{h,cpp}` |
| ID-P9-4 | 2026-09-29 | client 在五种情况下退回回复形式:旋钮 `MOBILEGL_IPC_PBO_READBACK_SYNC=1`、无回读路径、buffer 已映射(持久映射的读者直接读指针)、范围超 2³¹−1、buffer 无句柄。split 下 UNPACK 源读取先 `SyncGpuWrites`。device lost 时欠着 GPU 写的 buffer 被读 → `Fatal{ReadbackDeclined, "buffer-writeback"}`(F1)。 | 每一条都是"标记兑现不了"的情形;UNPACK 源不同步会让"读进 PBO 再从它上传"上传旧字节;device lost 下返回影子就是把旧字节当像素。 | `TextureReadbackEmit.inc`、`GL_Texture.cpp`、`GpuWritePending.cpp`、`Config.h`、`ConfigLoader.cpp` |
| ID-P9-5 | 2026-09-29 | 两个新 sink 的全部形状检查在**读之前**做完,并归到每个 sink 唯一的闩锁点(`"<op>.shape"`,原因作参数);落地函数里不再有闩。准入推导改为"盖该 verb 戳的**每个** op 都等待才算静态屏障"(原实现取表中最后一个 op),自检里以 ReadPixels 为例的对照相应翻转,并加"把新 op 也屏障后该对重新准入"的正向对照。 | `ph_latch_sites.py` 要求每个闩锁点首参为字面量且有原始对端对照行;一个 sink 一个站点只需一行。准入表按 verb 存,一个不等待的 op 就让该 verb 的拉取对它的记录是撕裂读;"最后一个 op"让答案取决于表的顺序。 | `PipeApplier.{h,cpp}`、`PeerLatchTest.cpp`(3 行)、`ph_latch_sites.py`(1 条不可达论证)、`gen_pipe_field_ownership.py` |
| ID-P9-6 | 2026-09-29 | W2 取 A:**不要拉取协议**,两后端都是。Espryt split 的重铸已从旧 GPU 纹理读回每级、合并 `StagedTextureStore` 的待定盒(`RequireImageBindableStorageByHandle`,c1bf7e15);Magma 是 `vkCmdCopyImage` GPU→GPU。两处 `Fatal{UnmigratedEmulation, "texture-remint-pull"}` 在传输下不可达(普查 77 行 × 2 臂 = 154 次运行 0 次命中)→ 删除;`OnTexturePullRequest` 删除;`TextureRemintPulls` 在 server 路径计数。只修一个 split 缺陷:只定义未上传的级在重铸时读回失败(`Fatal{ResourceUnavailable,"image-promotion-readback"}`)→ 先问驱动该级是否存在,没有就用暂存或跳过;读回失败且暂存有该级 → 用暂存。 | 交接 §3 W2 的"改读 server 自己的 store"是错的:store 只有 client 上传过的字节,而语料里两次真实重铸(iris-photon、iris-derivative,GLES)都是纯 GPU 内容、store 为空。读 GPU 图像才对。只有确实需要拉取协议时才回来问用户,此处不需要。 | p9/w2 包(`Managers.cpp`、`MGPipeCallbacks.h`、`TextureRemintPullScenario`) |
| ID-P9-7 | 2026-09-29 | W4 不做:`OnBufferWriteback` 批处理 / epoch 排序、`OnGpuWritten` 收窄都没有实测需求。普查全语料 0 错误事件、0 环满阻塞、0 丢弃;唯一的大量是 Magma 在 create-indirect 第 1 帧发 7,093 条整 buffer 的 `OnGpuWritten`(client 自己已标同一批 buffer,Espryt 同 trace 为 0),冗余但无害,记为债。 | 交接 §3 W4:只有事件量在某个负载里成为问题才做。 | `DEBTS.md` |
| 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`)、两条故障注入。 | 过程 |