mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
[Docs] (P8): wave 1 integrated - rulings ID-P8-5..13 (the survey, packages A-F, the integration gate, the wave 2 scope and the monolith defects left to P13), the survey note, open questions 9/11/15 answered, the debts and the P8 contract amendments, the P8 README table, PLAN-P8 wave 2 and the status page
This commit is contained in:
@@ -149,7 +149,9 @@ VBO-backed index buffers (restart rewriting, multi-draw flattening) and is answe
|
||||
`Server/IndexHostMirror` (ARCHITECTURE §10.3), not by a per-draw span. **A multi-draw with
|
||||
client-side indices** (`indices[i]` are `drawcount` separate client pointers, one span can
|
||||
name one run) is refused by name, `Fatal{UnmigratedVerb, "MultiDrawElements+CLIENT_INDICES"}`,
|
||||
until P8's `HostResolve.cpp` flattens it; no measured workload has one.
|
||||
until P8's `HostResolve.cpp` flattens it; no measured workload has one. **P8 amendment (ID-P8-6):**
|
||||
the client flattens client indices into an owned EBO (`EmitTables.cpp:688-709`), so only a foreign
|
||||
peer can reach the server latch, which is now `ProtocolCorruption`.
|
||||
|
||||
**Client-side VERTEX arrays** (attribute pointers into client memory, no VBO) are NOT d1's
|
||||
and are not a wire question: Espryt's `SyncClientSideAttributesForDrawArrays`
|
||||
|
||||
@@ -441,7 +441,9 @@ pointer, `Managers.cpp:5382`): under `RunAheadArmed` a draw with `kDrawClientArr
|
||||
array arm; the lockstep arm is unchanged; the staged form (a per-attribute `{BindingIndex,
|
||||
MGHostSpan}` tail like `kDrawHasUserIndices`) is P8's. Two pins by test: `CurrentBufferMutationEpoch()`
|
||||
(`Managers.cpp:794`) is apply-thread-only under a transport; the VAO twin key is 1:1 only while the
|
||||
vertex-elements CSO stays identity-addressed.
|
||||
vertex-elements CSO stays identity-addressed. **P8 amendment (ID-P8-6):** client arrays and client
|
||||
indices became owned buffers (`beba0256`); Magma's `client-vertex-array` site is unreachable from our
|
||||
client and is now `ProtocolCorruption`.
|
||||
|
||||
### 5.2 Textures (tx2)
|
||||
Every draw-path entry is `SyncTextureToBackendByHandle(h, imageBindable)`: record first, twin by
|
||||
|
||||
@@ -60,7 +60,7 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7
|
||||
|---|---|---|---|
|
||||
| `uniform-buffer-byte-tail` | `UniformManager.cpp:2391` | **退役**(真机 MC 报告 §5 的活边界) | 拷贝窗口外扩到 4 字节边界进 transient slice,再 `vkCmdCopyBuffer` 对齐内部到正确子字目的;`CopyWireBufferRangeToSlice` 扩 |
|
||||
| `copy-image-in-place` | `VulkanRenderer.cpp` | **已退役(wave 2-B,`4f857aa5`)** | `srcImage == dstImage` 时单次转 `GENERAL`、两侧布局 GENERAL、一次写回;同 mip+layer 且矩形重叠 → decline(GL 未定义) |
|
||||
| `mipmap-shader-format-or-shape`(真机 iterationt 的死因) | `WireFramebuffer.inc` | **半退役(wave 2-B,`c4be3800`)** | Fatal 行带上格式 / 尺寸 / aspect / 缺的 feature 位;image 不能作附件时经 scratch 走颜色 shader mip;仍无 shader 臂的形状**具名**拒绝 |
|
||||
| `mipmap-shader-format-or-shape`(真机 iterationt 的死因) | `WireFramebuffer.inc` | **已退役(P8-F,ID-P8-6)**:wire 臂改具名拒绝 `MipmapShaderFormatOrShape`,与 monolith 一致;此前半退役(wave 2-B,`c4be3800`) | Fatal 行带上格式 / 尺寸 / aspect / 缺的 feature 位;image 不能作附件时经 scratch 走颜色 shader mip;仍无 shader 臂的形状**具名**拒绝 |
|
||||
| **wire 回读竞态(曾被当作 OpenRA 真机 0.976494 的原因;真因是下一行)** | `WireFramebuffer.inc` / `VulkanRenderer.cpp` | **已修(wave 2-B,`76b74693`)** |
|
||||
| **wire 臂 completed-frame-serial floor 不健全(OpenRA 真机 0.976494 / 0.988998 的真因,ID-P7-33)** | `VulkanRenderer.cpp` `OnSubmitsCompletedUpTo`、`VkBufferManager.cpp` `WriteWireBuffer` | **已修(wave 2-B3,`511c1f16` / `c9164f25`)** | 一个 serial 两次提交(S1 pooled-fence 中帧 flush、S2 Present),逐记录退休把 floor 提前 → 帧 N 首次 `glBufferSubData` 走无序 host memcpy 被 S2(N-1) 的排队拷贝盖掉;floor 只升到可证 serial + 有读者在飞的 buffer 一律有序;计数 26→0,red-once `StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn;32 处静默出口具名(`WireDeclines.def`)。留:三处单 fence 退休站点的聚合等待(B4) | `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,`f1b04edf`)** | `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 文件) |
|
||||
|
||||
@@ -1,27 +1,30 @@
|
||||
# 当前阶段:P8 进行中(2026-09-29 起)
|
||||
|
||||
> **更新 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)。
|
||||
> **更新 2026-09-30**。这一页只有摘要;计划与裁定在 [`notes/p8/PLAN-P8.md`](notes/p8/PLAN-P8.md)、[`notes/p8/INTEGRATOR-DECISIONS-P8.md`](notes/p8/INTEGRATOR-DECISIONS-P8.md)。上一阶段 P11 于 09-29 收官,见 [`notes/p11/README.md`](notes/p11/README.md)。
|
||||
|
||||
## 目标
|
||||
|
||||
补齐 server 侧仿真缺口(Espryt 生成 mip、Espryt 暂存影子与 GPU 写、Magma wire indirect、CopyImage),并把 monolith 用例登记到 split 各臂;为 P13 删掉旧的「后端直接读前端」路径扫清前置。原范围已重定界(划掉保留在 [`notes/p8/README.md`](notes/p8/README.md))。
|
||||
补齐 server 侧仿真缺口(Espryt 生成 mip、Espryt 暂存影子与 GPU 写、Magma wire indirect、驱动拒读),并把 monolith 用例登记到 split 各臂;为 P13 删掉旧的「后端直接读前端」路径扫清前置。原范围已重定界(划掉保留在 [`notes/p8/README.md`](notes/p8/README.md))。
|
||||
|
||||
## 完成情况
|
||||
|
||||
| 项 | 状态 |
|
||||
|---|---|
|
||||
| 只读核查与重定界 | ✅ 原 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 的测量 |
|
||||
| P8-0 普查(设备 + 主机) | ✅ 真实内容只 Magma wire indirect 命中;G 不做;create-indirect 门在多帧 trace 上成立(ID-P8-5) |
|
||||
| A 覆盖对齐 | ✅ 246 例登上 split / spawn / tcp,`split_coverage.py` 进门(ID-P8-7) |
|
||||
| B Espryt 生成 mip | ✅(ID-P8-8) |
|
||||
| C Espryt 暂存影子与 GPU 写 | ✅(ID-P8-9) |
|
||||
| D Magma wire 原生 indirect | ✅ create-indirect 每次整 GPU 等待 321 → 0(ID-P8-10) |
|
||||
| E 驱动拒读 / CopyImage | ✅(ID-P8-11) |
|
||||
| F 死闩清理与重分类 | ✅(ID-P8-6) |
|
||||
| G 大 blob 分片 | 不做(ID-P8-5) |
|
||||
| 第一波集成头 `39cd8fb7` | ✅ 整套门全绿,G1 不变(ID-P8-12) |
|
||||
| 第二波 SE / SV(split 余项) | 进行中 |
|
||||
| 第二波 MD(dev:create-* 在 Adreno 上的三条) | 进行中 |
|
||||
|
||||
## 下一步
|
||||
|
||||
第一波七包并行(ID-P8-4);逐包集成进 `p8/main` 并跑整套门。
|
||||
第二波(ID-P8-13):SE、SV 串行合入 `p8/main`;MD 在 dev 上修,集成者推 dev 后合回 `p8/main`(G1 换基线)。之后出口:trace 双后端 SSIM 复跑、收官。
|
||||
|
||||
**待用户决策**:[`DEBTS.md`](notes/DEBTS.md) 六项「需裁定」(CI 触发条件、`TCP_USER_TIMEOUT`、HyperOS 下 FCL 保活、Mali 复测、TLS、`IDLE_EXIT_S`)。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 仍开放的债务(跨阶段)
|
||||
|
||||
> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 [`p5b/README.md`](p5b/README.md) 末节。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-29(P11 收官;按债务审查重排)。去向「需裁定」= 等用户定;「可进行」= 随时可开的小修,不依赖别的阶段。
|
||||
> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 [`p5b/README.md`](p5b/README.md) 末节。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-30(P8 第一波;按债务审查重排)。去向「需裁定」= 等用户定;「可进行」= 随时可开的小修,不依赖别的阶段。
|
||||
|
||||
| 债务 | 去向 |
|
||||
|---|---|
|
||||
@@ -15,14 +15,18 @@
|
||||
| P11 转出:client 与 server 共用日志前缀时,client 以 `"w"` 打开 `<base>.server.log` 写转发来的 server 日志(`MobileGL/MG_Util/Debug/Log.cpp:89`),截断 server 自己的文件;同机两个进程用同一前缀时同样互相截断 | 可进行(小修) |
|
||||
| P11 转出(B1):会话位被慢启动程序占着时,第二个 client 若 2 s 内发 Hello 得具名 `Refuse{Busy}`,更慢的只见发送失败(那条路径不读待发的拒绝);已写进契约 | 可进行(小修) |
|
||||
| P11 转出(B1):会话启动失败后 client 还多报一个误导性的 `Fatal{CapsBeforeFirstSnapshot}`(`CapsMirror.cpp:247`,早于 B1,helper 用户每次被拒都会看到) | 可进行(小修) |
|
||||
| P11 转出(B2):handle 臂的 CPU 读者(indirect、primitive restart、multi-draw rebase → `SplitHostBytes`)读采纳 / T0 映射前不先落完排队的常驻写;单进程大概也要同一条「读前先落」规则 | 可进行(小修;单进程那半 P8 开工时一并看) |
|
||||
| P11 转出(B2):handle 臂的 CPU 读者读采纳 / T0 映射前先落排队常驻写——split 半已由 P8-C 实现(`SplitHostBytesForCpuRead` 的 T0 臂:落写 + `glFinish`,ID-P8-9),但主机无 T0、未能证红 | 需设备验证(红米 Android 集成测试 + static-peek) |
|
||||
| P11 转出(B2):server 准了 T0 而 client 选了 T2 时,每个存储的 `map_persistent` 等 2 s 再具名拒绝(产品里 grant 与 caps 一致,只在变异下见过) | 可进行(小修:每会话一个「client 不要 T0」提示) |
|
||||
| P9 转出:Espryt 重铸保留路径上 framebuffer clear 后 `imageLoad` 偶读旧值(主机 3/30,加 barrier 后 0/30;`TextureRemintPullScenario` case C 暂钉 barrier),疑 llvmpipe(ID-P9-11);P11 合并 dev 后 push 单进程臂上也见过一次,`ImageBindableRemintScenario` 同样钉 barrier(ID-P11-6) | 可进行(在红米上不加 barrier 归因) |
|
||||
| P8 转出(D):应用省略 `glMemoryBarrier` 时(create-indirect 322 轮 cull→draw 里 320 轮),两臂在计算写与顶点着色器读之间都没有依赖(GL 未定义,但真实应用依赖它);D 的每轮屏障在真机上的开销未测 | 待归因(与第二波 Magma monolith 的计算→indirect 依赖一起看) |
|
||||
| P8 转出(E):driver-written 标按整张纹理打(`GenerateMipmap` 也打),驱动拒读时连基级也具名拒绝,偏保守;跨格式拷贝 store 不跟随;拒绝仍是会话 Fatal(要改回包状态才能答 `GL_INVALID_OPERATION`) | 小修(按 level 打标);其余按需 |
|
||||
| P8 转出(B):`PipeCalls.def:260` `GenerateMipmap` 仍是 `kWaitApplied`,裁定 14 的理由(CPU 滤波碰 client 影子)已不成立,可改 `kWaitNone` | 性能工作(协议行为变更,需单独裁定) |
|
||||
| P8 转出(C):server SSBO 标记过近似(窗口内每个绑定的 SSBO 都标);一个留在 SSBO 绑定上又当 restart EBO 用的 buffer 每次 draw 都回读 | 性能工作 |
|
||||
| P8 转出(monolith,ID-P8-13):11 条 monolith 缺陷真实内容 0 命中,不在 dev 上修——Espryt `*IndirectCount` / 原生 indirect `gl_BaseVertex` / fp64 收窄读未同步影子;Magma `glMultiDrawArraysIndirectCount` CPU 臂同病;Magma 录制中途 `SyncGpuWrites` → SIGSEGV;Espryt RGB16F / RGB32F CPU 滤波读陈旧影子、R11F / 深度链无视 BASE / MAX;Magma 无 BLIT 颜色格式缺着色器 mip 臂;Espryt 拷贝后 `glGetTexImage` 读拷贝前影子(证据见 `notes/p8/{B,C,D,E}.md`) | P13(monolith 换到已修好的记录臂) |
|
||||
| P8-0 转出:设备上基线就有的 SSIM < 0.99——1.21.11-main-menu(Espryt 0.890、Magma 0.165)、derivative-main(Espryt 0.851);两臂都有 | 待归因 |
|
||||
| P12 未做:D8 窗口种类白名单——X11 / MetalLayer / Win32Hwnd / None 仍被接受(`SurfaceOpCodec.cpp:138-141`),`HandleFromToken` 把 token 强转为指针(`ServerLoop.cpp:1228`,经 `UnpackWindowHandle`;下游是否交给 EGL 未追到底) | 可进行(Ph 类小修) |
|
||||
| P12 未做:修后的横屏 server 窗口未重测 | 可进行(红米只读检查) |
|
||||
| P11 转出(M2,给 dev):dev 的 `DirectVulkan.SplitRecording.` 车道没有 `RESOURCE_LOCK`(dev 上 `MG_IntegrationTest/CMakeLists.txt` 第 609 行)、其用例读字面日志路径——`-j` 下可能互相截断;P11 线的副本已修。另:dev 的 `853c5f12` / `7030d307` 与 B2 的 `7784d6bb` 修同一处 | 下次向 dev 回流时带上;那两处取一份 |
|
||||
| 未接入内容分块的 record 类型:program archive 与 `draw_vbo` range 尾 | P6.5 sl 与 P8 共用的分片(开放问题 11) |
|
||||
| 仿真路径的具名拒绝:RGB CPU mip 等(class C 已于 P10 清零;multi-draw client indices 已不再拒绝——client 转成自有 buffer,`EmitTables.cpp:459`,`RefuseDrawByName` 只剩 NO_CONTEXT / INDEX_TYPE / INDEX_OFFSET / CLIENT_COMMANDS / UNBOUND_PARAMETER) | P8(开工时复核) |
|
||||
| P11 转出(M2):超过 stage 分块预算的大层按分片发出,没有写入框覆盖的分片仍带整框(server 要靠它拼层图),会把影子盖到 GPU 写过的地方;修法要一个两个 server 都跳过的「只定位」区域写法,控制协议修订 +1(split 专属,早于 P11) | 小包或 P8 |
|
||||
| P11 转出(M2):上传仍有两种有损形状,各记一次日志——一层的精确写入框超过 4096 个时按存储的矩形表覆盖发出;applier 一个条目累计超过 4096 个区域时并成并集框。纹理带 GPU 写时两者都会把影子盖进空隙 | 小修,无触发报告 |
|
||||
| P10 转出(性能):设备上 tcp loopback 的 rd12 每帧 19.4 ms 中 ~11.2 ms 是生产者在 stream 传输里的停车(发送 + 环 / stage / ack 等待),credit 等待只有 ~0.2 ms(`notes/p10/C-MEASUREMENTS.md` §2,ID-P10-13) | 路线图推完后的性能工作 |
|
||||
|
||||
@@ -12,13 +12,13 @@ P0 已回答的不再列出(spike A 的域、spike B 的分档、`posix_spawn`
|
||||
6. **具名 UBO host payload 的形状(D-B8)。** Magma 在 26.3 世界每帧重打包 331 KB 具名 UBO 字节,Espryt 为 0。要么冻结第二变长尾形状,要么走备选(Magma 直接描述符绑定常驻 `VkBuffer` range,独立 `dev` PR)。P7。
|
||||
7. **`MG_Util` 的切割缝。** server 需要 SPIRV-Cross / ESSL 转译缓存 / 格式处理器 / POST 探针,client 需要 glslang 与反射层;`MG_Util` 内部是否有干净的 Transpile-vs-Reflect 缝未审计。P7。
|
||||
8. **一份反射归档能否服务三个消费者。** Espryt 那一半已答(P4a):能且不需要复制。Magma 的第一个消费者已由 P5f fm 答:`MagmaProgramSource` 全部从 wire `ProgramArchive` 取,无前端对象、无复制。第二个(storage block 表)今天是**否**且变差了:split 下 `MagmaProgramSource::EnsureStorageBlocks` **每 draw** 重跑 SPIRV-Reflect(monolith 臂 `DirectVulkan.cpp:177-200` 至少有持久缓存);答案是往 `LinkArtifacts` 加有序 `storageBlocks`(数据已在 `blockReflection` 里),两个消费者都改读它。**已答(P7 wave 2-C,`dce9953d..cf7ca59f`)**:`storageBlocks` 入归档、两个消费者改读、每 draw SPIRV-Reflect 4→0;`g_programResourceCaches` 的 monolith 半边归 P13(G1)。
|
||||
9. **viewport-array 回放能否塞进一次 `draw_vbo`**:各遍之间观察到的状态是否与今天一致未验证。P8。
|
||||
9. **viewport-array 回放能否塞进一次 `draw_vbo`**:**已答(2026-09-30,ID-P8-1)**:能——server 在一次 draw 内按状态分组逐遍回放(`DirectGLES.cpp:8421-8465`),`ViewportArrayScenario` 在 split 各臂绿。
|
||||
10. **`ResidentSubData` 的不对称。** 已答一半(2026-09-22 核):**Magma 的实现已补**(`VkBufferManager.cpp:123` monolith 表、`:148` wire 表,`fff9d639f`)。**仍未答:`kCapResidentSubData` 从未被 server 发布**——`MG_Backend/Init.cpp:192-219` 是全树唯一的 `SetCapabilityBits` 生产调用点,只 OR 了 XFB、三个 query 位与 run-ahead 位;于是 `PipeFill.cpp:848` 在 split 下恒 false,**两个后端在拆分模式下都退回 `BufferObject.cpp:711-716` 的就地 memcpy**,Magma 的实现在 split 里是死代码。**已答(P7 wave 2-C,ID-P7-20)**:`InitServerRoleCommon` 按 server 自己的 wire 资源表发布 `kCapResidentSubData`,镜像收到即验收;白盒「发出的是 opcode 49」在 P11 采纳档落地前不可达(§5.4 债)。
|
||||
11. **`SEG_STAGE` 的上限。** 内容侧已答(2026-09-20):**分块已实现**——buffer 范围走查(`1e7c372e`)与纹理整宽 slab(`9469d48e`)按 `MGPipeStageChunkBytes()`(默认 32 MiB 的 1/4 = 8 MiB)切成多条 `resource_subdata`,所以单次 128 MiB 上传不再需要显式 `MOBILEGL_IPC_STAGE_MB=256`;单片仍超 arena 或该 record 类型未接入分片时仍是 `Fatal{RingOverrun, "SEG_STAGE"}` 兜底。**仍未答(2026-09-22 收窄)**:a6 §6 实测没走查的只剩 **program archive**(唯一无界 blob)与 **`draw_vbo` 的 `NumDraws*12` range 尾**;宿主索引 span 无 producer(划掉),`set_global_constants` 有走查。二者的分片是 P6.5 sl 与 P8 共用的同一件事,stream 发送窗口对着它们定尺。MC in-world / Create 的占用分布仍未量(门 8 已给出两条负载的字节/帧与记录/帧,逐 blob 分布只在 integration 车道取到)。
|
||||
11. **`SEG_STAGE` 的上限。** 内容侧已答(2026-09-20):**分块已实现**——buffer 范围走查(`1e7c372e`)与纹理整宽 slab(`9469d48e`)按 `MGPipeStageChunkBytes()`(默认 32 MiB 的 1/4 = 8 MiB)切成多条 `resource_subdata`,所以单次 128 MiB 上传不再需要显式 `MOBILEGL_IPC_STAGE_MB=256`;单片仍超 arena 或该 record 类型未接入分片时仍是 `Fatal{RingOverrun, "SEG_STAGE"}` 兜底。**仍未答(2026-09-22 收窄)**:a6 §6 实测没走查的只剩 **program archive**(唯一无界 blob)与 **`draw_vbo` 的 `NumDraws*12` range 尾**;宿主索引 span 无 producer(划掉),`set_global_constants` 有走查。二者的分片是 P6.5 sl 与 P8 共用的同一件事,stream 发送窗口对着它们定尺。MC in-world / Create 的占用分布仍未量(门 8 已给出两条负载的字节/帧与记录/帧,逐 blob 分布只在 integration 车道取到)。 **P8-0 实测(2026-09-30,ID-P8-5)**:最大 program archive 354,846 B、最大 `draw_vbo` 记录 1,936 B,都远低于 arena/4;**不做分片,关闭**。
|
||||
12. **P13 之后 split-only 渲染 bug 的 server 侧第二意见。** verify 构建 + recorder 只覆盖推送内容,不覆盖后端对它的解释。
|
||||
13. **烘焙后的内部 shader 能否在没有活 `ProgramObject` 的情况下表达 uniform location 与 UBO 布局。** 颜色 blit 已答(P5f fv:`WireColorBlit.{vert,frag}` 用 push constant,`WireColorBlitSpirv.h` 签进树);窄化到深度 mip 程序(今天在 split 下被编译掉、其 split 路径是具名 Fatal)与直通 TCS(`ProgramFactory.cpp:4060-4262`,第三个未盘点的内部 shader 生成器)。**已答(P7 wave 2-B / B2)**:深度 mip 烘焙 (A)(D)(`WireDepthMipmap.*`,push constant,`MOBILEGL_BAKED_INTERNAL_SHADERS` 新鲜度门表驱动)与 (B′)(disaggregated 构建的 monolith 臂改用烘焙模块)落地;multisample resolve 第三套烘焙 shader 随 B2;直通 TCS 仍未盘点。
|
||||
14. **推送模型改变哪些按拉取模式调过的缓存命中率。** 幸存者容量在 P13 重调。一条线索:设备上 26.3 Espryt 的 `sve` ≈ draw 数(每 draw 重发一次 sampler-view 集合),桌面只有 ~0.07/draw;列入 P3b/P4b 优化清单。
|
||||
15. **monolith 的 `*IndirectCount` 不调 `SyncGpuWrites()` 是不是潜在缺口。** 独立 `dev` 问题,拆分不得借机顺手修。
|
||||
15. **monolith 的 `*IndirectCount` 不调 `SyncGpuWrites()` 是不是潜在缺口。** 独立 `dev` 问题,拆分不得借机顺手修。**已答(2026-09-30):是**——P8-C / P8-D 主机 red-once 证实(Espryt `*IndirectCount`、Magma `glMultiDrawArraysIndirectCount` 读到 0);split 半已修(ID-P8-9),monolith 半在 P8 第二波的 dev 包里修(ID-P8-3)。
|
||||
16. **索引宿主镜像的实际内存占用。** MC / Sodium / Iris 语料里 element-array buffer 总量未测;若显著超 64 MiB,退化路径的频率与代价必须实测。P8。
|
||||
17. **`create-indirect` fixture 在 Adreno 830 上的失败**是 `dev@81b17c0b` 就有的(基线 APK 复现),不是本分支造成;`rd12` + Magma 在两台 Adreno 830 上的 `scudo::reportMapError` 崩溃同样是 `dev` 侧。两者排除在设备 A/B 之外、留在桌面语料里;P8 要在 `create-indirect` 上断言 `roundtrips-per-frame == 0`,所以 `dev` 的修复在别人的关键路径上。
|
||||
18. **split 两侧的负载平衡。** P5e 解锁出来的新问题:VD32(~3550 draws/帧)下 apply 线程 **11-12 ms**、client **15.7 ms**,**client 是瓶颈且打满 ~94%**。把工作从 client 挪到 apply 会直接降瓶颈——这在 lockstep 下毫无意义(两侧串行相加),**run-ahead 才使它成为一个杠杆**。供选:编码侧的 emitter、tracker 走查、持久映射的脏页追踪(`change_protection` 在侧写里占 1.3%)。需先重新侧写:等待消失后尾部各项的分母都变了。排在 P5e 之后;无主,2026-09-22 建议挂在路线图推完后的优化阶段,P6.5 的 2×2 矩阵车道顺带重新侧写
|
||||
|
||||
@@ -8,3 +8,12 @@
|
||||
| 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` 按行段分开)。 | 全部 |
|
||||
| ID-P8-5 | 2026-09-30 | **P8-0 普查**(主机 80 + 78 次重放、红米 trace 语料 77 × 两臂、FCL 原版 26.3 实机;插桩不提交):真实内容里只有 D 命中——原版 MC 26.3 × Magma × inproc 把 44,768 次 indirect 调用 / 13,028,030 个 draw(约 870 / 帧)在 CPU 展开;B1 / B2 / C / E 的前提在真实内容 0 命中,靠构造的 red-once 成立。**G 不做**:最大 program archive 354,846 B = arena/4 的 4.2 %,最大 `draw_vbo` 记录 1,936 B。create-indirect 门(ID-P8-2)在多帧 trace 上成立:rd12(250 帧)与 improved-transparency-26.3(1210 帧)加载帧非 `ResourceCreate` 等待 = 0。设备语料 spawn 70/77、monolith 68/77 达 0.99,差的都在基线(未插桩对照)上复现。 | FCL 上只有原版 26.3(无 Iris / Complementary / Create,未下载),B2 实机对照做不了,改用两条 Complementary trace(生成 mip 只见 R11F 与 RGBA8)。 | [`S.md`](S.md);树外 `~/w7/notes/p8/s-report.md` |
|
||||
| ID-P8-6 | 2026-09-30 | **F 落地**(`2b4ae539`):我们的 client 发不出的形状改判 `ProtocolCorruption`——multi-draw `CLIENT_INDICES` / `INSTANCED` 闩、Magma `client-vertex-array`;Magma 生成 mip 着色器形状在 wire 臂由 Fatal 改具名拒绝 `MipmapShaderFormatOrShape`(与 monolith 一致,判定在长链之前);`kCapViewportArray` / `kCapNeedsHost{Index,Ubo}Bytes` 与索引镜像哨兵标保留位、不改号。 | 只有外来 peer 能到;mip 形状是后端覆盖缺口不是坏记录。`@P` 标签本不计入 census(BRIEF-F 前提不成立)。 | [`F.md`](F.md) |
|
||||
| ID-P8-7 | 2026-09-30 | **A 落地**(`8133cd52` + `24b8aef6`):246 个只在 monolith 登记的用例登上 split / spawn / tcp(`P8Coverage.cmake`);五条 server 读的旋钮车道各起一个 tcp supervisor;撤 `ClientSideIndices` / `GuiBatch` 排除;`split_coverage.py` + 豁免表(mechanism / single-backend / no-records / pending-fix)进 CI 与 `gate.sh`,断言归一化后 monolith ⊆ split ∪ 豁免(ID-P8-2)。按名普查 304 例:235 三臂全过、55 同因跳过、13 no-records、1 真红(Espryt spawn / tcp 默认帧缓冲深度读 0,pending-fix,第二波)。 | 旋钮只放 client 环境时 tcp 副本静默跑默认臂(旧 `ForcedDs` tcp 条目同病,已修)。**规则**:server 读的旋钮车道要么独立 tcp supervisor,要么只上 split + spawn,要么证明对其他用例惰性(E 的 13×7 extent 限域)。 | [`A.md`](A.md) |
|
||||
| ID-P8-8 | 2026-09-30 | **B 落地**(`2f530ad8`):Espryt server 按记录的生成窗口 [BASE+1, min(MAX+1, 存储层数, 链长)) 生成 mip(B1,与 Magma 同口径);RGB16F / RGB32F 先试驱动原生,驱动拒绝时 server 从驱动读回基级做 2×2 box(不读 client 影子;读回被拒且暂存覆盖整级才用暂存);split 名 `generate-mipmap-storage` / `generate-mipmap-cpu-filter` 退役。 | 基线 B1 六例 × 三臂、B2 四例 Fatal;只修检查不修链时 BASE=1 会被 level 0 覆盖。强制 CPU 臂旋钮 `MGITEST_ESPRYT_FORCE_CPU_MIPMAP` 只上 split + spawn(合 ID-P8-7 规则)。 | [`B.md`](B.md) |
|
||||
| ID-P8-9 | 2026-09-30 | **C 落地**(`94410715`):split server 给 shader 写过的 buffer 孪生体打标(SSBO / 原子计数、可写 buffer image、XFB),restart 重写、multi-draw rebase、`*IndirectCount`、CPU 取用的 indirect 字段、XFB scatter、fp64 收窄一律经 `SplitHostBytesForCpuRead` 懒刷新后读;T0 臂先落排队常驻写再 `glFinish`(P11-B2 那条债的 split 半,主机无 T0、未能证红)。 | 前提成立:基线 Espryt split / spawn / tcp 21/21 红。monolith 13 条缺陷用例运行时按名跳过(`SkipBrokenMonolith`,原因写在代码里),第二波 dev 修复落地后解除。 | [`C.md`](C.md) |
|
||||
| ID-P8-10 | 2026-09-30 | **D 落地**(`92eab9f3`):Magma wire 臂把 `glDraw*Indirect` / `glMultiDraw*Indirect[Count]` 直接录成 `vkCmdDraw*Indirect[Count]`;CPU 展开只留给设备发不出的 COUNT 形态(与 monolith 同条件);shader 写过的 store 在首个 indirect 读前录一次屏障;范围 / 对齐 / 缺 store 四条具名拒绝。 | create-indirect split 上 321/322 次 indirect 读每次一整 GPU 等待(每次回放约 8 s)→ 0。去屏障的像素用例在 lavapipe 上不红(顺序执行),如实记录。 | [`D.md`](D.md) |
|
||||
| ID-P8-11 | 2026-09-30 | **E 落地**(`39cd8fb7`):审计前提不成立——split 的 `glGetTexImage` 只读 GPU、不碰影子;真实缺口是驱动拒绝 attach(Adreno RGB16 / 16 位 SNORM)时会话以 `Fatal{ReplyError,"ReadPixels"}` 结束。改为由 server 暂存 store 作答(整级、extent 相符、未被驱动写过),store 跟随同格式 `glCopyImageSubData`(FollowCopy),跟不了的打粘性 driver-written 标;否则具名拒绝。死闩 `CopyImageSubData+RENDERBUFFER` 删除,census 79 → 78。 | red-once 11 条。E 的 monolith 半(拷贝后读拷贝前的 CPU 影子)归第二波 dev。 | [`E.md`](E.md) |
|
||||
| ID-P8-12 | 2026-09-30 | **第一波集成头 `39cd8fb7` 整套门**:G1 符号增 0 减 0、`.text` `0xa5ba13`(pull 不变);fatal census 78;link ratchet 172;parity 0;修订 5;wire-declines 58 / 59 站点;卫生 12/12 + `split_coverage`(两后端 monolith 701,Espryt 门控 612 + 豁免 89,missing 0);unit 2721;split / spawn / tcp 735 / 649 / 661;Magma 271 / 248 / 216 / 668;gpu monolith / inproc 3684 / 3684;verify 5471;retrace 230/236(已知 6 例 iterationrp)。集成者裁定:契约旧措辞加 P8 修订注(`CONTRACT-P5B.md`、`CONTRACT-P5E.md`、`CONTRACT-P7.md`);monolith 缺陷共 14 条,全部进第二波 dev 包(ID-P8-3);开放问题 9、11 关闭,15 答「是缺口」。 | 串行集成六次,每次整套门;两处追加冲突(`CMakeLists.txt`、`WireDeclines.def`)都两块保留,一次合并修复(A 的豁免行)。 | 树外 `~/w7/notes/p8/int-*.md` |
|
||||
| ID-P8-13 | 2026-09-30 | **第二波**:split 两包(SE Espryt + 文档、SV Magma)串行合入 `p8/main`;dev 一包(MD)只修 create-* 在 Adreno 上的三条真实负载缺陷,其余 11 条 monolith 缺陷留给 P13(`DEBTS.md`)。 | ID-P8-3 原意是「B2 的 monolith 半边上 dev」,第一波报出 14 条,全在 monolith 专属臂里、P13 换臂即消失;按 P8-0 真实内容命中收窄,只修 Create 在 Adreno 上会碰到的三条(dev 是现行产品)。这是对 ID-P8-3 的收窄,已告知用户。 | `PLAN-P8.md` 第二波 |
|
||||
|
||||
@@ -42,3 +42,27 @@
|
||||
- **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)。
|
||||
|
||||
## 第二波(2026-09-30,ID-P8-13)
|
||||
|
||||
| 包 | 树 / 分支 | 内容 |
|
||||
|---|---|---|
|
||||
| SE(split,Espryt + 文档) | `~/w7/p8-se` / `p8/se` | 默认帧缓冲深度在 Espryt spawn / tcp 读 0(A 的 pending-fix 豁免);B2 的 CPU mip 回退看 E 的 driver-written 标;D 的 case 3 在 Espryt split 臂放开(C 已落地);`PipeCatalogueTest` 名单去死名 `copy-image-shadow-mirror` 并加"名单 = 调用点"的门;B / C / D / E 包说明的行号漂移 |
|
||||
| SV(split,Magma) | `~/w7/p8-sv` / `p8/sv` | 3D 纹理原生 mip blit 把 depth 当 `layerCount`(VUID-vkCmdBlitImage-srcImage-00240);深度模板 mip 拒绝补 `WireDeclineTally` 行;`GenerateWireDepthMipLevel` 拒 1D;wire 臂 `DispatchComputeIndirect` 原生化 |
|
||||
| MD(dev,设备) | `~/w7/dev-p8-md` / `devfix/p8-md` | create-* 在 Adreno 830 上的三条:Espryt create-instancing monolith SSIM 0.870;Espryt 每次 indirect draw 整 buffer 同步回读(设备上挂死 > 10 分钟);Magma 计算写与 indirect 读之间无依赖(可能就是 ID-P7-4)。先在 dev 构建上复现,复现才在 dev 上修;只在 feat 构建上出现的交回集成者 |
|
||||
|
||||
### monolith 缺陷(ID-P8-3)的取舍
|
||||
|
||||
所有 14 条都在 monolith 专属臂里;P13 把 monolith 换到第一波已修好的记录臂上,它们随之消失。按 P8-0 的真实内容命中取舍:
|
||||
|
||||
| 缺陷 | 来源 | 真实内容命中 | 做法 |
|
||||
|---|---|---|---|
|
||||
| Espryt create-instancing monolith 画面错(0.870) | S | Create(Adreno) | **MD 修(dev)** |
|
||||
| Espryt indirect draw 整 buffer 同步回读、设备挂死 | S | Create(Adreno) | **MD 修(dev)** |
|
||||
| Magma 计算写 → indirect 读无依赖 | D | Create(推断,ID-P7-4) | **MD 修(dev)** |
|
||||
| Espryt `*IndirectCount` / 原生 indirect `gl_BaseVertex` / fp64 收窄读未同步影子 | C | 0 | 留给 P13 |
|
||||
| Magma `glMultiDrawArraysIndirectCount` CPU 臂读未同步影子 | C、D | 0 | 留给 P13 |
|
||||
| Magma 录制中途 `SyncGpuWrites` → SIGSEGV | C | 0 | 留给 P13 |
|
||||
| Espryt RGB16F / RGB32F CPU 滤波读陈旧影子;R11F / 深度链无视 BASE / MAX | B | 0 | 留给 P13 |
|
||||
| Magma 无 BLIT 颜色格式缺着色器 mip 臂 | B | 0 | 留给 P13 |
|
||||
| Espryt 拷贝后 `glGetTexImage` 读拷贝前影子 | E | 0 | 留给 P13 |
|
||||
|
||||
@@ -4,16 +4,18 @@
|
||||
|
||||
## 重定界后的包
|
||||
|
||||
| 包 | 内容 |
|
||||
|---|---|
|
||||
| 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 的测量决定做不做 |
|
||||
| 包 | 内容 | 结果 |
|
||||
|---|---|---|
|
||||
| P8-0 | 普查:设备与主机的 trace 语料上各拒绝点 / 仿真谓词的命中数 | ✅ 真实内容只 D 命中;G 不做;create-indirect 门在多帧 trace 上成立([`S.md`](S.md),ID-P8-5) |
|
||||
| A | 覆盖对齐 | ✅ 246 例登上三臂,`split_coverage.py` 进门([`A.md`](A.md),ID-P8-7) |
|
||||
| B | Espryt 生成 mip | ✅ 生成窗口 + RGB16F / RGB32F 在 server 完成,两个 split 名退役([`B.md`](B.md),ID-P8-8) |
|
||||
| C | Espryt server 暂存影子与 GPU 写 | ✅ 基线 21/21 红 → 绿([`C.md`](C.md),ID-P8-9) |
|
||||
| D | Magma wire 臂原生 indirect | ✅ create-indirect 每次整 GPU 等待 321 → 0([`D.md`](D.md),ID-P8-10) |
|
||||
| E | CopyImage / 驱动拒读 | ✅ 前提改正:真实缺口是驱动拒读时会话 Fatal,改由 server store 作答([`E.md`](E.md),ID-P8-11) |
|
||||
| F | 死闩清理与重分类 | ✅([`F.md`](F.md),ID-P8-6) |
|
||||
| G | 大 blob 分片 | 不做(ID-P8-5) |
|
||||
|
||||
第一波集成头 `39cd8fb7` 整套门全绿(ID-P8-12)。第二波见 [`PLAN-P8.md`](PLAN-P8.md)。
|
||||
|
||||
## 摘要(原文,已划掉)
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# P8-0 普查(S 包)
|
||||
|
||||
> 插桩不提交(树外 `~/w7/notes/p8/s/instrument.diff`);全文 `~/w7/notes/p8/s-report.md`。裁定 ID-P8-5。设备计数是下限(Android 不跑退出 dump,按 10 / 600 帧周期 dump)。
|
||||
|
||||
## 覆盖
|
||||
|
||||
| 语料 | 臂 | 数 |
|
||||
|---|---|---|
|
||||
| 主机 trace | monolith / inproc,两后端 | 80 / 78 次重放 |
|
||||
| 红米 trace APK(插桩) | monolith / spawn `--matrix` | 77 / 77,达 0.99:68 / 70 |
|
||||
| 红米未插桩对照 | create-indirect、create-instancing | 7 次,区分设备缺陷与插桩 |
|
||||
| FCL 实机 | 原版 26.3-rc-3,两后端 | 约 15,000 帧;无 Iris / Complementary / Create(未下载) |
|
||||
|
||||
## 命中(真实内容)
|
||||
|
||||
| 谓词 | 主机 | 设备 trace | FCL | 结论 |
|
||||
|---|---|---|---|---|
|
||||
| Magma wire indirect CPU 展开(D) | create-indirect 322 次调用 | create-indirect 321 次 | Magma inproc 44,768 次调用 / 13,028,030 draw | **唯一真实命中** |
|
||||
| B1 split 存储检查会失败 | 0 / 1375 次生成(R11F 1357、D16 18) | 0 / 391 | 0 | 路径热、失败形状 0 |
|
||||
| B2 RGB16F / RGB32F 生成 mip | 0 | 0 | 0 | 未见(两条 Complementary trace 只有 R11F 与 RGBA8) |
|
||||
| C GPU 写过的字节被 CPU 读 | 0(只有指针解析 322/322) | 0 | 0 | 未见 |
|
||||
| E 拷贝后经影子 `glGetTexImage` | 0(1,288 次拷进 DEPTH / R32F,无一回读) | 0 | 0 | 未见 |
|
||||
| Magma 生成 mip 着色器形状 | 0 | 0 | 0 | 未见 |
|
||||
|
||||
## G(大 blob)
|
||||
|
||||
| 量 | 最大值 | arena / 4 | 比例 |
|
||||
|---|---|---|---|
|
||||
| program archive | 354,846 B(complementary-unbound) | 8 MiB(SEG_STAGE 32 MiB) | 4.2 % |
|
||||
| `draw_vbo` 记录 | 1,936 B(156 段) | 2 MiB(SEG_CMD / 4) | 0.1 % |
|
||||
|
||||
结论:不做分片。
|
||||
|
||||
## create-indirect 门(ID-P8-2)
|
||||
|
||||
| trace | 帧 | 加载帧非 `ResourceCreate` 等待 |
|
||||
|---|---|---|
|
||||
| rd12 odinlite(设备 spawn,两后端) | 250 | 0 |
|
||||
| improved-transparency-26.3(设备 spawn,两后端) | 1210 | 0 |
|
||||
| create-indirect(1 帧) | 1 | 8(设备)/ 10(主机):`ResourceReadback` 6 + `MapPersistent` |
|
||||
| FCL 原版 26.3(实机 inproc) | ~15,250 | 16(`MapPersistent`) |
|
||||
|
||||
## 设备上基线就有的问题(两臂都有,不归 P8)
|
||||
|
||||
- create-indirect 在 Adreno 830 上 kgsl `Preemption Fault`(两后端两臂;ID-P7-4)。
|
||||
- 1.21.11-main-menu(Espryt 0.890、Magma 0.165)、derivative-main(Espryt 0.851)SSIM < 0.99。
|
||||
- create-instancing × Espryt × monolith 0.870(spawn 0.99998)——monolith 缺陷,进第二波 dev。
|
||||
Reference in New Issue
Block a user