diff --git a/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md b/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md index e74379e4..b3eff5da 100644 --- a/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md +++ b/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md @@ -41,6 +41,7 @@ - **§1.4 别名刷新**:`RefreshAliasedStoreFromGpu`(`Managers.cpp`):读回 GL buffer → `OnBufferWriteback`(前端把字节拷进它的影子,即别名基址)→ 清 `serverGpuWritten`、盖 serial、bump epoch。前提:monolith 记录臂在 sub-data 与 respecify 时就铸 twin;孤立 respecify 也带影子基址(上传仍按描述符的 `HasDefinedContent` 门控);`contentSinceRespecify` 代替别名 store 没有的覆盖集回答流式写法。 - **GPU 写标记**:`GpuWriteSetIsClientSide()` 改谓词,client 侧的保守集由端口的 `MarkGpuWritesForDraw` 打;后端只标自己的 twin(`serverGpuWritten`)。image 单元仍在前端臂(W4c),其 buffer-texture 写在前端臂里额外标 twin。 - **单元测试**:`BufferTest` 三例断言前端臂的 map 推送,钉 `ScopedMonolithFrontendArm`,W6 随前端臂删。 +- **W6 待办(monolith 登记的余项)**:`F1WireScenario` 在 `SetUp` 用 `SplitRuntimeSkipReason()` 整组跳过 monolith,所以 Magma 的 `MGITEST_MAGMA_FORCE_SHADER_MIPMAP` 车道(`ShaderMip1/2.`、`DepthMip.`)还没有 monolith 登记;它的断言读 `emitSeq`(编码器序号),monolith 记录臂走路由表不经编码器。W6 删前端臂时把 F1 的门改成「记录臂」并换掉 `emitSeq` 证据,再补 monolith 登记、退役对应的 census 跳过。 - **Magma 换臂**(同一会话稍后):一次性;`MonolithTakesRecordArm` 对两后端都为真。坑:服务端产生的字节(回读落入 pack buffer 的 `LandReadbackInBuffer`、纹理重铸 / 再生成的 `Adopt`)绝不能被别名 store 当基址——缓冲侧用 `MGPipeServerOriginatedWriteScope` 走「直接上传 GL + 标 GPU 写」,纹理侧 `Adopt*` 默认复制、只有客户端记录的 run 传 `frontendShadow=true`(曾造成 use-after-free:重铸后首 16 字节是 malloc 元数据)。 - **本机 retrace**:`~/mgl-p13-tools/sync.sh` 才物化 LFS fixture(`sb.sh` 用的 `sync2.sh` 会把它们复原为指针);跑前设 `MOBILEGL_GPU_HANG_BUDGET_MS=0`。 - 完整的 site 分类表与后续步骤(W4b 纹理别名 store、W4c、Magma)见 Plan 代理的设计(会话 scratchpad `W4-design.md`;要点已并入本节)。 diff --git a/docs/Disaggregated/notes/p13/README.md b/docs/Disaggregated/notes/p13/README.md index a59a7014..750fdb95 100644 --- a/docs/Disaggregated/notes/p13/README.md +++ b/docs/Disaggregated/notes/p13/README.md @@ -14,6 +14,7 @@ | W3c | 完成 | `e2c90986` `be86ca17` | 删 `ResidualValueBlock`;op 46 退役为拒绝行;verify 的 A2 负对照接管能力比对 | | W4a–c(Espryt) | 本地完成 | 14a `3e2aff1d` `cef29781`;谓词、W4a、W4b/W4c(本地) | Espryt monolith 全部族走记录臂:缓冲、indirect、client 数组、绑定点、GPU 写标记、fp64、重启索引、multi-draw、纹理(别名式 staged 纹理 store)、读回(含 pack buffer)、帧缓冲、单元 / sampler / image、program(monolith CSO 记录带档案副本)、XFB;进程内 verb 端口;§1.4 别名刷新。本地 unit 2905/2905、integration-gpu 3650/3650、DirectGLES retrace 29/29(另 11 条缺 LFS fixture 或主机 llvmpipe 的 iterationrp) | | W4(Magma) | 本地完成 | 一次性换臂(本地) | monolith 注册 wire 资源表;进程内持久映射捐赠(`DonateWireBuffer`:wire store 本就 host-visible / coherent / 常驻映射,交给前端,取 T0 的「回读无字节」语义);`GetSyncStatus` 在记录臂上对同一未提交 fence 连续轮询 64 次后提交一次(split 由 apply 线程空闲时提交,monolith 无空闲时刻);ABA 对照车道钉前端臂(其对象是前端臂的身份表,W6 随之删);`DescriptorPoolGrowth` 的 wire 预算按记录臂而非传输判断。本地 integration-gpu 3650/3650、DirectVulkan retrace 29/29(本机须 `MOBILEGL_GPU_HANG_BUDGET_MS=0`,与 CI 相同,否则 llvmpipe 上 >2 s 的提交触发挂死看门狗) | +| W4b 补 monolith 登记 | 本地完成 | | `DirectGLES.Monolith.CpuMip.*`(`MGITEST_ESPRYT_FORCE_CPU_MIPMAP`)与 `DirectGLES.Monolith.StoreRead.*`(`MGITEST_ESPRYT_REFUSE_TEXTURE_READBACK_EXTENT`),各自私有日志断言本臂的日志行。StoreRead 首跑 3/4 红:别名式纹理 store 不跟随 `glCopyImageSubData`,目的 level 被标为驱动写过,驱动又拒读 → `Fatal{ReplyError, "ReadPixels"}`(Adreno 上 RGB16 / 16-bit SNORM 的真实 monolith 回归)。修复:`FollowCopy` 在别名模式下先把目的 level 取成服务端自有副本再搬窗口(从不写前端内存),`AdoptClientBoxes` 随后在该副本上落客户端的框;单元 `AnAliasingStoreFollowsACopyIntoAServerOwnedDestination` | | W4d | 部分(本地) | | monolith 记录臂的 8 个值类字段改由 `set_context_values` 记录供给(不再 residual 填充)。转发访问器替身、`kFatal` 前端指针字段删除、`PipeInputs.h` 去 `MG_State` 头并入 W6/W7(它们是删前端臂与模块边界的一部分) | ### G1 退役读数(ID-P13-4,2026-10-06)