mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
[docs] (P7): every cited feat/disaggregated commit is the rewritten one without the attribution trailer
- 144 commits from785fed0b0onward were rewritten to drop the Co-Authored-By trailer the project forbids; origin/feat/disaggregated moved from 1135c664 to3c80cd62(same trees) - the old->new map is ~/w7/logs/sha-map-20260922.txt; every 7..40-hex citation in the Disaggregated docs and the MG_Remote contracts that matched an old SHA is replaced by the same-length prefix of its rewrite; no other content changes
This commit is contained in:
@@ -4,7 +4,7 @@ Authority: this file, beside `CONTRACT-P5.md` (table 0, byte carriers, field own
|
||||
`CONTRACT-P5B.md` (the class-C slots), `CONTRACT-P5C.md` (rule E, the two named exemptions, SEG_EVENT,
|
||||
the guards), `CONTRACT-P5E.md` (rule F, the barriered predicate, the wait rule) and
|
||||
`CONTRACT-MAGMA-RUNAHEAD.md`. Where it disagrees with any of them this file is newer and wins; §10
|
||||
lists every such place. Base: `feat/disaggregated @ 785fed0b`. Every `file:line` was read at that
|
||||
lists every such place. Base: `feat/disaggregated @ c25a7760`. Every `file:line` was read at that
|
||||
commit; paths are under `MobileGL/` unless they start with `docs/`.
|
||||
|
||||
**How to change it.** Package `c6`'s file, edited by the integrator first. A P6 package
|
||||
@@ -701,7 +701,7 @@ owed to P13. Method and full symbol list:
|
||||
|
||||
**Gate (landed, P7 wave 0 — ID-P7-7)**: `scripts/link_ratchet.py` recomputes this set from an
|
||||
explicit per-object partition on every `build-linux-split` run and fails on any symbol absent from
|
||||
`scripts/data/link_ratchet_baseline.txt` — which stands at **186** on `78b7d6be`, the 184 plus
|
||||
`scripts/data/link_ratchet_baseline.txt` — which stands at **186** on `e8b2c4bd`, the 184 plus
|
||||
P6.5's `Client::ClientSession::StartSpawned()` and `MG_State::GLState::ProgramArtifactsSchemaFingerprint()`,
|
||||
with the three backend buckets reproducing a6's 101 / 14 / 60 exactly — while a symbol that
|
||||
disappears is reported rather than failed, so progress never turns the build red
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# CONTRACT-P7 — Magma(DirectVulkan)全量走完拆分路径
|
||||
|
||||
权威:本文,与 `CONTRACT-P5.md`(表 0、字节载体、字段归属、R-1…R-17)、`CONTRACT-P5C.md`(规则 E、两个具名豁免、`SEG_EVENT`、守卫)、`CONTRACT-P5E.md`(规则 F、等待规则)、`CONTRACT-MAGMA-RUNAHEAD.md`、`CONTRACT-P6.md`(规则 G/H、死亡漏斗、§12 记录债)、`CONTRACT-P65.md`(两轴传输、布局指纹、`LinkTerms`)并列;与它们不一致处以本文为准,§10 逐条列出。基线:`feat/disaggregated @ 78b7d6be`。`file:line` 均在该提交上读取;路径在 `MobileGL/` 下,除非以 `docs/` 开头。
|
||||
权威:本文,与 `CONTRACT-P5.md`(表 0、字节载体、字段归属、R-1…R-17)、`CONTRACT-P5C.md`(规则 E、两个具名豁免、`SEG_EVENT`、守卫)、`CONTRACT-P5E.md`(规则 F、等待规则)、`CONTRACT-MAGMA-RUNAHEAD.md`、`CONTRACT-P6.md`(规则 G/H、死亡漏斗、§12 记录债)、`CONTRACT-P65.md`(两轴传输、布局指纹、`LinkTerms`)并列;与它们不一致处以本文为准,§10 逐条列出。基线:`feat/disaggregated @ e8b2c4bd`。`file:line` 均在该提交上读取;路径在 `MobileGL/` 下,除非以 `docs/` 开头。
|
||||
|
||||
**怎么改。** 集成者的文件。wave 2 的实现包(A / B / C / D / E / F,§9)需要改行时经集成者;包从第一天起就对着下面的行编译。
|
||||
|
||||
@@ -22,7 +22,7 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7
|
||||
|
||||
| 项 | 谁做了 | 证据 |
|
||||
|---|---|---|
|
||||
| `DynamicBackendParameters` / `MGPCaps` / `RenderStateParameters` 定宽 + 布局指纹 | P6.5 wf(`fe27380a`) | `CONTRACT-P65.md` 「握手与布局」;`CONTRACT-P6.md:666` 仍记在 P7 名下,§10 更正 |
|
||||
| `DynamicBackendParameters` / `MGPCaps` / `RenderStateParameters` 定宽 + 布局指纹 | P6.5 wf(`fe28bdb5`) | `CONTRACT-P65.md` 「握手与布局」;`CONTRACT-P6.md:666` 仍记在 P7 名下,§10 更正 |
|
||||
| server buffer consumers、Android 旋转 blit | `38919d45` | `notes/p5f/magma-inproc-fix.md` |
|
||||
| Magma run-ahead、GPU 延迟退休、VAO 身份碰撞 | `194382c9` | `notes/p5f/magma-runahead.md`;`MG_Backend/Init.cpp:101` `kMGPipeMagmaRunAheadReady = true` |
|
||||
| packed-float mip 原生 blit、resolve、占位图像、copy-image 端点、XFB 捕获 span、纹理回读 | `ed507b1a..d56c0e83`(随 `e1bf3677` 合入) | `WirePlaceholderImages.inc`、`WireFramebuffer.inc:634-636` |
|
||||
@@ -59,15 +59,15 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7
|
||||
| 名 | 站点 | 判定 | 形状 |
|
||||
|---|---|---|---|
|
||||
| `uniform-buffer-byte-tail` | `UniformManager.cpp:2391` | **退役**(真机 MC 报告 §5 的活边界) | 拷贝窗口外扩到 4 字节边界进 transient slice,再 `vkCmdCopyBuffer` 对齐内部到正确子字目的;`CopyWireBufferRangeToSlice` 扩 |
|
||||
| `copy-image-in-place` | `VulkanRenderer.cpp` | **已退役(wave 2-B,`9e126a14`)** | `srcImage == dstImage` 时单次转 `GENERAL`、两侧布局 GENERAL、一次写回;同 mip+layer 且矩形重叠 → decline(GL 未定义) |
|
||||
| `mipmap-shader-format-or-shape`(真机 iterationt 的死因) | `WireFramebuffer.inc` | **半退役(wave 2-B,`c5fa52f9`)** | Fatal 行带上格式 / 尺寸 / aspect / 缺的 feature 位;image 不能作附件时经 scratch 走颜色 shader mip;仍无 shader 臂的形状**具名**拒绝 |
|
||||
| **wire 回读竞态(曾被当作 OpenRA 真机 0.976494 的原因;真因是下一行)** | `WireFramebuffer.inc` / `VulkanRenderer.cpp` | **已修(wave 2-B,`64530ed2`)** |
|
||||
| **wire 臂 completed-frame-serial floor 不健全(OpenRA 真机 0.976494 / 0.988998 的真因,ID-P7-33)** | `VulkanRenderer.cpp` `OnSubmitsCompletedUpTo`、`VkBufferManager.cpp` `WriteWireBuffer` | **已修(wave 2-B3,`6a92a10d` / `214cb2eb`)** | 一个 serial 两次提交(S1 pooled-fence 中帧 flush、S2 Present),逐记录退休把 floor 提前 → 帧 N 首次 `glBufferSubData` 走无序 host memcpy 被 S2(N-1) 的排队拷贝盖掉;floor 只升到可证 serial + 有读者在飞的 buffer 一律有序;计数 26→0,red-once `StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn;32 处静默出口具名(`WireDeclines.def`)。留:三处单 fence 退休站点的聚合等待(B4) | `ReadWirePixels` 在 pooled fence 下 flush 帧内 draw 但不等待,拷贝是后一次提交,二者只靠一条 barrier 相连,而 `UNDEFINED` / `PRESENT_SRC_KHR` 的源 scope 映射成 `TOP_OF_PIPE`+0 = 空 scope——刚 present 过的默认 framebuffer正是这个布局;修后回读等它读的那一帧(red-once:`fences=2` vs `1`,`completed=71` 不变)。真机验收 = 三次 `pm clear` 冷跑 1.0 |
|
||||
| `vertex-layout` | `WireDraw.inc:245`、`VertexInputStateFactory.cpp:439-500` | **已拆分(wave 2-C,`8385a338`)** | `buffer-window` 一种保留为协议错(经 hook 的具名 Fatal,家族词暂留 `UnmigratedVerb`——改成更诚实的 `ProtocolCorruption` 要在 `MG_Pipe::MGPipeFatalFamily` 加一行 + 适配臂,§3.3 未花这笔,记 §12);其余**七**种形状/格式原因(含审计之后新增的 `offset-overflow`)改 monolith 的「屏蔽该属性继续画」,`BuildWireVertexInput` 出 `unsupportedAttribMask`;`vertex-format-conversion` 同包改 decline。`WireDraw.inc` 从此无 `@P7`(普查 15 → 13 处 / 3 文件) |
|
||||
| `default-color-blit-shape` | `WireFramebuffer.inc` | **已退役(wave 2-B,`0a8a7a0c`)** | 恒等变换回落 `vkCmdBlitImage` 臂;非恒等旋转先 resolve/copy 进 scratch 2D RGBA 再 shader blit;四旋转之外 decline。顺手修出拒绝背后的活 bug:普通 blit 臂对 3D 源按 layer 寻址(z 0..1 读到 slice 0)。旋转半边只在真机可证 |
|
||||
| `multisample-blit-shape` / `-aspect` | `WireFramebuffer.inc` | **已退役(wave 2-B2,`089fd495` / `22c2687d`)**:shape 走 scratch resolve + blit、MS 目的地具名 decline;aspect 走 `VK_KHR_depth_stencil_resolve` 或第三套烘焙 shader resolve(`WireMultisampleResolve.*`),无臂的采样数形状具名 decline;树上 `@P7` 拒绝站点 **0**(剩 19 行全是注释) | shape:resolve 进 scratch 单采样再 `vkCmdBlitImage` 缩放/翻转;aspect:MS 深/模板 → 单采样用 `VK_KHR_depth_stencil_resolve`(`DynamicBackendParameters` 里查扩展)或 `texelFetch(sampler2DMS)` 写 `gl_FragDepth` 的 shader resolve;单采样 → MS 尺寸不同 decline |
|
||||
| `copy-image-in-place` | `VulkanRenderer.cpp` | **已退役(wave 2-B,`4f857aa5`)** | `srcImage == dstImage` 时单次转 `GENERAL`、两侧布局 GENERAL、一次写回;同 mip+layer 且矩形重叠 → decline(GL 未定义) |
|
||||
| `mipmap-shader-format-or-shape`(真机 iterationt 的死因) | `WireFramebuffer.inc` | **半退役(wave 2-B,`c4be3800`)** | Fatal 行带上格式 / 尺寸 / aspect / 缺的 feature 位;image 不能作附件时经 scratch 走颜色 shader mip;仍无 shader 臂的形状**具名**拒绝 |
|
||||
| **wire 回读竞态(曾被当作 OpenRA 真机 0.976494 的原因;真因是下一行)** | `WireFramebuffer.inc` / `VulkanRenderer.cpp` | **已修(wave 2-B,`76b74693`)** |
|
||||
| **wire 臂 completed-frame-serial floor 不健全(OpenRA 真机 0.976494 / 0.988998 的真因,ID-P7-33)** | `VulkanRenderer.cpp` `OnSubmitsCompletedUpTo`、`VkBufferManager.cpp` `WriteWireBuffer` | **已修(wave 2-B3,`511c1f16` / `c9164f25`)** | 一个 serial 两次提交(S1 pooled-fence 中帧 flush、S2 Present),逐记录退休把 floor 提前 → 帧 N 首次 `glBufferSubData` 走无序 host memcpy 被 S2(N-1) 的排队拷贝盖掉;floor 只升到可证 serial + 有读者在飞的 buffer 一律有序;计数 26→0,red-once `StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn;32 处静默出口具名(`WireDeclines.def`)。留:三处单 fence 退休站点的聚合等待(B4) | `ReadWirePixels` 在 pooled fence 下 flush 帧内 draw 但不等待,拷贝是后一次提交,二者只靠一条 barrier 相连,而 `UNDEFINED` / `PRESENT_SRC_KHR` 的源 scope 映射成 `TOP_OF_PIPE`+0 = 空 scope——刚 present 过的默认 framebuffer正是这个布局;修后回读等它读的那一帧(red-once:`fences=2` vs `1`,`completed=71` 不变)。真机验收 = 三次 `pm clear` 冷跑 1.0 |
|
||||
| `vertex-layout` | `WireDraw.inc:245`、`VertexInputStateFactory.cpp:439-500` | **已拆分(wave 2-C,`f1b04edf`)** | `buffer-window` 一种保留为协议错(经 hook 的具名 Fatal,家族词暂留 `UnmigratedVerb`——改成更诚实的 `ProtocolCorruption` 要在 `MG_Pipe::MGPipeFatalFamily` 加一行 + 适配臂,§3.3 未花这笔,记 §12);其余**七**种形状/格式原因(含审计之后新增的 `offset-overflow`)改 monolith 的「屏蔽该属性继续画」,`BuildWireVertexInput` 出 `unsupportedAttribMask`;`vertex-format-conversion` 同包改 decline。`WireDraw.inc` 从此无 `@P7`(普查 15 → 13 处 / 3 文件) |
|
||||
| `default-color-blit-shape` | `WireFramebuffer.inc` | **已退役(wave 2-B,`583e12de`)** | 恒等变换回落 `vkCmdBlitImage` 臂;非恒等旋转先 resolve/copy 进 scratch 2D RGBA 再 shader blit;四旋转之外 decline。顺手修出拒绝背后的活 bug:普通 blit 臂对 3D 源按 layer 寻址(z 0..1 读到 slice 0)。旋转半边只在真机可证 |
|
||||
| `multisample-blit-shape` / `-aspect` | `WireFramebuffer.inc` | **已退役(wave 2-B2,`452d33b5` / `51fa513d`)**:shape 走 scratch resolve + blit、MS 目的地具名 decline;aspect 走 `VK_KHR_depth_stencil_resolve` 或第三套烘焙 shader resolve(`WireMultisampleResolve.*`),无臂的采样数形状具名 decline;树上 `@P7` 拒绝站点 **0**(剩 19 行全是注释) | shape:resolve 进 scratch 单采样再 `vkCmdBlitImage` 缩放/翻转;aspect:MS 深/模板 → 单采样用 `VK_KHR_depth_stencil_resolve`(`DynamicBackendParameters` 里查扩展)或 `texelFetch(sampler2DMS)` 写 `gl_FragDepth` 的 shader resolve;单采样 → MS 尺寸不同 decline |
|
||||
| `depth-stencil-mipmap` | `WireFramebuffer.inc` | **已退役(wave 2-B,`227d8220`)** | DEPTH-only 走 `WireDepthMipmap.{vert,frag}` 烘焙程序((A));`MOBILEGL_BAKED_INTERNAL_SHADERS` 表驱动新鲜度门((D))覆盖树内全部烘焙头——首跑抓出 iterationRP witness 头过期;D\|S 合并 / 仅 stencil → decline |
|
||||
| `uniform-buffer-byte-tail` → **已退役(wave 2-A,`5a14e5a1`)** | — | — | 见上行;真正可达的形状是 `size` 非 4 倍数(offset 非对齐在前端就 `GL_INVALID_VALUE`) |
|
||||
| `uniform-buffer-byte-tail` → **已退役(wave 2-A,`450d3075`)** | — | — | 见上行;真正可达的形状是 `size` 非 4 倍数(offset 非对齐在前端就 `GL_INVALID_VALUE`) |
|
||||
| `texel-buffer-native-format` | `UniformManager.cpp` | **已 decline(wave 2-A)** | 零占位 view,fetch 读零;只在 Adreno 上有可观测(`GL_RGB32F` buffer texture) |
|
||||
| `unaligned-{texel,storage,atomic}-buffer-range` | `UniformManager.cpp` | **已具名 decline(wave 2-A)** | 跳过该绑定;可写 range 的 copyback 不做(分不出 readonly、录制点在 B/C 的 draw 尾,配方 `magma-a.md` §3.1);真正活的缺口是 `glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, …, 4, 4)`,Adreno 64 字节对齐 |
|
||||
| `storage-buffer-native-range` / `uniform-block-native-range` | `UniformManager.cpp` | **已钳制(wave 2-A)** | 钳到 `maxStorageBufferRange` / `maxUniformBufferRange` |
|
||||
@@ -76,13 +76,13 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7
|
||||
| `vertex-format-conversion` | `WireDraw.inc:272` | decline | 可选:packed converter |
|
||||
| `buffer-legacy-arm` | `WireDraw.inc:14/:204` | 具名 Fatal 经 hook(`RoleViolation`) | 已是拒绝,只换漏斗 |
|
||||
|
||||
**3.3 普查门(wave 0 包 C)。** `scripts/ci/fatal_census.py` 的扫描根扩到 server 镜像(`MG_Remote`、`MG_Pipe`、`MG_Backend`、`MG_Impl/Pipe`、`MG_State`,MG_Test / MG_Benchmark / MG_IntegrationTest 除外);`abort_sites` 成为**向下棘轮**;每个 `Fatal{Word` 在 `FatalFamilies.def` 有行;`Refuse{Word}` 对 `protocol.fbs` `RefuseCode` 校验。baseline 数(wave 0 落地,`852e3c28`):**79 处 abort / 20 文件**(扩容前 4 / `MG_Remote` 一处),**43 个家族词**(补了 11 行 `.def`,`InitialBytesNotCarried` 并入 `UncarriedInitialBytes`),3 个 `Refuse{}` 词,0 无标记;`ResourceUnavailable` 投影到 `ServerCrashed` 而非 `SegmentMismatch`(段几何没错的时候不说段错了);Magma 三个 wire fatal 漏斗(`MagmaWireFatal` / `WireDescriptorFatal` / `WireBufferLegacyFatal`)经 `MG_Pipe` 的 `MGPipeSessionFailHook` 进 `SessionFail`,家族词保持 `UnmigratedVerb`(改名会作废自 P5b 起的拒绝普查计数);`Refuse{AuthenticationRequired}` 改为词表里的 `Authentication`。
|
||||
**3.3 普查门(wave 0 包 C)。** `scripts/ci/fatal_census.py` 的扫描根扩到 server 镜像(`MG_Remote`、`MG_Pipe`、`MG_Backend`、`MG_Impl/Pipe`、`MG_State`,MG_Test / MG_Benchmark / MG_IntegrationTest 除外);`abort_sites` 成为**向下棘轮**;每个 `Fatal{Word` 在 `FatalFamilies.def` 有行;`Refuse{Word}` 对 `protocol.fbs` `RefuseCode` 校验。baseline 数(wave 0 落地,`8bb6309a`):**79 处 abort / 20 文件**(扩容前 4 / `MG_Remote` 一处),**43 个家族词**(补了 11 行 `.def`,`InitialBytesNotCarried` 并入 `UncarriedInitialBytes`),3 个 `Refuse{}` 词,0 无标记;`ResourceUnavailable` 投影到 `ServerCrashed` 而非 `SegmentMismatch`(段几何没错的时候不说段错了);Magma 三个 wire fatal 漏斗(`MagmaWireFatal` / `WireDescriptorFatal` / `WireBufferLegacyFatal`)经 `MG_Pipe` 的 `MGPipeSessionFailHook` 进 `SessionFail`,家族词保持 `UnmigratedVerb`(改名会作废自 P5b 起的拒绝普查计数);`Refuse{AuthenticationRequired}` 改为词表里的 `Authentication`。
|
||||
|
||||
---
|
||||
|
||||
## §4 出口门 4:184 符号棘轮下降 P7 的 101 个
|
||||
|
||||
**4.1 定义(wave 0 包 R,`scripts/link_ratchet.py`)。** 在 disaggregated 构建的对象树上:按 `notes/p6/a6-link-experiment-data.md` 的路径规则把 `MobileGL.dir` 下对象分 SERVER / FRONTEND / SHARED;集合 = (SERVER 未定义) − (SERVER 已定义) − (SHARED 已定义) ∩ (FRONTEND 已定义)。baseline 存**符号列表**(`scripts/data/link_ratchet_baseline.txt`),`--assert-monotone` 只对新增符号红,消失只提示重基线(ID-P7-7)。基线数(`scripts/data/link_ratchet_baseline.txt`,`852e3c28`):**186** = `p7-magma` **101** / `p3b-p4b-espryt` **14** / `both-backends` **60** / `p6-core` 11——三个后端桶与 a6 的手数逐符号相同,多出的 2 个是 P6.5 的 `ClientSession::StartSpawned()` 与 `ProgramArtifactsSchemaFingerprint()`。Espryt 桶里 5 个是 `MG_Impl/Pipe/SlotAllocator.cpp.o` 定义的 `MG_Pipe::` 符号,按文件位置落在前端桶、只有 P13 的模块搬迁能清(标 `# P13`),所以 P3b/P4b 的可清数是 9 不是 14。`MG_Remote/FatalFunnel.cpp.o` 归 SHARED(两个角色都经它);`MG_Backend/Init.cpp.o` 按 a6 规则归 SERVER,虽然它引用 5 个 client-session 符号。CI 步骤在 `build-linux-split` 作业;baseline 由参考工具链生成,CI 的 `clang++-20` 内联决策可能让首轮红——三元规则:已列类的兄弟方法、无新引用对象 = 内联,重基线;新引用对象永远不是内联。**重基线(wave 2-B2,`ec46a550`):186 → 173** = `p7-magma` **88** / `p3b-p4b-espryt` 18 / `both-backends` 56 / `p6-core` 11;(B′) 清掉 13 个(`ProgramObject::*`、`SamplerObject::Set*`、`ShaderObject::*` 的编译/链接路径)。剩下的 88 不是「隐藏程序」而是 **monolith draw 路径**(`UniformManager.cpp.o` 引用 `TextureObjectBase`/`TextureObjectWithOneMipmap` 等 62 个、`VkSamplerManager.cpp.o` 引用 `SamplerObject` 14 个 getter、12 个单例),`SetupDraw` 在运行时才分支到 `SetupWireDraw`(ID-P7-5 保留该运行时)——`#if` 掉这些 monolith 臂与 (B′) 是同一种操作、属 wave 3,故不标 `# P13`;§4.2 的「降到 0」对 (B′) 单独不成立。
|
||||
**4.1 定义(wave 0 包 R,`scripts/link_ratchet.py`)。** 在 disaggregated 构建的对象树上:按 `notes/p6/a6-link-experiment-data.md` 的路径规则把 `MobileGL.dir` 下对象分 SERVER / FRONTEND / SHARED;集合 = (SERVER 未定义) − (SERVER 已定义) − (SHARED 已定义) ∩ (FRONTEND 已定义)。baseline 存**符号列表**(`scripts/data/link_ratchet_baseline.txt`),`--assert-monotone` 只对新增符号红,消失只提示重基线(ID-P7-7)。基线数(`scripts/data/link_ratchet_baseline.txt`,`8bb6309a`):**186** = `p7-magma` **101** / `p3b-p4b-espryt` **14** / `both-backends` **60** / `p6-core` 11——三个后端桶与 a6 的手数逐符号相同,多出的 2 个是 P6.5 的 `ClientSession::StartSpawned()` 与 `ProgramArtifactsSchemaFingerprint()`。Espryt 桶里 5 个是 `MG_Impl/Pipe/SlotAllocator.cpp.o` 定义的 `MG_Pipe::` 符号,按文件位置落在前端桶、只有 P13 的模块搬迁能清(标 `# P13`),所以 P3b/P4b 的可清数是 9 不是 14。`MG_Remote/FatalFunnel.cpp.o` 归 SHARED(两个角色都经它);`MG_Backend/Init.cpp.o` 按 a6 规则归 SERVER,虽然它引用 5 个 client-session 符号。CI 步骤在 `build-linux-split` 作业;baseline 由参考工具链生成,CI 的 `clang++-20` 内联决策可能让首轮红——三元规则:已列类的兄弟方法、无新引用对象 = 内联,重基线;新引用对象永远不是内联。**重基线(wave 2-B2,`3c2867d3`):186 → 173** = `p7-magma` **88** / `p3b-p4b-espryt` 18 / `both-backends` 56 / `p6-core` 11;(B′) 清掉 13 个(`ProgramObject::*`、`SamplerObject::Set*`、`ShaderObject::*` 的编译/链接路径)。剩下的 88 不是「隐藏程序」而是 **monolith draw 路径**(`UniformManager.cpp.o` 引用 `TextureObjectBase`/`TextureObjectWithOneMipmap` 等 62 个、`VkSamplerManager.cpp.o` 引用 `SamplerObject` 14 个 getter、12 个单例),`SetupDraw` 在运行时才分支到 `SetupWireDraw`(ID-P7-5 保留该运行时)——`#if` 掉这些 monolith 臂与 (B′) 是同一种操作、属 wave 3,故不标 `# P13`;§4.2 的「降到 0」对 (B′) 单独不成立。
|
||||
|
||||
**4.2 P7 的目标。** `--bucket` 归到 DirectVulkan 引用对象的那一桶(a6 的 101)降到 **0**。唯一还在构造前端 `SamplerObject` / `ShaderObject` / `ProgramObject` 的 DirectVulkan 站点是 `VulkanRenderer.cpp:4526-4583 / 4624-4684`(monolith 臂的隐藏 blit / 深度 mip 程序),其 early-return 是运行时而非 `#if`,所以符号仍被引用。降到 0 的路径:在 **disaggregated 构建里** monolith 臂也改用烘焙模块(§5.2 的 (B')),pull 构建的代码逐语句原样——G1 不动。若 wave 3 实测某桶符号无法在不动 pull `.text` 的前提下消失,按名记入 §12 并在 baseline 里 `# P13` 标注,不算门 4 失败。
|
||||
|
||||
@@ -109,7 +109,7 @@ verify 今天只在 monolith 注册(`MG_IntegrationTest/CMakeLists.txt:1684-17
|
||||
## §7 出口门 3 与 5:真机与 CTS
|
||||
|
||||
**7.1 门 3 分母(ID-P7-4,设备窗口 #1 E0a 补正)。** `trace_cases.json` 的 CI split 子集(39)× DirectVulkan × `--use-pbuffer`,排除**在 monolith 臂上就红的 case**——它们按定义不是分离缺陷:`create-indirect`(OQ-17:`dev@81b17c0b` 起在 Adreno 830 上就坏)、`minecraft-1.21.11-main-menu`(trace 自身 UBO offset 不满足本机 32 字节对齐,`notes/p65/mainmenu-trace-difference.md`)、`minecraft-1.21.4-fabric-iris-photon-v1.3b-in-world`(Adreno 830 的 `vkCreateGraphicsPipelines` 对 photon 程序返回 `VK_ERROR_UNKNOWN`,`Renderer/PipelineFactory.cpp:660`,monolith SSIM 0.0089;桌面 lavapipe 绿;按 OQ-17 先例归 `dev` 侧独立条目);rd12 in-world 不在 `--matrix` 里。**分母 = 36**。`iterationrp` 带 `apk.yml:460-462` 的三个 Magma 旋钮。排除表随每次窗口更新于 `notes/p7/device-window-<n>/E0-attribution/exclusions.md`。
|
||||
**7.2 门 3 判据(逐 case 对 monolith 臂,不是对 golden 的平 1.0)。** E0a 实测 monolith × DirectVulkan 对 golden 的 SSIM 在 0.996–1.000(iris 光影 case 最低 0.99617),只有 OpenRA 是 1.000000——golden 来自桌面,阈值吸收驱动差。所以门 3 = 同一 reboot-clean 会话内,对分母中每个 case:inproc **与** spawn(或 tcp)三遍**逐位相同**(零翻转),且每遍 `ssim vs golden` ≥ 该 case 阈值 **且与 monolith 臂同会话读数之差 ≤ 0.0005**(OpenRA 两臂都必须 1.000000、mismatch 0);`RUN_AHEAD=0` 对照臂一遍记录。证据目录 `docs/Disaggregated/notes/p7/device-window-<n>/`。定位实验顺序 E0–E6 见计划 §3 wave 1。**状态(W4,p7w4 = `8c5dd6fc`,ID-P7-25)**:inproc 一遍 34/36 与 monolith 差 ≤ 0.0005;OpenRA 是与温度无关的约 50% 竞态(两张图,lockstep 第三张),验收改为 run-ahead 与 lockstep 各 6 遍全等 golden;bsl-esc-menu inproc OOM 待 spawn 臂。**状态(W5,p7w5 = `c89000f5`,ID-P7-34)**:OpenRA **27/27 golden**(inproc/spawn × run-ahead/lockstep × 冷/热 + FIF=8 + dump-armed)——项关闭;余 bsl-esc-menu(M2)与终局形式(p7w6:分母 36 三遍逐位 + spawn 臂同会话)。
|
||||
**7.2 门 3 判据(逐 case 对 monolith 臂,不是对 golden 的平 1.0)。** E0a 实测 monolith × DirectVulkan 对 golden 的 SSIM 在 0.996–1.000(iris 光影 case 最低 0.99617),只有 OpenRA 是 1.000000——golden 来自桌面,阈值吸收驱动差。所以门 3 = 同一 reboot-clean 会话内,对分母中每个 case:inproc **与** spawn(或 tcp)三遍**逐位相同**(零翻转),且每遍 `ssim vs golden` ≥ 该 case 阈值 **且与 monolith 臂同会话读数之差 ≤ 0.0005**(OpenRA 两臂都必须 1.000000、mismatch 0);`RUN_AHEAD=0` 对照臂一遍记录。证据目录 `docs/Disaggregated/notes/p7/device-window-<n>/`。定位实验顺序 E0–E6 见计划 §3 wave 1。**状态(W4,p7w4 = `ae3f43ab`,ID-P7-25)**:inproc 一遍 34/36 与 monolith 差 ≤ 0.0005;OpenRA 是与温度无关的约 50% 竞态(两张图,lockstep 第三张),验收改为 run-ahead 与 lockstep 各 6 遍全等 golden;bsl-esc-menu inproc OOM 待 spawn 臂。**状态(W5,p7w5 = `713bea9a`,ID-P7-34)**:OpenRA **27/27 golden**(inproc/spawn × run-ahead/lockstep × 冷/热 + FIF=8 + dump-armed)——项关闭;余 bsl-esc-menu(M2)与终局形式(p7w6:分母 36 三遍逐位 + spawn 臂同会话)。
|
||||
**7.3 门 5。** 块与 caselist(`tools/cts/caselists/`,取自 VK-GL-CTS `0b04c470e`,即设备上 glcts 的源):`KHR-GL46.texture_*`(1055)、`KHR-GL46.shader_image*`(125)、`KHR-GL46.packed_pixels`(4732)、`KHR-GL46.direct_state_access.*`(371)、**UBO 在 KHR 包里没有专属组**——取 GTF 模块 `GTF-GL46.gtf31.GL3Tests.uniform_buffer_object*`(90,设备 glcts 若未含 GTF 则该块记 unrun)、另加 `KHR-GL46.shader_storage_buffer_object`(124,簇 A 的 unaligned / native-range 拒绝实际打的是 SSBO range)。`KHR-GL46` 在 Android 跑器上未证实可开 4.6 core context:窗口先探针;不行则 `$BASE` 与 AFTER 都用 `gl33` 变体(texture 868 / packed_pixels 4732 / ubo 90;GL 3.3 无 shader image、无 DSA),**同一 API 版本比 0.5 pp**。先 monolith × DirectVulkan 基线入库 `tools/cts/baselines/`,迁移落地后 inproc × DirectVulkan 比对:每块 pass 率差 ≤ 0.5 pp(Pass/(Pass+Fail),NS 不入分母),**新增 crash = 0 单独硬红**。完整 caselist(~56k)在合 `dev` 前跑,不在关键路径。
|
||||
|
||||
---
|
||||
@@ -157,11 +157,11 @@ verify 今天只在 monolith 注册(`MG_IntegrationTest/CMakeLists.txt:1684-17
|
||||
|
||||
## §12 记录债
|
||||
|
||||
- ~~Magma 两进程 client 在 `StateObjectDeathOps` 落地前 `ObjectDeaths=0`:`CtWireScenario` 死亡用例在 Magma 臂按名 skip(§2.3)。~~ **已退(wave 2-C,`04292f06`)**:两处 skip 守卫删除,死亡用例在三臂全绿;泄漏的是 **server 的 twin**(framebuffer 无 wire delete opcode,用例现在两边计数都读)。
|
||||
- ~~Magma 两进程 client 在 `StateObjectDeathOps` 落地前 `ObjectDeaths=0`:`CtWireScenario` 死亡用例在 Magma 臂按名 skip(§2.3)。~~ **已退(wave 2-C,`dce9953d`)**:两处 skip 守卫删除,死亡用例在三臂全绿;泄漏的是 **server 的 twin**(framebuffer 无 wire delete opcode,用例现在两边计数都读)。
|
||||
- §5.4 的「白盒断言发出的是 `BufferSubDataResident(49)`」在本树**不可达**:resident 发射需要 GPU 常驻存储 → 需要 `AdoptPersistentMap` → split 下 T2 对每次采纳都 decline(`PipeApply.cpp:2331`),T0/T1 归 P11。本阶段证明到「server 按自己的表发布该位、client 镜像在双后端 × 三传输收到」为止;`rsd=` PipeStats 计数器在 P11 落地采纳档后会显示这些记录。
|
||||
- §5.3 的 `g_programResourceCaches` 删除只在 disaggregated 构建:monolith 消费者已改读归档(red-once 在 monolith 臂也红),但归档成员必须 `#if MOBILEGL_BUILD_DISAGGREGATED` 才能守 G1,pull 构建保留旧缓存——钉子挪动那天一行改完,**P13**。
|
||||
- 门 3 的「不确定」在 wave 1 E0 之前无法区分「同 case 多次结果不同」与「不同 case 各自低于阈值」;两个历史点值(0.988998 / 0.976494)无 per-case 归属。**已归属(W4,ID-P7-25)**:两个点值都是 OpenRA 同一帧里被静默丢掉的一段 draw(9836 / 14658 像素),run-ahead 与 spawn 臂都掷硬币;修复归 B3。
|
||||
- ~~`TextureViewAliasScenario.TheOwnerUploadDrainRunsAgainAfterADrawBoundary` 在三条 split 臂按名排除~~ **已退(wave 2-D3,`6eaaf492`)**:split 的 clean gate 改读 storage record(`IsDrawSyncCleanByRecord` 走 `Desc.ViewOf` 到 owner,与 Magma 的 `ResolveWireTextureStorage` 同形),排除删除,三臂 3 红 → 14/14;P5E §5.2 改写。留下的:该场景的 Magma 臂只在 informational 层;`KHR-GL46.texture_view.coherency` 无 split 读数(门 5)。
|
||||
- ~~`TextureViewAliasScenario.TheOwnerUploadDrainRunsAgainAfterADrawBoundary` 在三条 split 臂按名排除~~ **已退(wave 2-D3,`1e1f4bad`)**:split 的 clean gate 改读 storage record(`IsDrawSyncCleanByRecord` 走 `Desc.ViewOf` 到 owner,与 Magma 的 `ResolveWireTextureStorage` 同形),排除删除,三臂 3 红 → 14/14;P5E §5.2 改写。留下的:该场景的 Magma 臂只在 informational 层;`KHR-GL46.texture_view.coherency` 无 split 读数(门 5)。
|
||||
- **OpenRA 调查裁判点名的 Magma 债(`notes/p7/device-window-1/W4-verify/README.md` §3b、`~/w7/notes/evidence/w4/judge.json`),B3 不动、记在这里**:`TryDrainFrameTransients` 的 wire-only 块 `CollectWireObjects(m_completedSubmitCounter, /*all=*/true)`(`VulkanRenderer.cpp:13526`)无视 `RetireWireObjects` 给未来对象打的 `submitIndex = m_submitCounter + 1` 标签(`WireDraw.inc:113-118, 175-194`);`HasPendingRecordedWork`(`:13435-13441`)看不见 pre-pass 命令流;`FlushWirePendingCommandsForTextureUpdate = !HasPendingRecordedWork() || FlushPendingCommands()`(`VulkanRenderer.h:148-152`)把「此刻没在录」当「没在飞」;`StagedTextureStore::AdoptRun` 在 extent 变化时不重置 `Bytes`/`Covered`(`StagedTextureStore.h:234-243` vs `:270-284`,一条单测即红);`FrameContext::WaitAndAcquireNextImage`(`FrameContext.cpp:303-312`)只凭槽 fence 释放中帧 flush 过的命令缓冲。本 trace 都不可达,但都是真债。
|
||||
- **bsl-esc-menu-854 在 wire 臂上是内存缺陷不是排除项**(W4 §2/§3c):monolith 807 MiB 峰值通过;spawn 下 server 进程涨到 ~1.2 GiB 在 scudo 二级分配器 `internal map failure (Out of memory)` 死(系统尚余 8 GB → 是映射数或每进程上限,不是系统 OOM),client 同时 543 MiB;inproc 1.6 GiB 也死。**M1 已归因(主机 lavapipe,三臂同图)**:不是 store 的字节复制,是 split server **无界累积死 `VkBuffer`**——`RespecifyWireBuffer`(`VkBufferManager.cpp:189-224`)对每个 `glBufferData` 无条件 `DeferRelease` 进按帧槽分桶的 `m_deferredBufferReleases`,而桶只在 `BeginFrame`/`CollectAllDeferredReleases` 扫(`TryDrainFrameTransients` 与 present 路径),**pbuffer 回放整跑 server 只收到 1 条 present 记录**、drain 约每分钟成功两次 → 25 935 个活 VkBuffer(25 923 死)对 monolith 7 个,lavapipe 上每个一条 `memfd` 映射(27.4k → 41k),+12.2 MiB / 7.2 s,与真机 server 527 → 1162 MB 的爬升同量;轻例 `iris-bsl-in-world` 同形 1000×小(93 活 / 74 死)——随帧界之间的调用数增长,不是结构性。`StagedTextureStore` 是每层第二份拷贝(43 MiB)但平台;`PendingUploads` 0 字节(与 B3 无关);monolith 式条件 orphan 无效(6701 vs 6702)。附带:`CollectGarbage()`/`pruneWire`(`VulkanRenderer.cpp:6989`)在 `SetupDraw` 转 `SetupWireDraw` 之后、wire 臂从不执行。修复包 **M2**(`VkBufferManager.{h,cpp}`:按 serial 的 fence-gated 回收 + `MOBILEGL_IPC_WIRE_DEFERRED_MB` 水位线;red-once = 单帧内 N 次 respecify 后活 VkBuffer ≤ k×wire buffers)。**未答**:真机上是 `vm.max_map_count` 还是字节(采样器没记 maps 行数;Adreno 的 VMA 256 MiB 块推测是字节)。**「只有一条 present」已答(P-present 调查)**:不是 pbuffer、不是 client 决定——该 fixture 1 303 535 次调用里只有 **2 次 `eglSwapBuffers`**(call 1 301 789 与目标 call 1 303 534),harness 在目标 swap 上先快照后 `exit`(apitrace `retrace_main.cpp` 的 `frameComplete` → `mobilegl_apitrace_exit` 抛出(`tools/trace_replay/CMakeLists.txt:186-189` 的宏替换),在 apitrace `glretrace_egl.cpp` 的 `frame_complete` 里、`drawable->swapBuffers()` 之前解栈),所以到达 MobileGL 的 swap = 1、present 记录 = 1、`OnPresent` = 1;规则 `presents = (swaps with call_no ≤ target) − 1`(OpenRA 30 → 29,B3 测得 33 次 `BeginFrame` = 29 present + 起会 + drain)。client 的 `SwapBuffers → BackendObject::SwapEGLBuffers → Present()` 链无任何 surface-kind 分支,credit 只停不丢。结论:**server 侧任何挂在 present 上的回收都不能假设一帧有界**(一帧可以是 1.3 M 调用的 Iris 换包重编译),M2 的按 serial 回收正是这个形状;`TryDrainFrameTransients` 的两道闸 + 每 8 次的节流不是替代品。附带债:`BackendObject.cpp:385-388` 单活动面守卫对多 surface 的 client 会静默丢 present(本 trace 不触发)——该给 `MGLOG_E_ONCE`/计数。
|
||||
- `MEASUREMENTS.md` §7.2 的同名比对自 P5b 起未重跑;「22 → texture readback」「3 → query」两行债务的关闭以 wave 3 的重跑为准。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## P6.5 第一波(2026-09-22)
|
||||
|
||||
实现、代码审查与主要正确性门已完成;**已落地并推送 `feat/disaggregated@fe27380a`(2026-09-22)**(原
|
||||
实现、代码审查与主要正确性门已完成;**已落地并推送 `feat/disaggregated@fe28bdb5`(2026-09-22)**(原
|
||||
在 `codex/p65-all-tcp` 的 WIP + 本次审查修复 + 收尾文档一并合入)。完整 39 例 device golden 矩阵与全套
|
||||
链路必测数按用户「本地代表性、CI 兜底」留 CI/后续,**尚未宣布阶段收官**。
|
||||
|
||||
@@ -46,9 +46,9 @@
|
||||
`2f7cbe2e` reboot-clean、同热窗口配对 A/B)判读为 **tie**——`inproc` 与 `spawn` 的 client CPU/帧
|
||||
差 −0.15%(会话 1)/ +0.16%(会话 2),都落在臂内散布之内,如实记录、不设门;门 8 的三个强制
|
||||
性能数(socket 门铃 vs condvar、`SEG_STAGE` 字节/帧、chunking 后记录/帧)已采齐,逐数见 §2;
|
||||
G1 pull 构建 **0/0/0/0** 且 `.text` 逐字节相同。测量期的源头:门 7 报告记 `98d0b96c`、门 8 的
|
||||
wire 计数器与真机第二轮记 `71aa9951`。分支 `feat/disaggregated` 其后又落地两个 P6.5 设计提交
|
||||
(`2d86e07a`、`2bd86664`),**现头 `2bd86664`,与 `origin` 同步**;**工作树另有未提交的 P6 收尾
|
||||
G1 pull 构建 **0/0/0/0** 且 `.text` 逐字节相同。测量期的源头:门 7 报告记 `75dd0cb1`、门 8 的
|
||||
wire 计数器与真机第二轮记 `94c130d6`。分支 `feat/disaggregated` 其后又落地两个 P6.5 设计提交
|
||||
(`872370ba`、`4e7bf0fe`),**现头 `4e7bf0fe`,与 `origin` 同步**;**工作树另有未提交的 P6 收尾
|
||||
改动**(wire 计数器、`ServerMain` 的 `PipeStats` 武装、`MOBILEGL_PIPE_STATS_FILE` 角色派生、设备行
|
||||
与工具入库、测试),见 §1.1。三种传输形态(`monolith` / `inproc` / `spawn`)在桌面(WSL lavapipe)
|
||||
与真机(Redmi `2f7cbe2e`)上都跑通了真实 trace 的两进程 retrace,逐像素对上 golden。性能**只记录、
|
||||
@@ -62,25 +62,25 @@ wire 计数器与真机第二轮记 `71aa9951`。分支 `feat/disaggregated` 其
|
||||
|
||||
| 包 | 落地什么 | 状态 / 证据 |
|
||||
|---|---|---|
|
||||
| **a6** | 进程装配与链接边界的核验;198 行审计;184 符号的链接实验(server 不能不链 `MG_Impl`) | ✅ `785fed0b`;[`notes/p6/a6-audit-v1.md`](notes/p6/a6-audit-v1.md)、[`a6-link-experiment.md`](notes/p6/a6-link-experiment.md) |
|
||||
| **c6** | 规范契约(21 条裁定)+ 数据面缝 `Transport/ILink.h` / `StreamLink.h`(声明不接线) | ✅ `0bbe41c2`;`CONTRACT-P6.md` |
|
||||
| **lk** | `RingControl` 按写者重组 + 可证伪的 per-field 断言;数据面缝的 pre-flight | ✅ `a54ae47a`、`f4cbaa89` |
|
||||
| **so** | `SocketTransport`(AF_UNIX SOCK_STREAM + SCM_RIGHTS),12 条 ITransport 契约用例 | ✅ `a3518361` |
|
||||
| **sm** | 两个**独立启动**的进程(非 fork),靠 name 汇合、共享匿名段;D1c 的六谓词里 D10 需要的三个,四个「编进来却永不武装」的守卫接线 | ✅ `e156ea5f`、`207c31f6`、`743d1fac` |
|
||||
| **cp** | EGL 控制帧跨进程并应答;`InitCapabilities` 上线(wire kind 11);真实 trace 两进程 retrace 逐像素通过 | ✅ `b0f4f8b7`、`ea9fc7fa` |
|
||||
| **hs** | build stamp 从「静默空串」变成显式 present 标志入指纹;客户端补检 `abiMajor/Minor`;`Hello::pid` / `Welcome::serverPid` 携带真实 pid | ✅ `570ebde9` |
|
||||
| **dl** | device-lost 闩(取自描述符的挂断,绝不取自超时);D5b「alive-but-silent」具名诊断;`MOBILEGL_IPC_RESPAWN` 具名拒绝;`Session::Fail` 漏斗(`FatalFamilies.def` 词表 + 90 站点归一 + `SessionFault` 帧向对端命名家族);Fatal 普查门 | ✅ `f6a0bd30`、`e7663512`、`e50463dc`、`f98f2067`、`5968863f`、`91d0cb78`、`16bfab10` |
|
||||
| **st** | fb-slot memo 的具名 Fatal(`nullptr==nullptr` 读成缓存命中、返回未填槽的潜在崩溃,sm 关掉可达性、st 出声) | ✅ `743d1fac` |
|
||||
| **t6** | `integration-spawn` 车道(102/102);集合一致做成结构性(一个宏两条臂)+ 校验门;per-role 日志 | ✅ `8cd00f42`、`b3155525` |
|
||||
| **a6** | 进程装配与链接边界的核验;198 行审计;184 符号的链接实验(server 不能不链 `MG_Impl`) | ✅ `c25a7760`;[`notes/p6/a6-audit-v1.md`](notes/p6/a6-audit-v1.md)、[`a6-link-experiment.md`](notes/p6/a6-link-experiment.md) |
|
||||
| **c6** | 规范契约(21 条裁定)+ 数据面缝 `Transport/ILink.h` / `StreamLink.h`(声明不接线) | ✅ `b6293957`;`CONTRACT-P6.md` |
|
||||
| **lk** | `RingControl` 按写者重组 + 可证伪的 per-field 断言;数据面缝的 pre-flight | ✅ `99649a90`、`db62d674` |
|
||||
| **so** | `SocketTransport`(AF_UNIX SOCK_STREAM + SCM_RIGHTS),12 条 ITransport 契约用例 | ✅ `5f846d96` |
|
||||
| **sm** | 两个**独立启动**的进程(非 fork),靠 name 汇合、共享匿名段;D1c 的六谓词里 D10 需要的三个,四个「编进来却永不武装」的守卫接线 | ✅ `70c45ab9`、`11807ac7`、`e3bb6d8b` |
|
||||
| **cp** | EGL 控制帧跨进程并应答;`InitCapabilities` 上线(wire kind 11);真实 trace 两进程 retrace 逐像素通过 | ✅ `5239ae0c`、`7e244b37` |
|
||||
| **hs** | build stamp 从「静默空串」变成显式 present 标志入指纹;客户端补检 `abiMajor/Minor`;`Hello::pid` / `Welcome::serverPid` 携带真实 pid | ✅ `90f9a790` |
|
||||
| **dl** | device-lost 闩(取自描述符的挂断,绝不取自超时);D5b「alive-but-silent」具名诊断;`MOBILEGL_IPC_RESPAWN` 具名拒绝;`Session::Fail` 漏斗(`FatalFamilies.def` 词表 + 90 站点归一 + `SessionFault` 帧向对端命名家族);Fatal 普查门 | ✅ `557dc2c1`、`8b13d8a8`、`3399b879`、`3a12a48a`、`4bb4d4fa`、`b46da700`、`77cbd176` |
|
||||
| **st** | fb-slot memo 的具名 Fatal(`nullptr==nullptr` 读成缓存命中、返回未填槽的潜在崩溃,sm 关掉可达性、st 出声) | ✅ `e3bb6d8b` |
|
||||
| **t6** | `integration-spawn` 车道(102/102);集合一致做成结构性(一个宏两条臂)+ 校验门;per-role 日志 | ✅ `15f5b54b`、`5fb54f03` |
|
||||
|
||||
配套:CI 的 `retrace-split` 从「1 case × 1 后端 × inproc」扩成「全 CI 矩阵 × 两后端 × inproc/spawn」,
|
||||
`split` 键改成 opt-out;Android CI 新增 `spawn-acceptance` 臂,真机 App 从 `nativeLibraryDir` 解析
|
||||
server 路径(`94e2f2e0`、`15bd9a67`、`1039502e`、`2afa0002`)。
|
||||
server 路径(`dc5bd935`、`d83fc664`、`53406749`、`7c8120cc`)。
|
||||
|
||||
### 1.1 收尾(2026-09-22)
|
||||
|
||||
下列改动**在两轮测量(门 7 的 `98d0b96c` 头、门 8 的 `71aa9951` 头)之后落地、目前仍在工作树里未
|
||||
提交**(其后两个提交 `2d86e07a`、`2bd86664` 只改文档与 `Transport/StreamLink.h` 的注释,不含这些代码):
|
||||
下列改动**在两轮测量(门 7 的 `75dd0cb1` 头、门 8 的 `94c130d6` 头)之后落地、目前仍在工作树里未
|
||||
提交**(其后两个提交 `872370ba`、`4e7bf0fe` 只改文档与 `Transport/StreamLink.h` 的注释,不含这些代码):
|
||||
|
||||
- **wire 计数器**:`PipeStats` 新增 `ByteClass::StageSegmentBytes`(唯一收口点
|
||||
`PipeWireCodec.cpp:878` `StageAllocate`)与 `CallClass::WireRecords`(`:1188` `EncodeRecord` 提交
|
||||
|
||||
@@ -4,19 +4,19 @@
|
||||
|
||||
**阶段:P7 DirectVulkan(Magma)全量迁移**,并行流 **P3b/P4b 深化(Espryt,wave 2-D)** 与 **Ph 小件(簇 F)**。计划 [`notes/p7/PLAN-PH-P34B-P7.md`](notes/p7/PLAN-PH-P34B-P7.md)(五波)。
|
||||
|
||||
**更新:2026-09-22 夜** · `origin/feat/disaggregated` = `1135c664`(B3 + ID-P7-33/34);集成树 `~/w7/pipe` = `51c71d87`(B2 返工 r1 + B3 返工 + V1,未推:等 B2 r2 与 V1 门 / 审查,ID-P7-35/36)。
|
||||
**更新:2026-09-22 夜** · `origin/feat/disaggregated` = `3c80cd62`(B3 + ID-P7-33/34);集成树 `~/w7/pipe` = `75858bfd`(B2 返工 r1 + B3 返工 + V1,未推:等 B2 r2 与 V1 门 / 审查,ID-P7-35/36)。
|
||||
|
||||
## 1. 出口门总览(CONTRACT-P7 §8 的 9 项分母)
|
||||
|
||||
| # | 子系统 | 状态 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 1 | Magma 两进程车道三臂同数绿 | ✅ | `integration-magma-{split,spawn,tcp}` 96 / 75 / 71,full-split 535(pipe `a785d055`;tcp 少 6 条 = 六个 server 端旋钮条目的具名 parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`);OpenRA DirectVulkan inproc + spawn 回放 1.000000 且 0 条 `unsound-serial-complete`(B3 的新红条件已进 pipe 门) |
|
||||
| 1 | Magma 两进程车道三臂同数绿 | ✅ | `integration-magma-{split,spawn,tcp}` 96 / 75 / 71,full-split 535(pipe `75a64ce0`;tcp 少 6 条 = 六个 server 端旋钮条目的具名 parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`);OpenRA DirectVulkan inproc + spawn 回放 1.000000 且 0 条 `unsound-serial-complete`(B3 的新红条件已进 pipe 门) |
|
||||
| 2 | §3.2 六个 `@P7` 退役 | ✅ | A(byte-tail、native-range、对齐 decline)、B(copy-image、default-color-blit、mip 半退役)、B2(multisample shape/aspect)、C(vertex-layout 拆分);树上 `@P7` 拒绝站点 **0** |
|
||||
| 3 | `StateObjectDeathOps` | ✅ | C,`04292f06..7ed5da52` |
|
||||
| 3 | `StateObjectDeathOps` | ✅ | C,`dce9953d..cf7ca59f` |
|
||||
| 4 | 烘焙 (A)(D) + (B′) | ✅ | B 深度 mip 烘焙;B2 disaggregated 构建的 monolith 臂改用烘焙模块 |
|
||||
| 5 | OQ-8 反射归档 `storageBlocks` | ✅ | C |
|
||||
| 6 | OQ-10 `kCapResidentSubData` 按 server 表发布 | ✅ | C |
|
||||
| 7 | verify × split(门 2) | 🔄→✅ | **V1 已报告并 cherry-pick 到 pipe**(`e5477898..51c71d87`):monolith verify 1136 不变、`integration-verify-split` 1070(DirectGLES 533 / DirectVulkan 537,逐条 inproc 武装证明)、`VERIFY_CORRUPT` 10/10 红、`POISON_OMIT` 2/2 红(split 臂)、8 verify trace × DV × inproc 0 分歧;verify 只能 inproc(比对器要求推送态与 GL 上下文同进程);pipe 门 + fable 审查在跑 |
|
||||
| 7 | verify × split(门 2) | 🔄→✅ | **V1 已报告并 cherry-pick 到 pipe**(`a1d17566..75858bfd`):monolith verify 1136 不变、`integration-verify-split` 1070(DirectGLES 533 / DirectVulkan 537,逐条 inproc 武装证明)、`VERIFY_CORRUPT` 10/10 红、`POISON_OMIT` 2/2 红(split 臂)、8 verify trace × DV × inproc 0 分歧;verify 只能 inproc(比对器要求推送态与 GL 上下文同进程);pipe 门 + fable 审查在跑 |
|
||||
| 8 | 真机 ssim 1.0(门 3,分母 36) | 🔄 | p7w4:34/36 与 monolith 差 ≤ 0.0005;**OpenRA 已关**(ID-P7-33/34:真因 = wire 臂 frame-serial floor 不健全,B3 修;p7w5 **27/27 golden**,[`W5-verify/`](notes/p7/device-window-1/W5-verify/README.md));**bsl-esc-menu** = server 死 VkBuffer 无界累积(ID-P7-32,**M2** 在修);终局形式(三遍逐位 + spawn 臂同会话)留 p7w6 |
|
||||
| 9 | CTS 五块 AFTER ≤ 0.5 pp(门 5) | ⏳ | `$BASE` 已取(`notes/p7/device-window-1/CTS-base/`);AFTER 在 wave 4 |
|
||||
|
||||
@@ -26,25 +26,25 @@
|
||||
|
||||
| 波 / 包 | 内容 | 落地 |
|
||||
|---|---|---|
|
||||
| wave 0 | Magma 两进程车道、`link_ratchet.py`、普查门扩容 + `MGPipeSessionFailHook`、设备跑器 `--matrix/--repeat/--archive-dir`、CTS caselists | `origin@8652bac0` |
|
||||
| wave 0 | Magma 两进程车道、`link_ratchet.py`、普查门扩容 + `MGPipeSessionFailHook`、设备跑器 `--matrix/--repeat/--archive-dir`、CTS caselists | `origin@801f8eda` |
|
||||
| wave 1 | 设备窗口 #1(Redmi 2f7cbe2e,DirectVulkan):门 3 分母 36、E0–E7 归因、CTS `$BASE` | `notes/p7/device-window-1/` |
|
||||
| X1 | persistent-map tracker 在 arm64 不认领 fault(bionic 指针标记 0xb4) | `0a41972b` |
|
||||
| F1 | split 起会提到 `MG_State::Init()` 之前 + `Fatal{CapsBeforeFirstSnapshot}` | `5d698cb9..3c8082cc` |
|
||||
| C | Magma `StateObjectDeathOps`、OQ-10、vertex-layout 拆分、OQ-8 `storageBlocks` | `04292f06..7ed5da52` |
|
||||
| A | UBO/SSBO/texel 对齐与 native-range 行 | `5a14e5a1..9376bea3` |
|
||||
| B | mip 形状半退役、深度 mip 烘焙、copy-image、default-color-blit、wire 回读 fence | `c5fa52f9..64530ed2` |
|
||||
| D1 | XFB 两洞、回调 10→9、resolver 具名 stop、readback 三臂 | `e35a0973..8c5dd6fc` |
|
||||
| D2 + 返工 | `TextureViewAlias`、TUS 门、memo 纯度门、`SubsystemDeps.def`、场景普查 | `9d857dc0..e7c5fc60`、`3cdaa5ee..c13ba36b` |
|
||||
| D3 + 审查修复 | view 陈旧缺陷(clean gate 读 storage record)、D-K2 单一陈述 | `6eaaf492..25b586d0`、`f1f2a19e` |
|
||||
| B2 | multisample 两处退役、AllocatorDebtScope ×2 删、(B′)、棘轮 173 | `089fd495..ec46a550` |
|
||||
| B3 | **OpenRA 真因**:wire 臂 completed-frame-serial floor 不健全 → 有序路径 + 可证 floor + 32 处静默出口具名 | `f62ceec6..38112dc6`,`origin@1135c664` |
|
||||
| B2 返工 r1 | tcp 五条 server 端旋钮条目改 split+spawn(parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`)、翻转 MS 深/模板 resolve 逐行镜像、缩放 / X 镜像 / 跨格式 decline、`MsFlip.` 用例 | pipe `475ab254..00f342c9`(审查 rework → r2 在跑,ID-P7-35) |
|
||||
| B3 返工 | `WireDeclines.def` 53 行全站点 + 审计脚本、`StaleSerial.` parity 例外、注记 + `:273`/`:432`、`run_trace_case.cmake` 对 `unsound-serial-complete` 打红 | pipe `23eeed68..a785d055`(审查 land with fixes → 修复轮在跑,ID-P7-36) |
|
||||
| V1 | `PipeRespecifyScope` 放宽、`integration-verify-split`(1070 条,双后端 inproc)、两负控 split 臂红、8 verify trace × DV × inproc 0 分歧、比对器 ReadPixels 窗口 oracle 改中性 pack | pipe `e5477898..51c71d87`(门 + 审查在跑) |
|
||||
| X1 | persistent-map tracker 在 arm64 不认领 fault(bionic 指针标记 0xb4) | `4cbf78c2` |
|
||||
| F1 | split 起会提到 `MG_State::Init()` 之前 + `Fatal{CapsBeforeFirstSnapshot}` | `df17c416..3179c497` |
|
||||
| C | Magma `StateObjectDeathOps`、OQ-10、vertex-layout 拆分、OQ-8 `storageBlocks` | `dce9953d..cf7ca59f` |
|
||||
| A | UBO/SSBO/texel 对齐与 native-range 行 | `450d3075..5937b4fc` |
|
||||
| B | mip 形状半退役、深度 mip 烘焙、copy-image、default-color-blit、wire 回读 fence | `c4be3800..76b74693` |
|
||||
| D1 | XFB 两洞、回调 10→9、resolver 具名 stop、readback 三臂 | `faf0a1f9..ae3f43ab` |
|
||||
| D2 + 返工 | `TextureViewAlias`、TUS 门、memo 纯度门、`SubsystemDeps.def`、场景普查 | `da30c130..519445f9`、`b3334cf3..a2d7fbd7` |
|
||||
| D3 + 审查修复 | view 陈旧缺陷(clean gate 读 storage record)、D-K2 单一陈述 | `1e1f4bad..00d02396`、`22761a69` |
|
||||
| B2 | multisample 两处退役、AllocatorDebtScope ×2 删、(B′)、棘轮 173 | `452d33b5..3c2867d3` |
|
||||
| B3 | **OpenRA 真因**:wire 臂 completed-frame-serial floor 不健全 → 有序路径 + 可证 floor + 32 处静默出口具名 | `76bbb6c3..9a494b6f`,`origin@3c80cd62` |
|
||||
| B2 返工 r1 | tcp 五条 server 端旋钮条目改 split+spawn(parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`)、翻转 MS 深/模板 resolve 逐行镜像、缩放 / X 镜像 / 跨格式 decline、`MsFlip.` 用例 | pipe `9fed478d..cc3c18c5`(审查 rework → r2 在跑,ID-P7-35) |
|
||||
| B3 返工 | `WireDeclines.def` 53 行全站点 + 审计脚本、`StaleSerial.` parity 例外、注记 + `:273`/`:432`、`run_trace_case.cmake` 对 `unsound-serial-complete` 打红 | pipe `b8d10d07..75a64ce0`(审查 land with fixes → 修复轮在跑,ID-P7-36) |
|
||||
| V1 | `PipeRespecifyScope` 放宽、`integration-verify-split`(1070 条,双后端 inproc)、两负控 split 臂红、8 verify trace × DV × inproc 0 分歧、比对器 ReadPixels 窗口 oracle 改中性 pack | pipe `a1d17566..75858bfd`(门 + 审查在跑) |
|
||||
|
||||
## 3. 真机(Redmi 2f7cbe2e,Adreno 830)
|
||||
|
||||
- 当前 APK:**p7w5**(`p7w5-c89000f5`,B3+B2+D3 之上)。验收 = OpenRA inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、FIF=8 ×3、dump-armed ×3 → **27/27 `ace2af04` / 1.000000 / 0 px**;iterationt ×2 + 26.3 逐位同 p7w4(ID-P7-34)。
|
||||
- 当前 APK:**p7w5**(`p7w5-713bea9a`,B3+B2+D3 之上)。验收 = OpenRA inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、FIF=8 ×3、dump-armed ×3 → **27/27 `ace2af04` / 1.000000 / 0 px**;iterationt ×2 + 26.3 逐位同 p7w4(ID-P7-34)。
|
||||
- p7w4 结论([`W4-verify/README.md`](notes/p7/device-window-1/W4-verify/README.md)):OpenRA 是与温度无关的约 50% 竞态、只出三张图;调色板纹理逐字节正确;错像素 100% 落在 call 30376 一次 draw 的 quad 前缀里;机制由裁判裁定并由 B3 计数证实。
|
||||
- bsl-esc-menu-854:monolith 807 MiB 过,spawn 的 server 1.2 GiB 死(scudo `internal map failure`);M1 归因 = 死 VkBuffer 无界累积(一帧 1.3 M 调用、整跑 2 次 swap);M2 修复中。
|
||||
|
||||
|
||||
@@ -616,7 +616,7 @@ P6(spawn transport)的实现包(a6 / c6 / lk / so / sm / cp / hs / dl / st
|
||||
| 跑法 | `--benchmark-repeats 3`(门 7)/ `2`(门 8),`--benchmark-tail-frames 200`,`--benchmark-no-finish`,best-of-3 / best-of-2 |
|
||||
| split 开关 | `MOBILEGL_IPC_ROLE_SPLIT_STATE=1`、`MOBILEGL_IPC_STRICT_ERRORS=1`、`MOBILEGL_IPC_RUN_AHEAD=1` |
|
||||
| stats | `MOBILEGL_PIPE_STATS=1`、`MOBILEGL_PIPE_STATS_PERIOD=120` |
|
||||
| 源码头 | 门 7 会话 `98d0b96c`;门 8 两会话 `71aa9951` + §12.6 的收尾改动(工作树) |
|
||||
| 源码头 | 门 7 会话 `75dd0cb1`;门 8 两会话 `94c130d6` + §12.6 的收尾改动(工作树) |
|
||||
| 臂的证明 | 每个 spawn 臂必须在**自己的**私有日志里出现 `Config: MOBILEGL_TRANSPORT=spawn` 与 `spawn ARMED - the server role runs in pid N`;`--transport` 在 `--benchmark` 模式下被 runner 忽略(会静默跑成 monolith),所以传输一律用显式 `--env MOBILEGL_TRANSPORT=…`,跑完按库自己的日志核对 |
|
||||
|
||||
**主指标 = client GL 线程自身的逐线程 CPU ms/帧**(§9 的规则:内核对本 app 的 `sched_setaffinity` 请求不生效,进程总量会把两个时钟域混在一起),由设备在**尾 200 帧**上汇总;`fps` 与 wall p50/p95 并列记录,不作主指标。
|
||||
@@ -773,7 +773,7 @@ P6(spawn transport)的实现包(a6 / c6 / lk / so / sm / cp / hs / dl / st
|
||||
- **spawn client 的窗口化字段仍不可信**,而且这一项是**结构**不是缺陷:要让 spawn client 推进窗口,得让 client 进程到达一次 `PipeStats::OnPresent`,而 client 的帧边界在 spawn 下是 `EmitPresent`(每条 present 记录一次)——接上去会与 backend 的帧边界重复计数。**不要顺手接**。
|
||||
- **`MOBILEGL_IPC_STAGE_MB` 同时是 arena 大小与 chunk 预算的来源**,所以分块的净效果没有被单变量隔离(§12.5 的 `tex` +194%)。
|
||||
|
||||
## 13. P3b/P4b wave 2-D 包 D2(`7ed5da52`,WSL 桌面 lavapipe/llvmpipe)
|
||||
## 13. P3b/P4b wave 2-D 包 D2(`cf7ca59f`,WSL 桌面 lavapipe/llvmpipe)
|
||||
|
||||
### 13.1 上传形状金标(R-11 / D-D4,`TextureUploadShapeScenario` 由记录升为门)
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
||||
# espryt D1 — the Espryt (DirectGLES) stream, part 1
|
||||
|
||||
P3b/P4b items landing under the P7 program (`notes/p7/PLAN-PH-P34B-P7.md` §1.2 rows XFB /
|
||||
回读 / `g_fboTextureSyncList`, §3 wave 2-D). Base `feat/disaggregated@665cfefc`, branch
|
||||
回读 / `g_fboTextureSyncList`, §3 wave 2-D). Base `feat/disaggregated@ec3ba00a`, branch
|
||||
`p7/espryt-d1`.
|
||||
|
||||
Per-slice red-once notes (R-16). A slice is not done until the case it adds has been seen RED
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# P3b/P4b wave 2-D package D2 — the Espryt stream, part 2
|
||||
|
||||
The verification gates P3b/P4b owes, plus the texture / program split-scenario census.
|
||||
Base `7ed5da52` (`feat/disaggregated`), worktree `~/w7/p7-espryt-d2`, branch `p7/espryt-d2`.
|
||||
Base `cf7ca59f` (`feat/disaggregated`), worktree `~/w7/p7-espryt-d2`, branch `p7/espryt-d2`.
|
||||
|
||||
Package D1 owns `MG_Backend/DirectGLES/{DirectGLES.cpp,Managers.cpp}`, the XFB/readback
|
||||
scenarios and their split-arm registrations. Nothing here touches those; every
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
`PLAN-PH-P34B-P7.md` §1.2, row **门:纹理 / program 场景 split 覆盖**: "~20 个候选场景…先在
|
||||
inproc 跑一遍记首阻塞,按 P7/P8/P9 归属决定注册或具名排除".
|
||||
|
||||
Head `7ed5da52`, build `~/w7/p7-espryt-d2/build-split` (Release, clang, lavapipe ICD, WSL
|
||||
Head `cf7ca59f`, build `~/w7/p7-espryt-d2/build-split` (Release, clang, lavapipe ICD, WSL
|
||||
desktop). Every candidate was run under `MOBILEGL_TRANSPORT=inproc` first; the ones that passed
|
||||
were then registered through `mgl_itest_register_split_arms` and re-run under all three
|
||||
transports, which is the reading in the table.
|
||||
@@ -28,14 +28,14 @@ un-exclusion makes it 77 on the integration tree, one per arm).
|
||||
|
||||
The raw diff against that baseline reports **77** per arm at D2's head, not 76. The extra one is
|
||||
`DirectGLES.<arm>.Ct.CtWireScenario.TheServerPublishesTheResidentSubDataCapabilityFromItsOwnTable`,
|
||||
registered by the pre-existing `foreach(ctCase ...)` loop and added by `b56d70177` ("the server
|
||||
registered by the pre-existing `foreach(ctCase ...)` loop and added by `1255caa2f` ("the server
|
||||
publishes kCapResidentSubData off its own wire resource table") — one of the five P7 commits
|
||||
between the `p7-before` baseline and this package's base. No file under `CtWireScenario` is
|
||||
touched here.
|
||||
|
||||
An earlier draft of this note said "+37 entries per split arm". That number came from
|
||||
differencing against `~/w7/pipe/build-split`, which is the integrator's LIVE build directory and
|
||||
had already moved past this package's base (`7ed5da52` -> `8c5dd6fc`); it matched nothing and is
|
||||
had already moved past this package's base (`cf7ca59f` -> `ae3f43ab`); it matched nothing and is
|
||||
withdrawn. The split-arm registration count recorded for the tier-2 Magma replay went from 33 to
|
||||
46.
|
||||
|
||||
|
||||
@@ -446,7 +446,7 @@ run against the finished code):
|
||||
|---|---|
|
||||
| `ctest --test-dir build-verify -R 'HandleRecycle'` | the six ABA cases' `Handles` arm and the seven leak cases **arm themselves** when D and E land. The leak cases are the phase's only defence against P3a's C-1 shape, on both backends |
|
||||
| `ctest --test-dir build-push -R 'ObjectSubsystemControl'` and `MOBILEGL_PIPE_PUSH=0x9ff ctest -R 'ObjectSubsystemControl'` | both cases SKIP today; the On/Off A/B arms when B and C land, the refusal when D lands. The refusal lane already pins `0x9ff` itself, so D.3's separate `0x9ff` invocation is a second reading of the same thing rather than the only one |
|
||||
| `ctest --test-dir build-push -R 'TextureUploadShape'` | ~~the client half (`ctu=`) is zero today; once B lands, the `ctu == emit` assertion is live~~ **DONE, P3b/P4b wave 2-D (R-11).** The client emitter landed (`MG_Impl/Pipe/TextureEmit.h`'s `EmitOneLevel`), the `ctu == emit` comparison is live, and the scenario is now a GATE against a gold row rather than a record. The workload gained a third texture written through a `glTextureView`, so the numbers are not comparable to the P4a baseline `emit=6 box=6 rect=0 jobs=6`: the row measured on `7ed5da52` is **`emit=9 box=9 rect=0 jobs=9`, client emitter 9**, identical on monolith / inproc / spawn / tcp. See `notes/p34b/espryt-d2.md` |
|
||||
| `ctest --test-dir build-push -R 'TextureUploadShape'` | ~~the client half (`ctu=`) is zero today; once B lands, the `ctu == emit` assertion is live~~ **DONE, P3b/P4b wave 2-D (R-11).** The client emitter landed (`MG_Impl/Pipe/TextureEmit.h`'s `EmitOneLevel`), the `ctu == emit` comparison is live, and the scenario is now a GATE against a gold row rather than a record. The workload gained a third texture written through a `glTextureView`, so the numbers are not comparable to the P4a baseline `emit=6 box=6 rect=0 jobs=6`: the row measured on `cf7ca59f` is **`emit=9 box=9 rect=0 jobs=9`, client emitter 9**, identical on monolith / inproc / spawn / tcp. See `notes/p34b/espryt-d2.md` |
|
||||
| `bash scripts/p4a_descriptor_negative_control.sh build-push` | exits 2 today because both emit headers are the contract's stubs. It becomes a real G7 control the moment B and C fill them in, and it is **not** a CI lane (it rebuilds the library up to four times) |
|
||||
| `bash scripts/p4a_untouched_regions.sh 37da3c3a HEAD` | this is the gate D and E can break. It is rc 0 here because nothing on the list has been touched yet |
|
||||
| `ctest --test-dir build-push -R 'TextureParamsWithoutASamplerView'` | green here; after `esprytobj` it is the regression net that says the parameter sync did not move onto the sampler view |
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
> 报告文件:本文件。任务书要求「只改你负责的那一份文档,另外两份由并行代理负责」——
|
||||
> 另一个代理的文档(`CURRENT_STAGE_PROGRESS.md`)与第三份**没有被触碰**。
|
||||
> 工作树:`feat/disaggregated`,**未 `git commit`**,未动任何既有未提交改动。
|
||||
> **头号勘误**:任务书写的分支头是 `71aa9951`,而写报告时 `git rev-parse HEAD` 读到的是
|
||||
> `2bd86664`(`71aa9951` 是它的祖先,另有 `2d86e07a` 一个提交夹在中间,两者都是 P6.5 的文档/传输
|
||||
> 提交,不涉及本次改动)。任务书同时把 `71aa9951` 标为门 8 的源码头——本文件里的源码头就是这样记的,
|
||||
> **头号勘误**:任务书写的分支头是 `94c130d6`,而写报告时 `git rev-parse HEAD` 读到的是
|
||||
> `4e7bf0fe`(`94c130d6` 是它的祖先,另有 `872370ba` 一个提交夹在中间,两者都是 P6.5 的文档/传输
|
||||
> 提交,不涉及本次改动)。任务书同时把 `94c130d6` 标为门 8 的源码头——本文件里的源码头就是这样记的,
|
||||
> 与分支头无关。
|
||||
|
||||
## 0 一句话
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# docs-closeout-progress — `CURRENT_STAGE_PROGRESS.md` 的 P6 收官写入报告
|
||||
|
||||
2026-09-22。工作树 `C:/Users/geekerwan/AndroidStudioProjects/FoldCraftLauncher/MobileGL-disagg`,
|
||||
分支 `feat/disaggregated`,**现头 `2bd86664`**,与 `origin/feat/disaggregated` 同步。任务书给的
|
||||
头 `71aa9951` 是**两轮测量的源头**(门 7 报告记 `98d0b96c`、门 8 的 wire 计数器与真机第二轮记
|
||||
`71aa9951`);它之后分支又落了两个 P6.5 设计提交(`2d86e07a`、`2bd86664`),非本报告所加。
|
||||
分支 `feat/disaggregated`,**现头 `4e7bf0fe`**,与 `origin/feat/disaggregated` 同步。任务书给的
|
||||
头 `94c130d6` 是**两轮测量的源头**(门 7 报告记 `75dd0cb1`、门 8 的 wire 计数器与真机第二轮记
|
||||
`94c130d6`);它之后分支又落了两个 P6.5 设计提交(`872370ba`、`4e7bf0fe`),非本报告所加。
|
||||
|
||||
**只改了一份文档**:`docs/Disaggregated/CURRENT_STAGE_PROGRESS.md`。未 commit。工作树里既有的
|
||||
未提交改动(`MobileGL/MG_Remote/**`、`MobileGL/MG_Util/**`、`tools/device_bench/pin_device.sh`、
|
||||
@@ -38,17 +38,17 @@ P6.5、Ph、P12、seq/op 五条**逐字保留**(仅 `DirectVulkan` 条尾加
|
||||
### 1.1 头部状态段
|
||||
|
||||
旧:「状态(2026-09-21):P6 全部包已落地(a6…t6),出口门第 1–6 项达成;第 7 项…第 8 项…尚未
|
||||
正式采集,因此 P6 记为「实现完成、出口性能/设备数待补」,**未宣布收官**。分支 … 头 `16bfab10`」
|
||||
正式采集,因此 P6 记为「实现完成、出口性能/设备数待补」,**未宣布收官**。分支 … 头 `77cbd176`」
|
||||
|
||||
新:`P6 已收官(2026-09-22)`,并把分支头写成**三层事实**,因为任务书要求"照实说"而
|
||||
`71aa9951` 已不是树头:
|
||||
`94c130d6` 已不是树头:
|
||||
|
||||
- 门 7 报告头 `98d0b96c`(`gate7-device-ab.md:3`)、门 8 第二轮头 `71aa9951`
|
||||
- 门 7 报告头 `75dd0cb1`(`gate7-device-ab.md:3`)、门 8 第二轮头 `94c130d6`
|
||||
(`gate8-doorbell-device.md:3`、`gate8-wire-counters.md:3`)——**测量期的源头**;
|
||||
- 其后两个提交 `2d86e07a`、`2bd86664` 是 P6.5 设计(已核实:`2d86e07a` 的 diff 只含
|
||||
- 其后两个提交 `872370ba`、`4e7bf0fe` 是 P6.5 设计(已核实:`872370ba` 的 diff 只含
|
||||
`CONTRACT-P6.md` / `StreamLink.h`(+5 行注释) / `ARCHITECTURE.md` / `CURRENT_STAGE_PROGRESS.md` /
|
||||
`P6-ENDSTATE-REVIEW.md` / `ROADMAP.md`;`2bd86664` 只含 `ROADMAP.md`);
|
||||
- 现头 `2bd86664`,与 `origin` 同步(`git rev-parse origin/feat/disaggregated` = `2bd86664…`);
|
||||
`P6-ENDSTATE-REVIEW.md` / `ROADMAP.md`;`4e7bf0fe` 只含 `ROADMAP.md`);
|
||||
- 现头 `4e7bf0fe`,与 `origin` 同步(`git rev-parse origin/feat/disaggregated` = `4e7bf0fe…`);
|
||||
**工作树另有未提交的 P6 收尾改动**,指向 §1.1。
|
||||
|
||||
### 1.2 §1.1 收尾(2026-09-22)
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
### 1.1 顶部状态 blockquote(第 3 行)
|
||||
|
||||
**改前**:`P6 全部包(a6 / c6 / lk / so / sm / cp / hs / dl / st / t6)已落地于 feat/disaggregated
|
||||
(头 16bfab10,2026-09-21);出口门第 1–6 项达成,第 7 项(真机配对 A/B 热窗口)与第 8 项
|
||||
(头 77cbd176,2026-09-21);出口门第 1–6 项达成,第 7 项(真机配对 A/B 热窗口)与第 8 项
|
||||
(三个强制性能数)尚未正式采集,故 P6 记为「实现完成、出口性能/设备数待补」,未宣布收官**。
|
||||
|
||||
**改后**:`P6 已收官(2026-09-22)`:全部包已落地(头 `16bfab10`,2026-09-21),出口门第 1–6 项此前已达成;
|
||||
**改后**:`P6 已收官(2026-09-22)`:全部包已落地(头 `77cbd176`,2026-09-21),出口门第 1–6 项此前已达成;
|
||||
第 7 项(Redmi `2f7cbe2e` 的 reboot-clean 同热窗口配对 A/B)与第 8 项(三个强制性能数)已于 2026-09-22 采齐
|
||||
——门 7 判读 **tie**(client CPU p50 差 −0.15% / +0.16%,均在臂内散布 0.2–4.2% 之内,符号随臂序翻转;
|
||||
monolith 约贵 30%),门 8 三数齐;证据链 `notes/p6/gate7-device-ab.md` / `gate8-doorbell-device.md` /
|
||||
@@ -38,7 +38,7 @@ monolith 约贵 30%),门 8 三数齐;证据链 `notes/p6/gate7-device-ab.m
|
||||
|
||||
### 1.2 阶段表 P6 行(第 37 行)
|
||||
|
||||
- **状态列**:`⏳ 全部包已落地(2026-09-21,头 16bfab10);出口门 1–6 达成,7/8 待采` →
|
||||
- **状态列**:`⏳ 全部包已落地(2026-09-21,头 77cbd176);出口门 1–6 达成,7/8 待采` →
|
||||
`✅ 已收官(2026-09-22)`,并保留十包落地信息。原「收官前另欠」三项改写为:server 进程 `PipeStats`
|
||||
从未初始化**已在收尾中修好**;184 符号棘轮门与 hs 的 `LinkTerms` / `Refuse` / 指纹拆分**未落地、移交 P6.5**。
|
||||
(只改「已在收尾中修好」这一处口径,未落地项原样保留——契约 §12.1 的棘轮门与 hs 三行确实仍未做。)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Gate 7 — Redmi `2f7cbe2e` paired A/B, and gate 8 item 1 (the doorbell)
|
||||
|
||||
2026-09-22, branch `feat/disaggregated`, source head `98d0b96c`. `CONTRACT-P6.md` §9 items 7 and 8-①.
|
||||
2026-09-22, branch `feat/disaggregated`, source head `75dd0cb1`. `CONTRACT-P6.md` §9 items 7 and 8-①.
|
||||
|
||||
Everything below was measured on one reboot-clean thermal window on Redmi `M332BF` (`2f7cbe2e`,
|
||||
SM8750, Adreno 830v2) from a **snapshot of the worktree** (`C:/Users/geekerwan/p6-snap/MobileGL-disagg`),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Gate 8 item ① — the doorbell, measured on the device (server half included)
|
||||
|
||||
2026-09-22, branch `feat/disaggregated`, source head `71aa9951`. `CONTRACT-P6.md` §9 item 8-①.
|
||||
2026-09-22, branch `feat/disaggregated`, source head `94c130d6`. `CONTRACT-P6.md` §9 item 8-①.
|
||||
|
||||
The number this item asks for is the socket doorbell's cost against `inproc`'s condvar. The previous
|
||||
session (`gate7-device-ab.md`) delivered the **client** half of that ledger and reported the
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# gate8-wire-counters — 门 8 的两个 wire 计数器、首采,与 spawn server 侧的 wait 账
|
||||
|
||||
> 头 `71aa9951`(`git rev-parse HEAD`,写报告时读取;工作树另有并行 agent 在修子模块指针,未 commit)。
|
||||
> 头 `94c130d6`(`git rev-parse HEAD`,写报告时读取;工作树另有并行 agent 在修子模块指针,未 commit)。
|
||||
> 环境:`wsl -d Ubuntu`,clang-20 / Ninja / Release / `MOBILEGL_BUILD_TYPE=Release`,
|
||||
> 快照 `~/w7/p6-gate8-src`(从 Windows 工作树 copy,见 §1),构建目录 `~/w7/p6-gate8-build`。
|
||||
> 交付内容:
|
||||
|
||||
@@ -266,7 +266,7 @@ Changes to be committed:
|
||||
| `git -C MobileGL status -sb` | 与修复前**逐字节相同**(12 个未初始化 `-<sha>` 不变) |
|
||||
| `git -C MobileGL submodule status` | 与修复前**逐字节相同** |
|
||||
| `git -C FoldCraftLauncher status -sb` | 与修复前**逐字节相同**(含原有的 `M .gitmodules`、`UU FCLauncher.java` 等,均非本次产生) |
|
||||
| 各仓库 HEAD | `MobileGL` = `fff9d639`、`MobileGL-disagg` = `71aa9951`、超项目 = `6d733f6f`,**均未移动** |
|
||||
| 各仓库 HEAD | `MobileGL` = `fff9d639`、`MobileGL-disagg` = `94c130d6`、超项目 = `6d733f6f`,**均未移动** |
|
||||
|
||||
被改到的共享 admin 目录的 **index、HEAD、objects 全部未动**(只删了 `core.worktree` 配置项,以及给 flatbuffers 补建新 admin)。
|
||||
|
||||
@@ -319,7 +319,7 @@ Changes to be committed:
|
||||
- **没有回滚或修改任何源码**。`MobileGL/MG_Util/Metrics/PipeStats.{h,cpp}`、`MobileGL/MG_Util/Metrics/PipeStatsTest.cpp`、
|
||||
`MobileGL/MG_Remote/Wire/PipeWireCodec.cpp`、`tools/device_bench/pin_device.sh` 的工作区改动是并行代理的合法产物,
|
||||
本修复只读不写(只在 `git add`/`reset` 往返里短暂进过索引,已验证索引被跟踪内容 md5 与修复前一致)。
|
||||
- **没有新增/移动任何提交**:`MobileGL-disagg` 仍停在 `71aa9951`,与 `origin/feat/disaggregated` 同步;
|
||||
- **没有新增/移动任何提交**:`MobileGL-disagg` 仍停在 `94c130d6`,与 `origin/feat/disaggregated` 同步;
|
||||
`dev` 工作树仍在 `fff9d639`;超项目仍在 `6d733f6f`。
|
||||
- **没有改分支**:`feat/disaggregated` 原样。
|
||||
- **没有动 `3rdparty/*` 里的文件内容**(flatbuffers 的 admin 是建在 `.git/modules/...` 下的新 git 目录,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# lk — 开工前的逐文件清单
|
||||
> 头 `0bbe41c2`。`CONTRACT-P6.md` §8.5 要求 `lk` 在开工前发布这份清单,理由是早先一份草案的棘轮基线
|
||||
> 头 `b6293957`。`CONTRACT-P6.md` §8.5 要求 `lk` 在开工前发布这份清单,理由是早先一份草案的棘轮基线
|
||||
> 差了三倍,而**装在错误数字上的棘轮第一次 CI 就会因为和泄漏无关的理由变红**。
|
||||
> 全部计数由 `grep -rn -E` 在本头机械产出,口径写在每节标题下。
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
## C 实际结果(重组落地后补记)
|
||||
|
||||
两个口径在本文里曾经打架:表 B 的 41(受体限定为 `control|m_control|ctrl`)与
|
||||
`a54ae47a` 提交信息里的 44(受体不限)。**以表 B 的口径为准**,差额是三处受体不是
|
||||
`99649a90` 提交信息里的 44(受体不限)。**以表 B 的口径为准**,差额是三处受体不是
|
||||
控制页对象的匹配;而实际改写时受体集合还要再宽一档,因为测试里普遍写作
|
||||
`session.Control()->appliedSeq` / `owner.CmdControl()->appliedSeq`。
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# P6.5 第一波 代码审查(4 切片,2026-09-22)
|
||||
|
||||
审查对象:`codex/p65-all-tcp` HEAD `52ffc6a7` + 未提交工作树(含 archive v2 / Present-glFlush 尾批 / 取消 / half-close 修复)。
|
||||
审查对象:`codex/p65-all-tcp` HEAD `018fab0f` + 未提交工作树(含 archive v2 / Present-glFlush 尾批 / 取消 / half-close 修复)。
|
||||
四个并行 Opus 审查各读设计(ROADMAP §51–116)后逐文件核验。**结论:数据面、wire 布局、握手三块无硬正确性缺陷;实现整体谨慎、扎实。** 下表按严重度排序,两项已修,其余记为跟进。
|
||||
|
||||
| 严重度 | 发现 | 出处 | 处置 |
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
|
||||
## 源码与制品身份
|
||||
|
||||
- 基线:远端 `feat/disaggregated` 的 `e6c51d0711595f579decfaf78c1f5b0040ccd7fe`。
|
||||
- 基线:远端 `feat/disaggregated` 的 `9043442454ae38568315ddf2b1c1814b183aa235`。
|
||||
最后一次 fetch 已确认没有更新;该提交是当前分支的祖先。
|
||||
- 开发工作树:`codex/p65-all-tcp`,HEAD `52ffc6a7` 加未提交修改。
|
||||
- 开发工作树:`codex/p65-all-tcp`,HEAD `018fab0f` 加未提交修改。
|
||||
用户纠正提交偏好之前已有的两个本地提交随后只做了 rebase;之后未创建开发提交、未 push。
|
||||
- 两端显式 build stamp:`410dfa94c3d92241e9ec01ddbba1bb911eb60d4b`。
|
||||
它是本轮共享的构建标识,不代表当前 HEAD 或一份已提交的最终源码。
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
但当时实际为 lockstep,不能充作 run-ahead 验收。首 caps race 修复后的 READY7 已取得主机 TCP
|
||||
及 Redmi 各 **102 PASS / 0 FAIL / 0 SKIP**,每条实际 ARMED;正式 trace 矩阵与同模式性能数仍待补。
|
||||
|
||||
当前源码基线为 `origin/feat/disaggregated@e6c51d07`,开发树 `codex/p65-all-tcp` 的
|
||||
HEAD 为 `52ffc6a7` 加未提交工作。两端曾共享的显式 `MOBILEGL_BUILD_STAMP` 是
|
||||
当前源码基线为 `origin/feat/disaggregated@90434424`,开发树 `codex/p65-all-tcp` 的
|
||||
HEAD 为 `018fab0f` 加未提交工作。两端曾共享的显式 `MOBILEGL_BUILD_STAMP` 是
|
||||
`410dfa94c3d92241e9ec01ddbba1bb911eb60d4b`,**它不是当前 HEAD**;后续 rebase 没有改变当时的
|
||||
生产字节,因此保留了这一制品标识。不能拿匹配的显式 stamp 替代每组产物 SHA、实际 arming
|
||||
状态和运行证据,也不能把较早制品的绿移记到新的修复头。
|
||||
@@ -131,7 +131,7 @@ link seam 的七个负控与生产 ownership 门已接入 `test.yml`,结果见
|
||||
设备为 Redmi `2f7cbe2e`,aarch64 / Adreno 830,IP `192.168.21.181`。
|
||||
已安装并启动 trace flavour 的前台 Service,supervisor 监听 `tcp://0.0.0.0:40613`,
|
||||
两端令牌一致;使用显式设置的 `MOBILEGL_BUILD_STAMP`,不依赖 APK 的 `nogit` 文件名。
|
||||
当前沿用的 `410dfa94...` 是共享制品标识,不是当前 `52ffc6a7` 源码 HEAD。
|
||||
当前沿用的 `410dfa94...` 是共享制品标识,不是当前 `018fab0f` 源码 HEAD。
|
||||
已经收到真实 Welcome 与 Adreno caps,wire/build 指纹均接受。
|
||||
此前安装的 traceDebug 原生实际只有 `-g`、没有优化,以上只作功能诊断,不能作为 release 性能数。
|
||||
后续功能复验已使用原生 `-O2/NDEBUG` 的 debuggable traceRelease APK,并保持受信任签名;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# P6.5 wire、计量与主机验证记录
|
||||
|
||||
基线是 `origin/feat/disaggregated@2ec8e7f4`,实现树是 `410dfa94c3d92241e9ec01ddbba1bb911eb60d4b` 加本轮未提交修改。没有推送。以下数字注明采集边界,不代表整个 P6.5 已收官;设备、完整 integration 与最终阶段审查另记。
|
||||
基线是 `origin/feat/disaggregated@35b3283b`,实现树是 `410dfa94c3d92241e9ec01ddbba1bb911eb60d4b` 加本轮未提交修改。没有推送。以下数字注明采集边界,不代表整个 P6.5 已收官;设备、完整 integration 与最终阶段审查另记。
|
||||
|
||||
## wire 事实与握手
|
||||
|
||||
@@ -27,7 +27,7 @@ Hello/Welcome 新字段采用 append;保留旧 FlatBuffers 字段槽。`wireFi
|
||||
|
||||
- 真正复制到临时树后,互换 `MGPRange::Offset`/`Size` 两个同宽 `Uint64` 成员;成员布局摘要由 `4304347197452401705` 变为 `6038841773737773369`,两次使用同一未改动 build header。证据 `/tmp/p65-wire-control-ehave5w9/{before.s,after.s}`。生产树没有被临时改坏。
|
||||
- `SessionHandshakeTest` 的生产 Accept 路径测试了 major=99、错误 wire 摘要的具名 Refuse、空 union 拒绝、Connect 异 build 成功、Fork 异 build 拒绝、Connect 强制同 build 拒绝;9/9 通过。
|
||||
- 真实 TCP supervisor 的开发期控制 `/home/swung/p65-supervisor-smoke/protocol-controls.json` 记录 major=99 → code 1、错误布局 → code 2、不同 build 的 Connect → Welcome、强制同 build → code 3,并验证拒绝后 supervisor 仍活着。该记录采于 rebase 前的 `2bd86664` 开发产物;不能据此冒称最新产物的所有进程退出条件均已重新取证。最终 control 复跑由阶段主报告记载。
|
||||
- 真实 TCP supervisor 的开发期控制 `/home/swung/p65-supervisor-smoke/protocol-controls.json` 记录 major=99 → code 1、错误布局 → code 2、不同 build 的 Connect → Welcome、强制同 build → code 3,并验证拒绝后 supervisor 仍活着。该记录采于 rebase 前的 `4e7bf0fe` 开发产物;不能据此冒称最新产物的所有进程退出条件均已重新取证。最终 control 复跑由阶段主报告记载。
|
||||
|
||||
## G1 与生成器
|
||||
|
||||
|
||||
@@ -19,24 +19,24 @@
|
||||
| ID-P7-13 | 2026-09-22 | iris-photon 归 `dev` 侧独立条目(Adreno 830 的 `vkCreateGraphicsPipelines` 对 photon 程序返回 `VK_ERROR_UNKNOWN`,`PipelineFactory.cpp:660`,monolith SSIM 0.0089,lavapipe 绿);不进 P7 出口门。 | OQ-17 先例:monolith 级的 Magma × Adreno 失败不是分离缺陷;拆分不借机顺手修。 | `exclusions.md` |
|
||||
| ID-P7-14 | 2026-09-22 | wave 0 三个包的命名/分桶裁定一并批准:C——`ResourceUnavailable`→`ServerCrashed`(不是 `SegmentMismatch`)、Magma 漏斗家族词保持 `UnmigratedVerb`、`Refuse{ProtocolMismatch}` / `Refuse{InitialCapsSnapshot}` 进 `LOCAL_REFUSAL_WORDS` 允许表;R——`FatalFunnel.cpp.o` 归 SHARED、`MG_Backend/Init.cpp.o` 按 a6 归 SERVER、Espryt 桶地板 5(`MG_Pipe::` 槽分配器符号,`# P13`)、P3b/P4b 可清数 9;L——`MagmaRunAheadScenario` / `MagmaWireCacheScenario` 只注册 inproc 臂(`MAGMA_INPROC_ONLY`),跨进程 hold / peek 记债;六处 `MGL_ITEST_MAGMA_*_ENVIRONMENT` 改用 `VULKAN_ENV`。 | 各包报告里的理由成立;改名会作废历史普查计数;一致性胜过「含义不变」。 | `scripts/ci/fatal_census.py`、`link_ratchet.py`、`spawn_lane_parity.py`、CMake |
|
||||
| ID-P7-15 | 2026-09-22 | 新增 wave 2 包 **X1**(inproc 下 GL 线程 memcpy 写进不可写映射的 SIGSEGV)进 P7 出口门 3 关键路径;其两条残余(屏蔽 SIGSEGV 的非 GL 线程写者、`RefaultOfANonWriteAccess`)与「P5d 的 Adreno mprotect 臂数字存疑」记 `CONTRACT-P7.md` §12,不阻塞 P7。 | 26.3 在门 3 分母里;机制是 bionic 指针标记 0xb4 与内核 `si_addr` 比较,与后端、run-ahead、persistent push 无关(E1/E4a/E4b)。 | `PersistentMapTracker.cpp`、`notes/p7/x1-persistent-map-segv.md` |
|
||||
| ID-P7-16 | 2026-09-22 | 出口门 5 = **五个可测块**(texture 1055 / shader-image 125 / packed-pixels 4732 / dsa 371 / ssbo 124),UBO 块(GTF 模块)在本 CTS 提交 `0b04c470e` 无 kc-cts 不可运行,记 unrun;API 版本 **KHR-GL46**(设备探针列出 697 例,`mgprobe` PASS 含 default_fb=ok);`$BASE` 用 pre-wave-2 库 `p7w1-d260f110`,AFTER 同版本同 caselist。 | 设备探针结果;caselists README 已预告 GTF 缺席。 | `tools/cts/caselists/`、`notes/p7/device-window-1/CTS-base/` |
|
||||
| ID-P7-16 | 2026-09-22 | 出口门 5 = **五个可测块**(texture 1055 / shader-image 125 / packed-pixels 4732 / dsa 371 / ssbo 124),UBO 块(GTF 模块)在本 CTS 提交 `0b04c470e` 无 kc-cts 不可运行,记 unrun;API 版本 **KHR-GL46**(设备探针列出 697 例,`mgprobe` PASS 含 default_fb=ok);`$BASE` 用 pre-wave-2 库 `p7w1-9be62cbc`,AFTER 同版本同 caselist。 | 设备探针结果;caselists README 已预告 GTF 缺席。 | `tools/cts/caselists/`、`notes/p7/device-window-1/CTS-base/` |
|
||||
| ID-P7-17 | 2026-09-22 | E2(present credit 扫描)与 E0b 的 ARMED 三遍确定性**不单独跑**:E1 已证明 run-ahead 整条线出局(OpenRA lockstep 仍 0.989、崩溃 case 照崩),确定性在 F1 修复后的复测里按 §7.2 一起做。 | runbook §5 的判别规则;设备时间省给 wave 2 复测与 CTS。 | `E1-lockstep/README.md` |
|
||||
| ID-P7-18 | 2026-09-22 | F1 落地(`5d698cb9`):split 起会提到 `MG_State::Init()` 之前(`InitSplitRolesBeforeState()`),`CapsMirror::ServerConsumes` 不再从 placeholder 作答(他线程 bring-up 在飞时等 250 ms,否则 `Fatal{CapsBeforeFirstSnapshot}`);**批准** `MG_Config::SplitTransportRequestedByConfig` 作为该门的武装闩——任何绕过 `MG_ConfigLoader::Init()` 手设 `Transport` 再造前端对象的生产路径都会退回 placeholder 作答,今天只有 `ServerLoopTest` 这么做且写了理由。 | 发射者是确定性的(11 个默认纹理在起会前 `resource_create`),主机也发生;不做「把警告调轻 / callMask 全 1」。 | `MobileGL/Init.cpp`、`MG_Backend/Init.cpp`、`CapsMirror.{h,cpp}`、`ClientSession.cpp` |
|
||||
| ID-P7-20 | 2026-09-22 | wave 2-C 落地(`04292f06..205793ca`)并批准其五条:§5.4 白盒(opcode 49 上 wire)在 P11 采纳档落地前不可达,以「server 按表发布 + 镜像收到」为验收;`g_programResourceCaches` 的 monolith 删除归 P13(G1);`buffer-window` 家族词暂留 `UnmigratedVerb`(改 `ProtocolCorruption` 记 §12);`vertex-layout` 屏蔽原因是七种不是六种;死亡缺口是 server twin 泄漏而非 client slot 泄漏(framebuffer 用例两边计数)。`p7_worktree.sh` 补 `MOBILEGL_ITEST_VK_ICD` 钉。 | 各条理由见 `notes/p7/magma-c.md`。 | `CONTRACT-P7.md` §3.2/§12、`p7_worktree.sh` |
|
||||
| ID-P7-21 | 2026-09-22 | wave 2-A 落地(`5a14e5a1..2f48ccf4`)并批准:`uniform-buffer-byte-tail` 退役(外扩到字边界读进 staging,一次子字拷贝进 padded block);两处 native-range **钳制**;三处 unaligned-*-range 与 `texel-buffer-native-format` 具名 decline(可写 range 的 copyback 不做——该站点分不出 readonly,且录制点在 B/C 的 draw/dispatch 尾;配方在 `magma-a.md` §3.1);两条算术不变量(`*-offset-overflow`)留作 hook 经过的具名 Fatal、不再带 `@P7`。审计写的「offset = alignment + 1」测试**不可达**(前端对非对齐 offset 报 `GL_INVALID_VALUE`),真正活的缺口是 `glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, …, 4, 4)`(GL 只强制 `offset % 4`)。 | `notes/p7/magma-a.md`;`@P7` 树上只剩 B 的 5 处(`WireFramebuffer.inc` 4 + `VulkanRenderer.cpp` 1)。 | `UniformManager.cpp`、`F1WireScenario`、`CONTRACT-P7.md` §3.2 |
|
||||
| ID-P7-18 | 2026-09-22 | F1 落地(`df17c416`):split 起会提到 `MG_State::Init()` 之前(`InitSplitRolesBeforeState()`),`CapsMirror::ServerConsumes` 不再从 placeholder 作答(他线程 bring-up 在飞时等 250 ms,否则 `Fatal{CapsBeforeFirstSnapshot}`);**批准** `MG_Config::SplitTransportRequestedByConfig` 作为该门的武装闩——任何绕过 `MG_ConfigLoader::Init()` 手设 `Transport` 再造前端对象的生产路径都会退回 placeholder 作答,今天只有 `ServerLoopTest` 这么做且写了理由。 | 发射者是确定性的(11 个默认纹理在起会前 `resource_create`),主机也发生;不做「把警告调轻 / callMask 全 1」。 | `MobileGL/Init.cpp`、`MG_Backend/Init.cpp`、`CapsMirror.{h,cpp}`、`ClientSession.cpp` |
|
||||
| ID-P7-20 | 2026-09-22 | wave 2-C 落地(`dce9953d..074a0727`)并批准其五条:§5.4 白盒(opcode 49 上 wire)在 P11 采纳档落地前不可达,以「server 按表发布 + 镜像收到」为验收;`g_programResourceCaches` 的 monolith 删除归 P13(G1);`buffer-window` 家族词暂留 `UnmigratedVerb`(改 `ProtocolCorruption` 记 §12);`vertex-layout` 屏蔽原因是七种不是六种;死亡缺口是 server twin 泄漏而非 client slot 泄漏(framebuffer 用例两边计数)。`p7_worktree.sh` 补 `MOBILEGL_ITEST_VK_ICD` 钉。 | 各条理由见 `notes/p7/magma-c.md`。 | `CONTRACT-P7.md` §3.2/§12、`p7_worktree.sh` |
|
||||
| ID-P7-21 | 2026-09-22 | wave 2-A 落地(`450d3075..2207b6d9`)并批准:`uniform-buffer-byte-tail` 退役(外扩到字边界读进 staging,一次子字拷贝进 padded block);两处 native-range **钳制**;三处 unaligned-*-range 与 `texel-buffer-native-format` 具名 decline(可写 range 的 copyback 不做——该站点分不出 readonly,且录制点在 B/C 的 draw/dispatch 尾;配方在 `magma-a.md` §3.1);两条算术不变量(`*-offset-overflow`)留作 hook 经过的具名 Fatal、不再带 `@P7`。审计写的「offset = alignment + 1」测试**不可达**(前端对非对齐 offset 报 `GL_INVALID_VALUE`),真正活的缺口是 `glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, …, 4, 4)`(GL 只强制 `offset % 4`)。 | `notes/p7/magma-a.md`;`@P7` 树上只剩 B 的 5 处(`WireFramebuffer.inc` 4 + `VulkanRenderer.cpp` 1)。 | `UniformManager.cpp`、`F1WireScenario`、`CONTRACT-P7.md` §3.2 |
|
||||
| ID-P7-22 | 2026-09-22 | S1(`IterationRPProgram203Scenario` exposure texel 差一个)**改判为环境敏感而非 tcp 专属**:A 在未钉 ICD 的树上 inproc 也 3/3 红、pipe(钉 lavapipe ICD)inproc 绿、L 只在 tcp 红。记为 §12 债,归 P6.5 StreamLink × Magma 交叉项的主人(未派);helper 已钉 ICD 免再混淆。 | 三棵树三种结果,唯一变量是 ICD 配置与臂。 | `CONTRACT-P7.md` §12 |
|
||||
| ID-P7-23 | 2026-09-22 | wave 2-B 落地五片(`c5fa52f9..64530ed2`):mip 形状拒绝半退役 + 具名、深度 mip 烘焙 (A)(D)、copy-image-in-place、default-color-blit(含 3D 源 blit 寻址 bug)、**wire 回读竞态修复**(OpenRA 真机分歧的机制,主机用 fence 计数 red-once,因为本机布局是 GENERAL 撞不上空 scope)。B 未做的三项(multisample-blit ×2、AllocatorDebtScope ×2、B′ 棘轮下降)另派 **B2**。`WireColorBlit.inc` / `VulkanRenderer.h` 在簇内顺手改,批准。 | `notes/p7/magma-b.md`。 | `WireFramebuffer.inc`、`VulkanRenderer.{cpp,h}`、`WireDepthMipmap.*`、`scripts/bake_internal_shaders.py`(若有) |
|
||||
| ID-P7-24 | 2026-09-22 | wave 2-D1 落地(`e35a0973..92f467ab`):XFB 孤儿目标保留 varyings、回写事件按 `EventRingCapacityBytes/4` 切片、`OnXfbScatterReady` 删除(回调 10→9,`ARCHITECTURE.md` §8.1/§8.5 改成树的样子)、四个 resolver 在有传输时具名启动期 stop、readback 家族三臂武装(+39 例/臂)。**readback 半边其实早已关**:首跑 65/65,`copy-image-shadow-mirror` 自 P5b i1 起有传输 `return`,`get-tex-image-shadow` 从 wire 路径不可达(server 经 `ReadTextureImageWire` 答)——P3b/P4b 行的「readback 开」是从未在传输下跑过的假设,不是缺陷;仍改成 rule-I decline 作纵深防御。`p7_worktree.sh` 改为非递归子模块 + 显式 `include/ska`。 | `notes/p34b/espryt-d1.md`。 | `DirectGLES.cpp`、`Managers.{h,cpp}`、`MGPipeCallbacks.h`、`ServerSession.cpp`、CMake |
|
||||
| ID-P7-25 | 2026-09-22 | W4 真机复验(p7w4 = `8c5dd6fc`,`device-window-1/W4-verify/`):iterationt ×2 通过(B 的 mip 退役兑现);门 3 AFTER 矩阵 **34/36 与 monolith 差 ≤ 0.0005**,未过的只剩 OpenRA 与 bsl-esc-menu(inproc OOM,待 spawn 臂)。**ID-P7-19 的「冷驱动缓存」读法撤回**:16 遍显示 run-ahead 臂是与温度、`IPC_AUDIT`、`FIF=1` 都无关的每次约 50% 的竞态,且只产生两张图(`ace2af04` = golden、`fb75d412` = 14658 像素错,与 B 修复前逐字节相同);lockstep 确定性地给第三张 `4e5ba514`(0.988998 = E1)。B 的回读 fence 修复保留(真洞)但不是本分歧的机制。**门 3 对 OpenRA 的验收改为** run-ahead 与 lockstep 各 6 遍全 `ace2af04`,冷热各半。归因交 B3(四镜头调查 + 裁判)。D2 落地时顺手:`SubsystemDepsTest` 在 pull 构建下调用 push-only 的 resolver 使 `build-linux` 编不过而 `.so` 陈旧、G1 看似恒等——门脚本改为对 `linux build rc≠0` 硬红(ID-P7-11 的第二次)。 | 16 遍的表在 `W4-verify/README.md` §3;目标调用 31249 是 `glXSwapBuffers`,快照在 swap 前经普通 `glReadPixels` 入流,present 是 class-B 记录,没有旁路。 | `W4-verify/README.md`、`CONTRACT-P7.md` §7.2、`SubsystemDepsTest.cpp`、`p7-gate-*-inner.sh` |
|
||||
| ID-P7-26 | 2026-09-22 | wave 2-D2 落地(`9d857dc0..e7c5fc60` + pull 构建修复 `6da19f71`);fable 审查判「带修复落地」,修复 1/2/4(TUS 散点工作负载的 union box 盖满整层所以 `rect=0` 是几何不是 unpack-ring 策略——`CoversWholeLevel`;`espryt_memo_purity.py` 对改名家族 fail-open、`LEGACY_MEMOS` 默认 ON 的措辞、`FRONTEND` 无词界;普查数 71→72、+37→+76、每片 Gates 行)交 D2 返工一轮,修复 3(排除用例的契约行)由集成者记 §12。**批准** D2 触及 `MG_Pipe/*`(`SubsystemDeps.def`、`MGPipe.h` 表)与 `CONTRACT-P5.md`:在 §9 D 簇清单之外,但正是计划 R-5/R-3 行点名的文件。审查确认:产品代码零 abort/Fatal/MGLOG 新增、`MG_Backend/` 零触及、G1 恒等、`SubsystemDeps.def` 与 `PipeFill.cpp:1487-1518` / 六个 resolver 逐行一致。 | 审查报告全文在 agent 记录;要点已入本行与 §12。 | `TextureUploadShapeScenario.cpp`、`espryt_memo_purity.py`、`split-scenario-census.md`、`CONTRACT-P7.md` §12 |
|
||||
| ID-P7-23 | 2026-09-22 | wave 2-B 落地五片(`c4be3800..76b74693`):mip 形状拒绝半退役 + 具名、深度 mip 烘焙 (A)(D)、copy-image-in-place、default-color-blit(含 3D 源 blit 寻址 bug)、**wire 回读竞态修复**(OpenRA 真机分歧的机制,主机用 fence 计数 red-once,因为本机布局是 GENERAL 撞不上空 scope)。B 未做的三项(multisample-blit ×2、AllocatorDebtScope ×2、B′ 棘轮下降)另派 **B2**。`WireColorBlit.inc` / `VulkanRenderer.h` 在簇内顺手改,批准。 | `notes/p7/magma-b.md`。 | `WireFramebuffer.inc`、`VulkanRenderer.{cpp,h}`、`WireDepthMipmap.*`、`scripts/bake_internal_shaders.py`(若有) |
|
||||
| ID-P7-24 | 2026-09-22 | wave 2-D1 落地(`faf0a1f9..ba81453f`):XFB 孤儿目标保留 varyings、回写事件按 `EventRingCapacityBytes/4` 切片、`OnXfbScatterReady` 删除(回调 10→9,`ARCHITECTURE.md` §8.1/§8.5 改成树的样子)、四个 resolver 在有传输时具名启动期 stop、readback 家族三臂武装(+39 例/臂)。**readback 半边其实早已关**:首跑 65/65,`copy-image-shadow-mirror` 自 P5b i1 起有传输 `return`,`get-tex-image-shadow` 从 wire 路径不可达(server 经 `ReadTextureImageWire` 答)——P3b/P4b 行的「readback 开」是从未在传输下跑过的假设,不是缺陷;仍改成 rule-I decline 作纵深防御。`p7_worktree.sh` 改为非递归子模块 + 显式 `include/ska`。 | `notes/p34b/espryt-d1.md`。 | `DirectGLES.cpp`、`Managers.{h,cpp}`、`MGPipeCallbacks.h`、`ServerSession.cpp`、CMake |
|
||||
| ID-P7-25 | 2026-09-22 | W4 真机复验(p7w4 = `ae3f43ab`,`device-window-1/W4-verify/`):iterationt ×2 通过(B 的 mip 退役兑现);门 3 AFTER 矩阵 **34/36 与 monolith 差 ≤ 0.0005**,未过的只剩 OpenRA 与 bsl-esc-menu(inproc OOM,待 spawn 臂)。**ID-P7-19 的「冷驱动缓存」读法撤回**:16 遍显示 run-ahead 臂是与温度、`IPC_AUDIT`、`FIF=1` 都无关的每次约 50% 的竞态,且只产生两张图(`ace2af04` = golden、`fb75d412` = 14658 像素错,与 B 修复前逐字节相同);lockstep 确定性地给第三张 `4e5ba514`(0.988998 = E1)。B 的回读 fence 修复保留(真洞)但不是本分歧的机制。**门 3 对 OpenRA 的验收改为** run-ahead 与 lockstep 各 6 遍全 `ace2af04`,冷热各半。归因交 B3(四镜头调查 + 裁判)。D2 落地时顺手:`SubsystemDepsTest` 在 pull 构建下调用 push-only 的 resolver 使 `build-linux` 编不过而 `.so` 陈旧、G1 看似恒等——门脚本改为对 `linux build rc≠0` 硬红(ID-P7-11 的第二次)。 | 16 遍的表在 `W4-verify/README.md` §3;目标调用 31249 是 `glXSwapBuffers`,快照在 swap 前经普通 `glReadPixels` 入流,present 是 class-B 记录,没有旁路。 | `W4-verify/README.md`、`CONTRACT-P7.md` §7.2、`SubsystemDepsTest.cpp`、`p7-gate-*-inner.sh` |
|
||||
| ID-P7-26 | 2026-09-22 | wave 2-D2 落地(`da30c130..519445f9` + pull 构建修复 `c2cc3a96`);fable 审查判「带修复落地」,修复 1/2/4(TUS 散点工作负载的 union box 盖满整层所以 `rect=0` 是几何不是 unpack-ring 策略——`CoversWholeLevel`;`espryt_memo_purity.py` 对改名家族 fail-open、`LEGACY_MEMOS` 默认 ON 的措辞、`FRONTEND` 无词界;普查数 71→72、+37→+76、每片 Gates 行)交 D2 返工一轮,修复 3(排除用例的契约行)由集成者记 §12。**批准** D2 触及 `MG_Pipe/*`(`SubsystemDeps.def`、`MGPipe.h` 表)与 `CONTRACT-P5.md`:在 §9 D 簇清单之外,但正是计划 R-5/R-3 行点名的文件。审查确认:产品代码零 abort/Fatal/MGLOG 新增、`MG_Backend/` 零触及、G1 恒等、`SubsystemDeps.def` 与 `PipeFill.cpp:1487-1518` / 六个 resolver 逐行一致。 | 审查报告全文在 agent 记录;要点已入本行与 §12。 | `TextureUploadShapeScenario.cpp`、`espryt_memo_purity.py`、`split-scenario-census.md`、`CONTRACT-P7.md` §12 |
|
||||
| ID-P7-27 | 2026-09-22 | bsl-esc-menu-854 **不排除**:monolith 807 MiB 通过、spawn 的 server 进程 ~1.2 GiB 死于 scudo `internal map failure`(client 543 MiB、系统余 8 GB)、inproc 1.6 GiB 死——wire 臂的内存缺陷(≈2.1× 字节或映射数上限),派 **M1** 归因(host 复测、逐 store 归因、泄漏/平台、`max_map_count`),修复包随归因定分区。 | `W4-verify/README.md` §3c 的采样表;ID-P7-12 的规则是「monolith 自己红才排除」。 | `CONTRACT-P7.md` §12 |
|
||||
| ID-P7-28 | 2026-09-22 | wave 2-D3 落地(`6eaaf492 de6fb063 25b586d0`;其 `8274dcab` 与集成者的 `6da19f71` 重复,不取):view 陈旧缺陷取「谓词解析到 storage record」而非反向索引(删除顺序:反向索引要在 view 死亡时剪枝,否则 owner 上传会推到被回收给无关纹理的槽——静默跨纹理串号;且把可变状态放进两后端共读的 `MG_Pipe`);删除顺序由构造保证(`TextureObjectView::m_storageOwner` 强 `SharedPtr`,`resource_destroy` 在析构发出,`TextureObject.cpp:63`)。D-K2 「两处一行」实为六处读者,全部改读 `SubsystemDeps.def`,client 侧参数按 `kMGPipeP4aFamilySubsystems` 掩码(bit 8 的 vertex-input 发射归 P3a 规则,`TextureEmit.EveryDKTwoDependencyRowGatesItsOwnFamilyAndTheMirrorPairsStayLive` 抓到);**批准**「`SubsystemDepsTest` 从比两份副本变成比两个读者」的减弱,编译期一半(`MGPipe.h:225/:230`)承担。门:pull rc 0、`.text` 0xa52203、nm 0/0;unit 2426 / split 303 / spawn 219 / tcp 222 / magma 88/67/69 / full 530;census 79、ratchet 186、parity 0。门脚本模板自此对 `linux build rc≠0` 打 `GATE-RED`。 | `notes/p34b/espryt-d3.md`;两处基线引文更正(KHR-GL46 非 GL43;`texture_view` 1/7 红是 `view_sampling` 不是 `coherency`)。 | `Managers.{h,cpp}`、`PipeFill.cpp`、`DirectGLES.cpp`、`SubsystemDeps.def`、`CONTRACT-P5E.md` §5.2、`CONTRACT-P7.md` §12 |
|
||||
| ID-P7-29 | 2026-09-22 | wave 2-D2 返工落地(`3cdaa5ee ec56644f 623d6641 c13ba36b`,叠在 D3 之上;`SubsystemDepsTest` 取 D2 版守卫 + 两条注记,`split-scenario-census.md` 与 D3 的附记手工合并):TUS 散点内缩后 gold 不变(`emit=9 box=9 rect=0 jobs=9` 四臂同)但对象对了——**零补丁 red-once** `MOBILEGL_ESPRYT_DISABLE_UNPACK_RING=1` 给 `box=3 rect=6 jobs=183`(两张散点纹理都动,26 像素例仍绿);顺带抓到 `ASSERT_TRUE(clientWindow.found)` 被「counters ON」横幅满足的假读,改为带 `tex[]` 的窗口;`espryt_memo_purity.py` 锚点/allow 活性断言后 6 条 allow 剩 1;`+76`/72 数字改正、每片 Gates 表。门:pull rc 0、G1 恒等、unit 2426 / split 303 / spawn 219 / tcp 222(`F1WireScenario.TextureReadbackRejectsPackedDestinationOverflowBeforeWriting` 首跑 1 红、rerun 绿——tcp 车道已知 flake 形状,非本包文件)/ magma 88/67/69 / full 530。 | D2 报告;tcp flake 记 §12 的既有条。 | `TextureUploadShapeScenario.cpp`、`PipeStatsWindow.h`、`espryt_memo_purity.py`、`test.yml`、`split-scenario-census.md`、`MEASUREMENTS.md` §13.1 |
|
||||
| ID-P7-28 | 2026-09-22 | wave 2-D3 落地(`1e1f4bad 1c36987e 00d02396`;其 `8274dcab` 与集成者的 `c2cc3a96` 重复,不取):view 陈旧缺陷取「谓词解析到 storage record」而非反向索引(删除顺序:反向索引要在 view 死亡时剪枝,否则 owner 上传会推到被回收给无关纹理的槽——静默跨纹理串号;且把可变状态放进两后端共读的 `MG_Pipe`);删除顺序由构造保证(`TextureObjectView::m_storageOwner` 强 `SharedPtr`,`resource_destroy` 在析构发出,`TextureObject.cpp:63`)。D-K2 「两处一行」实为六处读者,全部改读 `SubsystemDeps.def`,client 侧参数按 `kMGPipeP4aFamilySubsystems` 掩码(bit 8 的 vertex-input 发射归 P3a 规则,`TextureEmit.EveryDKTwoDependencyRowGatesItsOwnFamilyAndTheMirrorPairsStayLive` 抓到);**批准**「`SubsystemDepsTest` 从比两份副本变成比两个读者」的减弱,编译期一半(`MGPipe.h:225/:230`)承担。门:pull rc 0、`.text` 0xa52203、nm 0/0;unit 2426 / split 303 / spawn 219 / tcp 222 / magma 88/67/69 / full 530;census 79、ratchet 186、parity 0。门脚本模板自此对 `linux build rc≠0` 打 `GATE-RED`。 | `notes/p34b/espryt-d3.md`;两处基线引文更正(KHR-GL46 非 GL43;`texture_view` 1/7 红是 `view_sampling` 不是 `coherency`)。 | `Managers.{h,cpp}`、`PipeFill.cpp`、`DirectGLES.cpp`、`SubsystemDeps.def`、`CONTRACT-P5E.md` §5.2、`CONTRACT-P7.md` §12 |
|
||||
| ID-P7-29 | 2026-09-22 | wave 2-D2 返工落地(`b3334cf3 0f3b8272 394df892 a2d7fbd7`,叠在 D3 之上;`SubsystemDepsTest` 取 D2 版守卫 + 两条注记,`split-scenario-census.md` 与 D3 的附记手工合并):TUS 散点内缩后 gold 不变(`emit=9 box=9 rect=0 jobs=9` 四臂同)但对象对了——**零补丁 red-once** `MOBILEGL_ESPRYT_DISABLE_UNPACK_RING=1` 给 `box=3 rect=6 jobs=183`(两张散点纹理都动,26 像素例仍绿);顺带抓到 `ASSERT_TRUE(clientWindow.found)` 被「counters ON」横幅满足的假读,改为带 `tex[]` 的窗口;`espryt_memo_purity.py` 锚点/allow 活性断言后 6 条 allow 剩 1;`+76`/72 数字改正、每片 Gates 表。门:pull rc 0、G1 恒等、unit 2426 / split 303 / spawn 219 / tcp 222(`F1WireScenario.TextureReadbackRejectsPackedDestinationOverflowBeforeWriting` 首跑 1 红、rerun 绿——tcp 车道已知 flake 形状,非本包文件)/ magma 88/67/69 / full 530。 | D2 报告;tcp flake 记 §12 的既有条。 | `TextureUploadShapeScenario.cpp`、`PipeStatsWindow.h`、`espryt_memo_purity.py`、`test.yml`、`split-scenario-census.md`、`MEASUREMENTS.md` §13.1 |
|
||||
| ID-P7-30 | 2026-09-22 | D3 的 fable 审查判「带修复落地」,两处修复由集成者直接落在 pipe:(1) `SubsystemDeps.def` 第 1/6 行(bit 8 / bit 13 各 requires bit 7)自 D3 起是活行为、却无任何钉子(`MGPipe.h` 的 static_assert 只钉纹理行/程序行/0x7ff/0x1fff,`SubsystemDepsTest` 只扫四个 P4a resolver)——加两条 `static_assert`;(2) 「删除顺序由构造保证」的说法在常见情形下反了:`m_storageOwner` 是派生类成员、destroy 从基类析构发出,view 持有 owner 最后一个引用时 wire 上先 `resource_destroy(owner)` 后 `(view)`,一次 apply 内 view 记录活着而 `ViewOf` 指向已释放槽——保证是 walk 的 `Live`/`Gen` 检查,不是顺序;`Managers.h`、`CONTRACT-P5E.md` §5.2、`espryt-d3.md` 三处改写,call-site 计数「五→四」改「四→三」。审查确认:门代数对非 view 逐字节同旧;G1 每处改动都在 `PIPE_PUSH`/`BUILD_DISAGGREGATED` 守卫内;red-once 在 tcp 臂真跑真红;引文(KHR-GL46、`view_sampling`)属实。**批准** D3 改 `CONTRACT-P5E.md` §5.2(既非 R-5 也非 R-3,但是 D2 普查行点名的修正)。 | 审查报告;`~/w7/pipe` 上 `range-diff` 三个提交 `=`。 | `MGPipe.h`、`Managers.h`、`CONTRACT-P5E.md`、`espryt-d3.md` |
|
||||
| ID-P7-31 | 2026-09-22 | wave 2-B2 落地(`089fd495 22c2687d 824eac05 ec46a550`):multisample-blit-shape / -aspect 退役(scratch resolve + 第三套烘焙 resolve shader;MS 目的地与无臂采样数具名 decline),`MagmaP7AllocatorDebtScope` 两处删除(P7 基线只剩两处——P5e 裁定 12 的四处里 P5f fv/fm 已去两处;类型留作 `RemoteClientTest` 负控),(B′) disaggregated 构建的 monolith 臂改用烘焙模块,棘轮 **186 → 173 重基线**(p7-magma 101 → 88,余 88 = monolith draw 路径,按 ID-P7-5 留运行时分支、不标 `# P13`,归 wave 3)。**`@P7` 拒绝站点归零**(§3.2 六个退役全部完成 → 子系统分母 (2) 成)。门:pull rc 0、G1 恒等;unit 2429 / split 303 / spawn 219 / tcp 222 / magma **93/72/74** / full 533;census 79、parity 0。**批准** B2 的「decline 的 GL 错误骑在后一次回复上、场景里 `glFinish()` 是承重的」记入 §12 作为 wire 错误归属的已知形状。真机待验:旋转面上的缩放 MS blit、Adreno 830 是否带 `VK_KHR_depth_stencil_resolve`(决定默认臂)、(B′) 烘焙 blit 几何在 ROTATE_90/180/270 下的等价(从未执行)。**fable 审查:带修复落地**——(1) tcp 臂的 `MsResolve1` 条目空转(knob 进的是 client 的 ctest ENVIRONMENT,tcp 的 server 是车道级 fixture 从自己的 `os.environ` 起,`tcp_server_fixture.py:60-68`;B 的 `FORCE_SHADER_MIPMAP`/`FORCE_DEFAULT_BLIT_SCRATCH` tcp 条目同病)→ 按 ID-P7-14 `MAGMA_INPROC_ONLY` 先例做 parity 例外只注册 split+spawn;(2) 翻转/缩放的 MS 深度/模板 resolve 仍 `MagmaWireFatal("multisample-depth-resolve-region")`(`WireFramebuffer.inc:437-443`)——颜色臂已处理翻转、深度却杀会话 → 缩放具名 decline、翻转逐行反向 copy-out;(3) 车道基线归因句改正(+4 = A 与 C 各 +2,都在 B 之前落地)。三项交 B2 返工一轮。审查确认:scratch 生命周期经 `RetireWireObjects` 标签正确、shader resolve 取样 0、无臂路径 decline 无 abort、B′ 每行在守卫内 pull 类布局不变、棘轮 13 去 + 5 重分类属实、bake `--check` fail-closed。§12 待记三条(缩放第二腿未裁剪、`multisample-resolve-region` 对超出读缓冲的源仍 Fatal、1→N 同矩形 decline 了合法形状)。 | `notes/p7/magma-b2.md`。 | `WireFramebuffer.inc`、`WireMultisampleResolve.*`、`VulkanRenderer.cpp`、`scripts/data/link_ratchet_baseline.txt`、`CONTRACT-P7.md` §3.2/§4.1 |
|
||||
| ID-P7-31 | 2026-09-22 | wave 2-B2 落地(`452d33b5 51fa513d a50d50df 3c2867d3`):multisample-blit-shape / -aspect 退役(scratch resolve + 第三套烘焙 resolve shader;MS 目的地与无臂采样数具名 decline),`MagmaP7AllocatorDebtScope` 两处删除(P7 基线只剩两处——P5e 裁定 12 的四处里 P5f fv/fm 已去两处;类型留作 `RemoteClientTest` 负控),(B′) disaggregated 构建的 monolith 臂改用烘焙模块,棘轮 **186 → 173 重基线**(p7-magma 101 → 88,余 88 = monolith draw 路径,按 ID-P7-5 留运行时分支、不标 `# P13`,归 wave 3)。**`@P7` 拒绝站点归零**(§3.2 六个退役全部完成 → 子系统分母 (2) 成)。门:pull rc 0、G1 恒等;unit 2429 / split 303 / spawn 219 / tcp 222 / magma **93/72/74** / full 533;census 79、parity 0。**批准** B2 的「decline 的 GL 错误骑在后一次回复上、场景里 `glFinish()` 是承重的」记入 §12 作为 wire 错误归属的已知形状。真机待验:旋转面上的缩放 MS blit、Adreno 830 是否带 `VK_KHR_depth_stencil_resolve`(决定默认臂)、(B′) 烘焙 blit 几何在 ROTATE_90/180/270 下的等价(从未执行)。**fable 审查:带修复落地**——(1) tcp 臂的 `MsResolve1` 条目空转(knob 进的是 client 的 ctest ENVIRONMENT,tcp 的 server 是车道级 fixture 从自己的 `os.environ` 起,`tcp_server_fixture.py:60-68`;B 的 `FORCE_SHADER_MIPMAP`/`FORCE_DEFAULT_BLIT_SCRATCH` tcp 条目同病)→ 按 ID-P7-14 `MAGMA_INPROC_ONLY` 先例做 parity 例外只注册 split+spawn;(2) 翻转/缩放的 MS 深度/模板 resolve 仍 `MagmaWireFatal("multisample-depth-resolve-region")`(`WireFramebuffer.inc:437-443`)——颜色臂已处理翻转、深度却杀会话 → 缩放具名 decline、翻转逐行反向 copy-out;(3) 车道基线归因句改正(+4 = A 与 C 各 +2,都在 B 之前落地)。三项交 B2 返工一轮。审查确认:scratch 生命周期经 `RetireWireObjects` 标签正确、shader resolve 取样 0、无臂路径 decline 无 abort、B′ 每行在守卫内 pull 类布局不变、棘轮 13 去 + 5 重分类属实、bake `--check` fail-closed。§12 待记三条(缩放第二腿未裁剪、`multisample-resolve-region` 对超出读缓冲的源仍 Fatal、1→N 同矩形 decline 了合法形状)。 | `notes/p7/magma-b2.md`。 | `WireFramebuffer.inc`、`WireMultisampleResolve.*`、`VulkanRenderer.cpp`、`scripts/data/link_ratchet_baseline.txt`、`CONTRACT-P7.md` §3.2/§4.1 |
|
||||
| ID-P7-32 | 2026-09-22 | bsl-esc-menu 归因(M1,主机复现):split server 无界累积死 `VkBuffer`(`RespecifyWireBuffer` 无条件 `DeferRelease`,桶只在帧界扫,pbuffer 回放整跑只 1 条 present)——派 **M2**(`VkBufferManager.{h,cpp}`:serial 门控回收 + `MOBILEGL_IPC_WIRE_DEFERRED_MB` 水位线 + spawn 臂 red-once);`CollectGarbage()` 在 wire 臂从不执行的次级发现待 B3 落地后路由(`VulkanRenderer.cpp`);「pbuffer 回放 server 只收 1 条 present」另查(若 client 对 pbuffer 面跳过 present 记录,与 `ARCHITECTURE.md:531` 的 1:1 相悖,且饿死 server 全部帧界维护)。40% 检查点 **6/9 已过**(§8)。 | M1 报告;`~/w7/p7-probe-m1` 探针、`~/w7/m1/` 采样器与序列。 | `CONTRACT-P7.md` §8/§12 |
|
||||
| ID-P7-33 | 2026-09-22 | wave 2-B3 落地(`f62ceec6 214cb2eb c2c3ca49 6a92a10d 38112dc6`,base 8c5dd6fc,叠在 B2 之上自动合并):OpenRA 真机分歧的机制按裁判 H1 **由计数证实**——wire 臂一个 frame serial 两次提交(S1 = 调色板 `glTexImage2D` 触发的 pooled-fence 中帧 flush,S2 = Present 携带 draw 与 staged 拷贝),`OnSubmitsCompletedUpTo` 逐记录 `NotifyFrameSerialComplete` 把 floor 提前到 N-1,帧 N 第一次 `glBufferSubData` 走 `WriteWireBuffer:268` 的无序 host memcpy 被 S2(N-1) 排队的拷贝盖掉;两种前缀 = 上一帧写入序列的后缀极大值(6696 = 31 quad × 216 B)。修复三片:(a) 32 处静默出口全部具名 + `WireDeclines.def` 计数(无新 abort/家族词,census 79 不变);(b) `WriteWireBuffer` 对仍有读者在飞的 buffer 一律走有序路径;(c) floor 只升到「无在飞记录仍携带」的可证 serial(`#if MOBILEGL_BUILD_DISAGGREGATED`)。计数 `unsound-serial-complete` monolith/inproc/spawn = 0/26/26 → 0/0/0;red-once `F1WireScenario.StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn 2/4 红 → 4/4 绿;强制回放 8102/2115/152216 px 错图 → 全 `ace2af04`。**未做**(另派 B4):裁判的 `WaitForSubmitsUpTo` 聚合等待(三处单 fence 退休站点 `Present:14094`/`WaitForSubmitIndex`/`WaitForFrameSerial`,只在无 present 的 fence 循环里不健全)与 GPU-drag 旋钮(修复后无法变红,只能做回归门)。B3 自己的第一稿机制(每第 8 次 drain)被其探针否决(OpenRA 回放 1 次 drain、33 次 serial 推进全来自 Present)。**镜头 A 的静默丢 draw 被独立否决**(32 处出口计数全 0)。门:pull rc 0、G1 恒等、census 79、ratchet 173、parity 0;unit 2429 / split 303 / spawn 219 / tcp 222(首跑因上一次被杀的门留下两个 `libMobileGLServer … 40613 --serve` 占端口而 220 红,清理后重跑 222/222)/ magma **95/74/76** / full 534。真机验收(p7w5):OpenRA inproc+spawn × run-ahead+lockstep 各 6、dump-armed ×3、FIF=8 ×3 全 `ace2af04`;修复前错图应为 quad 前缀 `K+1 ∈ {1,16,31,53}`。 | `notes/p7/magma-b3.md`;ID-P7-19/25 的两次改判到此闭合。 | `VulkanRenderer.{cpp,h}`、`VkBufferManager.{cpp,h}`、`VkTextureManager.cpp`、`WireDraw.inc`、`WireDeclineTally.h`、`WireDeclines.def`、`F1WireScenario.cpp` |
|
||||
| ID-P7-34 | 2026-09-22 | **OpenRA 真机项关闭**:p7w5(`c89000f5`,B3 之上)验收 **27/27 golden**——inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、`FRAMESINFLIGHT=8` ×3(p7w4 上 6/6 红)、dump-armed ×3(p7w4 上 0/5 绿),全部 ssim 1.000000 / 0 px / `ace2af04`;iterationt ×2 与 26.3 逐位同 p7w4(`W5-verify/README.md`)。B3 的 fable 审查「带修复落地」(tcp `StaleSerial` 条目空转 → parity 例外;floor 钳位无车道 → `run_trace_case.cmake` 对 split 回放里的 `unsound-serial-complete` 行打红;`02bb5789` 的注记把提交项当成修复且仍讲 drain 机制 → 改写、`:273` 加 `IsSubmitIndexComplete(lastUseSubmitIndex)`、`:432` 重打戳;`WireDeclines.def` 53 行里 12 行无站点、纹理站点只计数 → 补齐或删行)交 B3 返工一轮;审查确认 floor 算术对每种顺序精确、`#else` 逐字、无卡死模式,并**否决**裁判的次级「聚合等待」为非缺陷(fence 信号覆盖更早的提交序工作;B 的回读洞是相反形状)——B4 降为后续包(GPU-drag 回归门 + §12 债)。§12 新债:disaggregated 构建的 monolith 臂在中帧 flush 下比 pull 构建更健全(`OnSubData` 经 `IsResourceBusy` 读同一 floor),pull 构建保留该潜在 bug(G1,P13)。 | 门 3 分母 36 现在只剩 bsl-esc-menu(M2)与 §7.2 终局形式。 | `W5-verify/`、`CONTRACT-P7.md` §7.2 |
|
||||
| ID-P7-35 | 2026-09-22 | **B2 返工 r1 审查 = rework**(fable)。r1 三提交(`856aa7ab` / `5d896170` / `db6892ec` → pipe `475ab254` / `3c4cd022` / `00f342c9`)在 pipe 上门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma 96 / 75 / 72、full 535,但新用例 `AFlippedMultisampleResolveMirrorsTheBandsAndAScaleDeclines` 随 `DepthStencilReadbackMatrixScenario.*` 的整套注册落到 DirectGLES 三条 split 臂与两条 monolith 条目上而红。集成者实测 monolith DirectGLES 同红(翻转 resolve 后目的地仍是 0.5 清除值且无 GL 错、缩放 resolve 无 `INVALID_OPERATION`)= **Espryt 行为**,非 wire 缺陷;先按后端名 skip 的临时提交(`3b66d1b1`,八车道全绿)被审查推翻——**DirectVulkan monolith 条目同样红**(`VulkanRenderer.cpp:9594` 翻转矩形的深度 blit「not supported yet」、`:9608` 合法缩放):wire 臂现在比 monolith 臂更正确,skip 应按车道标记 `MGITest::IsSplitLane()` 而非后端名;临时提交已从 pipe 撤下(pipe 回到 `00f342c9`)。第二条 must-fix:逐行 `VkBufferImageCopy` 的 `bufferOffset = row × width × texelSize` 在 stencil(1 B)宽非 4 倍数或 D16 宽为奇数时违反 `VUID-vkCmdCopyBufferToImage-pRegions-07978`(scissor 裁剪产生任意宽度)→ 行距对齐 + stencil 腿 red-once。should-fix:§7 数字取自非祖先树(`5d896170`)、`COLOR\|DEPTH` 缩放 blit 先写完颜色再拒深度的部分效应未陈述、X 与跨格式 Y 两种 decline 共用一个 `MGLOG_E_ONCE`;nit ×4(`!dstSpan` 静默返回、parity tail 必须匹配、`MsFlip1.` 旋钮孪生、`:10066`)。**r2 已派**。同日:六个在跑 agent 撞 session limit 全部死亡,按各 worktree 未提交 diff 重派为 `claude-opus-5-5` 单 agent workflow(Agent 工具的 opus 别名仍是 Opus 5)。 | pipe 停在 `00f342c9`(DirectGLES split 三车道各 1 红)**不推送**,r2 落地后再门再推;§12 届时抄 B2 §6 五行 + 两条新行(monolith DirectVulkan 翻转 / 缩放 MS 深度 blit 是 wire-vs-monolith 分歧;Espryt 翻转 / 缩放 MS 深度 resolve 是 P3b/P4b 债)。 | `DepthStencilReadbackMatrixScenario.cpp`、`WireFramebuffer.inc`、`magma-b2.md` §6 / §7 |
|
||||
| ID-P7-36 | 2026-09-22 | **B3 返工落地(pipe `23eeed68..8d1a7848` + 集成提交 `a785d055`),fable 审查 = land with fixes。** 返工五提交:`WireDeclines.def` 53 行全部有站点、每站点一条 W/E(新审计 `scripts/ci/wire_declines_audit.py` 进 CI);`StaleSerial.` 只注册 split+spawn;注记改写(floor = 保证、提交项 = 探针)+ `WaitForWireBufferHostAccess` 早返回兼看 `IsSubmitIndexComplete(lastUseSubmitIndex)` + `ReadWireBuffer` 等待后重打戳;`run_trace_case.cmake` 对 split 回放里任一 `MGWIRE-FLOOR unsound-serial-complete` 行打红(包树上撤钳位 → inproc/spawn 各 26 行红,恢复 → 0 绿)。**集成合并裁定**:B3 的 `MAGMA_NOT_OVER_TCP` 与 B2 的 `MAGMA_SERVER_ENV_KNOB_NO_TCP` 是同一形状 → 只留 B2 的机制(`compare_arms(no_tcp=)` / CMake `mglItestServerEnvKnobArm`),`.StaleSerial.` 入同一张表;冲突外残留的一行 `not_on_arm = not_on_arm or {}`(首次运行即 NameError)删除。pipe 门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma **96 / 75 / 71**(tcp 少 1 = StaleSerial 条目退出)、full 535、审计 53/53/0;**OpenRA DirectVulkan inproc + spawn 回放(B3 树的 replay exe + pipe 的库与 runner)ssim 1.000000 / 0 px / 0 条 unsound-serial-complete** —— 新红条件在 pipe 上武装,并入后续每个包的门(`~/w7/logs/pipe-retrace.sh`)。审查修正(已派 B3 修复轮):must-fix 审计把注释 / 字符串里的站点当真(剥注释与字面量);should-fix 8 行窗口不看分支(按缩进块回溯)、无 `--self-test` 负控、`run_trace_case.cmake` 在 spawn 的 server 日志缺失时读作 0 行 = 绿(补 fail-closed)、注记 §5 数字未标「包树」;nit ×3;§12 新债:`WaitForFrameSerial` 在钳位后对同 serial 的后续记录会先返回 true 而 `IsFrameSerialComplete` 为 false(调用方复查 → 今日退化为伪超时;B4 修)。 | 不阻塞推送;修复轮作为新提交叠加。V1 五提交已 cherry-pick(`e5477898..51c71d87`,尾注统一为 Fable),门 + 审查在跑;pipe 的 verify 构建(`build-verify`,`MOBILEGL_PIPE_VERIFY=ON`)首次配置以跑 `integration-verify{,-split}`。 | `wire_declines_audit.py`、`run_trace_case.cmake`、`VkBufferManager.cpp`、`magma-b3.md` |
|
||||
| ID-P7-33 | 2026-09-22 | wave 2-B3 落地(`76bbb6c3 c9164f25 a2e244c0 511c1f16 9a494b6f`,base ae3f43ab,叠在 B2 之上自动合并):OpenRA 真机分歧的机制按裁判 H1 **由计数证实**——wire 臂一个 frame serial 两次提交(S1 = 调色板 `glTexImage2D` 触发的 pooled-fence 中帧 flush,S2 = Present 携带 draw 与 staged 拷贝),`OnSubmitsCompletedUpTo` 逐记录 `NotifyFrameSerialComplete` 把 floor 提前到 N-1,帧 N 第一次 `glBufferSubData` 走 `WriteWireBuffer:268` 的无序 host memcpy 被 S2(N-1) 排队的拷贝盖掉;两种前缀 = 上一帧写入序列的后缀极大值(6696 = 31 quad × 216 B)。修复三片:(a) 32 处静默出口全部具名 + `WireDeclines.def` 计数(无新 abort/家族词,census 79 不变);(b) `WriteWireBuffer` 对仍有读者在飞的 buffer 一律走有序路径;(c) floor 只升到「无在飞记录仍携带」的可证 serial(`#if MOBILEGL_BUILD_DISAGGREGATED`)。计数 `unsound-serial-complete` monolith/inproc/spawn = 0/26/26 → 0/0/0;red-once `F1WireScenario.StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn 2/4 红 → 4/4 绿;强制回放 8102/2115/152216 px 错图 → 全 `ace2af04`。**未做**(另派 B4):裁判的 `WaitForSubmitsUpTo` 聚合等待(三处单 fence 退休站点 `Present:14094`/`WaitForSubmitIndex`/`WaitForFrameSerial`,只在无 present 的 fence 循环里不健全)与 GPU-drag 旋钮(修复后无法变红,只能做回归门)。B3 自己的第一稿机制(每第 8 次 drain)被其探针否决(OpenRA 回放 1 次 drain、33 次 serial 推进全来自 Present)。**镜头 A 的静默丢 draw 被独立否决**(32 处出口计数全 0)。门:pull rc 0、G1 恒等、census 79、ratchet 173、parity 0;unit 2429 / split 303 / spawn 219 / tcp 222(首跑因上一次被杀的门留下两个 `libMobileGLServer … 40613 --serve` 占端口而 220 红,清理后重跑 222/222)/ magma **95/74/76** / full 534。真机验收(p7w5):OpenRA inproc+spawn × run-ahead+lockstep 各 6、dump-armed ×3、FIF=8 ×3 全 `ace2af04`;修复前错图应为 quad 前缀 `K+1 ∈ {1,16,31,53}`。 | `notes/p7/magma-b3.md`;ID-P7-19/25 的两次改判到此闭合。 | `VulkanRenderer.{cpp,h}`、`VkBufferManager.{cpp,h}`、`VkTextureManager.cpp`、`WireDraw.inc`、`WireDeclineTally.h`、`WireDeclines.def`、`F1WireScenario.cpp` |
|
||||
| ID-P7-34 | 2026-09-22 | **OpenRA 真机项关闭**:p7w5(`713bea9a`,B3 之上)验收 **27/27 golden**——inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、`FRAMESINFLIGHT=8` ×3(p7w4 上 6/6 红)、dump-armed ×3(p7w4 上 0/5 绿),全部 ssim 1.000000 / 0 px / `ace2af04`;iterationt ×2 与 26.3 逐位同 p7w4(`W5-verify/README.md`)。B3 的 fable 审查「带修复落地」(tcp `StaleSerial` 条目空转 → parity 例外;floor 钳位无车道 → `run_trace_case.cmake` 对 split 回放里的 `unsound-serial-complete` 行打红;`02bb5789` 的注记把提交项当成修复且仍讲 drain 机制 → 改写、`:273` 加 `IsSubmitIndexComplete(lastUseSubmitIndex)`、`:432` 重打戳;`WireDeclines.def` 53 行里 12 行无站点、纹理站点只计数 → 补齐或删行)交 B3 返工一轮;审查确认 floor 算术对每种顺序精确、`#else` 逐字、无卡死模式,并**否决**裁判的次级「聚合等待」为非缺陷(fence 信号覆盖更早的提交序工作;B 的回读洞是相反形状)——B4 降为后续包(GPU-drag 回归门 + §12 债)。§12 新债:disaggregated 构建的 monolith 臂在中帧 flush 下比 pull 构建更健全(`OnSubData` 经 `IsResourceBusy` 读同一 floor),pull 构建保留该潜在 bug(G1,P13)。 | 门 3 分母 36 现在只剩 bsl-esc-menu(M2)与 §7.2 终局形式。 | `W5-verify/`、`CONTRACT-P7.md` §7.2 |
|
||||
| ID-P7-35 | 2026-09-22 | **B2 返工 r1 审查 = rework**(fable)。r1 三提交(`856aa7ab` / `5d896170` / `db6892ec` → pipe `9fed478d` / `645dd96f` / `cc3c18c5`)在 pipe 上门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma 96 / 75 / 72、full 535,但新用例 `AFlippedMultisampleResolveMirrorsTheBandsAndAScaleDeclines` 随 `DepthStencilReadbackMatrixScenario.*` 的整套注册落到 DirectGLES 三条 split 臂与两条 monolith 条目上而红。集成者实测 monolith DirectGLES 同红(翻转 resolve 后目的地仍是 0.5 清除值且无 GL 错、缩放 resolve 无 `INVALID_OPERATION`)= **Espryt 行为**,非 wire 缺陷;先按后端名 skip 的临时提交(`3b66d1b1`,八车道全绿)被审查推翻——**DirectVulkan monolith 条目同样红**(`VulkanRenderer.cpp:9594` 翻转矩形的深度 blit「not supported yet」、`:9608` 合法缩放):wire 臂现在比 monolith 臂更正确,skip 应按车道标记 `MGITest::IsSplitLane()` 而非后端名;临时提交已从 pipe 撤下(pipe 回到 `cc3c18c5`)。第二条 must-fix:逐行 `VkBufferImageCopy` 的 `bufferOffset = row × width × texelSize` 在 stencil(1 B)宽非 4 倍数或 D16 宽为奇数时违反 `VUID-vkCmdCopyBufferToImage-pRegions-07978`(scissor 裁剪产生任意宽度)→ 行距对齐 + stencil 腿 red-once。should-fix:§7 数字取自非祖先树(`5d896170`)、`COLOR\|DEPTH` 缩放 blit 先写完颜色再拒深度的部分效应未陈述、X 与跨格式 Y 两种 decline 共用一个 `MGLOG_E_ONCE`;nit ×4(`!dstSpan` 静默返回、parity tail 必须匹配、`MsFlip1.` 旋钮孪生、`:10066`)。**r2 已派**。同日:六个在跑 agent 撞 session limit 全部死亡,按各 worktree 未提交 diff 重派为 `claude-opus-5-5` 单 agent workflow(Agent 工具的 opus 别名仍是 Opus 5)。 | pipe 停在 `cc3c18c5`(DirectGLES split 三车道各 1 红)**不推送**,r2 落地后再门再推;§12 届时抄 B2 §6 五行 + 两条新行(monolith DirectVulkan 翻转 / 缩放 MS 深度 blit 是 wire-vs-monolith 分歧;Espryt 翻转 / 缩放 MS 深度 resolve 是 P3b/P4b 债)。 | `DepthStencilReadbackMatrixScenario.cpp`、`WireFramebuffer.inc`、`magma-b2.md` §6 / §7 |
|
||||
| ID-P7-36 | 2026-09-22 | **B3 返工落地(pipe `b8d10d07..3f92d0f1` + 集成提交 `75a64ce0`),fable 审查 = land with fixes。** 返工五提交:`WireDeclines.def` 53 行全部有站点、每站点一条 W/E(新审计 `scripts/ci/wire_declines_audit.py` 进 CI);`StaleSerial.` 只注册 split+spawn;注记改写(floor = 保证、提交项 = 探针)+ `WaitForWireBufferHostAccess` 早返回兼看 `IsSubmitIndexComplete(lastUseSubmitIndex)` + `ReadWireBuffer` 等待后重打戳;`run_trace_case.cmake` 对 split 回放里任一 `MGWIRE-FLOOR unsound-serial-complete` 行打红(包树上撤钳位 → inproc/spawn 各 26 行红,恢复 → 0 绿)。**集成合并裁定**:B3 的 `MAGMA_NOT_OVER_TCP` 与 B2 的 `MAGMA_SERVER_ENV_KNOB_NO_TCP` 是同一形状 → 只留 B2 的机制(`compare_arms(no_tcp=)` / CMake `mglItestServerEnvKnobArm`),`.StaleSerial.` 入同一张表;冲突外残留的一行 `not_on_arm = not_on_arm or {}`(首次运行即 NameError)删除。pipe 门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma **96 / 75 / 71**(tcp 少 1 = StaleSerial 条目退出)、full 535、审计 53/53/0;**OpenRA DirectVulkan inproc + spawn 回放(B3 树的 replay exe + pipe 的库与 runner)ssim 1.000000 / 0 px / 0 条 unsound-serial-complete** —— 新红条件在 pipe 上武装,并入后续每个包的门(`~/w7/logs/pipe-retrace.sh`)。审查修正(已派 B3 修复轮):must-fix 审计把注释 / 字符串里的站点当真(剥注释与字面量);should-fix 8 行窗口不看分支(按缩进块回溯)、无 `--self-test` 负控、`run_trace_case.cmake` 在 spawn 的 server 日志缺失时读作 0 行 = 绿(补 fail-closed)、注记 §5 数字未标「包树」;nit ×3;§12 新债:`WaitForFrameSerial` 在钳位后对同 serial 的后续记录会先返回 true 而 `IsFrameSerialComplete` 为 false(调用方复查 → 今日退化为伪超时;B4 修)。 | 不阻塞推送;修复轮作为新提交叠加。V1 五提交已 cherry-pick(`a1d17566..75858bfd`,尾注统一为 Fable),门 + 审查在跑;pipe 的 verify 构建(`build-verify`,`MOBILEGL_PIPE_VERIFY=ON`)首次配置以跑 `integration-verify{,-split}`。 | `wire_declines_audit.py`、`run_trace_case.cmake`、`VkBufferManager.cpp`、`magma-b3.md` |
|
||||
| ID-P7-19 | 2026-09-22 | OpenRA 真机分歧改判为 **wire 臂的 GPU 时序竞态**(冷驱动缓存 = 慢 pipeline 创建 → 最终帧回读在最后几批 draw 完成前采样),归 wave 2-B 第 0 片;主机 red-once 用 pipeline 创建延迟旋钮复现;真机验收 = 三次 `pm clear` 冷跑 1.0。F1 保留(机制正确)但不再被当作分歧原因。 | E7:`pm clear` 三遍 0.976493989 / 14658 逐字相同、热跑 1.0、冷 monolith 1.0、`FRAMESINFLIGHT=1` 一绿一红;两臂 client/server 日志逐行相同;diff 只缺最后画的对象。 | `WireFramebuffer.inc`、`VulkanRenderer.cpp`、`F1-verify/README.md` |
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Ph / P3b-P4b / P7 统筹计划(2026-09-22,基线 `feat/disaggregated@a96875bf`)
|
||||
# Ph / P3b-P4b / P7 统筹计划(2026-09-22,基线 `feat/disaggregated@b95f5f1a`)
|
||||
|
||||
> 用户指令:「查看 ROADMAP,统筹并推进实现,直到 P7 结束。先计划,看看 Ph、P3/4 深化、P7 有哪些任务已经完成、哪些不必要、哪些是必须的,然后开工实现直到 P7 结束。」
|
||||
>
|
||||
@@ -147,4 +147,4 @@ P3b/P4b 余项(场景普查后半、CTS AFTER)→ Ph 大件(PH-1 (3)(4)、
|
||||
|
||||
## 6. 纪律(每个提交)
|
||||
|
||||
沿用 ROADMAP「通用纪律」:ALL target 完整构建(**含 pull 构建的测试**——a96875bf 的 `build-linux` 因 `PipeStatsTest.cpp:137` 编不过,已修);G1 pull `.text` 恒 `0xa52203`、符号 0/0/0/0(基线 `~/w7/p7-before/`);G2/G14 名集合只增不删(split 4155 / linux 3049);每门 red-once;性能只记录;拆分不顺手修 `dev`;先 commit+push 再进下一波(用户 2026-09-11 常规)。
|
||||
沿用 ROADMAP「通用纪律」:ALL target 完整构建(**含 pull 构建的测试**——b95f5f1a 的 `build-linux` 因 `PipeStatsTest.cpp:137` 编不过,已修);G1 pull `.text` 恒 `0xa52203`、符号 0/0/0/0(基线 `~/w7/p7-before/`);G2/G14 名集合只增不删(split 4155 / linux 3049);每门 red-once;性能只记录;拆分不顺手修 `dev`;先 commit+push 再进下一波(用户 2026-09-11 常规)。
|
||||
|
||||
@@ -26,4 +26,4 @@ available: 1100000000 1050000000 967000000 ... 160000000
|
||||
|
||||
## APK 身份
|
||||
|
||||
见 `apk.sha256` / `apk-install.txt`(安装后写入)。构建:`~/w7/pipe@d260f110`,`assembleTraceRelease -Pmobilegl.buildDisaggregated=ON -Pmobilegl.buildDisaggregatedInproc=ON -Pmobilegl.pipePush=ON -Pmobilegl.debuggableRelease=true -Pmobilegl.applicationIdSuffix=.p7w1 -Pmobilegl.apkSuffix=p7w1`,显式 `MOBILEGL_BUILD_STAMP=p7w1-d260f110`,debug keystore 签名,并排安装为 `top.mobilegl.plugin.p7w1.trace`。
|
||||
见 `apk.sha256` / `apk-install.txt`(安装后写入)。构建:`~/w7/pipe@9be62cbc`,`assembleTraceRelease -Pmobilegl.buildDisaggregated=ON -Pmobilegl.buildDisaggregatedInproc=ON -Pmobilegl.pipePush=ON -Pmobilegl.debuggableRelease=true -Pmobilegl.applicationIdSuffix=.p7w1 -Pmobilegl.apkSuffix=p7w1`,显式 `MOBILEGL_BUILD_STAMP=p7w1-9be62cbc`,debug keystore 签名,并排安装为 `top.mobilegl.plugin.p7w1.trace`。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# CTS `$BASE`(出口门 5)· monolith × DirectVulkan × KHR-GL46,Redmi `2f7cbe2e`
|
||||
|
||||
- 库:`/data/local/tmp/mgcts/libMobileGL.so` = p7w1 APK 的 arm64 库,stamp **`p7w1-d260f110`**(wave 0 之前的 monolith Magma;`../00-session/apk.sha256`;`deploy/IDENTITY.txt`)。
|
||||
- 库:`/data/local/tmp/mgcts/libMobileGL.so` = p7w1 APK 的 arm64 库,stamp **`p7w1-9be62cbc`**(wave 0 之前的 monolith Magma;`../00-session/apk.sha256`;`deploy/IDENTITY.txt`)。
|
||||
- glcts:VK-GL-CTS `0b04c470e`(main),arm64,`DEQP_TARGET=mobilegl` + `tools/cts/patches/0001-fbo-color-texture-attachment.patch`;caselists `tools/cts/caselists/p7-*-gl46.txt`(同一提交切出)。
|
||||
- 跑法:`run_cts.py --backend DirectVulkan --surface fbo --gl-config-name rgba8888d24s8 --cpu-mask fast --env MOBILEGL_CTS_FBO_COLOR_TEXTURE=1 --chunk-timeout 900 --skip-file tools/cts/caselists/p7-skip.txt`,无 `MOBILEGL_TRANSPORT`(monolith 是 `$BASE` 的定义)。preflight `mgprobe`:PASS,`default_fb=ok user_fbo=ok rbo_fbo=ok`(`preflight.txt`)。API 探针:`KHR-GL46.texture_swizzle.*` 列出 697 例(`probe-gl46.txt`)→ 读数在 **GL 4.6**,AFTER 必须同版本。
|
||||
- 五块全部 `unrun.txt` / `hung.txt` / `crashed.txt` 为空 → **完整读数**;总耗时 6 分钟(`run-base.log`)。UBO 块(GTF)本 CTS 提交无 kc-cts,不可运行(ID-P7-16)。
|
||||
@@ -13,4 +13,4 @@
|
||||
| texture (`texture_*`) | 1055(1 例在 skip 表) | 815 | 221 | 18 | 98.29% | 77.32% |
|
||||
| packed-pixels | 4732 | 4732 | 0 | 0 | 100% | 100% |
|
||||
|
||||
失败按组:texture_barrier 4/4、texture_cube_map_array 5/27、texture_swizzle 4/697、texture_border_clamp 2/32、texture_buffer 1/16、texture_size_promotion 1/1、texture_view 1/7、shader_image_load_store 6/51、direct_state_access 2/371——逐例名在 `report-*.json`。它们是 **monolith Magma 的既有一致性状态**,不是 P7 的题;门 5 比的是 inproc × DirectVulkan 对这份读数每块 ≤ 0.5 pp 且新 crash = 0。机器可读:`base-DirectVulkan-monolith-p7w1-d260f110.json`(`cts_multi_report.py --json`)。
|
||||
失败按组:texture_barrier 4/4、texture_cube_map_array 5/27、texture_swizzle 4/697、texture_border_clamp 2/32、texture_buffer 1/16、texture_size_promotion 1/1、texture_view 1/7、shader_image_load_store 6/51、direct_state_access 2/371——逐例名在 `report-*.json`。它们是 **monolith Magma 的既有一致性状态**,不是 P7 的题;门 5 比的是 inproc × DirectVulkan 对这份读数每块 ≤ 0.5 pp 且新 crash = 0。机器可读:`base-DirectVulkan-monolith-p7w1-9be62cbc.json`(`cts_multi_report.py --json`)。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# E0 · 分歧 case 名单(本窗口最重要的产出)
|
||||
|
||||
E0a:39 例 × {monolith, inproc} × DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-d260f110`(`apk.sha256`),reboot-clean,`svc power stayon usb`。两臂各 39/39 回放完成;两臂所有有结果的 case 都逐位确定(`ssim vs first = 1.0`,E0b 的 3 遍确定性在 E1 上补做了 OpenRA 一遍——同样逐位相同)。
|
||||
E0a:39 例 × {monolith, inproc} × DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-9be62cbc`(`apk.sha256`),reboot-clean,`svc power stayon usb`。两臂各 39/39 回放完成;两臂所有有结果的 case 都逐位确定(`ssim vs first = 1.0`,E0b 的 3 遍确定性在 E1 上补做了 OpenRA 一遍——同样逐位相同)。
|
||||
|
||||
## 结论一句话
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# E0 · 出口门 3 分母之外的 case(按名单列,不在汇总表里悄悄删行)
|
||||
|
||||
E0a monolith 臂(DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-d260f110`,Redmi `2f7cbe2e`)39 例全部回放、全部逐位确定(`ssim vs first = 1.0`),**3 例低于阈值**。它们都在 **monolith** 上就红,所以按 runbook §4 的判别「monolith 也分歧 ⇒ 问题不在分离」,从出口门 3 的分母里排除;分母 = 39 − 3 = **36**(另:rd12 in-world 本来不在 `--matrix` 里,ID-P7-4)。
|
||||
E0a monolith 臂(DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-9be62cbc`,Redmi `2f7cbe2e`)39 例全部回放、全部逐位确定(`ssim vs first = 1.0`),**3 例低于阈值**。它们都在 **monolith** 上就红,所以按 runbook §4 的判别「monolith 也分歧 ⇒ 问题不在分离」,从出口门 3 的分母里排除;分母 = 39 − 3 = **36**(另:rd12 in-world 本来不在 `--matrix` 里,ID-P7-4)。
|
||||
|
||||
| case | monolith SSIM | 阈值 | 原因 | 归属 |
|
||||
|---|---|---|---|---|
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# F1 复验 + E7/E8 · OpenRA 的分歧是「冷驱动缓存」下的时序竞态
|
||||
|
||||
APK `p7w3-3c8082cc`(wave 0 + X1 + F1;`../00-session/`),Redmi `2f7cbe2e`,DirectVulkan × `--use-pbuffer` × inproc。每次回放都是**新进程**(logcat pid 11917 → 12156 → 12478),所以「热」不在进程里,在 Adreno 驱动的磁盘 shader / pipeline 缓存里。
|
||||
APK `p7w3-3179c497`(wave 0 + X1 + F1;`../00-session/`),Redmi `2f7cbe2e`,DirectVulkan × `--use-pbuffer` × inproc。每次回放都是**新进程**(logcat pid 11917 → 12156 → 12478),所以「热」不在进程里,在 Adreno 驱动的磁盘 shader / pipeline 缓存里。
|
||||
|
||||
## F1 本身:生效,但不是分歧的原因
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# W4 复验 · p7w4(X1+F1+C+A+B+D1)真机:门 3 AFTER 矩阵、iterationt、OpenRA 改判为纯竞态
|
||||
|
||||
APK `p7w4-8c5dd6fc`(`apk-p7w4.sha256` = `22472dc5…`;`apk-p7w4-install.txt`:`versionName=26.09.8c5dd6f-trace`),= `feat/disaggregated@8c5dd6fc` = wave 0 + X1 + F1 + C + A + B + D1。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × inproc × pbuffer;`--archive-dir .trace-work/p7w4/<run>`(不入库)。
|
||||
APK `p7w4-ae3f43ab`(`apk-p7w4.sha256` = `22472dc5…`;`apk-p7w4-install.txt`:`versionName=26.09.ae3f43a-trace`),= `feat/disaggregated@ae3f43ab` = wave 0 + X1 + F1 + C + A + B + D1。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × inproc × pbuffer;`--archive-dir .trace-work/p7w4/<run>`(不入库)。
|
||||
|
||||
## 1. iterationt ×2:`Fatal{UnmigratedVerb,"Magma:mipmap-shader-format-or-shape"}` 退役(`iterationt.log`)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# W5 验收 · p7w5(B3 + B2 + D3 之上)真机:OpenRA 27/27 golden
|
||||
|
||||
APK `p7w5-c89000f5`(`apk-p7w5.sha256` = `01040add…`;`apk-p7w5-install.txt`:`versionName=26.09.c89000f-trace`),= 集成树 `c89000f5` = `origin@be636ee5` + B3(`f62ceec6..38112dc6`)+ ID-P7-33。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × pbuffer;`--archive-dir .trace-work/p7w5/<run>`(不入库)。
|
||||
APK `p7w5-713bea9a`(`apk-p7w5.sha256` = `01040add…`;`apk-p7w5-install.txt`:`versionName=26.09.713bea9-trace`),= 集成树 `713bea9a` = `origin@b089e0de` + B3(`76bbb6c3..9a494b6f`)+ ID-P7-33。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × pbuffer;`--archive-dir .trace-work/p7w5/<run>`(不入库)。
|
||||
|
||||
## 1. 验收矩阵(ID-P7-25 定的判据:run-ahead 与 lockstep 各 6 遍全等 golden,冷热各半)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# X1 复验 · persistent-map tracker 在 arm64 上认领自己的 fault
|
||||
|
||||
APK `p7w2-665cfefc`(`../00-session/apk-p7w2.sha256` = `4b11f647…`;`apk-p7w2-install.txt`),= wave 0 + X1(`0a41972b`,`notes/p7/x1-persistent-map-segv.md`)+ CTS skip list。同一 reboot-clean 会话(boot id `18d8d589…`),并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。DirectVulkan × inproc × pbuffer × 1 遍,外加 26.3 的 DirectGLES 臂:
|
||||
APK `p7w2-ec3ba00a`(`../00-session/apk-p7w2.sha256` = `4b11f647…`;`apk-p7w2-install.txt`),= wave 0 + X1(`4cbf78c2`,`notes/p7/x1-persistent-map-segv.md`)+ CTS skip list。同一 reboot-clean 会话(boot id `18d8d589…`),并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。DirectVulkan × inproc × pbuffer × 1 遍,外加 26.3 的 DirectGLES 臂:
|
||||
|
||||
| case | 后端 | E0a / E4a(修前) | X1 后 | tracker DECLINED |
|
||||
|---|---|---|---|---|
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
## 2 今天的数字
|
||||
|
||||
基座 `78b7d6be`,`build-split`(Release,`-DMOBILEGL_BUILD_DISAGGREGATED=ON
|
||||
基座 `e8b2c4bd`,`build-split`(Release,`-DMOBILEGL_BUILD_DISAGGREGATED=ON
|
||||
-DMOBILEGL_BUILD_DISAGGREGATED_INPROC=ON -DMOBILEGL_PIPE_PUSH=ON`),211 个 object:
|
||||
|
||||
| | |
|
||||
@@ -136,7 +136,7 @@ a6 §5 的叙述(「server 不该问 client 要答案」)本来就该把它
|
||||
|
||||
## 4 red-once(R-16)
|
||||
|
||||
在 `~/w7/p7-ratchet`(`78b7d6be`,`build-split`)里往一个**被分类为 SERVER 的** object
|
||||
在 `~/w7/p7-ratchet`(`e8b2c4bd`,`build-split`)里往一个**被分类为 SERVER 的** object
|
||||
加一次前端触及,只重编那一个 object,跑门,然后还原。
|
||||
|
||||
**注意选哪个符号。** 计划书里举的例子 `SamplerObject s(0); s.GetMinFilter();` **不会让门变红**——
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# wave 2 包 A — Magma 的 UBO / SSBO / texel 对齐与 range 簇
|
||||
|
||||
基线 `feat/disaggregated @ 460a3a72`(pipe HEAD,wave 0 与 X1 已落地)。分支 `p7/magma-a`,
|
||||
基线 `feat/disaggregated @ 5c4235d7`(pipe HEAD,wave 0 与 X1 已落地)。分支 `p7/magma-a`,
|
||||
worktree `~/w7/p7-magma-a`。规范:`CONTRACT-P7.md` §0 规则 I / J、§3.2 退役表、§9 的文件分区。
|
||||
|
||||
本包只改 `Renderer/UniformManager.{cpp,h}` 与 `Renderer/VkBufferManager.{cpp,h}` 里一个**新增**
|
||||
@@ -168,7 +168,7 @@ G1 不动是结构性的,不是运气:本包所有改动都在 `#if MOBILEGL
|
||||
|
||||
### 6.1 census 为什么一个数都没动
|
||||
|
||||
`abort_sites` 数的是 `std::abort()`。wave 0(`852e3c28`)已经把三个 Magma wire fatal 漏斗改走
|
||||
`abort_sites` 数的是 `std::abort()`。wave 0(`8bb6309a`)已经把三个 Magma wire fatal 漏斗改走
|
||||
`MGPipeSessionFailHook` → `SessionFail`,`abort` 本身住在 `FatalFunnel.cpp` 这个被 sanction 的
|
||||
漏斗里。所以**退役一个 `WireDescriptorFatal` 调用点不改变任何 census 数字**,
|
||||
`--write-baseline` 不需要跑。任务书里「retirements should LOWER abort_sites」的预期来自
|
||||
@@ -188,9 +188,9 @@ golden half bits=(0x3a74, 0x4821); mismatched 1 of 262656 texels
|
||||
```
|
||||
|
||||
差别在于契约 §2.5 把这条记在 **tcp** 臂,这里它出现在 **split** 臂。`~/w7/pipe` 自己的
|
||||
`build-split` 上同一条用例是绿的,而 `~/w7/pipe` 已经走到 `610fa281`(本 worktree 从
|
||||
`460a3a72` 分出),两边 `build-split` 的 configure 也不是同一次生成的。**需要集成者裁定**:
|
||||
是 460a3a72→610fa281 之间被改掉了,还是 S1 本来就与 configure 有关而不只与 tcp 有关。
|
||||
`build-split` 上同一条用例是绿的,而 `~/w7/pipe` 已经走到 `206abdfa`(本 worktree 从
|
||||
`5c4235d7` 分出),两边 `build-split` 的 configure 也不是同一次生成的。**需要集成者裁定**:
|
||||
是 5c4235d7→206abdfa 之间被改掉了,还是 S1 本来就与 configure 有关而不只与 tcp 有关。
|
||||
本包只能确认「与包 A 无关」。
|
||||
|
||||
## 7. 还剩什么 / 需要真机
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) §1.3 与 §3 wave 2-B;规范见
|
||||
> [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §0(规则 I / J)、§3.2(退役 vs
|
||||
> decline 表)、§5.1 / §5.2。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `8652bac0`
|
||||
> decline 表)、§5.1 / §5.2。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `801f8eda`
|
||||
> (wave 0 已落地:Magma 两进程三臂、`MGPipeSessionFailHook` → `Session::Fail` 漏斗、
|
||||
> `scripts/link_ratchet.py`)。
|
||||
>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
> 规范见 [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §0(规则 I / J)、
|
||||
> §3.2(`multisample-blit-shape` / `-aspect` 行)、§4.2(棘轮目标与 (B′) 路线)、§5.2;
|
||||
> 前一包见 [`magma-b.md`](magma-b.md)。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头
|
||||
> `ac8065a3`(X1、F1、C、A、B 全部落地)。
|
||||
> `09ba88e7`(X1、F1、C、A、B 全部落地)。
|
||||
>
|
||||
> 主机口径与包 B 相同:WSL Arch + lavapipe(`/usr/share/vulkan/icd.d/lvp_icd.json`),
|
||||
> `build-split` = Release / clang / ccache / `DISAGGREGATED=ON` `INPROC=ON` `PIPE_PUSH=ON`
|
||||
@@ -13,7 +13,7 @@
|
||||
> 基线门读数(本树实测,非引自包 B):`integration-magma-split` **88**、`-spawn` **67**、
|
||||
> `-tcp` **69**、`integration-magma-full-split` **521**、`ctest -L unit` **2420**,全绿。
|
||||
> 包 B 的报告写的是 84 / 63 / 65,差的四条**不是**「包 A 在它之后落地」——那句是错的,
|
||||
> 审查round 已更正:包 A 在 B **之前**落地(`5a14e5a1..2f48ccf4` 在 `c5fa52f9` 之前)且只有 +2
|
||||
> 审查round 已更正:包 A 在 B **之前**落地(`450d3075..2207b6d9` 在 `c4be3800` 之前)且只有 +2
|
||||
> (`magma-a.md:151-153`),另外 +2 是包 C(`magma-c.md:59-61`)。本树的基线因此是
|
||||
> 73 + 11(B)+ 2(A)+ 2(C)= **88 / 67 / 69**。
|
||||
|
||||
@@ -341,7 +341,7 @@ lifetime-id 探针——所以 P5c 给这两处 teardown 一个具名豁免,P5
|
||||
|
||||
裁定 12 点了**四**处 Magma 站点(`VulkanRenderer.cpp` ×3、`ResourceTracker.h` ×1)。其中两处在 P7
|
||||
开始前就没了——`git log -S` 把 `ResourceTracker.h` 那处记在 P5f fv(`4f3d2d6b`)、第三处
|
||||
`VulkanRenderer.cpp` 记在 P5f fm(`036c3a3d`)——所以 P7 基线 `78b7d6be` 上只剩**两**处,就是本片
|
||||
`VulkanRenderer.cpp` 记在 P5f fm(`036c3a3d`)——所以 P7 基线 `e8b2c4bd` 上只剩**两**处,就是本片
|
||||
删掉的这两处。Magma 的 apply 线程分配器债现在是**零**处。
|
||||
|
||||
### 3.4 类型留下,并且写明了为什么
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) §3 wave 2;规范见
|
||||
> [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §0(规则 I / J)、§3.2、§7、§9;
|
||||
> 裁定 ID-P7-14 / 19 / 20 / 21 / 23。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `8c5dd6fc`。
|
||||
> 裁定 ID-P7-14 / 19 / 20 / 21 / 23。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `ae3f43ab`。
|
||||
> 本文所有 `file:line` 均在该提交上读取。
|
||||
>
|
||||
> 主机口径:WSL Arch + lavapipe(`/usr/share/vulkan/icd.d/lvp_icd.json`),`build-split` =
|
||||
|
||||
@@ -41,7 +41,7 @@ Nine things this package changes that live outside its own files or outside its
|
||||
notice it.
|
||||
|
||||
|
||||
Base: `p7/magma-c` off `feat/disaggregated @ a686131e` (pipe HEAD at branch time).
|
||||
Base: `p7/magma-c` off `feat/disaggregated @ 4f2d4c4e` (pipe HEAD at branch time).
|
||||
Build: `build-split` = `-DMOBILEGL_BUILD_DISAGGREGATED=ON -DMOBILEGL_BUILD_DISAGGREGATED_INPROC=ON
|
||||
-DMOBILEGL_PIPE_PUSH=ON -DMOBILEGL_BUILD_INTEGRATION_TEST=ON`, ICD pinned to
|
||||
`/usr/share/vulkan/icd.d/lvp_icd.json` (the same lavapipe ICD `~/w7/pipe/build-split` pins; the
|
||||
@@ -53,7 +53,7 @@ wire arm), rule J / R-16 (every fix red once on a two-process arm first).
|
||||
|
||||
## Gates, on the four slices together
|
||||
|
||||
| gate | base (`a686131e`) | after | |
|
||||
| gate | base (`4f2d4c4e`) | after | |
|
||||
|---|---|---|---|
|
||||
| `ctest -L unit` | 2402 | **2403 / 2403** | +1 = the OQ-8 order case |
|
||||
| `integration-magma-split` | 73 (71 P + 2 S) | **75 / 75, 0 skipped** | +2 vertex-layout; the 2 skips were the death cases |
|
||||
@@ -69,10 +69,10 @@ wire arm), rule J / R-16 (every fix red once on a two-process arm first).
|
||||
| **G1** (`build-linux`, pull) | `.text` `0xa52203` | **`.text` `0xa52203` (10822147, +0)** | `.data`/`.bss`/`.rodata`/total all +0; 27837 → 27837 defined symbols, **0 added / 0 removed / 0 resized / 0 renamed**; the `.so` is byte-identical on disk (19143824) |
|
||||
|
||||
**Ratchet buckets.** AFTER: `p7-magma` **101**, `p3b-p4b-espryt` **13**, `both-backends` **61**,
|
||||
`p6-core` **11**, total **186**. CONTRACT-P7 §4.1 records the `852e3c28` baseline as
|
||||
`p6-core` **11**, total **186**. CONTRACT-P7 §4.1 records the `8bb6309a` baseline as
|
||||
101 / 14 / 60 / 11. So one symbol sits in `both-backends` that the baseline recorded under
|
||||
`p3b-p4b-espryt`; the total, the monotone assertion and **P7's own target bucket (101)** are all
|
||||
unchanged. HONESTY NOTE: I did not separately re-measure the buckets at `a686131e`, so I cannot
|
||||
unchanged. HONESTY NOTE: I did not separately re-measure the buckets at `4f2d4c4e`, so I cannot
|
||||
attribute that single move to this package rather than to the two commits between the baseline
|
||||
and this branch point. Nothing here was aimed at gate 4 — §4.2's path from 101 to 0 is package
|
||||
B's `(B')`. (An attempt to identify the mover by rebuilding one object at the base failed to
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# P7 wave 0 包 L:Magma 两进程车道的首轮(2026-09-22)
|
||||
|
||||
> 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) §0 发现 1 / §1.3 出口门 1 / §3 wave 0 第 1 项。
|
||||
> 基线 `feat/disaggregated@78b7d6be`,分支 `p7/lane`,主机 WSL Arch + lavapipe
|
||||
> 基线 `feat/disaggregated@e8b2c4bd`,分支 `p7/lane`,主机 WSL Arch + lavapipe
|
||||
> (`/usr/share/vulkan/icd.d/lvp_icd.json`,系统唯一 ICD),`build-split` = Release / clang / ccache /
|
||||
> `DISAGGREGATED=ON` `INPROC=ON` `PIPE_PUSH=ON` `BUILD_INTEGRATION_TEST=ON`,
|
||||
> `MOBILEGL_ITEST_TCP_ENDPOINT=tcp://127.0.0.1:40713`(本树专用端口,避免与兄弟树的 40613 撞车)。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) 「wave 3」与 §4 分母第 (7) 项;规范见
|
||||
> [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §6(门 2)、§0(规则 I / J)、§9。
|
||||
> 基线 = `ec46a550`。
|
||||
> 基线 = `3c2867d3`。
|
||||
>
|
||||
> 主机口径:WSL Arch + lavapipe(`/usr/share/vulkan/icd.d/lvp_icd.json`,钉在 `MOBILEGL_ITEST_VK_ICD`),
|
||||
> `build-split` = Release / clang / ccache / `DISAGGREGATED=ON` `INPROC=ON` `PIPE_PUSH=ON`
|
||||
@@ -162,7 +162,7 @@ DirectVulkan 半边保留且绿。
|
||||
|
||||
### 2.5 车道计数(每臂,前 → 后)
|
||||
|
||||
| 车道 | 臂 | 基线 `ec46a550` | 本包之后 | 结果 |
|
||||
| 车道 | 臂 | 基线 `3c2867d3` | 本包之后 | 结果 |
|
||||
|---|---|---|---|---|
|
||||
| `integration-verify` | monolith,DirectGLES / DirectVulkan | 568 / 568 = 1136(本配置下 2 红,§2.4) | 568 / 568 = **1136**(名不变) | 1136/1136,271 skip |
|
||||
| `integration-verify-split` | inproc,DirectGLES / DirectVulkan | 0 / 0(不存在) | 533 / 537 = **1070** | 1070/1070,117 skip(GLES 60、Magma 57) |
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# X1 — the client-thread SIGSEGV in a mapped buffer under inproc (device window #1)
|
||||
|
||||
Wave 2, package X1. Base `a686131e`. Branch `p7/segv`.
|
||||
Wave 2, package X1. Base `4f2d4c4e`. Branch `p7/segv`.
|
||||
|
||||
## 1. What the tombstone actually said
|
||||
|
||||
Three CI split-subset traces died on the Redmi (`2f7cbe2e`, Adreno 830, APK `p7w1-d260f110`)
|
||||
Three CI split-subset traces died on the Redmi (`2f7cbe2e`, Adreno 830, APK `p7w1-9be62cbc`)
|
||||
under `MOBILEGL_TRANSPORT=inproc` and passed under monolith on the same device and APK:
|
||||
`improved-transparency-minecraft-26.3`, `minecraft-1.21.1-neoforge-create-instancing-in-world`,
|
||||
`minecraft-1.21.1-neoforge-create-indirect-in-world`. Every one of them is
|
||||
|
||||
Reference in New Issue
Block a user