diff --git a/docs/Disaggregated/MEASUREMENTS.md b/docs/Disaggregated/MEASUREMENTS.md index f393761e..58dfdd0e 100644 --- a/docs/Disaggregated/MEASUREMENTS.md +++ b/docs/Disaggregated/MEASUREMENTS.md @@ -800,4 +800,68 @@ v1-r3 已完成并需保留的事实:native EGL bind 在 reduced lane 实测 r2 最终包门:split unit **2087 selected**、reduced **22 selected**、push **1128 selected** 均零失败(selected 包含已注明 skip);E1 **14 own reds**、E3(a) **4 own reds**;smoke **16 core + 12 private**;census **432/185/505/27**,零 segfault/harness-error。r2 **没有新跑 pull G1 binary comparison**,只说明修改不影响 pull production code;不能把继承的 0/0/0/0 当它的新测量。日志 `~/w7/p5b-r2-final-gate.log` 的 `UNIT_OK SPLIT_OK CONTROLS_OK SMOKE_OK CENSUS_OK PUSH_OK` 只认证 r2 包头,不认证后续合并头。 -r2 还更新树外 `~/w7/p5b-c0b-census.{sh,py}`、`~/w7/notes/tools/p6_census_lane.py`、`~/w7/notes/tools/wsl_p5_gate.sh`;git merge 不会把它们自动带到别处。仍未关闭的债务包括 r1 四项、无 stamp 的 residual reads、ReadPixels 正确大小但非法 status=3 的接受路径,以及 §27 的 27 条 wrong-answer。完整归属/退休门见 `ROADMAP.md`;实现与证据索引为 `~/w7/notes/p5b/p5b-results/r2-v1.md`。本节只汇总现有证据,没有追加轮次审查或重复全门。 +r2 还更新树外 `~/w7/p5b-c0b-census.{sh,py}`、`~/w7/notes/tools/p6_census_lane.py`、`~/w7/notes/tools/wsl_p5_gate.sh`;git merge 不会把它们自动带到别处。在 r2 包头时仍未关闭的债务包括 r1 四项、无 stamp 的 residual reads、ReadPixels 正确大小但非法 status=3 的接受路径,以及 §27 的 27 条 wrong-answer。完整归属/退休门见 `ROADMAP.md`;实现与证据索引为 `~/w7/notes/p5b/p5b-results/r2-v1.md`。本节只汇总现有证据,没有追加轮次审查或重复全门。 + +## 32. P5b 真实负载迁移与包证据 + +集成基准头 **`348d22a4b9c15cc571af840dedc4b4edc8c53dbb`**(2026-09-16)。此头包含 d1/i1/t2/f1、P5 收官 r1/r2、五槽 sync、具名 blit 与 GLES mip storage 修复。发射表 **A=2 / B=54 / C=15**;B=54 中包含 P5 的五槽,以及本轮 19+7+6+11+1+5 槽。目录仍是 76 条;槽数与 wire opcode 数不是同一个统计量。 + +| 包 / 后续首阻塞 | 已落地行为与证据边界 | +|---|---| +| d1 | 19 个索引/实例/multi-draw/indirect 槽经 draw_vbo 过线。独立包动态 Minecraft 普查实际执行 77 backend cases,28 passed、49 first blockers;全部越过原 draw 首阻塞。该次默认 stage=32 MiB,不能用它直接推算后续合并头或 256 MiB profile 的进步幅度。 | +| i1 | 七个 image/compute/barrier/copy-image/storage-block 槽迁移;包内五类原首阻塞合计 239(138+49+18+30+4)归零。CopyImage 的 client-shadow 镜像被跳过,GetTexImage 前端本地回退仍可能读旧 shadow,不能宣称始终有 Fatal 挡住它。 | +| t2 | 六个 XFB/曲面细分槽迁移;原首阻塞实测 **140**(BeginTransformFeedback 95 + PatchParameteri 43 + BindTransformFeedback 2),不是早期计划的 138。包内同名基线 490 passed / 191 skipped / 390 aborted / 78 failed,原 432 passes 全保留;新增暴露的 Vulkan capture/query 失败详见包表。 | +| f1 | 11 个 clear/copy/mip 槽迁移;原 34 个首阻塞归零。bound named-clear 已接线,unbound named-clear 仍具名拒绝;深度 copy/readback 和 Vulkan named publication 留待最终普查与后续阶段。 | +| r1 / r2 | P5 收官 #1–13 修复已集成。r1 阻止 apply-role 进入 persistent-map producer,FBO death 转 apply mailbox,补 PACK_SWAP_BYTES,保留 r2 staging 等待并补 command retirement 重试。r1 最终定向 **10 passed / 0 skipped**;client-only push suppression 两个自己的像素失败,另一个 metadata skip 不算 red。r2 的库身份/恢复、skip/zero-run/陈旧日志、CI 控制顺序等证据见 §31。 | +| 具名 blit | `BlitNamedFramebuffer` 经 scoped read/draw binding 发布降为现有 bound backend 调用,退出恢复公开绑定,下次普通 verb 重新发布。两后端四个 split runtime 像素 entry 通过;附带 15 unit passes,另四个 monolith 注册项设计性 skip,故包内选择 23 不等于 23 passes。 | +| GLES mip storage | 前端先定义并发布层级,server 只验证 applier descriptor 的 Levels/extent,跳过重复 client-shadow grow。原 RGBA8、新 R11F、新 depth 三个 mip 像素控制 **3 passed / 0 skipped**;iris-BSL GLES 单例 SSIM **0.997496**、无 Fatal、默认 stage 32 MiB。registry 身份解析只 Find,不 mint;仍是 P5b barrier 债。RGB 三通道 CPU fallback 保持 Fatal。 | +| sync | FenceSync / ClientWaitSync / GetSyncStatus / WaitSync / DeleteSync 的五条现有 opcode 接线,wire 只传句柄,native fence 归 apply 线程。原 LOCAL guard 使 trace 的 FenceSync 没真正执行,所以 d1 旧普查不存在可直接扣除的 FenceSync first-blocker 数。真实 wait 返回、64-bit timeout、flush flag、世代与 orphan cleanup 已有包内控制;长 wait 的运输 watchdog 另见 §34。 | + +包报告位于 `~/w7/notes/p5b/p5b-results/{d1-codex-v1,i1-v1,t2-codex-v1,f1-v1,r1-codex-v1,r2-v1,blit-codex-v1,mip-codex-v1,sync-codex-v1}.md`。这些是各包固定二进制上的证据;合并头以以下一次阶段门与普查为准。 + +## 33. P5b 一次主机收尾门与合并普查 + +主机门固定 **`348d22a4`**,证据目录 `~/w7/p5b-final-host-348d22a4/`;原始 `head.txt`、`libraries.sha256`、逐步 `status.tsv`、JUnit 及 `summary-counts.{json,md}` 保留。下表严格区分 selected、passed 和 skipped;当前已结束的表项均无 failed/error,完整回放尚待终止标记,不能据此把全门写成完成。 + +| 车道 | Selected | Passed | Skipped | Failed/error | +|---|---:|---:|---:|---:| +| unit-linux | 1817 | 1500 | 317 | 0 | +| unit-push | 1817 | 1782 | 35 | 0 | +| unit-verify | 1817 | 1795 | 22 | 0 | +| unit-split | 2132 | 2122 | 10 | 0 | +| gpu-linux-monolith | 1148 | 895 | 253 | 0 | +| gpu-push-monolith | 1148 | 953 | 195 | 0 | +| gpu-split-monolith | 1178 | 953 | 225 | 0 | +| split | 107 | 105 | 2 | 0 | +| verify | 950 | 804 | 146 | 0 | +| audit | 10 | 9 | 1 | 0 | + +G1:27,814 defined symbols,新增/删除/resize/rename 全为 0;`.text` **10,806,611 B → 10,806,611 B(+0)**。G5 的 P3a 11 函数 / P4a 17 区域及各自 production pin-selection 自测完成,生成器/纯度检查完成;测试注册名比较与 G14 步骤 rc=0。 + +E1 与 E3(a) 的控制步骤 rc=0,各自 selected entry 必须自己的诊断与私有日志;E3(a) 精选四个像素 case,不含旧两条 metadata skip。E2 OpenRA **2 selected / 2 passed**;draw-drop 的单例 SSIM **0.000036**、758 records,pull-library 拒绝与恢复后的库 SHA 保持一致。控制跑器 smoke **16 core + 12 private** 按各自预期通过。 + +**执行异常独立记账:**为归档 E1/E3 私有日志而在运行中追加 runner 行,Bash 的读取偏移触发过一次 `-test-dir: command not found`;外层未设置 set-e。该 shell 异常保留在原始会话输出,不冒充测试失败,也不能省略。verify / audit 自己的 JUnit 均完整且步骤 rc=0,后续 E2 正常;`negative-private-logs` 已提前手动归档。最终须用全部必需步骤状态、JUnit 数量及回放计数确认没有缺步,而不是仅凭最后一个 shell exit 宣称通过。 + +主机 push / verify 的各 79 replay 结果与最终 complete/exit 尚待记录。 + +合并 inproc 普查由独立 frozen runner 在 `~/w7/p5b-final-census-348d22a4/` 记录:integration lane 显式 **32 MiB**,完整 trace 显式 **256 MiB**。后者容纳目标负载的单次 128 MiB 上传;这不是默认容量修复。integration lane 已执行 **1267 selected = 811 passed + 203 skipped + 62 aborted + 191 failed**。旧 1149 名全部保留,新增 118、删除 0;旧 **432 passes 全保留、零回退**。旧 505 abort → 265 passed / 18 skipped / 58 aborted / 164 failed;旧 27 failed → 1 passed / 26 failed。后续错误被执行到不等于这些路径已正确,新增测试也不计入旧名回归判断。完整 trace 的 79 项仍在运行;最终同名 transition、逐 trace first blocker/SSIM 以 `joint-codex-v1.md` 的 census 块及 `identity.json`、`counts.json` 为准。 + +## 34. P5b 唯一收官审查与定向修复 + +阶段审查 `~/w7/notes/p5b/p5b-results/p5b-close-codex-review.md` 固定 `348d22a4`、diff base `37fc4fdb`,只读结论 **0 blocker / 2 major / 1 minor**。没有宣称现场重现 driver 越界、长时间 GPU wait 或设备结果;P5 的 #1–13 修复在此头已存在,没有追加发现。 + +| 项 | 问题 | 当前处置 | +|---|---|---| +| Major 1 | user-index span 虽在 segment 范围内,其 Size 仍可能短于 Count × IndexSize,sink 会按独立 count 消费 | 集成 `a021e3cc`(包 `0b67568e`):encoder/decoder/sink 共用 shape/extent gate,单 range、index width 1/2/4、Start=0,Uint64(Count) × IndexSize ≤ Size;三端短 span 均拒绝、segment 末尾 exact-fit 通过,**9 selected / 9 passed / 0 skipped** | +| Major 2 | ClientWaitSync 保留 64-bit 原 timeout,但 applied/reply 等待一律 30 秒,合法长 wait 会被 BarrierTimeout 打断 | 集成 `82683d4a`(包 `6388035f`):applied/reply 预算为 ceil(timeout ns / 1,000,000) + 30,000 ms,以有限 chunk 避开溢出和 forever sentinel;普通容量等待/FenceWaitServer 仍为 30 秒,shutdown 可唤醒 | +| Minor 3 | ReadPixels exact-size reply 的未知 status 仍可穿过 production helper | 集成 `82683d4a`(包 `6388035f`):tight 与 bounce 实际 return path 拒绝 status=3,报 ReplyStatusInvalid;既有 ERROR/DECLINED 诊断保留 | + +`6388035f` 的定向 RemoteClientTest **7 selected / 7 passed / 0 skipped / 0 failed**(80 ms):真实 EmitAndWait 的 0 ns、1 ns、60 s、UINT64_MAX 预算,FenceWaitServer、shutdown,以及 tight/bounce 的未知状态控制。报告 `~/w7/notes/p5b/p5b-results/wait-codex-v1.md`;该结果属于后续修复包;index span 的报告为 `indexspan-codex-v1.md`。最终代码源头 **`82683d4a83b5c8f4f7c375a7a92ebee9a1854646`** 包含三项修复,合并后定向确认待集成者汇总。 + +本阶段不再做第二轮全门或收官审查。原始全门的源头仍为 `348d22a4`,后续三项只以修复提交上的定向证据补齐;最终 APK/设备源头另行明确,不能倒改历史 gate 身份。 + +## 35. P5b Redmi 出口与四臂 A/B(待完成) + +最终代码源头 **`82683d4a83b5c8f4f7c375a7a92ebee9a1854646`** 正在构建 pull / push / split 三个 APK,split APK分别运行 monolith control(splitctl)与 inproc(split)。四条目标 trace × 双后端共 **8 个正确性组合**;四臂性能共 **32 个组合**。全部显式使用 **`MOBILEGL_IPC_STAGE_MB=256`**,默认 32 MiB 保持不变。运行前检查源头与 APK/library 身份,使用独立 attempt 目录保留正确性 SSIM、Fatal 日志与性能数据。 + +最终 sourcehead 已固定,设备尚无 DEVICE_DONE,**本节不填结果、不标 P5b 收官,也不从主机 SSIM 推断设备成功**。设备实际 selected/passed/skip、每个组合的 SSIM、barrier tax 与逐线程 CPU 汇总待同源证据到齐后填写。性能仍只记录,不作 landing 阻塞门;P6 spawn 要在设备出口之后开始。 diff --git a/docs/Disaggregated/README.md b/docs/Disaggregated/README.md index bdd14af1..dbd967fc 100644 --- a/docs/Disaggregated/README.md +++ b/docs/Disaggregated/README.md @@ -1,6 +1,6 @@ # MGPipe:MobileGL 前后端拆分 -> 状态:**P0、P0.5、P1、P2、P3a、P4a、P5 已落地,P5b 正在进行**。P5 代码收尾头为 `37fc4fdb`;缩减路径的五个 verb 经 wire codec 到第二个 apply 线程,历史 joint 门已测 OpenRA `inproc` 双后端 2/2、SSIM 1.0。该收尾头的全门实跑停在 E3(a) 的设计性 skip,**没有完成最终五部分门**;r2 已在自己的包头修正控制选择并验证。P5b 按普查迁移真实负载的后续首阻塞,出口是四个 A/B trace 在 Redmi 上 `inproc` 渲染,之后再做 P6 spawn。各头的证据与欠债见 `MEASUREMENTS.md` §26–31、`ROADMAP.md`。 +> 状态:**P0、P0.5、P1、P2、P3a、P4a、P5 已落地,P5b 收尾中**。P5b 已合入索引/实例/multi-draw、image/compute/barrier、XFB/曲面细分、clear/copy/mip、具名 framebuffer blit 和五个 sync 槽;`348d22a4` 的发射表为 A=2 / B=54 / C=15。主机阶段门、合并普查与 Redmi 出口分别记账:主机已完成的 split lane 为 **107 selected = 105 passed + 2 skipped**,最终回放和设备结果尚待汇总;不能据此宣布收官。出口仍是四个 A/B trace 在 Redmi 上 `inproc` 渲染,之后进入 P6 spawn。当前实现保留具名 barrier-pulled 身份/状态依赖,尚不等于跨进程可运行。实测与剩余债务见 `MEASUREMENTS.md` §32–35、`ROADMAP.md`。 > > 性能纪律(2026-09-08 起):逐线程 CPU 与 tracker 绝对 ns **对着 pull 臂基线记录**,不再作阻塞门(push 比 pull 多约 10% 逐线程 CPU 已被接受;该读数出自 -O0 APK,Release 基准线见 `MEASUREMENTS.md` §20),专门的优化阶段排在路线图推完之后。 @@ -25,7 +25,7 @@ MGPipe 是 MobileGL 前端(`MG_State` + `MG_Impl`)与后端(`MG_Backend` 三种构建/运行形态共用**同一份 backend 实现**:`monolith`(默认,接口在进程内直调)、`inproc`(同进程两个线程,CI 形态与渲染线程交付物)、`spawn`(`fork`+`execve` 出 server 进程,SPSC 共享内存 ring + FlatBuffers 控制面)。 -## 运行 P5 split lane +## 运行 split lane 本地门使用四个 flavour:`build-linux`(pull)、`build-push`(monolith push)、`build-verify`(影子比对)与 `build-split`(disaggregated + inproc)。split 运行时显式设置: @@ -34,16 +34,19 @@ MOBILEGL_TRANSPORT=inproc ctest --test-dir build-split -L integration-split --ou MOBILEGL_TRANSPORT=inproc ctest --test-dir build-split -L integration-gpu --output-on-failure ``` -`integration-gpu` 在 inproc 下仍是带已知 abort/wrong-answer 的普查车道;它的失败不会免除缩减路径和阴性控制的硬门。缩减路径的具名入口是 `DirectGLES.Split.*`;每条 entry 都带独立的 `MOBILEGL_LOG_FILE_PATH`,日志不共享,阴性控制也只读被选 entry 的私有文件。常用运行时旋钮: +`integration-gpu` 在 inproc 下仍是带已知 abort/wrong-answer 的普查车道;它的失败不会免除缩减路径和阴性控制的硬门。split 场景的具名入口包含 `DirectGLES.Split.*` 与 `DirectVulkan.Split.*`;每条 entry 都带独立的 `MOBILEGL_LOG_FILE_PATH`,日志不共享,阴性控制也只读被选 entry 的私有文件。常用运行时旋钮: | 变量 | 默认 | 用途 | |---|---:|---| +| `MOBILEGL_IPC_STAGE_MB` | `32` | 单次 staging 容量;P5b 真实负载普查与 Redmi 四臂显式使用 `256`,默认值不变 | | `MOBILEGL_IPC_VERB_BARRIER` | `1` | 每个 verb 等 `appliedSeq == emitSeq`;`0` 只作 E1 阴性控制 | | `MOBILEGL_IPC_AUDIT` | `0` | apply 返回后以 `0xDD` 填退休 staging,查跨返回持针 | | `MOBILEGL_IPC_STRICT_ERRORS` | `0` | 把 BARRIER-PULLED residual input 提升为具名 Fatal | | `MOBILEGL_IPC_ADOPT_TIER` | `2` | P5 split 使用 emulated persistent-map 路径;接受 `auto/0/1/2` | | `MOBILEGL_IPC_PERSISTENT_BLOCK_KB` | `64` | persistent-map 保守块推送粒度;`0` 是 E3(a) 阴性控制 | +P5b 的真实负载 profile 显式设置 `MOBILEGL_IPC_STAGE_MB=256`,用于容纳目标 trace 的单次 128 MiB 上传。它只增加容量,不提供分块传输;默认 32 MiB 对超大单次 blob 的拒绝仍是已知边界。设备 pull、push、splitctl、split 四臂使用同一 profile,profile 与源头、APK/library 身份一起记录。 + Android 有三份 APK flavour:pull、push 与 split-inproc;构建映射分别由 Gradle properties `mobilegl.pipePush`、`mobilegl.buildDisaggregated`、`mobilegl.buildDisaggregatedInproc` 驱动。split APK 仍需运行环境 `MOBILEGL_TRANSPORT=inproc`;不设置时是 split build 的 monolith control arm。 ## 文件地图 @@ -52,7 +55,7 @@ Android 有三份 APK flavour:pull、push 与 split-inproc;构建映射分 |---|---| | `ARCHITECTURE.md` | 已定稿的设计与架构:句柄与世代、调用目录、记录约定、tracker、纹理路径、shader 制品、反向通道、后端改造、传输、persistent map 分档、进程/EGL/平台、构建与纯度门、验证策略 | | `ROADMAP.md` | P0…P13 阶段表、两条跑道、GO/NO-GO 清单、再基线检查点、仍然开放的问题 | -| `MEASUREMENTS.md` | 逐阶段实测:P0(spike A/B、双设备边界计数器基线、桌面数据点、语料事实)、P1(verify harness 门)、P2(五部分门、两机配对 A/B、DriverBench T1/T2、计数器)、P3a(门、接缝缺陷、Track H 普查、两机 A/B)、P4a(门、契约七次修正与两轮终审修复、缝类审计、三臂设备 A/B、DriverBench T1/T2/T3)、P5(分头门证据、R-10、红米四臂 A/B、收官失败与 r2 修正)与复现命令 | +| `MEASUREMENTS.md` | 逐阶段实测:P0(spike A/B、双设备边界计数器基线、桌面数据点、语料事实)、P1(verify harness 门)、P2(五部分门、两机配对 A/B、DriverBench T1/T2、计数器)、P3a(门、接缝缺陷、Track H 普查、两机 A/B)、P4a(门、契约七次修正与两轮终审修复、缝类审计、三臂设备 A/B、DriverBench T1/T2/T3)、P5(分头门证据、R-10、红米四臂 A/B、收官失败与 r2 修正)、P5b(迁移、一次主机门、普查、收官审查与设备出口)及复现命令 | 代码地图(P0 已落地的部分): diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index d592150b..1c81645e 100644 --- a/docs/Disaggregated/ROADMAP.md +++ b/docs/Disaggregated/ROADMAP.md @@ -1,6 +1,6 @@ # MGPipe 路线图 -> 状态:**P0、P0.5、P1、P2、P3a、P4a、P5 已落地,P5b 进行中**。P5 收尾头 `37fc4fdb` 的缩减路径已有 IPC 帧;历史 joint OpenRA 双后端 2/2、SSIM 1.0。该头的最终全门在 E3(a) 的两条设计性 skip 处停止,r2 已修正选择并完成包内控制验证,不能把它写成合并头全门通过。当前先让四个 A/B trace 在 Redmi 的 `inproc` 下渲染,再做 P6 spawn。设计见 `ARCHITECTURE.md`,实测与证据边界见 `MEASUREMENTS.md` §26–31。 +> 状态:**P0、P0.5、P1、P2、P3a、P4a、P5 已落地,P5b 收尾中**。迁移集成头 `348d22a4` 已有 A=2 / B=54 / C=15;一次主机阶段门与合并普查正在完成,阶段唯一收官审查为 0 blocker / 2 major / 1 minor,三项已在 `82683d4a` 修复,包内定向 9/9 与 7/7(均 0 skip),合并确认待汇总。最后 APK/Redmi 出口未完成,不能标记 P5b 收官。P6 仍排在四个目标 trace 的 Redmi `inproc` 渲染之后。设计见 `ARCHITECTURE.md`,分头证据见 `MEASUREMENTS.md` §26–35。 ## 通用纪律(每个 commit) @@ -19,7 +19,7 @@ | **P3a** handle wave 1(Espryt):buffer、VAO | 18–23 | ✅(`fde5fda3`,44 个提交,`git diff --stat 5cb826b0 3e298c9a` = 37 文件 / +9273 / −230)**九条 `resource_*` 调用**接线:`ResourceCreate`、`ResourceRespecify`、`ResourceSubData`、`BufferSubDataResident`(`kOptional`,Magma 仍不注册)、`ResourceFlushRange`、`ResourceReadback`、`ResourceDestroy`、`MapPersistent`、`UnmapPersistent`——全部在 GL 调用时刻从 `BufferObject` 的十一处分发点发射(`ARCHITECTURE.md:157` 的唯一例外),落到新的句柄形后端表 `MGPipeResourceOps`(`MobileGL/MG_Pipe/PipeApply.h`,签名里没有任何 `MG_State` 类型);Espryt 的 `Ops_*` 行为逐条不变,只换了读输入的地方。**五条 vertex-input 调用**:`CreateVertexElements`/`BindVertexElements`/`DeleteVertexElements`(blob 两个视图都带,`MGPVertexAttribWire[]` + `MGPVertexBindingPointWire[]`,`ARCHITECTURE.md:132`)、`SetVertexBuffers`(`BaseInstance` 显式字段,取代 `g_pendingFetchBaseInstance` 那个 ambient 全局)、`SetIndexBuffer`。**第七张 Espryt slot 表**:`GLESBufferResource` 搬出 `PipeResource::m_backend`,进 `BackendSlotTable`(`MobileGL/MG_Backend/DirectGLES/Managers.h:691-692`)——第一张按 client 铸造、随调用过线的句柄索引的表。`kNeedsAck` 首次落到目录里(`ResourceRespecify`,逐记录谓词 `MGPipeResourceRespecifyNeedsAck(desc) == (desc.Immutable != 0)`,`MobileGL/MG_Pipe/MGPipeTypes.h:680`)。pool、延迟释放与三条 ring 原样搬(G5 十个函数逐字节相同);Adreno 禁用属性 SIGSEGV workaround 保留。**memo 普查(`ARCHITECTURE.md` §9.5)**:句柄臂上**退役 6 条身份 memo 成员**——VAO twin 的 `m_hasSyncedConfigVersion` / `m_syncedConfigVersion` / `m_syncedAttributeVersions`(`Array`,本阶段最大的一处)/ `m_syncedIndexBufferVersion` / `m_syncedIndexBufferObject`(裸前端指针),加 `ConvertedFloat64Stream::sourceLifetimeId`(即普查里 11 条直接删除的最后一条,`ConvertedVertexStreamKey` 的 `sourcePin`)。六条都**仍在 `MOBILEGL_PIPE_LEGACY_MEMOS` 下编译**(`Managers.h:1109-1130`、`:1067-1075`),pull 构建强制该开关 ON,所以 `sizeof` 一处不动——G1 的 0/0/0/0 就是这条的度量,真正的删除随 pull 路径在 P13 发生;**4 条重键** —— twin 的同步门(config version + 32 组逐属性版本 → `{elementsHandle, elementsSerial}` + `VertexBuffersSerial`)、twin 的索引槽 memo(回绕 `Uint16` + 裸 `BufferObject*` → 一个 `Uint64 m_syncedIndexSerial`)、`ResolvedDrawBuffers`(`configVersion` → `{elementsHandle, elementsSerial, buffersSerial}`,`Entry` 与 `iboFrontend` 各加 `MGPipeHandle`)、`ConvertedFloat64Stream`(前端 lifetime id + change serial → buffer `{slot, gen}` + applier `Serial`),另 `GLESBufferResource::syncedChangeSerial` 从镜像 `BufferObject::GetChangeSerial()` 改为镜像 applier 的 `Serial`;**保留不删** —— `g_pendingFetchBaseInstance` / `SetPendingFetchBaseInstance` / `GetPendingFetchBaseInstance` / `ScopedFetchBaseInstance` 与它的三个 scope 仍在 `MOBILEGL_PIPE_LEGACY_MEMOS` 下编译(`Managers.h:1189-1200`、`DirectGLES.cpp:5293`),因为真删会从 pull 构建移走两个符号 = 直接的 G1 破坏,计划里"grep 为空"那条在 P3a **不可达**;`PipeResource::m_backend` / `SetBackendResource` / `ReleaseBackend` / `BackendBufferResource` 同理(D-K,`ARCHITECTURE.md:286`),push 下只是不再被写,随 pull 路径在 P13 退役。**`map-persistent-roundtrips`(`mpr`)**:定义为**每一次 `MapPersistent` 发射,铸成或拒绝都算**(`ARCHITECTURE.md:485`),所以 monolith 下非零、可断言。子系统位 7(resources)与位 8(vertex input),push 默认 `0x7f` → **`0x1ff`**(`kMGPipeSubsystemsMigratedAtP3a`) | ✅ 五部分门(本地 `~/w7/pipe`):**G1** pull 符号 0 增 / 0 删 / 0 重命名 / **0 resize**、`.text` 10806323 字节不变(P3a 的认定 resize 集为空);**G5** 十个 pool / 延迟释放 / ring / flush-drain 函数对 `44c2b5cf` **与** `5cb826b0` 都逐字节相同,self-test 两个阴性对照(`ClearBufferPool`、`FlushPendingRangesNow`)都按名变红;`RenderStateImpl` sha 仍不变;**G2** pull 与 push 逐名相同(名差 0);**G14** 测试名 0 删除 / **+58**;单元 **1619** × {pull, push, verify};`integration-gpu` **958/958** × {pull、push、`MOBILEGL_PIPE_PUSH=0`、`0x7f`(G12 的子系统关闭臂)、`MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH=1`};buffer/VAO 族 **202/202**;`RenderStateSpans`/`Residual`/`VertexInputEmit`/`ResourceEmit` **48/48**;`HandleRecycle`(verify)**60/60**,含新的 buffer 用例三臂;`CsoContentAddressing` + `ResourceSubsystemControl` **10/10**,controls **64/64**;**G7** 两个阴性对照都按设计变红,vertex-input 那个**点名 `IsBgra`**;`integration-verify` **842/842**,零 `Fatal{`;`gen_pipe` 与 `gen_pipe_dirty_surface`(scan root 已扩到 `MG_State/GLState`,75 个 mutator 全映射、0 COARSE / 0 UNDECIDED)`--check` + `--self-test` 全绿。79 例 retrace:push 下 **79/79**,`MOBILEGL_PIPE_VERIFY=1` 下 **79/79 全部 armed、零分歧、零 `Fatal{`**;G3b 的具名五条都在这两次扫描里通过,**但单独那次具名扫描因门脚本把正则写成了逗号清单而选中 0 例**,且设备侧仍按开放问题 17 排除 `create-indirect`,所以 G3b 记为"桌面全绿、设备侧部分"——详见 `MEASUREMENTS.md` §16。**性能只记录不设门(用户 2026-09-08 规则 (a))**:MC 26.3 在 Adreno 上的 p99 对与两机 p50/p99 表见 `MEASUREMENTS.md` §20。**再基线检查点 1:实际日历 1 天(2026-09-08,四个包),远低于 27 天,不触发重定基线** | P2 | | **P4a** handle wave 2(Espryt):FBO / 纹理 / sampler / program 身份与描述符 | 26–34 | ✅(`8c458cd5`,101 个提交,`git diff --stat 37da3c3a 8c458cd5` = 86 文件 / +30066 / −384)**十四条族调用接线**:`set_framebuffer_state`、`create/delete_sampler_state`、`create/delete_sampler_view`、`set_texture_params`、`set_sampler_views`、`bind_sampler_states`、`set_shader_images`、`create/delete_shader_state`、`set_draw_program`/`set_dispatch_program`、`set_global_constants`;纹理与 renderbuffer 的 create/respecify/subdata/destroy **复用 P3a 的四条 `resource_*` 行**(D-D1),所以目录仍是 **71 条,P4a 一行未加**。**六种 kind 按 `{slot, gen}` 重键**:Texture、Renderbuffer、Framebuffer、SamplerCso、SamplerViewCso、ShaderCso——其中 sampler **state** 内容寻址(容量 256、引用计数防 LRU 驱逐掉仍被 `MGPTextureParams::BuiltinSampler` 指着的项),sampler **view** 按纹理对象身份寻址(D-F2),framebuffer 只有句柄没有 wire 生命期(D-I2)。子系统位 **9(framebuffer)/ 10(纹理资源)/ 11(sampler)/ 12(program)**,`MOBILEGL_PIPE_PUSH` 默认 `0x7f`→`0x1ff`→**`0x1fff`**。`CompositeResolver` 落地(program pipeline 解析成保留段里的一条 shader CSO,按 `(ContextId, 管线名)` 记忆——进程级单例配每上下文 GL 名,是复审在真实 make-current 序列上打出来的)。**契约改了七次才对**(`c0b`…`c0g`):birth 半边 hook 与发布 latch、`wants()` 看 wired 常量、四个缝的编码一次性写死(`MGPSubData::Target` 低字节资源目标 + 高字节上传目标、`DepthStencilMode` 0/1、`MGPSurface::Kind`、`Pad0`→`TextureTarget`)、Tracker 两个看不见自己主体的快门(`glBindSampler` 只动位 12 的世代、SSO 下 `GetCurrentProgram()` 恒 null)、`MGPipeFramebufferTarget::Named = 3`(**记录改按 framebuffer 句柄存**:原设计只存两个"当前绑定"记录,于是 `BlitNamedFramebuffer` / `ClearNamedFramebuffer*` 在句柄臂上打进一个从没拿到附件的 FBO)、**消费者门**(四族必须"某后端注册了 `MGPipeResourceOps`"才发射——Magma 没有 P4a twin,客户端却按 acceptance 清了 dirty,直接让 66 条 DirectVulkan 用例丢上传)、**客户端侧 D-K2 依赖表**(位 10 要位 7 和位 11,位 9 要位 10;只在服务端拒绝时客户端已经把标记清了)。emulation 在 split 下显式 Fatal 直到 P8(`MGPipeUnmigratedEmulation` 在 `Managers.cpp` 2 处、`DirectGLES.cpp` 4 处) | ✅ 全门(`6035c9d7` 全量 + `8c458cd5` 上复跑):**G1** pull 符号 0 增 / 0 删 / 0 重命名 / 0 resize、`.text` 字节不变(P4a 认定 resize 集为空;Espryt 侧靠预处理器宏而非 lambda/局部量改写——插一个 lambda 就会把同函数里九个既有 `$_N` 全部重编号);**G5** P3a 的十一函数 + P4a 自己的 **17 个区**(`scripts/p4a_untouched_regions.sh`,8 个阴性对照全部按名变红);**G2** pull 与 push 逐名相同 **2902**;**G14** 0 删除 / **+314**;单元 **1785 × 3**;`integration-gpu` **1117/1117 × 七臂**(默认 `0x1fff`、`0x1ff`、`0`、`0x9ff`、`0x5ff`、pull、`ESPRYT_DISABLE_INVALIDATE_FLUSH=1`),其中 DirectVulkan **559/559**;`integration-verify` **920/920 零 `Fatal{`**;79 例 retrace 在 verify 臂 **79/79 全 armed 零分歧**、push 臂 **79/79**、G3b 具名 **12/12**;**八族拒绝普查 = 0**(按族逐条 grep 服务端拒绝句,工具 `wsl_p4a_refusal_census.sh`;`ctest -V` 的普查是假零——console sink 被编译掉了,必须逐用例取自己的日志)。**G9 的"落地前必须红"没能通过公共 GL 达成**:回读模拟自己会设 `GL_DEPTH_STENCIL_TEXTURE_MODE`,`IsDrawSyncClean` 又在首次采样时推参数,所以该场景改成**白盒断言**(新增 `MG_IntegrationTest/Harness/PipeApplyPeek.{h,cpp}` 直接读 applier 的参数记录 + Espryt 已应用状态,变异下 4/4 变红),D 的 `SanityTest` 另加一条覆盖"推迟到首次取视图"的那半。真正红过再绿的是终审抓出的两条:per-level respecify 丢上传(`L0; draw(other); L1; draw(T)` 在 `0x1fff` 下读回全黑、`0x1ff` 下正常)与 delete-then-draw(`glTexImage2D; glDeleteTextures; draw` 在句柄臂 SIGABRT `pure virtual method called`)。**CTS `direct_state_access.framebuffers*` / `packed_pixels`(G15)未跑**,判在关键路径外,随 P3b/P4b 补。**再基线检查点 1b:实际 1 天(2026-09-08 起,六包并行 + 契约七修 + 两轮终审修复),远低于 39 天,未触发** | P3a | | **P5** 传输 + inproc applier + 发射表 | 12 | ✅(`ff2994d9..37fc4fdb`)同一 codec 上的 `InProcessTransport`;发射表、caps/reply;apply-thread context;lockstep barrier;tight ReadPixels;persistent-map 块推送;八包及 j0/x2/v1-r3 收尾 | 历史 joint:OpenRA 双后端 2/2、SSIM 1.0。收尾头:G1 0/0/0/0、.text +0,unit 1817×3 / 2086,push 1128、split-monolith 1149、reduced 22(含 2 skip)均零失败;**最终全门在 E3(a) 停止,Part 2/4 未到达**。收官审查 1 blocker / 10 major / 2 minor 转 r1/r2;证据见 `MEASUREMENTS.md` §31 | P4a | -| **P5b** `inproc` verb migration(进行中) | 按首阻塞迭代 | c0b 契约已落地;按 class-C 普查迁移 d1 索引/实例、多 draw,i1 image/compute/barrier,t2 XFB/曲面细分,f1 clear/copy/mip;r1/r2 修收官发现。基线为 432 passed / 185 skipped / 505 UnmigratedVerb abort / 27 failed | 各包负责的 slot abort 归零,逐场景/trace 报下一个 first blocker;合并后重普查。四个 A/B trace 在 Redmi 上由 apply 线程渲染后收官,全门一次、Codex 审查一次;期间只有包门与集成快门 | P5 | +| **P5b** `inproc` verb migration(收尾中) | 按首阻塞迭代 | d1 19、i1 7、t2 6、f1 11 槽已迁移;新增具名 blit lowering、GLES mip descriptor 路径、五槽 sync;P5 收官 r1/r2 已合入。合并头 `348d22a4`:A=2 / B=54 / C=15 | 主机 split 107 selected = 105 passed + 2 skipped;一次全门、合并普查与审查定向修复分别记账,见 `MEASUREMENTS.md` §32–34。Redmi 四 trace × 双后端正确性及四臂 A/B 尚待最终证据;256 MiB stage 为显式 profile,默认仍为 32 MiB | P5 | | **P6** spawn transport(后移) | 5 | `SocketTransport`(socketpair + fork/execve,envp 剔除 + 强制 monolith 双保险);`ServerMain`;`MOBILEGL_IPC_SERVER_PATH` + `dladdr` 兜底;有界重试握手;EOF 即时退出;device-lost latch | P5b 的完整渲染路径在 `spawn` 下绿;进程树只多一个子进程;`HeadlessGL` fork 预检无孤儿;OpenRA 在 Adreno 830 上 split SSIM ≥ 0.99 | P5b | | **P3b / P4b** 深化(Espryt) | 29–38 | **P4a 已经付掉的,别再排进来**:`ResolvedDrawBuffers` 重键(P3a 就做了)、Tracker 的集合 hash 抑制器(三个 unit set 各自带内容 hash,clientsp)、`g_unitTextureSyncList` 那条 unit-bindings epoch(E 的验证轮换成 sampler set serial,顺带重键四条下游 memo)、`MGPSubRegion` 的跨步描述符(P4a 的 `resource_subdata` 已经逐区携带 `SrcOffset`/`SrcRowStride`/`SrcSliceStride`)。**仍然欠着**:按存储属主键控的发射游标与 index 重映射(dirty 归属反转,P4a 只落了 drain list);`g_fboTextureSyncList`;`ResolvedTextureBindingMemo` / `SamplerPassMemo` / image sweep / program registry 的重键;XFB scatter 搬到 client;删 fragColor 重推导 workaround 与 `g_broadcastMemo*`;**raw-depth-fetch sampler 原生化**(`g_rawDepthFetchSamplerState` 至今是 `MG_Backend` 里的一个前端 `SamplerObject`,是句柄臂上唯一一处有意保留的前端读——P4a 终审的 R-6);回读 / pack state;外加 P4a 记下的 R-3(三处只活在包头里的编码收进契约)、R-4(`UseProgram`/`BindVertexArray` 两行的 G9 推导)、R-5(D-K2 依赖表两侧各一份,要合成一处)、R-7(三通道 CPU mipmap 重武装缺口)、R-10(六种新 kind 的 ABA 对照目前是惰性的,缺一个消费者 `if`)、R-11(`TextureUploadShapeScenario` 仍是"只记录不设门") | ~25 个纹理场景、21 个 program 场景 + `MG_Test/ShaderTranspiler`;两台设备 `KHR-GL46.texture_*`/`internalformat.texture2d.*`/`shader_image_*`/`packed_pixels` 在 pull 基线 0.5 pp 内;每一个 Iris trace;**`TextureUploadShapeScenario`**(形状金标,Mali 帧时增量必须发布);view/owner 发射游标别名场景;verify 保留模式下 subdata 形状逐项相等;XFB 场景 + `capture_special_interleaved_test` | P4a | | **P7** DirectVulkan(Magma)全量迁移 | 80–104 | §5.5 其余 10 个子系统(子系统 1、4 已在 P2):`SetupDrawSnapshot` 探测字段塌成 dirty mask;占位纹理原生化(~120 行删除);具名 UBO host payload(D-B8,`kCapNeedsHostUboBytes`);blit/depth-mipmap 内部 shader 烘焙 + 新鲜度测试;`VertexInputStateFactory` 裸指针写回删除;D18 容器纪律原样保留 | 集成 + 40 trace 在 Magma 的 push 与 split 下全绿;verify 零分歧;**`nm -D libMobileGLServer.so | grep glslang` 为空**;Iris trace 上 `stage-ubo-named` 逐帧字节发布;两台设备 CTS 0.5 pp 内。**再基线检查点 2:中点(第 40–52 工作日)完成子系统 < 40% 立即重定基线** | P0.5、P2;可与 P5/P6/P8 并行 | @@ -55,6 +55,8 @@ P5 的八个实现包(报告在 `~/w7/notes/p5/p5-results/`): - **P5 出口(2026-09-16)**:缩减路径首个 IPC 帧已经观察到;joint、落地快门、收尾头实跑分别记在 `MEASUREMENTS.md` §26/31。收尾头 `37fc4fdb` 的 E3(a) 控制因两条设计性 skip 失败;不能以早期 joint 或各包自门替代未完成的最终全门。红米 P5 四臂 A/B 的 split 均停在索引 draw,barrier tax 未测(`MEASUREMENTS.md` §30),迁移与重跑归 P5b。 - 原“第 104 天跨进程帧”后移到 `inproc` verb migration 之后;目标先是完整 separate-thread rendering,再是 separate-process transport(ID-66)。第 145 天全功能 split与第 187 / 267 天纯度门仍是方向,不据此伪造新日历。 +- **P5b 出口(待完成)**:主机迁移与阶段门不代替 Redmi 渲染证据;唯一收官审查后的定向修复不触发第二轮全门/审查。四臂统一采用 256 MiB stage profile,原始主机门固定在 `348d22a4`,最终设备源头另记。 + ## 第 43 天 GO/NO-GO 清单 手上必须有(**结算:继续**,2026-09-08): @@ -85,13 +87,13 @@ P5 的八个实现包(报告在 `~/w7/notes/p5/p5-results/`): 任一触发,先跑 `inproc` 的证伪数字再决定是否继续。 -## P5 出口记录的债务 +## P5/P5b 出口记录的债务 -ID-65 的原始处置与 ID-73 收官审查/r2 的更正如下。阶段接纳不等于这些路径正确;包内证据不替代最终合并头门。 +ID-65 的原始处置、ID-73 的 r1/r2 修复与 P5b 残余项如下。历史 27 条 wrong-answer 不是当前合并头计数,最终普查以 `MEASUREMENTS.md` §33 的同名比对为准。 | 债务 | 去向 / 当前口径 | |---|---| -| 27 个普通 inproc wrong-answer | **22**(14 layered + 3 packed depth/stencil + 5 framebuffer recycle)→ P4b/P7 texture readback;3 → P7 query;1 inspection → P6。FBO/RBO delete 那 1 条使用 ReadPixels,完整像素因果未隔离;收官确认的 client-thread framebuffer death 驱动调用另归 **r1 #2**,不得把所有 27 条统称纹理读回或断言均与 v1 无关 | +| P5 基线 27 个普通 inproc wrong-answer(历史) | **22**(14 layered + 3 packed depth/stencil + 5 framebuffer recycle)→ P4b/P7 texture readback;3 → P7 query;1 inspection → P6。FBO/RBO delete 那 1 条使用 ReadPixels,完整像素因果未隔离;client-thread framebuffer death 已由 **r1 #2** 转至 apply mailbox,原 FBO/RBO delete 像素用例在 r1 定向验证中通过;合并普查决定最终计数,不能从单例外推 | | `rsp` residual inputs | STRICT_ERRORS reduced lane 19 abort/2 skip;既有 rsp=35 只是有 stamp 读点的下界。无 verb stamp 的 sticky/non-verb forward 仍可绕过计数/strict;P7/P8 补逐字段归类和自证门(r2 提议),其余按字段的 P3b/P4b/P7 phase 退役 | | `SEG_REPLY` 2 MiB payload cap | 当前 `MaxReplyBytes = 2 MiB - 16`;更大 readback 需要 P6+ chunking 或专用 carrier(ID-47) | | `GetCaps` 的两个 blobref | 目前不骑 record;一旦运输,必须有 server→client carrier rule,不能套 `SEG_STAGE`(ID-48) | @@ -99,12 +101,15 @@ ID-65 的原始处置与 ID-73 收官审查/r2 的更正如下。阶段接纳不 | ABI fingerprint | 目前不混 segment sizes;改变 8/32/16 MiB + 256 KiB ledger 时仍欠这项(ID-47) | | max record bytes telemetry | **x2 已实测** reduced/OpenRA maxrec=784 B(SetVertexAttribDefaults),默认 cap=4 MiB;只代表所测负载,后续索引/indirect 尾仍须记录 | | E2 wire 内容控制 | x2 draw-drop:758 draws,SSIM 0.000036;clear-drop 被全屏 overdraw 掩盖,不能作 OpenRA 控制。**r2 已在包头验证 pull-library → 恢复原库 → draw-drop 顺序及 split 库身份** | -| E3 small-ring wait telemetry | x2 已证明 wrap,旧 ringwaits=1 只证明 reclaim。**r2** 改为等待 outstanding retirement 后才计数,1 MiB 时 wrap=1/wait=1,8 MiB 对照同时红;command-ring 等待与 shutdown 策略仍须与 r1 #4 合并 | +| E3 small-ring wait telemetry | x2 已证明 wrap,旧 ringwaits=1 只证明 reclaim。**r2** 改为等待 outstanding retirement 后才计数,1 MiB 时 wrap=1/wait=1,8 MiB 对照同时红;**r1 #4 已合入** command-ring retirement 等待,重试保留两条尾与 ordinal;超大单记录仍拒绝 | | E3(a) block-zero control | x2 补私有 disabled-push 诊断;j0 逐选项拒绝 skip。旧 6 selected 实为 4 red/2 skip,收尾全门因此停下;**r2** 精选 4 pixel case,每条必须自己的 assertion+私有诊断,且仍拒绝 pre-flight skip | -| E5 staged shadow 与 coherent map | v1-r3 的 unmapped 双 shadow 控制证明 ensure 上传 server pattern B,删保护会读 client A 并变红;**不能证明 coherent-map wire-only**。server re-entry 读 client MappedData/写 tracker 的绕过归 **r1 #1 blocker**,以仅取消 client pre-draw push 的具名控制退休 | -| tight ReadPixels PACK_SWAP_BYTES | 多字节 client scatter 丢 swap 语义,**r1 #3**;非对称 UNSIGNED_SHORT 像素与 monolith 对照 | -| ReadPixels reply 状态校验 | 正确长度但 status=3 仍可接受;P5b reply-protocol follow-up(r2 提议),须具名拒绝非 0/1/2;生产是否会发 3 未证实 | +| E5 staged shadow 与 coherent map | v1-r3 的 unmapped 双 shadow 控制证明 ensure 上传 server pattern B,删保护会读 client A 并变红;**不能证明 coherent-map wire-only**。**r1 #1 已合入** apply-role producer guard;仅取消 client pre-draw push 的两个像素控制均变红,恢复后变绿,见 `MEASUREMENTS.md` §32 | +| tight ReadPixels PACK_SWAP_BYTES | **r1 #3 已修** tight/scatter 的 component/packed-word swap;非对称 UNSIGNED_SHORT 像素在 monolith/inproc 均通过,混合 depth/stencil 按两个 32-bit word 处理 | +| P5b 收官审查三项 | **已在 `82683d4a` 修复**:user-index span 长度、长 ClientWaitSync 预算、ReadPixels 非 OK 状态;包内定向 9 passed + 7 passed,均零 skip;原始审查为 0 blocker / 2 major / 1 minor,证据见 `MEASUREMENTS.md` §34 | | CI / 控制 / 跑器 | **r2 包内已修** broad debt lane 吞掉后续控制、all-skip 绿、REQUIRE_GPU、E2 库恢复、E3 选择、陈旧/零用例普查、G5 pin 自测、c1f 旧名。外部 notes 脚本也有修改,git merge 不会自动传播;验收详见 `MEASUREMENTS.md` §31 | +| 默认 32 MiB staging 容量 | 128 MiB 单次上传不能装入默认 stage;P5b 普查/Redmi 显式 profile=256 MiB,默认不改。更大 blob 的分块/专用 carrier 仍属后续设计 | +| P5b 的 inproc 依赖 | 具名 blit 使用 scoped client binding + barrier;mip descriptor 的 registry 身份查询仍依赖 barrier-held object;FBO death 使用 inproc mailbox。P6 需替换这些跨地址空间不成立的路径 | +| 未迁移与仿真路径 | `348d22a4` 尚有 class-C 15 槽;client vertex arrays、multi-draw client indices、RGB 三通道 CPU mip/writeback、renderbuffer copy endpoint、未绑定 named clear 等保留具名拒绝或后续阶段债务;query/texture readback 的错答仍按普查记录 | | 临时 CI trigger | 合入 dev 前删除 `feat/disaggregated` 的 TEMPORARY trigger;不能随阶段遗留 | ## 仍然开放的问题 @@ -129,7 +134,7 @@ P0 已回答的不再列出(spike A 的域、spike B 的分档、`posix_spawn` 8. **一份反射归档能否服务三个消费者**(Espryt 读前端表、Magma 跑 SPIRV-Reflect、`DirectVulkan.cpp` 为 `glGetProgramResource*` 又反射一遍)。**P4a 答了 Espryt 那一半:能,而且不需要复制**——`create_shader_state` 过线的是逐 stage SPIR-V 与归档 blob 加上身份与序号,monolith 下 Espryt 仍直接读前端那份归档(D-H3),`ProgramArtifactsCodec.{h,cpp}` 只在 verify 构建里被调用,所以句柄化没有给热路径添一次编解码;换句话说"一份归档服务 Espryt"在 monolith 上已经是事实,跨进程时它就是那条 blob。**Magma 的两个消费者仍未答**(P7):`DirectVulkan.cpp` 为 `glGetProgramResource*` 重跑一遍反射这件事,P4a 没有碰。 9. **viewport-array 回放能否塞进一次 `draw_vbo`**:`EndViewportRoutingPasses` 会 `InvalidateSyncedRenderState`,各遍之间观察到的状态是否与今天一致未验证。 10. **`ResidentSubData` 的不对称怎么收口。** null 项保住今天的行为;给 Magma 补真实现是行为变更,独立 `dev` PR。**P3a 的处置(仍开放)**:不对称原样保留。`MGPipeResourceOps::SubDataResident` 是 `kOptional`、允许为 null,前端检查它就像今天检查 `g_bufferBackendOps->ResidentSubData` 一样;**P3a 没有给 Magma 补实现**(Magma 的 buffer 路径是 P7),`kCapResidentSubData` 也没有接线。所以这条问题原样留给 P7 / 独立 `dev` PR。 -11. **`SEG_STAGE` 的上限。** 六类新字节需要 P8 之后用 MC in-world 与 Create 两类 fixture 的 `stage-*` 计数器给 p99 占用;G3 分块路径需要设计与测试。 +11. **`SEG_STAGE` 的上限。** P5b 目标负载已实测单次 128 MiB 上传,超过默认 32 MiB;完整 trace 普查及 Redmi 四臂统一显式设置 256 MiB。默认不变,分块路径尚未实现;P8 仍需 MC in-world / Create 的占用分布与更大 blob 的 carrier 设计。 12. **P13 之后 split-only 渲染 bug 的 server 侧第二意见。** verify 构建 + recorder 只覆盖推送内容,不覆盖后端对它的解释。 13. **烘焙后的内部 shader 能否在没有活 `ProgramObject` 的情况下表达 uniform location 与 UBO 布局。** 未做原型。 14. **推送模型改变哪些按拉取模式调过的缓存命中率。** 幸存者容量在 P13 重调。