mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
12 KiB
12 KiB
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、Bb9feb9d7、Ce815ce8d、Dd639e546、Ec00f5eab、Fc7a14ed7)经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 的去向以本说明为准 |