mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-16 06:23:23 +09:00
[Docs] (P12): close the phase - the contract, the disposition of every leftover item, a G1 line that only compares same-machine builds, and the doc citation the docs reshuffle broke
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
# P12:server 自有屏幕窗口
|
||||
|
||||
2026-09-29。依据 `docs/Disaggregated/notes/p12/`([`PLAN-P12.md`](../../docs/Disaggregated/notes/p12/PLAN-P12.md)、裁定 `INTEGRATOR-DECISIONS-P12.md` ID-P12-1..15、验收 [`CROSSHOST-ACCEPTANCE.md`](../../docs/Disaggregated/notes/p12/CROSSHOST-ACCEPTANCE.md) / [`FCL-ACCEPTANCE.md`](../../docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md))。本文只记实现所需的协议与行为;验证结果以那些文件里的运行证据为准。
|
||||
|
||||
## 范围
|
||||
|
||||
server 应用自己拥有一个窗口,把 client 渲染的帧直接上屏;client 不需要窗口。**离屏(pbuffer)路径不变**,两条路径**每会话只有一条活跃**。不在本阶段:X11 / Win32 / None 窗口种类的白名单(D8)、cached-app freezer 的完整处理、多 context、TLS、把触摸转发给 client。
|
||||
|
||||
## 配置
|
||||
|
||||
- client:`MOBILEGL_IPC_SURFACE=offscreen|server`(默认 `offscreen`)。`server` 让 `eglCreateWindowSurface` 向远端 server 要它自己的窗口;没有远端 server 时忽略并说一次。
|
||||
- server:进程是否拥有显示由宿主决定(`ServerDisplay` 钩子已安装 = 拥有)。fork 出的离屏 supervisor 不拥有。
|
||||
|
||||
## 线上格式(控制面修订 3)
|
||||
|
||||
- `WindowKind.ServerOwned = 7`,只在 `CreateWindowSurface` 上合法;`nativeToken` 恒为 0,**没有任何指针过线**(Rule G / H)。`SetWindowHandle` 不得指名它(`SurfaceRefusal::ServerOwnedOnSetWindowHandle`)。
|
||||
- `SurfaceReply` 追加 `width`、`height`(server 窗口实际尺寸)与 `refusal`。`SurfaceRefusal`:`NoServerDisplay`(server 没有显示)、`NoServerWindow`(有显示但等不到窗口)、`SurfaceModeMismatch`(会话已被另一种表面模式闩定)、`ServerOwnedOnSetWindowHandle`。拒绝是具名的 `ok=false` 应答,**不闩会话**。
|
||||
- 修订号 2 → 3,`wireFingerprint` 随之移动:client 与 server 一起重装。
|
||||
- client 的 `SetWindowHandle` 不再无条件发送(server-owned 模式下不发)。
|
||||
|
||||
## 表面模式
|
||||
|
||||
会话的表面模式在**第一次成功的表面创建**时闩定:ServerOwned 窗口 → 上屏,pbuffer → 离屏;之后另一种具名拒绝(`SurfaceModeMismatch`)。client 自己命名的窗口(X11 / Win32 / None)既不闩也不拒(D8 未关)。
|
||||
|
||||
## 窗口租约与失窗
|
||||
|
||||
- `ServerDisplay` 持有窗口引用与租约;创建表面时 apply 线程按需取租约。窗口没有时等(有界),同时按 `SurfaceProgress` 心跳,client 读作"还在跑"而不是"活着但沉默"。
|
||||
- **失窗的顺序即契约**(`surfaceDestroyed` → `Detach`):apply 线程先让后端放掉窗口(Espryt 销毁 EGL surface / context,Magma 销毁 swapchain / VkSurface),再以 `Fatal{ServerWindowLost}` 闩会话,**最后**才结束租约、让回调返回。`Detach` 有界 3 s,超时不抽走窗口。失窗请求在 `DrainRing` 每次 pop 之前也检查。
|
||||
- 窗口属于显示进程,不属于会话:会话结束后窗口还在,下一个会话接着用;Espryt 的孪生对象与单元影子随会话清空(`DropEveryTwinForEndedServerSession`),下一会话从空表开始。
|
||||
|
||||
## 几何
|
||||
|
||||
- client 请求 `W×H`:`W,H > 0` → server 显示 `SurfaceHolder.setFixedSize(W,H)`,视图**等比缩放、留黑边**放进屏幕;`0/0` → `setSizeFromLayout`(窗口自己的大小)。请求是异步应答,server 等布局回报(ID-P12-9)。
|
||||
- **请求尺寸的来源**:`eglCreateWindowSurface` 的 `EGL_WIDTH/EGL_HEIGHT`;两者缺省(SDL 就是这样)且传入了 native window 时,取 `ANativeWindow_getWidth/Height`(Android、split 构建、server-owned)。缺这一步时游戏按自己的窗口渲染、server 窗口取屏幕尺寸,横屏游戏在竖屏窗口里被裁成左下角。
|
||||
- `ResizeEGLWindowSurface` 走同一条几何请求,后端表面随窗口**真实**尺寸,reply 带回该尺寸,client 采用它(ID-P12-10)。`kEventSurfaceChanged` 携带宽高(Espryt 以前只发格式,client 的默认帧缓冲会停在 512×512 占位值)。
|
||||
|
||||
## 死亡与 device-lost
|
||||
|
||||
- device-lost 只由对端**挂断**闩住,从不由超时闩住(CONTRACT-P6 §5.4 不变)。杀 server 进程后 client 在毫秒级闩住,随后每个 verb 被 DECLINED,`glGetGraphicsResetStatus` 报 `GL_UNKNOWN_CONTEXT_RESET`。
|
||||
- 闩锁的 `DEVICE LOST` 说一次;闩住之后 DECLINED 的 verb **不再逐条打 ERROR**(一个 FCL 游戏几千次/秒)。
|
||||
|
||||
## server 的形态
|
||||
|
||||
- **进程内显示 server**(`MobileGLDisplayActivity`,进程 `:mglwin`):TCP / unix 监听线程 + 会话线程(`TcpSupervisor::Handoff::Thread`),预认证 / Busy / DataBind 路由与 fork 形状是同一份代码;会话串行;后端**按进程钉住**(无 `MOBILEGL_BACKEND_TYPE` 时取第一个会话的);会话间 `ResetSessionLatch`。以崩溃隔离换窗口可达:会话里一个未武装的 `SessionFail` 会带走整个显示进程。
|
||||
- **离屏 supervisor**(`MobileGLServerService`):每会话 fork 一个子进程,子进程 `PR_SET_PDEATHSIG` 随 supervisor 去。
|
||||
- **同一设备一个 server**:显示 Activity 与离屏 service 互相替换(谁后启谁拥有端口)。Render Server 屏(`ServerControlActivity`)是两种形态的入口,字段与 extras:`listen` / `token` / `env`(`KEY=VALUE;KEY`)/ `onscreen` / `start` / `stop`。
|
||||
- 停止推流中的进程内 server 时,会话在 `loop.Stop()` 前放弃队列里剩余记录(`AbandonQueuedRecords`);正常的 client EOF 仍 drain 完。
|
||||
- 转发日志:进程内 server 只有会话线程与选择加入的线程转发,且在释放日志互斥之后、在独立转发互斥下发送。
|
||||
|
||||
## FCL 集成(FCL fork,不在本仓库)
|
||||
|
||||
- FCL 的界面一退后台就把游戏暂停;server 窗口要在屏幕上,FCL 必然在后台。版本设置 **`keepRunningInBackground`**("游戏退到后台时不暂停",默认关):强制 TextureView 并保留它的 SurfaceTexture,界面离开前台时不通知 SDL 暂停、不撤销 GLFW focused / visible。
|
||||
- FCL 默认的 spawn(游戏进程派生 server 子进程)把自己的窗口指针发给 server,按 Rule H 被拒(`UnmigratedSurface`):**只能接外部 render server**,`MOBILEGL_IPC_CONTROL=tcp://127.0.0.1:<port>`、`MOBILEGL_IPC_DATA=stream`、`MOBILEGL_IPC_SURFACE=server`;后端由 `mg_env.txt` 里的 `MOBILEGL_BACKEND_TYPE` 选。
|
||||
- 时序:FCL 的游戏界面出现后要再等约 10 s 才能把 server 窗口切到前台。
|
||||
|
||||
## 不变量
|
||||
|
||||
- G1:pull 构建符号 0/0/0/0,`.text` 不变(全部新代码在 `MOBILEGL_BUILD_DISAGGREGATED` 下;`EGLImpl` 的新分支还要 `__ANDROID__`)。
|
||||
- 离屏路径仍是门(gate 3 跑 `--use-pbuffer`)。`RefuseCode` 只追加。
|
||||
- 会话里 server-owned 表面之外的表面(`SurfaceModeMismatch`)具名拒绝,会话继续。
|
||||
|
||||
## 仍开放
|
||||
|
||||
D8 窗口种类白名单(X11 / Win32 / None 仍被接受并把 token 强转为指针);freezer 的完整处理;多 context;TLS;server 窗口不转发输入;DirectGLES 的 `g_Display/g_Surface/g_Context` 仍是全局(每进程一个会话时不需要);修后的横屏 server 窗口没有重测。
|
||||
@@ -1,4 +1,4 @@
|
||||
# 当前阶段:P12 — server 自己开窗口上屏
|
||||
# 当前阶段:P12 已收官(2026-09-29);下一阶段 P9 / P8 待排
|
||||
|
||||
> **更新 2026-09-28**(含五臂传输性能对比,见 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md))。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。P12 审查后的定向主机与真机复测已完成;验收 A、B 都已通过(B 于 2026-09-28,A 于 2026-09-29)。上一阶段 P7 已于 2026-09-23 完成。
|
||||
|
||||
@@ -33,10 +33,16 @@ Android 上的 server 应用自己开一个全屏窗口,把收到的渲染流
|
||||
- 原先记录的「跨主机 TCP 在 `eglMakeCurrent` 挂死」**不是源码 bug**:WSL 流量被主机 v2rayN 的 `xray_tun` 终结后中继卡住。绕开后 rd12 / openra 都跑通;跨机测试前先跑 `tools/device_bench/disagg/tcp_path_check.sh`。
|
||||
- Wi-Fi 上加载帧(2.7 GB)受带宽约束(server 实测 52 MB/s 持续),稳态不受(20–24 MB/s,受往返延迟);`PRESENT_CREDIT` 1→2 稳态 +26%,2→3 +4%。此前的「带宽上限 18–26 fps」结论已撤回(`toybox nc` 汇点低估了链路)。
|
||||
|
||||
## 收官(2026-09-29)
|
||||
|
||||
- 出口门 A、B 都过;契约 [`MG_Remote/CONTRACT-P12.md`](../../MobileGL/MG_Remote/CONTRACT-P12.md) 已写;`gate.sh` 的 G1 只在同机基线上比较;G1 在 Arch 上成立(pull 构建 `.text` 与基线同为 `0xa52203`,符号增 0 减 0)。
|
||||
- 没做、转入 [`notes/DEBTS.md`](notes/DEBTS.md):DirectGLES 去全局、freezer、多 context、D8 窗口种类白名单、TLS。
|
||||
- 收官审查:用户裁定不派 agent / Codex;契约断言由本人对照代码核过。
|
||||
- FCL fork 的「游戏退到后台时不暂停」改动在 FCL 仓库,**未提交**(父仓库在合并冲突中)。
|
||||
|
||||
## 下一步
|
||||
|
||||
1. 收尾:写 `MG_Remote/CONTRACT-P12.md`、修门脚本误导的一行输出、收官审查。
|
||||
2. 零代码 knob A/B:`PRESENT_CREDIT=2`、shm 臂 server `SPIN_US` 降到 20–35、`SERVER_AFFINITY`;代码级:client doorbell 换 futex/eventfd、applier 自适应 spin、sendmsg 跨 Flush 合批。
|
||||
3. 之后按 [`ROADMAP.md`](ROADMAP.md):P8;P9 → P10 → P11。
|
||||
1. 零代码 knob A/B:`PRESENT_CREDIT=2`、shm 臂 server `SPIN_US` 降到 20–35、`SERVER_AFFINITY`;代码级:client doorbell 换 futex/eventfd、applier 自适应 spin、sendmsg 跨 Flush 合批。
|
||||
2. 之后按 [`ROADMAP.md`](ROADMAP.md):P9 → P10 → P11(IPC 跑道);P8(monolith 跑道);P6.5 残余(39 例 device 矩阵)与 P3b/P4b 余项并行。
|
||||
|
||||
**阻塞**:没有需要决策的事项。
|
||||
|
||||
@@ -47,5 +47,5 @@
|
||||
| 13 | P3b/P4b | 纹理上传形状在四种拓扑下完全一致 | [`notes/p34b`](notes/p34b/README.md) |
|
||||
| 14 | P6.5 | 跨机 TCP 102/102;断线约 5 s 检测到 | [`notes/p65`](notes/p65/README.md) |
|
||||
| 15 | P7 | 真机画面 36/36;server 内存无界增长收住(主机 825 → 546 MiB) | [`notes/p7`](notes/p7/README.md) |
|
||||
| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);跨机 TCP 门 (b) 通过(rd12 ssim 0.999883、稳态 17–22 fps);FCL 门 (a) 通过(Minecraft 上屏到 render server 窗口,杀 server 后 33–54 ms 闩住 device-lost) | [`notes/p12`](notes/p12/README.md) |
|
||||
| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);**P12 已收官(09-29)**:跨机 TCP 门 (b) 通过(rd12 ssim 0.999883、稳态 17–22 fps);FCL 门 (a) 通过(Minecraft 上屏到 render server 窗口,杀 server 后 33–54 ms 闩住 device-lost) | [`notes/p12`](notes/p12/README.md) |
|
||||
| 17 | 五臂传输测量(2026-09-28,非阶段) | inproc/shm 重负载比 monolith 快 ~1/3;tcp localhost 瓶颈是 credit=1 + 唤醒税(SPIN_US=2000 → 2.9×);跨主机 hang 实为主机 xray TUN 代理造成;直连 Wi-Fi 稳态 rd12 17–22 fps、openra 105–133 fps | [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md) |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 路线图(索引)
|
||||
|
||||
> **2026-09-28**:P0 到 P7 已完成;当前阶段 **P12**(server 自己开窗口上屏)审查后主机定向测试和真机七项复测已通过,两个收官验收都已通过(B [跨机 TCP](notes/p12/CROSSHOST-ACCEPTANCE.md)、A [FCL 同机](notes/p12/FCL-ACCEPTANCE.md)),剩契约文档与收官审查。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。
|
||||
> **2026-09-29**:P0 到 P7、P12 已完成(P12:server 自己开窗口上屏,两个出口门都过:B [跨机 TCP](notes/p12/CROSSHOST-ACCEPTANCE.md)、A [FCL 同机](notes/p12/FCL-ACCEPTANCE.md),契约已写,G1 成立);下一阶段 **P9**(IPC 跑道)与 **P8**(monolith 跑道)。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。
|
||||
|
||||
## 目标
|
||||
|
||||
@@ -32,7 +32,7 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不
|
||||
| [Ph](notes/p7/README.md) | server 能安全地接受外来连接:令牌、限额、坏数据不致崩溃 | 必需项 ✅(随 P7) |
|
||||
| [P3b / P4b](notes/p34b/README.md) | GLES 后端的深化与收尾 | 大部分 ✅,余项并行 |
|
||||
| [P7](notes/p7/README.md) | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 |
|
||||
| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | **进行中**:审查后主机定向测试和真机七项复测通过;验收 B(跨机 TCP)✅ 09-28;验收 A(FCL + 杀 server)✅ 09-29;剩契约文档与收官审查 |
|
||||
| [**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) | 把剩余的仿真路径挪到正确的一侧,补齐协议 | 待排 |
|
||||
| [P9](notes/p9/README.md) | 反向通道异步化(回读、写回不再同步等待) | 待排 |
|
||||
| [P10](notes/p10/README.md) | 同步对象、查询与帧节奏 | 待排 |
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
- 交付链(spike A 已证):APK 唯一可 exec 的位置是 `lib/<abi>/`,server 以 `add_executable` + `lib*.so` 命名构建;从 `untrusted_app` 进程 `fork`+`execve` 同域、零 avc denial;`posix_spawn` 在 minSdk 26 不可用。一份共享库两个角色(stub `dlopen` + `dlsym("mobilegl_server_main")`)。
|
||||
- 离屏 server:前台 `MobileGLServerService`(`:mglsrv`),从 `nativeLibraryDir` exec,fork-per-session,EGL 是 pbuffer / surfaceless。
|
||||
- **上屏 server(P12 子集)**:窗口归 **server 自己**(client 的窗口不跨进程)。`MobileGLDisplayActivity`(`:mglwin`)持全屏 SurfaceView,在自己的进程里用一个线程跑 TCP server(会话串行、会话间重置闩、后端按进程钉住);`ServerDisplay` 以 acquire / release / 几何三个钩子持有窗口,apply 线程以**租约**使用它。client 设 `MOBILEGL_IPC_SURFACE=server` 后**无头**:`eglCreateWindowSurface(NULL)` 发一帧 `WindowKind::ServerOwned`(控制修订 3),不发 `SetWindowHandle`,尺寸由 reply 带回,resize 变成对 server 窗口的几何请求。一台设备同一时刻一个 server;一个会话一种表面模式(`SurfaceModeMismatch`);无显示的 server 对 ServerOwned 具名拒绝(`NoServerDisplay`)。
|
||||
- **上屏 server(P12 子集)**:窗口归 **server 自己**(client 的窗口不跨进程)。`MobileGLDisplayActivity`(`:mglwin`)持全屏 SurfaceView,在自己的进程里用一个线程跑 TCP server(会话串行、会话间重置闩、后端按进程钉住);`ServerDisplay` 以 acquire / release / 几何三个钩子持有窗口,apply 线程以**租约**使用它。client 设 `MOBILEGL_IPC_SURFACE=server` 后**无头**:`eglCreateWindowSurface(NULL)` 发一帧 `WindowKind::ServerOwned`(控制修订 3),不发 `SetWindowHandle`,尺寸由 reply 带回,resize 变成对 server 窗口的几何请求;client 没给 `EGL_WIDTH/HEIGHT`(SDL)时取 native window 的大小作请求,server 把窗口缓冲固定成它并等比留黑边(不然横屏游戏在竖屏窗口里被裁)。FCL 只能接外部 server(自带 spawn 会把窗口指针发过来,被 Rule H 拒),且要开版本设置「游戏退到后台时不暂停」,否则 FCL 一退后台游戏就暂停(`MG_Remote/CONTRACT-P12.md`)。一台设备同一时刻一个 server;一个会话一种表面模式(`SurfaceModeMismatch`);无显示的 server 对 ServerOwned 具名拒绝(`NoServerDisplay`)。
|
||||
- 失窗:`surfaceDestroyed` 有界(3 s)阻塞,直到 apply 线程(批内每条记录前也检查)放掉后端表面并以 `Fatal{ServerWindowLost}` 闩住会话;server 继续监听。进程内会话结束时手动做进程退出本来白给的清理(Espryt twin 与单元影子、swap interval、Magma renderer)。
|
||||
- `HeadlessGL` 的 fork 预检会产生孤儿 server:server 的 EOF 检测即时且无条件退出。
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 仍开放的债务(跨阶段)
|
||||
|
||||
> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 [`p5b/README.md`](p5b/README.md) 末节。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-24。
|
||||
> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 [`p5b/README.md`](p5b/README.md) 末节。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-29。
|
||||
|
||||
| 债务 | 去向 |
|
||||
|---|---|
|
||||
@@ -10,7 +10,8 @@
|
||||
| `GetCaps` 的两个 blobref | 一旦运输,必须有 server → client 的 carrier rule,不能套 `SEG_STAGE` |
|
||||
| E1 对照的重定义(ID-122) | 无主(开放问题 24) |
|
||||
| `MOBILEGL_IPC_IDLE_EXIT_S` 未解析;`CONTRACT-P6.md` 仍把 `DynamicBackendParameters` 定宽记在 P7 名下(已由 P6.5 wf 落地) | 文档 / 小修 |
|
||||
| P12 文档债:`MG_Remote/CONTRACT-P12.md` 未写;`protocol.fbs` 的窗口注释仍是旧说法 | P12 收尾 |
|
||||
| P12 未做(2026-09-29 收官时转入):DirectGLES `g_Display` / `g_Surface` / `g_Context` 仍是全局(每进程一个会话时不需要);cached-app freezer 的完整处理(文档从未定义);多 context;D8 窗口种类白名单(X11 / Win32Hwnd / None 仍被接受并把 token 强转为指针);TLS;server 窗口不转发输入;修后的横屏 server 窗口未重测 | 无主;D8 等 Windows / X11 client,其余等出现第二个会话 / 第二个 context 的需求 |
|
||||
| FCL fork 的版本设置「游戏退到后台时不暂停」未提交(父仓库在合并冲突中:`FCLauncher.java` 为 `UU`,`.gitmodules` 已暂存) | 用户处理父仓库合并后提交 |
|
||||
| 树外脚本:普查跑器、`wsl_p5_gate.sh` 等在 `~/w7/notes/`,git merge 不会传播 | 需要时入库 |
|
||||
| 临时 CI trigger | 合入 `dev` 前删除 `test.yml` / `apk.yml` 的 `feat/disaggregated` 触发器 |
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
| P6.5 两轴传输 + 跨机 | [`p65/`](p65/README.md) | `evidence-index.md`、`validation-status.md`、`code-review-findings.md` |
|
||||
| P3b / P4b Espryt 深化 | [`p34b/`](p34b/README.md) | `espryt-d1.md` … `espryt-d3.md` |
|
||||
| P7 Magma 全量迁移(含 Ph) | [`p7/`](p7/README.md) | `PLAN-PH-P34B-P7.md`、`INTEGRATOR-DECISIONS-P7.md`(ID-P7-1..63)、`HANDOFF-2026-09-23.md`、`device-window-*/`;审查稿在 [`handoff/`](handoff/) |
|
||||
| **P12**(当前)server 自有屏幕窗口 | [`p12/`](p12/README.md) | `PLAN-P12.md`、`INTEGRATOR-DECISIONS-P12.md`、`device/` |
|
||||
| **P12**(已收官)server 自有屏幕窗口 | [`p12/`](p12/README.md) | `PLAN-P12.md`、`INTEGRATOR-DECISIONS-P12.md`、`device/` |
|
||||
| P8 / P9 / P10 / P11 / P13(待排) | [`p8/`](p8/README.md)、[`p9/`](p9/README.md)、[`p10/`](p10/README.md)、[`p11/`](p11/README.md)、[`p13/`](p13/README.md) | 目前只有路线图上的完整范围与出口门 |
|
||||
|
||||
跨阶段:[`DEBTS.md`](DEBTS.md)(仍开放的债务与去向)、[`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)(开放问题全文,编号稳定);[`handoff/`](handoff/)(P7 的集成者审查稿,路径被 P7 交接文档引用,保持原位);[`recovered/`](recovered/)(从失败的 workflow 运行里捞回的 P0–P2 期材料,`wf1` 设计定稿前的计划草案、`wf2` P0、`wf3` P0.5、`wf4` P1、`wf5` P2;与阶段目录逐字节重复的副本已于 2026-09-24 删除,只留独有的);[`perf-five-arm-20260928/`](perf-five-arm-20260928/README.md)(非阶段的五臂传输性能对比与瓶颈归因,2026-09-28)。
|
||||
|
||||
@@ -67,45 +67,31 @@
|
||||
|
||||
审查后主机 **P12 定向 CTest 46/46 通过**:`ServerDisplayTest`、`ServerLoopTest`、`InProcessServer`、`SupervisorChildren`、`ServerOwnedSurface`。这组定向测试不等于完整主机门。证据在测试机 `/home/swung/w7/logs/p12-verify-1fb18d9e/`;日志、APK 和截图按证据数据规则未入仓库。当前 `0fe01588` 相对验证 head 只有文档整理及文档检查配置更新。
|
||||
|
||||
## 3. 还没做(P12 未收官)
|
||||
## 3. 收官处置(2026-09-29)
|
||||
|
||||
按 [`../ROADMAP.md`](../../ROADMAP.md) P12 行的两个出口门,以及本包任务书列出的改小后的条目:
|
||||
两个出口门都过了((b) [`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md)、(a) [`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md)),`MG_Remote/CONTRACT-P12.md` 已写,`gate.sh` 的 G1 已改。ROADMAP P12 行与任务书里原先"未落地"的每一项,处置如下:
|
||||
|
||||
1. **出口门 (a) 未达成。** 要求 FCL 同机 spawn、双后端**入世界**、杀 server 产生干净 device-lost latch。
|
||||
今天验证到的是:trace_replay(**不是 FCL**)经 `--window-surface` + `MOBILEGL_IPC_SURFACE=server` 在屏上重放 OpenRA,
|
||||
双后端都 1.0;device-lost 是**按 HOME(surfaceDestroyed)**触发的,**不是杀 server**。
|
||||
2. **出口门 (b) 完全未做。** 要求另一台机器上的 client 经 TCP 在 Redmi 入世界并记录 P6.5 的必测数。
|
||||
本轮的 client 是 `adb forward` 后的 `tcp://127.0.0.1:40613` **环路**(`android/dev.sh:7-8` 写得很清楚),
|
||||
**不是跨机**。
|
||||
3. **ROADMAP P12 行里仍未落地的条目**(交接时在树上核过):
|
||||
- `unix:` 监听(in-process server 只做了 tcp;`grep 'unix:' ServerMain.cpp` 为 0);
|
||||
- DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局(`DirectGLES.cpp` 仍有 40 处);
|
||||
- cached-app freezer 的"完整处理"(树上 0 处提及);文档从未定义它是什么,`SPAWN-PLAN.md` §8.2 只说了它是 P12 的;
|
||||
- 多 context(契约 §11);
|
||||
- FCL env 与 plugin APK 开关表接线;
|
||||
- **`AndroidNativeWindow@P12` / `MetalLayer@P12` 的 D8 白名单**(拒 X11 / Win32Hwnd / None)——`map-docs-contract.md` §5.3 记它
|
||||
**没落地**,且当时 `SetWindowHandle` 在 client 侧**无条件发**;本轮把 ServerOwned 模式下的
|
||||
`SetWindowHandle` 变成了具名拒绝,但 D8 本身(X11/Win32 白名单)仍是独立跟进项。
|
||||
4. **文档债**(`map-docs-contract.md` §4 列的"落地时要记录的东西"):
|
||||
- **没有 `MG_Remote/CONTRACT-P12.md`**(前几个阶段都有;本页与 `BRIEF-onscreen.md` 不是契约);
|
||||
- 没有 `INTEGRATOR-DECISIONS-P12.md` 式的逐条裁定;
|
||||
- `ARCHITECTURE.md:526` 仍写着被删掉的 Surface → AIDL → `ANativeWindow_fromSurface` 旧路径,`protocol.fbs:258`
|
||||
仍写「Android transfers the window out of band」,`ARCHITECTURE.md:533` 仍描述 RESPAWN / IDLE_EXIT 可用;
|
||||
- `CURRENT_STAGE_PROGRESS.md:244` 仍把 P12 描述成"real windows cross processes",与 Rule H 冲突;
|
||||
- IPC 顺序(`ROADMAP.md:19` 的 P6.5 → Ph → **P12** → P9 与 `CURRENT_STAGE_STATUS.md` / HANDOFF 的
|
||||
P9 → P10 → P11 → P12)两处说法仍不一致;
|
||||
- a6 行 A8-3…A8-15 的处置、CONTRACT-P6 §7.2 D8 的处置都还没写;
|
||||
- 阶段收尾该有一次 Codex 审查(`ROADMAP.md:17` 的惯例)。
|
||||
5. **`MG_Test/SanityTest.cpp` 在本包里被改动过**——它属于 pull 构建之外的测试目标,但要确认它与 G1 的关系已在门里测到(门已绿,此处只是点名)。
|
||||
| 项 | 处置 |
|
||||
|---|---|
|
||||
| in-process server 的 `unix:` 监听 | ✅ 已做(`c16fb5a8a`) |
|
||||
| FCL env 与 plugin APK 开关表接线 | ✅ FCL 走 `/sdcard/FCL/mg_env.txt`;plugin / trace 两个 APK 都带 Render Server 屏与二进制(`1987bdff5`);FCL fork 新增版本设置「游戏退到后台时不暂停」(FCL 仓库,未提交) |
|
||||
| DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局 | 不做:每进程一个会话时不需要 → [`DEBTS.md`](../DEBTS.md) |
|
||||
| cached-app freezer 的完整处理 | 不做:文档从未定义它;FCL 后台暂停的实测答案见契约 → DEBTS |
|
||||
| 多 context | 不做(同上)→ DEBTS |
|
||||
| D8 窗口种类白名单(拒 X11 / Win32Hwnd / None) | 不做:仍接受并把 token 强转为指针 → DEBTS(无主,等 Windows / X11 client) |
|
||||
| TLS | 仍开放 → DEBTS |
|
||||
| 逐条裁定日志 | ✅ `INTEGRATOR-DECISIONS-P12.md`(ID-P12-1..15) |
|
||||
| 文档债(`ARCHITECTURE.md:526` 旧路径、`protocol.fbs` 旧注释、`CURRENT_STAGE_PROGRESS` 的"real windows cross processes") | ✅ 已清(设计文本已迁到 `design/`,`design/08-runtime-and-platform.md` 记上屏路径与几何) |
|
||||
| IPC 顺序两处说法不一致 | ✅ ROADMAP 现为 P5 … P6.5 → Ph → P12 → P9 → P10 → P11 |
|
||||
| `IterationRPProgram203Scenario` | ID-P12-12:按"既有、环境敏感"读,不阻塞 |
|
||||
| a6 行 A8-3…A8-15 与 CONTRACT-P6 §7.2 D8 的逐行处置 | 由契约与裁定日志覆盖,**没有逐行列出** |
|
||||
| 收官审查 | 用户裁定(2026-09-29)不派 agent / Codex 审查;由本人核对契约断言(发现两处措辞错误已改)并跑 G1 |
|
||||
| G1 | G1(Arch,clang++,pull 构建,`6e35ea2c`):`.text` `0xa52203` = 基线,符号增 0 减 0 |
|
||||
|
||||
## 4. 立刻可做的收尾
|
||||
## 4. 收官前立刻做过的
|
||||
|
||||
1. 把 `~/w7/notes/p12/gate.sh` 的 G1 符号比较改成与基准同源(`nm --defined-only … | awk '{print $3}'`),
|
||||
否则下一个跑门的人还会看到 `added=N removed=N` 而误判。
|
||||
2. 决定 `IterationRPProgram203Scenario` 在 P12 的处置:既然 ID-P7-22 已判"环境敏感",把它在门里的
|
||||
出现方式(钉 ICD 即可绿 / 记为已知偶发)写成一句结论,别再一次次口头带过。
|
||||
3. 若要真正收官 P12:先补跨机 TCP(出口门 b),再补 FCL + 杀 server 的 device-lost(出口门 a),
|
||||
最后写 `CONTRACT-P12.md` 并按惯例做一次收官审查。
|
||||
1. `gate.sh` 的 G1 只在同机同编译器的基线上比较,否则说"未比较"并给做法,不再印无意义的 `added / removed`。
|
||||
2. `notes/p7/INTEGRATOR-DECISIONS-P7.md` 里一条指向已缩成索引的 `ARCHITECTURE.md:531` 的引用改到 `design/08-runtime-and-platform.md:7`(文档引用门原先在 HEAD 上红)。
|
||||
|
||||
## 5. 工装在哪
|
||||
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
- 形状:server APK 自建 `ANativeWindow`(`MobileGLDisplayActivity` 的 SurfaceView,进程内 TCP server,会话串行)把渲染流**上屏**;离屏路径保留、同一时刻一条活跃;client 以 `WindowKind::ServerOwned`(控制修订 3)**完全无头**接入,几何由 server 回传;失窗 → `Fatal{ServerWindowLost}` → 干净 device-lost。
|
||||
- 进展:15 个 `(P12)` 提交 + 审查轮修复(10 个问题,ID-P12-5..11)已并入 `feat/disaggregated`;主机门绿(ID-P12-14)、G1 成立(ID-P12-15);审查后在 `1fb18d9e` 上完成 P12 定向 CTest 46/46 和 Redmi 真机七项复测。当前分支 `0fe01588` 后续提交只改了文档、文档检查范围和基准脚本说明文字,未改 P12 实现。
|
||||
- **2026-09-25 追加(会话交接 §4/§5.1)**:**device-lost 的 DECLINED 回复容忍**与**纹理上传的等待粒度**已落地,各有自己的 red-once 门(前者就是进世界后 `Fatal{ProtocolCorruption, "Fence.reply"}` 那条崩溃;后者让单条纯上传的回包等待 1 → 0)。真机端到端(进世界不崩、那一帧墙钟)与 G1 本机复核仍待做,见 [`DEVICELOST-AND-UPLOAD-WAITS.md`](DEVICELOST-AND-UPLOAD-WAITS.md)。
|
||||
- 出口门 (b) 已于 2026-09-28、(a) 已于 2026-09-29 通过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md)、[`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md))。未完成:`CONTRACT-P12.md`;阶段表行里的其余条目(`unix:` 监听、DirectGLES 去全局、freezer、多 context、FCL 开关接线、D8 白名单)。
|
||||
- 出口门 (b) 已于 2026-09-28、(a) 已于 2026-09-29 通过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md)、[`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md));契约 `MG_Remote/CONTRACT-P12.md` 已写。未做的(DirectGLES 去全局、freezer、多 context、D8 白名单、TLS)已转入 [`DEBTS.md`](../DEBTS.md)。
|
||||
|
||||
## 阶段表行(原 `ROADMAP.md`)
|
||||
|
||||
- **阶段**:**P12** Android 生产窗口路径
|
||||
- **状态**:**子集已实现、未收官(2026-09-25)**:上屏 server 窗口、`WindowKind::ServerOwned`、无头 client、失窗 device-lost 已落地;审查轮 10 个问题已修(两个大项:批内失窗、会话间 Espryt 单元影子悬空;裁定 [`INTEGRATOR-DECISIONS-P12.md`](INTEGRATOR-DECISIONS-P12.md) ID-P12-5–11)。审查后 P12 定向 CTest 46/46、真机七项复测通过;出口门 (a) FCL + 杀 server 与 (b) 跨机 TCP 仍未完成(见 [`PLAN-P12.md`](PLAN-P12.md) §3)。
|
||||
- **状态**:**已收官(2026-09-29)**——两个出口门都过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md)、[`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md)),契约 `MG_Remote/CONTRACT-P12.md` 已写,余项处置见 [`PLAN-P12.md`](PLAN-P12.md) §3。以下是 09-25 的进展记录:**子集已实现(2026-09-25)**:上屏 server 窗口、`WindowKind::ServerOwned`、无头 client、失窗 device-lost 已落地;审查轮 10 个问题已修(两个大项:批内失窗、会话间 Espryt 单元影子悬空;裁定 [`INTEGRATOR-DECISIONS-P12.md`](INTEGRATOR-DECISIONS-P12.md) ID-P12-5–11)。审查后 P12 定向 CTest 46/46、真机七项复测通过;出口门 (a) FCL + 杀 server 与 (b) 跨机 TCP 仍未完成(见 [`PLAN-P12.md`](PLAN-P12.md) §3)。
|
||||
- **落地什么 / 范围**:**按重审 §6 改小**:~~Service 收 Java `Surface`~~ 删掉 Surface 传递那一半——server app 拥有自己的 SurfaceView,client 根本没有窗口,于是 minSdk 26 没有扁平化 `ANativeWindow` 的 NDK API 这条约束不再成立;`WindowKind::ServerOwned`;两个后端各一条 `CreateEGLWindowSurface` 臂;`m_windowHandle` 四处写点 + `sameHandle` 去重键(a6 §6);DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局;`kEventSurfaceChanged` 的 Width / Height 缺口(Espryt 只发布格式,server 拥有显示时 client 默认 FBO 会停在 512×512 占位值);client 侧不再无条件发 `SetWindowHandle`(`BackendObject_Remote.cpp:215`——今天 FCL 里开 spawn,第一次 `eglCreateWindowSurface` 就在 server 进程 abort);server app 监听 `unix:` 与 `tcp://`(后者 Ph 之后);server 生命周期绑 Activity;cached-app freezer(SPAWN-PLAN §8.2);多 context(契约 §11);FCL env 与 plugin APK 开关表接线
|
||||
- **验收门 / 证据**:两个门:(a) Minecraft 经 FCL **同机 spawn** 在 Adreno 830 双后端入世界,杀 server 产生干净 device-lost latch;(b) **另一台机器上的 client 经 TCP** 在 Redmi 上进世界(数据面 stream),并记录 P6.5 的必测数
|
||||
|
||||
@@ -81,10 +81,9 @@ Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流**
|
||||
|
||||
### 5. 下一步
|
||||
|
||||
1. **出口门**:(a) [`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md) 与 (b) [`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md) 都已通过;剩 `CONTRACT-P12.md`、门脚本误导输出、收官审查。
|
||||
2. **收尾**:写 `MG_Remote/CONTRACT-P12.md`;修 `notes/p12/gate.sh` 的 G1 符号比较(与基准不同源,会印出误导的 `added=N removed=N`);按惯例做一次收官审查。
|
||||
3. **阶段表行里的余项**(交接时在树上核过,均未做):in-process server 的 `unix:` 监听、DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局、cached-app freezer、多 context、FCL env 与 plugin 开关表接线、D8 窗口种类白名单。
|
||||
4. 其后按 [`ROADMAP.md`](../../ROADMAP.md):monolith 跑道 P8;IPC 跑道 P9 → P10 → P11;P6.5 残余(39 例 device 矩阵 + 必测数)与 P3b/P4b 余项并行;`CONTRACT-P7.md` §12 的记录债按阶段认领。
|
||||
P12 已收官(2026-09-29):出口门 (a)(b) 通过、契约已写、`gate.sh` 的 G1 已改、余项已处置([`PLAN-P12.md`](PLAN-P12.md) §3)。
|
||||
|
||||
1. 其后按 [`ROADMAP.md`](../../ROADMAP.md):monolith 跑道 P8;IPC 跑道 P9 → P10 → P11;P6.5 残余(39 例 device 矩阵 + 必测数)与 P3b/P4b 余项并行;`CONTRACT-P7.md` §12 的记录债按阶段认领。
|
||||
|
||||
### 6. 阻塞 / 需要人
|
||||
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
# gate.sh <tree> <tag>: the P7 v2 local gate (logs/p7-gate-template2.sh) for a P12 package tree, minus
|
||||
# build-verify and the retrace leg (both run at integration). G1 compares against the p12 base
|
||||
# (9f669e52: .text a52203, symbols in logs/p12/pull-syms-base.txt).
|
||||
# (9f669e52). G1 is only meaningful between two builds of the SAME machine and compiler (a symbol
|
||||
# list or .text size read on another host says nothing): the base list is used only when its sidecar
|
||||
# (pull-syms-base.txt.cc) names this build's compiler, and otherwise G1 says so and gives the recipe
|
||||
# instead of printing an added/removed count that means nothing (ID-P12-15: build both commits here).
|
||||
TREE=${1:?tree}; TAG=${2:?tag}
|
||||
T=/tmp/p12gate-$TAG; mkdir -p "$T"
|
||||
cd "$TREE" || exit 1
|
||||
@@ -10,9 +13,15 @@ unset DISPLAY WAYLAND_DISPLAY
|
||||
echo "=== START $(date) head=$(git rev-parse --short HEAD) dirty=$(git status --porcelain --untracked-files=no | wc -l) ==="
|
||||
ninja -C build-split -j 24 2>&1 | tail -1; echo "=== split build rc=${PIPESTATUS[0]} ==="
|
||||
ninja -C build-linux -j 24 2>&1 | tail -1; lrc=${PIPESTATUS[0]}; echo "=== linux build rc=$lrc ==="
|
||||
readelf -S -W build-linux/libMobileGL.so | awk '$2==".text"{print "G1 text size (hex):", $6, "(base a52203)"}'
|
||||
CC_NOW=$(grep -m1 '^CMAKE_CXX_COMPILER:' build-linux/CMakeCache.txt | cut -d= -f2- | xargs -I{} sh -c '{} --version | head -1')
|
||||
readelf -S -W build-linux/libMobileGL.so | awk '$2==".text"{print "G1 text size (hex):", $6, "(informational: compare only with a base built by this compiler)"}'
|
||||
nm --defined-only build-linux/libMobileGL.so | awk '{print $3}' | sort > "$T/pull-syms.txt"
|
||||
echo "G1 syms added=$(comm -13 /home/swung/w7/logs/p12/pull-syms-base.txt "$T/pull-syms.txt" | wc -l) removed=$(comm -23 /home/swung/w7/logs/p12/pull-syms-base.txt "$T/pull-syms.txt" | wc -l)"
|
||||
BASE_SYMS=/home/swung/w7/logs/p12/pull-syms-base.txt
|
||||
if [ -f "$BASE_SYMS.cc" ] && [ "$(cat "$BASE_SYMS.cc")" = "$CC_NOW" ]; then
|
||||
echo "G1 syms added=$(comm -13 "$BASE_SYMS" "$T/pull-syms.txt" | wc -l) removed=$(comm -23 "$BASE_SYMS" "$T/pull-syms.txt" | wc -l) (base list built by: $CC_NOW)"
|
||||
else
|
||||
echo "G1 syms: NOT COMPARED - the base list was not made by this compiler ($CC_NOW). Build the pull config at the base commit on this machine and diff the nm symbol lists (ID-P12-15); to reuse the list, write the compiler line to $BASE_SYMS.cc"
|
||||
fi
|
||||
python3 scripts/ci/fatal_census.py 2>&1 | tail -1
|
||||
python3 scripts/link_ratchet.py --build-dir build-split --baseline scripts/data/link_ratchet_baseline.txt --assert-monotone 2>&1 | tail -1
|
||||
python3 scripts/ci/spawn_lane_parity.py build-split 2>&1 | grep -c -i error | sed 's/^/parity errors: /'
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
| 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 落地(`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-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 记录,与 `design/08-runtime-and-platform.md:7` 的 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 落地(`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 |
|
||||
|
||||
Reference in New Issue
Block a user