mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 10:03:23 +09:00
132 lines
12 KiB
Markdown
132 lines
12 KiB
Markdown
# P8-SE:Espryt split 残项与 P8 包说明的行号漂移
|
||
|
||
> 2026-09-30,分支 `p8/se`(基线 `cbbaf77f`)。简报 `~/w7/notes/p8/BRIEF-SE.md`;证据 `~/w7/notes/p8/se-evidence/`(树外)。第二波,ID-P8-13。
|
||
|
||
## 1. 结论
|
||
|
||
| 项 | 结果 | 位置 |
|
||
|---|---|---|
|
||
| 1 默认帧缓冲深度 / 模板在 Espryt spawn / tcp 读 0 | 修;A 的 pending-fix 豁免行删去,用例登上三臂(含 `ForcedDs.` 三臂) | `MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp:16239` |
|
||
| 2 B2 的 server CPU mip 臂 × E 的驱动写标 | 修;驱动读回被拒且纹理被驱动写过时具名拒绝 `generate-mipmap-store-declined`,不读 store | `DirectGLES.cpp:13066`、`:13134` |
|
||
| 3 D 的 case 3 在 Espryt split 臂放开 | 放开,三臂 + inproc A/B 绿;Espryt monolith 跳过保留(证红) | `MobileGL/MG_IntegrationTest/Scenarios/WireIndirectDrawScenario.cpp:306` |
|
||
| 4 `PipeCatalogueTest` 名单 = 调用点 | 删 `copy-image-shadow-mirror` 调用与名(G1 不变);新 lint 进 CI 与 unit 车道 | `scripts/ci/unmigrated_emulation_sites.py` |
|
||
| 5 A–F、S 包说明行号漂移 | 213 处引用逐条对内容;87 处按内容重定位 + E.md 一行改写;S.md 无引用 | §7 |
|
||
|
||
- monolith 缺陷:本包未发现新的(case 3 的 Espryt monolith 红是 C 已记的 OQ15 一条)。
|
||
|
||
## 2. 项 1:根因与修法
|
||
|
||
| 事实 | 出处 |
|
||
|---|---|
|
||
| 发布函数原 guard `!defaultFBOInfo \|\| ...` 在 `OnSurfaceChanged` post 之前 return | `DirectGLES.cpp:16229`(函数)、`:16360`(post) |
|
||
| spawn / tcp 的 server 进程没有前端,`pDefaultFramebufferInfo` 为空(临时探针:spawn `(nil)`,inproc 非空) | 探针未提交 |
|
||
| 结果:client 的默认帧缓冲 depth / stencil 留在占位格式 `Depth32FStencil8` | `MobileGL/MG_Impl/Init.cpp:33`、`:37` |
|
||
| 探针:spawn client 报 depth 32 / `GL_FLOAT`;inproc 报 24 / `GL_UNSIGNED_NORMALIZED`(pbuffer 是 D24S8) | `DirectGLES.cpp:16498` |
|
||
| 用例按报告分配 D32F_S8,server 驱动拒绝 D24S8→D32F_S8 的深度 / 模板 blit,只打 `the depth/stencil aspect was dropped`;颜色照过,client 无 GL 错误 | `DirectGLES.cpp:10926` |
|
||
| inproc 绿是巧合:client 与 server 同进程共用该指针 | — |
|
||
| Magma 的发布从不看该指针(callback 臂直接 post),三臂一直绿 | `MobileGL/MG_Backend/DirectVulkan/Renderer/SwapchainObject.cpp:346` |
|
||
| 修:`MOBILEGL_PIPE_PUSH` 下 callback 在场即发布,只有 monolith 臂写占位;pull 构建保留原句(`#else`) | `DirectGLES.cpp:16239`、`:16325` |
|
||
| 登记:`mgl_itest_register_split_arms` 三臂;`ForcedDs.` 过滤器不再减掉该例 | `MobileGL/MG_IntegrationTest/CMakeLists.txt:4866`;`MobileGL/MG_IntegrationTest/P8Coverage.cmake:177-178` |
|
||
| 豁免表 pending-fix 类清空 | `scripts/data/split_coverage_exemptions.txt:64-65` |
|
||
|
||
- 顺带生效:P12 服务器自有窗口在 spawn 下的 extent 发布(`g_publishWindowExtent`,`DirectGLES.cpp:16656`)被同一 guard 挡住、从未发出过;现在会发出,client 走 `ApplySurfaceChangedToClient` 的带 extent 臂(`MobileGL/MG_Remote/Client/ClientSession.cpp:325`)。主机无覆盖,需设备确认。
|
||
|
||
## 3. 项 2:CPU mip 臂的 store 路由
|
||
|
||
| 事实 | 出处 |
|
||
|---|---|
|
||
| E 的驱动写标按纹理、粘性 | `MobileGL/MG_Remote/Server/StagedTextureStore.h:496-502` |
|
||
| split 的 `GenerateMipmap` 在进 `GenerateMipmapByRecord` 前无条件记驱动写:CPU 臂读 store 时标恒为真 | `DirectGLES.cpp:13296` |
|
||
| 所以在记写之前快照 `driverWrittenBefore` 并下传;否则 store 路由(B 为不可附着存储设计的)永远拒绝 | `DirectGLES.cpp:13291`、`:13305` |
|
||
| store 路由拒绝条件:view、无 store、驱动写过、未整层覆盖、尺寸不符 → `MGLOG_E_ONCE` `generate-mipmap-store-declined`,层不动,不 Fatal | `DirectGLES.cpp:13066`、`:13134` |
|
||
| E 的旋钮原只在 `ReadTextureImageWire` 查,CPU 臂直接调 `ReadTextureLevelTight`,主机到不了 store 路由;现在 CPU 臂也查(前向声明) | `MobileGL/MG_Backend/DirectGLES/WireTextureReadback.inc:445`;`DirectGLES.cpp:13026`、`:13045` |
|
||
| 粒度:标按纹理不按层,纹理被生成过一次或任一层被画过,之后读回被拒的生成一律拒绝(保守,不给旧字节) | — |
|
||
|
||
| 用例(`GenerateMipmapServerScenario`) | 形状 | 断言 | 行 |
|
||
|---|---|---|---|
|
||
| `Rgb16fDrawnBaseWithARefusedReadbackDeclinesByName` | level 0 上传哨兵色后当渲染目标画上下两半 | server 日志有 `generate-mipmap-store-declined`、无 store 滤波行;level 1..3 不是哨兵色 | `MobileGL/MG_IntegrationTest/Scenarios/GenerateMipmapServerScenario.cpp:408`、`:546` |
|
||
| `Rgb16fUploadedBaseWithARefusedReadbackIsFilteredFromTheStore`(对照) | 只上传 level 0 | 日志有 `filtering the staged store's copy`、无拒绝;level 1..3 正确 | `GenerateMipmapServerScenario.cpp:439`、`:550` |
|
||
|
||
| 条目 | 臂 | 登记 |
|
||
|---|---|---|
|
||
| `DirectGLES.{Split,Spawn}.CpuMipRefused.*` | 旋钮 `MGITEST_ESPRYT_FORCE_CPU_MIPMAP=1` + `MGITEST_ESPRYT_REFUSE_TEXTURE_READBACK_EXTENT=16x16`,标签 `integration-gpu`、`integration-cpu-mip-<arm>` | `MobileGL/MG_IntegrationTest/CMakeLists.txt:4883` |
|
||
| 其他臂(monolith、无旋钮 split 三臂、Magma) | 两例按旋钮缺席跳过 | 环境发现 / `GenerateMipmapServerScenario.*` |
|
||
|
||
- 不上 tcp:server 是共享 `TcpServer.Start`,16x16 拒绝会碰到整条 lane 的 16x16 颜色读回;与 B 的 `CpuMip.` 同形,parity 无需例外行(实测 0 错)。
|
||
|
||
## 4. 项 3:D 的 case 3
|
||
|
||
- 跳过条件由「非 Magma」改为「非 Magma 且 monolith」(`WireIndirectDrawScenario.cpp:306`);Espryt split 的 count 字由 C 的 `SplitHostBytesForCpuRead` 刷新(`DirectGLES.cpp:9632`、`:9798`)。
|
||
- 计数断言只在 Magma inproc(`CountersReadable`),Espryt 只断言像素。
|
||
|
||
## 5. 项 4:名单与调用点
|
||
|
||
| 事实 | 出处 |
|
||
|---|---|
|
||
| `copy-image-shadow-mirror` 调用在镜像函数自己的 transport return 之后,且在 `#if MOBILEGL_PIPE_PUSH` 内:任何 transport 到不了,pull 构建不编译它 | `DirectGLES.cpp:13580`、`:13582-13585` |
|
||
| 删调用与名:G1 符号 +0 / −0,`.text` `a5ba13` 不变 | §8 |
|
||
| 名单现 3 名,一名一处调用 | `MobileGL/MG_Test/Pipe/PipeCatalogueTest.cpp:1448-1455` |
|
||
| lint 规则(全是 error):名单每名恰一处产品调用;每处调用名在名单;名单无重复;调用须是字符串字面量。产品源 = `MobileGL/` 去掉 `MG_Test/`、`MG_IntegrationTest/`;先掩码注释 | `scripts/ci/unmigrated_emulation_sites.py` |
|
||
| CI:`test.yml` 在 `split_coverage.py` 之后一步 | `.github/workflows/test.yml:1475` |
|
||
| unit 车道:`PipeCatalogue.UnmigratedEmulationSites{SelfTest,MatchTheList}` | `MobileGL/MG_IntegrationTest/CMakeLists.txt:4895-4901` |
|
||
| 门命令:`python3 scripts/ci/unmigrated_emulation_sites.py --self-test && python3 scripts/ci/unmigrated_emulation_sites.py` | — |
|
||
| 回看:lint 在 `8d3e2317`(B 之前)红 2 条:`generate-mipmap-storage` 4 处调用、`generate-mipmap-cpu-filter` 不在名单;在 `cbbaf77f` 绿(4 名 4 处) | 证据 `r4b-lint-*.log` |
|
||
|
||
## 6. red-once
|
||
|
||
| # | 变异 | 载体 | 观察到的红 |
|
||
|---|---|---|---|
|
||
| R1 | 发布 guard 改回 `if (!defaultFBOInfo) return;`(= 基线) | `DirectGLES.{Split,Spawn,Tcp}.DepthStencilReadbackAttachmentShapeScenario.DefaultFramebuffer…` | Spawn、Tcp 红(depth 0、stencil 0),Split 绿 |
|
||
| R1′ | 同上 | 三个 `ForcedDs.` 条目 | Spawn、Tcp 红,Split 绿 |
|
||
| R2a | 去掉 `driverWrittenBefore` 判定 | `DirectGLES.{Split,Spawn}.CpuMipRefused.*` | 画过的例两臂红:level 1..3 = 哨兵 `rgba(255,0,255,255)`、无拒绝行、有 store 滤波行;对照绿 |
|
||
| R2b | 快照挪到自身记写之后 | 同上 | 对照两臂红:store 路由拒绝、level 1..3 `rgba(0,0,0,255)`;画过的例绿 |
|
||
| R2c | CPU 臂不查拒绝旋钮 | 同上 | 4/4 红:拒绝行与 store 滤波行都没有(原生读回路径) |
|
||
| R3 | 两处 `*IndirectCount` 参数读改回 `SplitHostBytes`(去 C 的刷新) | `DirectGLES.{Split,Spawn,Tcp}.WireIndirectDrawScenario.ComputeWrittenCount…` | 三臂红:两处 count 画错条带 |
|
||
| R3m | 去掉 Espryt monolith 跳过 | `DirectGLES.WireIndirectDrawScenario.ComputeWrittenCount…`(monolith) | 红:count 1 却画了条带 2、3(OQ15,跳过须保留) |
|
||
| R4a | `kNames` 加回 `copy-image-shadow-mirror` | lint;`PipeCatalogue.UnmigratedEmulationSitesMatchTheList` | rc 1:「listed and has no call site」;ctest 红 |
|
||
| R4b | `--self-test` 六例(多名、漏名、同名两处、名单重复、非字面量、匹配) | lint | 各规则按预期 rc;匹配树 rc 0 |
|
||
|
||
还原一律复制比对 + `touch`(`cmp` 一致)后重建再跑绿。
|
||
|
||
## 7. 项 5:行号漂移
|
||
|
||
- 方法:每份说明从最后写它的提交(A `06f28b0a`、B `b9feb9d7`、C `e815ce8d`、D `d639e546`、E `c00f5eab`、F `c7a14ed7`)经 `git diff -U0` 把每处 `file:line` 与同行 `:line` 简写映射到 HEAD;映射到的行与原行内容逐字相同。工具未提交。
|
||
|
||
| 说明 | 引用 | 未动 | 重定位 | 备注 |
|
||
|---|---|---|---|---|
|
||
| A | 21 | 7 | 14 | — |
|
||
| B | 31 | 2 | 29 | — |
|
||
| C | 30 | 20 | 10 | — |
|
||
| D | 44 | 32 | 12 | `WireDraw.inc` +7(F)、`WireDeclines.def` +6、`CMakeLists` D 块 `:4831-4864` |
|
||
| E | 41 | 21 | 18 + 1 行改写 | 第 93 行:调用与名已由本包删,改指删除注释与名单 |
|
||
| F | 46 | 42 | 4 | 第 11 行「旧 `:1427`…」是 F 之前的位置,按原意不动;`:1460` 属 `WireFramebuffer.inc`,未变 |
|
||
| S | 0 | — | — | — |
|
||
|
||
- 集成方简报里的几处量值是中间合并点的:B 的 `CMakeLists` `:3355` 在 HEAD 是 `:3442`(非 `:3375`),`:4059` 是 `:4174`,`:2154`(`TcpServer.Start` 的 fixture 属性)是 `:2168`;D 的 `:4651` 是 `:4831`(非 `:4764`);按内容为准。
|
||
- 只改行号,不改历史陈述:B.md 的「名单保持 4 名」是 B 当时的读数,现为 3 名(§5)。
|
||
|
||
## 8. 门
|
||
|
||
`gate.sh ~/w7/p8-se p8se`,头 `edcb9328`,dirty 0(`~/w7/notes/p8/se-evidence/gate-p8se.log`);与第一波集成头(ID-P8-12)对比。
|
||
|
||
| 项 | 读数 | 变化 |
|
||
|---|---|---|
|
||
| G1 | 符号 `added=0 removed=0`(clang 22.1.6);`.text` `a5ba13` | 不变 |
|
||
| fatal census / link ratchet | 78 abort 点 / 20 文件 / 45 族;172 | 不变(`MGPipeUnmigratedEmulation` 调用不是 abort 点) |
|
||
| parity / protocol pin / wire-declines | 0 错;revision 5;58 行 59 处 0 未记 | 不变 |
|
||
| hygiene | 13/13 OK(含 `split_coverage`、`doc_citations`) | — |
|
||
| split_coverage | DirectGLES monolith 703 = 门控 615 + 豁免 88,missing 0;DirectVulkan 703 = 门控 222 + 信息层 449 + 豁免 32 | monolith +2(两个新例);Espryt 门控 +3,豁免 −1(pending-fix) |
|
||
| unit | 2723 | +2(lint 两条 ctest) |
|
||
| integration-split / spawn / tcp | 739 / 653 / 665 | 各 +4:默认帧缓冲例、其 `ForcedDs.` 条目、两个新例(无旋钮臂跳过) |
|
||
| magma split / spawn / tcp / full-split | 271 / 248 / 216 / 670 | full-split +2(两个新例经 tier 3 回放) |
|
||
| integration-gpu[monolith] / [inproc] | 3704 / 3704 | +20:默认帧缓冲例的 Espryt 三臂与 `ForcedDs.` 三臂 6;两个新例 14(两后端 monolith 4、Espryt 三臂 6、`CpuMipRefused.` 4) |
|
||
| retrace(`MOBILEGL_BUILD_TRACE_REPLAY=ON`,236 条) | 230 过;6 红 = 已知 `iris-iterationrp-in-world`(两后端 × monolith / SPLIT / SPAWN,主机 llvmpipe JIT `Cannot select`) | 与第一波相同(`retrace-p8se.log`) |
|
||
|
||
## 9. 发现未修
|
||
|
||
| 项 | 说明 |
|
||
|---|---|
|
||
| P12 extent 发布在 spawn 下首次生效 | §2 末条;需设备(红米 FCL→render server)确认 |
|
||
| store 路由粒度 | 驱动写标按纹理;按层的标需要改 E 的 store 接口 |
|
||
| B.md / E.md 的历史陈述 | 名单数、`copy-image-shadow-mirror` 的去向以本说明为准 |
|