mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 18:13:23 +09:00
8.5 KiB
8.5 KiB
P9 集成者裁定日志(反向通道)
形式沿用
../p12/INTEGRATOR-DECISIONS-P12.md:一条裁定一个 ID,只记「定了什么、为什么、影响哪些文件」。交接与重划范围见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)、两条故障注入。 |
过程 |