Files
MobileGL/docs/Disaggregated/notes/p11/INTEGRATOR-DECISIONS-P11.md
T

18 KiB
Raw Blame History

P11 集成者裁定日志(persistent map 与 ≥16 MiB 采纳)

形式沿用 ../p10/INTEGRATOR-DECISIONS-P10.md:一条裁定一个 ID,只记「定了什么、为什么、影响哪些文件」。计划见 PLAN-P11.md,协议见 MobileGL/MG_Remote/CONTRACT-P11.md。

ID 日期 裁定 理由 影响
ID-P11-1 2026-09-29 范围按计划 §1 重划:gPipeInputs 版本化(P5e / P5f 已落地)与 T1(两台设备上只有 Adreno Vulkan 可用)关闭;completedFrameSerial 生命周期与探针选档并入 B;路线图的采纳基线(163 → 21 ms / 40 → 115 fps / ~400 MB)撤下,由 A4 同会话重测替代,性能与 RSS 只记录。 逐项核对 74ae652e 的树(审计 ~/w7/notes/p11/AUDIT-P11.md);基线没有构建号、设备、臂与定频记录,115 疑为 vsync 封顶。 PLAN-P11.md
ID-P11-2 2026-09-29 B 排期,消费者是同一台设备上从其他 app 里启动的 GL 程序(Termux 一类,用户)。顺序 B0(跨 app 通道探针)→ B1(外部 client 的共享内存数据面)→ B2(T0)。B0 的 client 按用户的说法用 retrace client 实现:先是 adb shell 里跑的可执行文件,再是另一个 app 里的 retrace client;不走 Termux 的路子,通道不通时的后备是 server app 自己的 bound Service。 这类 client 今天只能走 TCP loopback(Stream),T0 在上面不可能;P10 实测 rd12 tcp 51 fps 对 shm 120 fps,数据面本身就是最大的收益。 PLAN-P11.md §2 B
ID-P11-3 2026-09-29 A1 的形状:不改线上格式。Stream 上两侧都是一行 Refuse{AdoptTierOnStream} 然后 T2;共享段上 client 在握手期 Fatal{UnimplementedAdoptTier},server 只警告并服务 T2(档位由 client 定,server 端 Fatal 在 fork 模式下会抢在 client 的具名诊断之前);使用处的 Fatal 留给没有经过握手的调用者。 每一侧只判自己的旋钮就够,不需要把档位带过线;ServerSpawn 本来就剔除子进程的 MOBILEGL_IPC_*(审计 F-K4"spawn 下晚死"不成立,实际是静默 T2)。 Transport/AdoptTier.cpp、ClientSession.cpp、ServerSession.cpp、PersistentMapTracker.cpp、fatal_census.py
ID-P11-4 2026-09-29 A2 的负控改用"split 车道声明 adopted"(两后端 8 条红);计划里"删 PipeApply.cpp 的 R-6 拒绝"那条 red-once 不成立,不用。Magma 同时进 Arena. 带状块与 Buffers 车道,两处都留;.AdoptTier0. 只登记 tcp(spawn_lane_parity.py 的 MAGMA_TCP_ONLY)。 split 下采纳请求经线路走,codec 不调 applier 就答 DECLINED,删 applier 的拒绝什么也不改变。 LargeArenaAdoptionScenario.cpp、MG_IntegrationTest/CMakeLists.txt、spawn_lane_parity.py、test.yml
ID-P11-5 2026-09-29 protocol.fbs:43 那行把 Adopt = 6 写成 T1 形状的注释不改。 protocol_revision_pin.py 对整个文件取哈希,改注释就要升修订号;档位定义以 design/07 与 CONTRACT-P11.md 为准。 无
ID-P11-6 2026-09-29 合并 dev c60639db(568090f0 重铸读回、8966d5c2 转换层的局部上传、b1d60523 Magma 清除后上传排序、c60639db Magma eglSwapInterval),合并提交 e0102bad 加五个跟进提交。规则:句柄臂只在上传字节是未转换的层时才用记录里携带的行 / 片步长(carriedLayoutApplies),转换过的层用转换缓冲自己的每纹素字节(强制旧行为的探针在 push 单进程与三臂 8 条红);push 单进程臂上 dev 的重铸丢了一个待上传的 glTexSubImage(client 发射时就清了脏标记),修为同时合并 applier 的待上传框(48a30602,合并头上红、修后绿);dev 的两个新场景登记到两后端的 Split / Spawn / Tcp(split 侧无需修);TextureRemintPullScenario 撤掉 monolith Espryt 的 skip;ImageBindableRemintScenario 钉 barrier(ID-P9-11 的同一形状)。G1 换基线:对 P9 基线 +120 / −84 个符号,其中具名的 +34 / −6 与 dev 自己的增量逐个相同,其余是重编号的异常表标签;.text 0xa52203 → 0xa56413;新基线 ~/w7/logs/p11/pull-syms-base.txt。 两边改的是同一段 Espryt 代码(单进程的重铸与局部上传 vs P9 的 split 重铸与 pipe-push 的句柄臂),按文本取一边会丢另一边的修复。 合并包报告 ~/w7/notes/p11/m-report.md;~/w7/notes/p11/gate.sh(G1 指向新基线)
ID-P11-7 2026-09-29 A3 / A4 的结论(A-DEVICE.md):T0 在 app 域两后端都是 GO(与 shell 域逐行相同,含 128 MiB 与持续锁定);Adreno 上采纳只省 RSS(Espryt 480 MB、Magma 356 MB)、不改帧时;split T2 相对单进程采纳在 MC 26.3 上 RSS 1.4–2×、p99 Espryt +37–42% / Magma 约 2.5×(部分来自线程落位)。 这是 B2 的可行性与价值依据。 A-DEVICE.md、DEBTS.md
ID-P11-8 2026-09-29 本阶段查出、不在 P11 修的:Espryt 零散写入按并集框上传覆盖 GPU 纹素(dev 独立任务);Magma 单进程 rd12 耗尽 vm.max_map_count(dev 独立任务);client 与 server 共用日志前缀时截断 server 日志(小修);pull 构建没有门跑集成测试(需裁定);split 的线程落位(性能)。 按规矩不顺手修 dev 的缺陷;性能只记录。 DEBTS.md
ID-P11-9 2026-09-29 集成头 82467823(dev 合并 + A-host + 计划文档)整套门:G1 对 P11 基线符号增 0 减 0、.text 0xa56413;fatal census 79、refusal 词 4、link ratchet 171、spawn parity 0、协议修订 3、wire-declines 53/53;卫生 12/12;unit 2654;integration-split / spawn / tcp 392 / 309 / 321;integration-magma-split / spawn / tcp / full-split 214 / 193 / 177 / 613;integration-gpu monolith / inproc 2529 / 2529。verify 构建 unit / integration-verify / integration-verify-split 2654 / 1298 / 1232。主机 retrace 230 / 236(6 项仍是 iterationrp 的宿主 llvmpipe JIT 崩溃,monolith 同挂)。 — 全部
ID-P11-10 2026-09-29 推送前发现 origin 已前进到 86dc38a0(另一个会话把 Magma eglSwapInterval 的移植直接推到了本线)。它与已合并的 dev c60639db 在 9 个文件上逐字相同,另加 split 专属的 ForgetRequestedSwapInterval(MOBILEGL_BUILD_DISAGGREGATED 下;传输模式下 ~BackendObject_DirectVulkan 调用它,结束的 server 会话不把交换间隔带给下一个,与 DirectGLES 同规则)。以合并吸收(9176dcff,净增 16 行),不改写 origin。 origin 不能强推;两份实现只差这一处,取并集。 DirectVulkan.{h,cpp}、BackendObject_DirectVulkan.cpp
ID-P11-11 2026-09-29 B0 的结论(B0-CROSS-APP.md):跨安全上下文连 server 的 unix 端点被 SELinux connectto 拒(shell 与另一个 app 都是),连上之后现有代码走共享段、7 个 fd 跨类别可用,数据面与协议不用改;B1 = 跨上下文的连接中介(导出的 bound Service 经 Binder 交出已连接的套接字)+ fd: 端点 + 按身份配对 + 防冻结 + 外部 client 的亲和 / 自旋策略 + 调用方认证。原生程序(Termux 一类)的引导方式交用户裁定。AcceptPair 按到达顺序配对(F2)是现有 server 的缺陷(unix 端点与非 --serve 的一次性 TCP server;产品 TCP 路径本已按身份配对),独立于 B1 先修(ID-P11-12)。p11/b0 保留到 B 落地(证据引用 72926a88)。 用户点名的消费者是原生程序,而跨上下文只有 Binder 能带 fd;原生进程没有 Context。 B0-CROSS-APP.md、DEBTS.md
ID-P11-12 2026-09-29 PAIR:socket client 的控制与辅助连接按 nonce 配对。client 在两条连接上各先发一条 PairBind{nonce, aux}(控制连接上 Hello 紧随其后);server 用 PairAcceptor 取代 SocketTransport::AcceptPair(已删):跨调用保留未配对的连接,不读 PairBind 之后的字节,同 nonce、角色相反才配对;什么都不发就关的连接(就绪探测)静默关闭,2 s 内没有 PairBind 或没等到另一半的具名拒绝后关闭,最多 16 条待配对。protocol.fbs 追加一张表与联合末位成员,控制协议修订 3 → 4(按 pin 脚本的程序);rev-3 client 连新 server 得 Refuse{WireFingerprint},不会被配对。门:PairAcceptorTest 8 例 × unix / tcp(探测后接真 client、四条连接交错、孤立辅助连接过期后下一个 client 正常、Hello 在前的旧 client 具名拒绝)加一个真 server 的端到端用例;按到达顺序配对放回后 8 例全红、端到端 rc=6(与设备上一致)。B1 注意:代 client 建连接的 Service 必须自己写这两条 PairBind。 就绪探测与并发连接会让会话配错;B1 的 broker 更会同时代多个 client 建连接。 MG_Remote/Transport/*、Server/PairAcceptor.*、ServerMain.cpp、protocol.fbs、CONTRACT-P11.md
ID-P11-13 2026-09-29 B1 的原生路线按用户裁定(app_process helper + IPC 令牌)可行(HSPIKE.md):helper 经隐藏 IActivityManager 发显式广播交出自己的 Binder,server app 的 broker 核令牌、连自己的端点两次、以 ParcelFileDescriptor 交回,client 走 fd:<control>,<aux>;shell 与另一 app 的 uid 下都通,令牌错按名拒绝。B1 只做这一种 broker(广播 + helper Binder,Java client 同样可用),bindService 等有消费者再加。依赖 ROM:直接跑的 app_process 不受隐藏 API 黑名单约束,若某 ROM 强制则原生路线断。p11/hspike 保留到 B 落地。 用户点名的消费者是原生程序;探针证明了唯一未验证的一环。 HSPIKE.md
ID-P11-14 2026-09-29 零拷贝必须可开关(用户):开关即 MOBILEGL_IPC_ADOPT_TIER——2(默认)= 今天的共享内存 + client 推送(T2),0 = T0 零拷贝导入。开了但本会话用不了(server 自测不通过、server 端禁用、Stream 数据面)→ 退回 T2 加一行具名日志,不 Fatal;A1 在共享段上对 0/1 的握手期 Fatal 随 B2 改成这个回退。server 端另设允许 / 禁止零拷贝的开关。默认值在 B2 真机门之后按数据再议。 零拷贝依赖 AHB 导入与 ROM 行为,必须能退回已验证的共享内存路径。 PLAN-P11.md §2 B2;B2 实现
ID-P11-15 2026-09-29 合并 dev c14283ee(M2:Espryt 零散写入按矩形上传、Magma 每 16384 次 draw 分段提交、Magma 描述符池几何增长与整槽回收),合并提交 c3715998 加 8 个跟进。要点:dev 的零散写入修复只在单进程成立——split 各臂的 client 仍发存储合并后的矩形表(跨过空隙),合并头上 30 例红(两后端、三臂);改为 client 发精确写入框、server 区域上限 256 → 4096、Espryt server 在纹理无 GPU 写时自行做原来的框 / 矩形取舍(91454338)。dev 在按句柄查纹理的 server 路径上补的「GPU 可能写过」标记是承重的(去掉帧缓冲附件那一处即 12 例红)。分段提交也覆盖 split server 的 draw / dispatch。描述符池:回收的围栏在 split server 上重核成立(只从 Present 等完整个槽或空闲排空到达,线上各 flush 点不到达);普查用例只在 Magma Split 跑(Spawn / Tcp 的池在 server 进程,按名跳过),要等 server 应用完再读;server 每 2048 个 set 回卷。link ratchet 171 → 172(dev 新的虚函数经纹理占位对象可达,重设基线)。G1:对旧基线 +108 / −81,具名 +25 / −0 与 dev 自己的增量相同,.text a56413 → a5b933,新基线已写。门(de996d53):unit 2676、split / spawn / tcp 408 / 325 / 337、Magma 238 / 215 / 191 / 629、gpu 2617×2、verify 2676 / 1330 / 1264、retrace 230 / 236(iterationrp 6 项)。 两边改的是同一条上传路径与同一套描述符管理,dev 的修复在 split 下还缺一半。 ~/w7/notes/p11/m2-report.md
ID-P11-16 2026-09-29 B1 落地(协议与行为见 CONTRACT-P11.md B1 节):fd:<control>,<aux> client 端点;两个 flavour 的 server app 都有导出的令牌 broker(令牌 ≥ 16 字节、核对运行中 server 自己的令牌,拒绝一律具名带退出码;server 只开 TCP 时走旁边的私有 abstract 监听);app_process helper(令牌走环境变量或文件、不走 argv,经隐藏 IActivityManager 发广播);server 界面「复制启动命令」「生成令牌」。broker 在交出时就写好两条 PairBind(ID-P11-12),helper 以 MOBILEGL_IPC_FD_PAIRED=1 告诉 client 跳过自己的;配对后的 unix 会话等 Hello 不设时限、以 EOF 为界(kPairedUnixHelloWaitMs),TCP 保留预认证时限——代价是一个永不发 Hello 的程序占着会话位直到它退出。apply 线程策略按对端与数据面:外部进程 + 共享段时 apply 线程在最低的那个大核、自旋 50 µs,唯一大核时不占它(退到别的大核或不绑);TCP、同 app spawn、inproc 不变(把 apply 放小核会把 TCP 从 51 拖到 27 fps)。server 把实际保留的核通过 broker 告诉 helper,helper 默认 taskset 避开它(--keep-affinity 关闭),核的规则只在 C++ 一处。用户须知:令牌 ≥ 16 字节、server 以离屏模式启动、HyperOS 电池对 server app 与 client 所在 app 都设「无限制」(否则熄屏或后台会被冻结)。真机(df826f42 APK,默认环境、无解冻器):rd12 两后端 × 路线 (a)(b) ssim 全过、shm 全部胜 tcp(Espryt 119.3 / 53.2、118.7 / 39.8;Magma 36.4 / 20.3、32.5 / 20.4);程序晚 10 s 才初始化 EGL 仍能连上;插件 flavour 跑通。主机门(8dfdd3ba,之后只改了 Java 一行与契约):G1 0/0、ratchet 172、修订 4、卫生 12/12、unit 2692、各车道全绿;5 个 red-once。 用户点名的消费者是同机的原生程序;B0 / HSPIKE 已证明通道可行。 CONTRACT-P11.md B1 节;~/w7/notes/p11/b1-report.md
ID-P11-17 2026-09-29 B2 落地:T0 零拷贝导入(协议与行为见 CONTRACT-P11.md B2 节,数据见 B2-DEVICE.md)。先验:AHB 的 fd 在 shell → server app、另一 app → server app、同 app(helper / 直连 / spawn 子进程)五条路线都跨得过,GPU 读到从不解锁的锁下写入的字节,0 个 avc。设计:领养搭数据环上已有的 map_persistent 记录,AHB 经 aux 套接字按记录序号配对,apply 线程处理该记录时最多等 2 s、超时对那一个缓冲具名拒绝、不挂死;server 起角色时做「持续锁定 + GPU 写 + 经持有的指针读回」自测,通过才发布 kCapAdoptT0;client 取 min(开关, caps, 数据面);Espryt glBufferStorageExternalEXT、Magma VK_ANDROID_external_memory_android_hardware_buffer,导入的缓冲不留 Espryt 暂存副本(读者逐一审过);释放由 server 自己的 fence / serial 门控;CPU 读前 server 落完常驻写并等 GPU。控制协议修订 4 → 5。MC 26.3 峰值总内存(含 kgsl 导入):Espryt −41–42 %(3.0 → 1.8 GB)、Magma −18–26 %;ssim、帧时、CPU 不变,每帧 stage 字节不变。T0 专属改动的 red-once 在真机上做(Android 集成测试 + static-peek,inproc)。 用户要的同机大缓冲零拷贝;A3 已证明 app 域可行。 CONTRACT-P11.md B2 节;B2-DEVICE.md;~/w7/notes/p11/b2-report.md
ID-P11-18 2026-09-29 B2 过程中查出并修掉的三处:(1) 删除仍绑在索引绑定点上的 buffer,前端清了绑定却没调 NoteBindPointChanged,server 留着旧句柄,槽位以新代号重用后 Espryt 在 BackendSlotTable.Generation 上 Fatal、Magma 静默丢掉那次 draw / dispatch(早于 B2,任何 split 会话都可能碰到)——四种索引目标加上交换 XFB 对象的路径都补上,DeletedBoundBufferScenario 两后端 × 单进程与三臂,去掉修复后 SSBO / uniform / 原子计数器红;(2) Magma 单进程在空的 uniform 绑定点上解引用空 buffer 而段错误(早于 B2),改为读零块,dev 同步修(853c5f12、测试 7030d307);这是本阶段 G1 唯一的变化:.text +224 字节、符号不变;(3) Espryt 的 split / spawn 集成用例没设 MOBILEGL_ITEST_REQUIRE_GPU,握手期 Fatal 被记成跳过、ctest 算通过——1106 条全部补上,未暴露新红。 前两个是真缺陷;第三个是门禁漏洞。 BufferState.cpp、UniformManager.cpp、MG_IntegrationTest/CMakeLists.txt
ID-P11-19 2026-09-29 零拷贝默认开(用户,看过 B2 数据后):MOBILEGL_IPC_ADOPT_TIER 不设 = 请求 T0,用不了时静默退回 T2(MGLOG_D、计数);显式 0 保留具名日志行,2 与之前相同。不设时 client 发一个单独的请求值(0x80),server 才知道该安静;为记录这个值改了 protocol.fbs,按 pin 脚本的「修订号提交本身的修补」用 --force 重钉修订 5(修订 5 从未发布),未升到 6。 自测把关、用不了自动退回,开关仍可关。 CONTRACT-P11.md B2 节;design/09
ID-P11-20 2026-09-29 收官头 0a117243 整套门:G1 符号增 0 减 0、.text 0xa5ba13(相对 ID-P11-9 的增量是 M2 合入的 dev 修复与 ID-P11-18 的 +224 字节);fatal census 79(45 族词、7 refusal 词、0 未标)、link ratchet 172、spawn parity 0、协议修订 5、wire-declines 53/53;卫生 12/12;unit 2714;integration-split / spawn / tcp 427 / 346 / 348;integration-magma-split / spawn / tcp / full-split 251 / 228 / 197 / 636;integration-gpu monolith / inproc 2688 / 2688。verify 构建 unit / integration-verify / integration-verify-split 2714 / 1344 / 1278。主机 retrace 230 / 236(6 项仍是 iterationrp 的宿主 llvmpipe JIT 崩溃,monolith 同挂)。 — ~/w7/logs/p11/final-summary.log