mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
[docs] (P7): ID-P7-31 - B2 landed: the six §3.2 retirements are complete, the ratchet re-baselines at 173, and the judge's Magma debts are recorded
This commit is contained in:
@@ -64,7 +64,7 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7
|
||||
| **wire 回读竞态(OpenRA 真机 0.976494 的原因)** | `WireFramebuffer.inc` / `VulkanRenderer.cpp` | **已修(wave 2-B,`64530ed2`)** | `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` | **未做(B 剩余 2 处 `@P7`)** | shape:resolve 进 scratch 单采样再 `vkCmdBlitImage` 缩放/翻转;aspect:MS 深/模板 → 单采样用 `VK_KHR_depth_stencil_resolve`(`DynamicBackendParameters` 里查扩展)或 `texelFetch(sampler2DMS)` 写 `gl_FragDepth` 的 shader resolve;单采样 → MS 尺寸不同 decline |
|
||||
| `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 |
|
||||
| `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`) |
|
||||
| `texel-buffer-native-format` | `UniformManager.cpp` | **已 decline(wave 2-A)** | 零占位 view,fetch 读零;只在 Adreno 上有可观测(`GL_RGB32F` buffer texture) |
|
||||
@@ -81,7 +81,7 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7
|
||||
|
||||
## §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` 内联决策可能让首轮红——三元规则:已列类的兄弟方法、无新引用对象 = 内联,重基线;新引用对象永远不是内联。
|
||||
**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.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 失败。
|
||||
|
||||
@@ -161,6 +161,7 @@ verify 今天只在 monolith 注册(`MG_IntegrationTest/CMakeLists.txt:1684-17
|
||||
- §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)。
|
||||
- **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** 调查(store 逐项归因、泄漏还是 2× 结构重复、`vm.max_map_count`);与 B3 的「`UploadPendingWireLevels` 拒绝后 pending 条目存活」可能同根。
|
||||
- `MEASUREMENTS.md` §7.2 的同名比对自 P5b 起未重跑;「22 → texture readback」「3 → query」两行债务的关闭以 wave 3 的重跑为准。
|
||||
- Android 模拟器 retrace 车道每轮 2–6 例 flaky(含 monolith 对照):门 1 的任何模拟器证据都先过「连续 N 轮绿」再算数。
|
||||
|
||||
@@ -33,4 +33,5 @@
|
||||
| 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-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 审查结论另记。 | `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-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` |
|
||||
|
||||
Reference in New Issue
Block a user