[Docs] (P8): re-scope the phase - strike the original scope in the roadmap and the P8 README, add PLAN-P8 (six items closed, packages P8-0 and A-G, the rewritten gates) and rulings ID-P8-1..4, and mark P8 in progress on the status page

This commit is contained in:
2026-09-29 21:31:15 -04:00
parent 0b55b55d4d
commit 8d3e2317a6
5 changed files with 93 additions and 31 deletions
+14 -19
View File
@@ -1,32 +1,27 @@
# 当前阶段:P11 已收官(2026-09-29);下一阶段 P8 待排
# 当前阶段:P8 进行中(2026-09-29 起)
> **更新 2026-09-29**。这一页只有摘要;计划、裁定与测量在 [`notes/p11/README.md`](notes/p11/README.md)(计划 [`PLAN-P11.md`](notes/p11/PLAN-P11.md)、裁定 [`INTEGRATOR-DECISIONS-P11.md`](notes/p11/INTEGRATOR-DECISIONS-P11.md))。上一阶段 P10 同日收官,见 [`notes/p10/README.md`](notes/p10/README.md)。
> **更新 2026-09-29**。这一页只有摘要;计划与裁定在 [`notes/p8/PLAN-P8.md`](notes/p8/PLAN-P8.md)、[`notes/p8/INTEGRATOR-DECISIONS-P8.md`](notes/p8/INTEGRATOR-DECISIONS-P8.md)。上一阶段 P11 同日收官,见 [`notes/p11/README.md`](notes/p11/README.md)。
## 目标
大 buffer(≥ 16 MiB)的 persistent map 在 split 下诚实地落在它声明的档位上;同一台设备上从其他 app 启动的 GL 程序(Termux 一类)能走共享内存,并能导入 client 分配的 AHardwareBuffer(T0)。
补齐 server 侧仿真缺口(Espryt 生成 mip、Espryt 暂存影子与 GPU 写、Magma wire indirect、CopyImage),并把 monolith 用例登记到 split 各臂;为 P13 删掉旧的「后端直接读前端」路径扫清前置。原范围已重定界(划掉保留在 [`notes/p8/README.md`](notes/p8/README.md))。
## 完成情况
| 项 | 状态 |
|---|---|
| 范围重划 | ✅ `gPipeInputs` 版本化与 T1 关闭;采纳基线三个数撤下,改为同会话重测(ID-P11-1) |
| 合并 dev(重铸读回、局部上传、Magma 排序、Magma `eglSwapInterval`) | ✅ 两后端 × 单进程 / Split / Spawn / Tcp;push 单进程臂上的一个丢写已修;G1 换基线(ID-P11-6) |
| A1 档位在握手时定 | ✅ Stream 上一行具名拒绝后 T2;共享段上 client 握手期具名 Fatal;无线上格式改动 |
| A2 断言 arena 落在哪一档、三臂登记 | ✅ 两后端 |
| A3 T0 在 app 域 | ✅ 两后端 GO(含 128 MiB 与持续锁定) |
| A4 采纳基线(Adreno 830) | ✅ 采纳省 RSS 360–480 MB、不改帧时;split T2 在 MC 26.3 上 RSS 1.4–2×、p99 Espryt +37–42% / Magma 约 2.5×(`notes/p11/A-DEVICE.md`) |
| B0 跨 app client 探针 | ✅ SELinux 挡连接,连上后共享段可用(`notes/p11/B0-CROSS-APP.md`) |
| PAIR 连接按 nonce 配对 | ✅ 控制协议修订 3 → 4 |
| helper 可行性探针 | ✅ 无 Context 的 `app_process` helper 经 Binder 拿到连接(依赖 ROM,`HSPIKE.md`) |
| 合并 dev(M2) | ✅ KGSL 分段提交、零散写入按矩形(补齐 split 半边)、描述符池 |
| B1 同机外部 client 走共享内存 | ✅ `fd:` 端点 + 令牌 broker + helper + 启动命令 + 外部 client 的 apply 线程策略;rd12 Espryt 约 119 vs tcp 40–53 fps |
| B2 T0 零拷贝导入 | ✅ 两后端、同 app 与外部路线;**默认开**(用户),用不了静默退回 T2;MC 26.3 峰值内存 Espryt −41–42 %、Magma −18–26 %(`notes/p11/B2-DEVICE.md`) |
| 顺带修掉 | 删除仍绑定的 buffer 留旧句柄、Magma 空 uniform 绑定段错误、Espryt split 用例跳过算通过 |
| 主机门(收官头) | ✅ 全绿,数字见 ID-P11-20 |
| 只读核查与重定界 | ✅ 原 10 项里 6 项已完成、直接关闭(ID-P8-1) |
| P8-0 普查(设备 + 主机) | 进行中 |
| A 覆盖对齐 | 进行中 |
| B Espryt 生成 mip | 进行中 |
| C Espryt 暂存影子与 GPU 写 | 进行中 |
| D Magma wire 原生 indirect | 进行中 |
| E CopyImage 在 server store 上 | 进行中 |
| F 死闩清理与重分类 | 进行中 |
| G 大 blob 分片 | 等 P8-0 的测量 |
## 下一步
拆分路线已走完。按 [`ROADMAP.md`](ROADMAP.md):**P8**(monolith 跑道:把读前端字节的 CPU 变换下放到 client、仿真路径下放、协议广度),之后 P13(删掉旧的「后端直接读前端」路径);P6.5 残余与 P3b / P4b 余项并行。
第一波七包并行(ID-P8-4);逐包集成进 `p8/main` 并跑整套门。
**待用户决策**:P8 开工确认(只读核查在跑);[`DEBTS.md`](notes/DEBTS.md) 六项「需裁定」(CI 触发条件、`TCP_USER_TIMEOUT`、HyperOS 下 FCL 保活、Mali 复测、TLS、`IDLE_EXIT_S`)。
**待用户决策**:[`DEBTS.md`](notes/DEBTS.md) 六项「需裁定」(CI 触发条件、`TCP_USER_TIMEOUT`、HyperOS 下 FCL 保活、Mali 复测、TLS、`IDLE_EXIT_S`)。
+2 -2
View File
@@ -1,6 +1,6 @@
# 路线图(索引)
> **2026-09-29**:P0 到 P7、P12、P9、P10、**P11** 已完成——拆分路线走完。P11:同机大缓冲零拷贝(T0,默认开、用不了静默退回共享内存;MC 26.3 峰值内存 Espryt −41 %、Magma −18–26 %),同机其他 app 启动的 GL 程序(Termux 类)经 `app_process` helper 与令牌 broker 走共享内存,连接按 nonce 配对;契约 `MG_Remote/CONTRACT-P11.md`,G1 仅 Magma 空 uniform 修复 +224 字节 `.text`。下一阶段 **P8**(monolith 跑道:仿真路径下放与协议广度),之后 P13。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。
> **2026-09-29**:P0 到 P7、P12、P9、P10、**P11** 已完成——拆分路线走完。P11:同机大缓冲零拷贝(T0,默认开、用不了静默退回共享内存;MC 26.3 峰值内存 Espryt −41 %、Magma −18–26 %),同机其他 app 启动的 GL 程序(Termux 类)经 `app_process` helper 与令牌 broker 走共享内存,连接按 nonce 配对;契约 `MG_Remote/CONTRACT-P11.md`,G1 仅 Magma 空 uniform 修复 +224 字节 `.text`。当前阶段 **P8**(09-29 起,重定界:~~仿真路径下放与协议广度~~ → 补齐 server 侧仿真缺口与 split 覆盖,[`PLAN-P8.md`](notes/p8/PLAN-P8.md)),之后 P13。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。
## 目标
@@ -33,7 +33,7 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不
| [P3b / P4b](notes/p34b/README.md) | GLES 后端的深化与收尾 | 大部分 ✅,余项并行 |
| [P7](notes/p7/README.md) | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 |
| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | ✅ 09-29:出口门 B(跨机 TCP)✅ 09-28、A(FCL + 杀 server)✅ 09-29;契约 `MG_Remote/CONTRACT-P12.md`;G1 成立;余项进 [`DEBTS.md`](notes/DEBTS.md) |
| [P8](notes/p8/README.md) | 把剩余的仿真路径挪到正确的一侧,补齐协议 | 待排 |
| [**P8**](notes/p8/README.md) | ~~把剩余的仿真路径挪到正确的一侧,补齐协议~~ → **补齐 server 侧仿真缺口与 split 覆盖**:Espryt 生成 mip(RGB16F / RGB32F、存储窗口)、Espryt 暂存影子与 GPU 写对账、Magma wire 原生 indirect、CopyImage 在 server store 上处理、monolith 用例登记到 split 各臂;原范围 6 项前序阶段已完成([`PLAN-P8.md`](notes/p8/PLAN-P8.md)) | 进行中(09-29 起) |
| [**P9**](notes/p9/README.md) | **反向通道:回读、日志、重铸不再同步等待 client** | ✅ 09-29:PACK-PBO 回读 fire-and-forget(两后端)、日志分级转发、重铸无拉取(`OnLog` / `OnTexturePullRequest` 删,回调 9 → 7),F1 / F2;契约 `MG_Remote/CONTRACT-P9.md`;G1 成立;事件量批处理无实测需求不做;余项进 [`DEBTS.md`](notes/DEBTS.md) |
| [**P10**](notes/p10/README.md) | **同步对象、查询与帧节奏** | ✅ 09-29:fence 轮询由 server 报告本地作答(`kEventFenceSignaled`、`MOBILEGL_IPC_POLL_ESCALATE`;主机 Magma·tcp −37%,Adreno 830 上两后端 0 次往返);`SetSwapInterval` 转发、class C 清零;query / XFB / AsyncCompile 登记 split 各臂;credit 1/2/3 设备 loopback 在噪声内;契约 `MG_Remote/CONTRACT-P10.md`;G1 成立;余项进 [`DEBTS.md`](notes/DEBTS.md) |
| [**P11**](notes/p11/README.md) | **同机大缓冲零拷贝共享** | ✅ 09-29:T0 零拷贝导入(两后端,默认开,自测不过或 Stream 上静默退回 T2);同机外部 client 经 helper + 令牌 broker 走共享内存(B1);连接按 `PairBind` nonce 配对(修订 5);采纳档位在握手时定;契约 `MG_Remote/CONTRACT-P11.md`;余项进 [`DEBTS.md`](notes/DEBTS.md) |
@@ -0,0 +1,10 @@
# P8 集成者裁定日志(server 侧仿真缺口与 split 覆盖)
> 形式沿用 [`../p11/INTEGRATOR-DECISIONS-P11.md`](../p11/INTEGRATOR-DECISIONS-P11.md):一条裁定一个 ID,只记「定了什么、为什么、影响哪些文件」。计划见 [`PLAN-P8.md`](PLAN-P8.md)。
| ID | 日期 | 裁定 | 理由 | 影响 |
|---|---|---|---|---|
| ID-P8-1 | 2026-09-29 | **重定界**(用户批准):原范围在 `README.md` 与路线图行里划掉保留;方向改为补 server 侧缺口与 split 覆盖;原 10 项里 6 项与 2 个门、开放问题 9 关闭(`PLAN-P8.md`「已关闭」表)。 | 只读核查逐项对代码:split 可达的仿真拒绝只剩 Espryt 生成 mip 两名;client 侧工作已由 P5b–P9 完成。 | `ROADMAP.md`、`notes/p8/` |
| ID-P8-2 | 2026-09-29 | 门改写:覆盖门 = 归一化后 split ⊆ monolith ∪ 豁免表;create-indirect 往返门 = 多帧设备 trace 加载帧非 `ResourceCreate` 等待 = 0。 | 原两门按字面不可达 / 是空的(trace 只 1 帧)。 | A 包、P8-0 |
| ID-P8-3 | 2026-09-29 | G1 不变;各包 split 半边放在 `MOBILEGL_BUILD_DISAGGREGATED` 下。monolith 半边(例如 B2 的 CPU 滤波读陈旧影子)若 red-once 证实,在 dev 上单独修再合并(用户同意)。 | 沿用 P9 / P11 做法。 | B、C、E |
| ID-P8-4 | 2026-09-29 | 第一波七包并行(P8-0、A、B、C、D、E、F,树 `~/w7/p8-<包>`,分支 `p8/<包>`,集成树 `~/w7/p9-main` 分支 `p8/main`);G 等 P8-0 的测量;C、D 为 P13 前置。设备只由 P8-0 使用(红米,约半天,用户同意)。 | 各包改动区域不重叠(`DirectGLES.cpp` 按行段分开)。 | 全部 |
+44
View File
@@ -0,0 +1,44 @@
# P8 计划(重定界,2026-09-29)
> 依据:只读核查(树外 `~/w7/notes/p8/AUDIT-P8.md`,审计树 `p11/main`)。用户 09-29 批准重定界并开工。原范围划掉保留在 [`README.md`](README.md)。裁定见 [`INTEGRATOR-DECISIONS-P8.md`](INTEGRATOR-DECISIONS-P8.md)。
## 结论
- 原方向"把仿真搬到 client"对剩下的工作不成立:三个真实缺口都在 server 侧(Espryt 生成 mip、Espryt 暂存影子与 GPU 写、Magma wire indirect)。
- split 可达的 `UnmigratedEmulation` 只剩 Espryt 生成 mip 的两个名:`generate-mipmap-cpu-filter`(`DirectGLES.cpp:12907-12912`,RGB16F / RGB32F)与 `generate-mipmap-storage`(`DirectGLES.cpp:11631-11653`,存储检查比 GL 要求严)。
- `MultiDraw*+CLIENT_INDICES` / `+INSTANCED` 四个 server 闩(`PipeApplier.cpp:972-978`)我们的 client 已发不出,只剩对外来 peer 的协议守卫。
- 396 个只在 monolith 登记的用例,CI 的 A/B 步骤已用 inproc 全量重跑(`test.yml` Transport A/B),缺的是按名登记、spawn / tcp 两臂与武装断言。
## 已关闭(无需工作)
| 原项 | 由谁完成 | 证据 |
|---|---|---|
| `HostResolve.cpp` 最大索引扫描、`*IndirectCount` | `beba0256` 自有 buffer、`62bfe461` ClientFetchPlan;server 读自己的影子 | `ClientFetchPlan.h:203-240`、`DirectGLES.cpp:9533-9571`、`DirectVulkan.cpp:381-385` |
| `Server/IndexHostMirror`、`index-mirror-bytes` | 不建:server 每个 buffer 已有 R-11 暂存影子,restart 重写从它读 | `DirectGLES.cpp:9198-9252` |
| multi-draw client indices | client 拼成一个自有 EBO | `EmitTables.cpp:688-709`、`OwnedDrawInputs.h:51` |
| `texture-remint-pull` | P9 W2 | [`../p9/W2-REMINT.md`](../p9/W2-REMINT.md) |
| `kCapDriverOrderedXfbCapture` | 被 `kCapBackendOwnsXfbCapture`(P5b t2)取代 | `MGPipeTypes.h:124-135` |
| viewport-array 回放(开放问题 9) | server 一次 draw 内按状态分组回放 | `DirectGLES.cpp:8421-8465` |
| 门 `ClientArrayAfterComputeWriteScenario` | 改名 `ClientVertexArrayScenario.GpuWritten*`,已登记 split 各臂 | `ClientVertexArrayScenario.cpp:271` |
| 门 trace split SSIM ≥ 0.99 | P7 最低 0.9935 | [`../p7/iris-census-1135c664.md`](../p7/iris-census-1135c664.md);出口再跑一次 |
## 包(第一波并行:P8-0、A、B、C、D、E、F;G 等 P8-0)
| 包 | 内容 | 门 | red-once |
|---|---|---|---|
| P8-0 普查 | 设备(红米,两后端)与主机的 trace 语料:monolith 下临时插桩计 5 个 `UnmigratedEmulation` 点、mip 窗口谓词、GPU 写过的 EBO / 参数被 CPU 读、CopyImage 到非可渲染格式的命中数;spawn 下 grep `Fatal{` / `Refuse{` / `MGWIRE-DECLINES`,`MOBILEGL_PIPE_STATS=1` 取逐 op 等待与最大暂存 blob。插桩不提交 | 普查报告:每名命中数与定性 | — |
| B | Espryt 生成 mip:B1 存储检查改读计划窗口(`VerbMipBaseLevel` / `LevelCount`、MaxLevel、immutable);B2 RGB16F / RGB32F 在 server 完成(原生可渲染时 `glGenerateMipmap`,否则 server 从自己的层做 CPU 滤波),删 `cpu-filter` 闩,修 `PipeCatalogueTest` 名单 | 新 F1 用例:R11F_G11F_B10F / 深度 × {MAX_LEVEL 偏小、部分 TexStorage};RGB16F 仅采样与渲染目标 × 生成 mip;两后端 × split / spawn / tcp | B1 在当前头上 split 预期 `Fatal{UnmigratedEmulation,"generate-mipmap-storage"}`,不红就关 B1;B2 去掉新臂即 Fatal |
| C | Espryt server 暂存影子与 GPU 写对账:被 draw / dispatch 写过的 buffer 标脏,CPU 读者(restart 重写、IndirectCount、原生 indirect 的 baseVertex、MultiDraw 重定基)先做 server 本地回读 | compute 写 EBO + restart 索引;compute 写参数 + `MultiDrawElementsIndirectCount` | 去掉对账即像素错;不红就关 C |
| D | Magma wire 臂原生 `vkCmdDraw*Indirect[Count]`(`DirectVulkan.cpp:375-431`),CPU 展开只留在 monolith 也展开的场合 | create-indirect × Magma × split 每帧 `WaitForWireBufferHostAccess` 次数与毫秒 → 0,create-indirect / instancing SSIM 不变 | 强制 CPU 路径即等待 > 0 |
| E | CopyImage 在 server store 上处理(复制 store 字节,或把目标层标 GPU 脏),不搬到 client;删 `DirectGLES.cpp:13118-13129` 过时注释与死闩 | copy 到 RGB16 / RGBA16_SNORM 后 `glGetTexImage`,强制影子路径开关 | 去掉即陈旧字节 |
| A | 覆盖对齐:(a) 类用例登记到 split / spawn / tcp(tcp fixture 带 ENV);撤 `ClientSideIndices` 排除;豁免表(机制 / 单后端 / 无记录 / 进程内 peek);脚本强制归一化后 split ⊆ monolith ∪ 豁免 | 新脚本 rc 0;各 split 车道全绿 | 删一条登记即按名红 |
| F | 重分类:`PipeApplier.cpp:972-978` 改 `ProtocolCorruption`;`WireDraw.inc:297` 去 `@P8`;Magma mip 着色器形状在 split 由 Fatal 改具名拒绝(与 monolith 一致);`kCapNeedsHost*` / `kCapViewportArray` 标保留位 | `fatal_census` / `PeerLatchTest` 绿 | PeerLatch 仍按名闩住 |
| G | 大 blob(program archive、`draw_vbo` range 尾):P8-0 测得最大值大于 arena / 4 才做分片 | 测量报告 | — |
## 门(改写,ID-P8-2)
- **覆盖**:归一化前缀后 `DirectGLES.Split.*` ⊆ `DirectGLES.*` ∪ 豁免表(原因类必填),脚本强制;取代"逐名相同"(机制类、单后端、进程内 peek 用例天生只属 monolith,按字面不可达)。
- **create-indirect 往返**:原 trace 只有 1 帧,门是空的;改为多帧设备 trace 上加载帧非 `ResourceCreate` 等待 = 0。
- **trace split 双后端 SSIM ≥ 0.99**(含两个 `coherent_as_flush` fixture),出口再跑。
- **P13 前置**:C、D 先于 P13 落地,否则删掉 monolith 臂后继承 split 臂的缺陷。
- **G1**:pull 构建不变;split 半边在 `MOBILEGL_BUILD_DISAGGREGATED` 下。monolith 半边若 red-once 证实有缺陷,在 dev 上单独修再合并(ID-P8-3)。
+23 -10
View File
@@ -1,15 +1,28 @@
# P8 — emulation 下放 + 索引宿主镜像 + 协议广度(待排)
# P8 — ~~emulation 下放 + 索引宿主镜像 + 协议广度~~ → server 侧仿真缺口与 split 覆盖(进行中,2026-09-29 起)
> 尚未开工。本页保存该阶段在路线图上的完整范围与出口门(2026-09-24 从 [`ROADMAP.md`](../../ROADMAP.md) 阶段表移入,原文照录);阶段开工后,计划、裁定与报告都放在本目录。
> **2026-09-29 重定界**(用户批准):只读核查发现原范围 10 项里 6 项已由前序阶段完成,剩下的缺口都在 server 侧,不是"搬到 client"。计划 [`PLAN-P8.md`](PLAN-P8.md);裁定 [`INTEGRATOR-DECISIONS-P8.md`](INTEGRATOR-DECISIONS-P8.md)。下面原范围照录并划掉,不删。
## 摘要
## 重定界后的包
- monolith 跑道,P7 之后。把读前端字节的纯 CPU 变换下放到 client(`MG_Impl/Pipe/HostResolve.cpp`:最大索引扫描、`*IndirectCount` 解析);`Server/IndexHostMirror` **待重裁**(a6 实测宿主索引 span 无 producer);multi-draw client indices、CopyImage 镜像、`generate_mipmap` CPU 回退、`texture-remint-pull` 仿真下放;大 blob carrier 只剩 program archive 与 `draw_vbo` range 尾(与 P6.5 sl 共用分片)。
- 门:`DirectGLES.Split.*` 与 `DirectGLES.*` 逐名相同;trace split 双后端 SSIM ≥ 0.99;`create-indirect` 上 roundtrips-per-frame 读零。
| 包 | 内容 |
|---|---|
| P8-0 | 普查:设备与主机 trace 语料上各拒绝点 / 仿真谓词的命中数;split 日志与逐 op 等待 |
| A | 覆盖对齐:monolith 用例登记到 split / spawn / tcp,豁免表 + 归一化名单门 |
| B | Espryt 生成 mip:存储检查读计划窗口(B1);RGB16F / RGB32F 在 server 完成(B2) |
| C | Espryt server 暂存影子与 GPU 写对账 |
| D | Magma wire 臂原生 indirect(不再 CPU 展开 + 等 GPU 空闲) |
| E | CopyImage 在 server store 上处理 |
| F | 死闩清理与重分类(无行为变化) |
| G | 大 blob 分片:按 P8-0 的测量决定做不做 |
## 阶段表行(原 `ROADMAP.md`)
## 摘要(原文,已划掉)
- **阶段**:**P8** emulation 下放 + 索引宿主镜像 + 协议广度
- **状态**:待排
- **落地什么 / 范围**:`MG_Impl/Pipe/HostResolve.cpp`(~~client 数组范围~~ 已由 `beba0256` 落地为 owned buffer;最大索引扫描、`*IndirectCount` 解析,逐站点 reconcile);`Server/IndexHostMirror` **待重裁**(树里 0 处;a6 §6 实测宿主索引 span 无 producer、client 索引已是 owned buffer——按 `kCapNeedsHostIndexBytes` 的真实消费者重新裁定,不照抄 `ARCHITECTURE.md` §10.3);multi-draw client indices(`MultiDrawElements+CLIENT_INDICES` 仍具名拒绝);CopyImage 镜像搬到 client;viewport-array 回放验证;`generate_mipmap` 计划 + CPU 回退纹素;`texture-remint-pull` 仿真下放(15 处具名拒绝);大 blob carrier 只剩 **program archive 与 `draw_vbo` range 尾**(a6 §6;与 P6.5 sl 共用同一分片);`kCapDriverOrderedXfbCapture`(0 处);~~无 present fence tick~~ 只记在 P10
- **验收门 / 证据**:`'^DirectGLES\.Split\.'` 与 `'^DirectGLES\.'` 逐名相同;trace split 双后端 SSIM ≥ 0.99 含两个 `coherent_as_flush` fixture;`ClientArrayAfterComputeWriteScenario`;`create-indirect` 上 `roundtrips-per-frame` 读零;`index-mirror-bytes` 逐用例发布
- ~~monolith 跑道,P7 之后。把读前端字节的纯 CPU 变换下放到 client(`MG_Impl/Pipe/HostResolve.cpp`:最大索引扫描、`*IndirectCount` 解析);`Server/IndexHostMirror` **待重裁**(a6 实测宿主索引 span 无 producer);multi-draw client indices、CopyImage 镜像、`generate_mipmap` CPU 回退、`texture-remint-pull` 仿真下放;大 blob carrier 只剩 program archive 与 `draw_vbo` range 尾(与 P6.5 sl 共用分片)。~~
- ~~门:`DirectGLES.Split.*` 与 `DirectGLES.*` 逐名相同;trace split 双后端 SSIM ≥ 0.99;`create-indirect` 上 roundtrips-per-frame 读零。~~
## 阶段表行(原 `ROADMAP.md`,已划掉)
- ~~**阶段**:**P8** emulation 下放 + 索引宿主镜像 + 协议广度~~
- ~~**状态**:待排~~
- ~~**落地什么 / 范围**:`MG_Impl/Pipe/HostResolve.cpp`(client 数组范围已由 `beba0256` 落地为 owned buffer;最大索引扫描、`*IndirectCount` 解析,逐站点 reconcile);`Server/IndexHostMirror` **待重裁**(树里 0 处;a6 §6 实测宿主索引 span 无 producer、client 索引已是 owned buffer——按 `kCapNeedsHostIndexBytes` 的真实消费者重新裁定,不照抄 `ARCHITECTURE.md` §10.3);multi-draw client indices(`MultiDrawElements+CLIENT_INDICES` 仍具名拒绝);CopyImage 镜像搬到 client;viewport-array 回放验证;`generate_mipmap` 计划 + CPU 回退纹素;`texture-remint-pull` 仿真下放(15 处具名拒绝);大 blob carrier 只剩 **program archive 与 `draw_vbo` range 尾**(a6 §6;与 P6.5 sl 共用同一分片);`kCapDriverOrderedXfbCapture`(0 处);无 present fence tick 只记在 P10~~
- ~~**验收门 / 证据**:`'^DirectGLES\.Split\.'` 与 `'^DirectGLES\.'` 逐名相同;trace split 双后端 SSIM ≥ 0.99 含两个 `coherent_as_flush` fixture;`ClientArrayAfterComputeWriteScenario`;`create-indirect` 上 `roundtrips-per-frame` 读零;`index-mirror-bytes` 逐用例发布~~