diff --git a/MobileGL/ConfigLoader.cpp b/MobileGL/ConfigLoader.cpp index 7700f8be..9487e7e6 100644 --- a/MobileGL/ConfigLoader.cpp +++ b/MobileGL/ConfigLoader.cpp @@ -601,8 +601,10 @@ namespace MobileGL::MG_ConfigLoader { // The verify harness compares the pushed block against the applier per verb; a // batched queue lets the comparer read a supplied field mid-apply, which is a // torn read rather than a divergence. The batch is therefore off whenever the - // shadow comparer is armed. + // shadow comparer is armed, which only a verify build compiles. +#if MOBILEGL_PIPE_VERIFY if (MG_Config::Features.PipeVerify) ipc.BatchWaits = 0; +#endif // UNSET is T0 with quiet fallbacks (the default since 2026-09-29); 0 asks for T0 by name, 1 is // refused by name, 2 is T2 - settled at the handshake from the data plane (P11 A1/B2, // MG_Remote/Transport/AdoptTier.h). An unparseable value is warned about and reads as unset. @@ -615,7 +617,9 @@ namespace MobileGL::MG_ConfigLoader { // ... and forced OFF by the verify harness for BatchWaits' reason, one step further: // run-ahead's whole point is that the client stops filling gPipeInputs for an // unbarriered record, and the comparator has nothing left to compare when it does. +#if MOBILEGL_PIPE_VERIFY if (MG_Config::Features.PipeVerify) ipc.RunAhead = 0; +#endif // The present credit (ruling 4). 1 is one frame of overlap; 8 is the ceiling because a // deeper queue buys nothing on a CPU-bound client and pays for it in latency. 0 is NOT // admitted: a credit of zero would mean "publish no present at all". @@ -645,12 +649,14 @@ namespace MobileGL::MG_ConfigLoader { // own and needs no applier quiesce. 0 still turns it off (the negative control does). ipc.RoleSplitState = QueryEnvQuirkOverride("MOBILEGL_IPC_ROLE_SPLIT_STATE") != MG_Config::QuirkOverride::ForceOff; +#if MOBILEGL_PIPE_VERIFY if (MG_Config::Features.PipeVerify && ipc.RoleSplitState) { MGLOG_W("Config: MOBILEGL_IPC_ROLE_SPLIT_STATE=1 is incompatible with " "MOBILEGL_PIPE_VERIFY (the comparator owns the single fill block); " "the dual-block rehearsal is OFF for this run"); ipc.RoleSplitState = false; } +#endif // P6 `dl` (CONTRACT-P6 5.3): MOBILEGL_IPC_RESPAWN IS A NAMED REFUSAL, NOT A NO-OP. // diff --git a/docs/Disaggregated/design/09-build-switches-counters.md b/docs/Disaggregated/design/09-build-switches-counters.md index c2815ec7..fbc1cef6 100644 --- a/docs/Disaggregated/design/09-build-switches-counters.md +++ b/docs/Disaggregated/design/09-build-switches-counters.md @@ -67,7 +67,7 @@ CMake:`MOBILEGL_BUILD_DISAGGREGATED`(OFF)、`MOBILEGL_BUILD_DISAGGREGATED_ | `MOBILEGL_FRAMES_IN_FLIGHT` | 3 | 1..64,两个后端共用(旧名 `MOBILEGL_MAGMA_FRAMESINFLIGHT` 为弃用别名):Magma 的帧上下文数;Espryt 在 present S 后等待帧 S+1-N 完成;split 的 present credit 由它导出为 max(1, N-2)(P15) | | `MOBILEGL_IPC_PRESENT_CREDIT` | 由 `MOBILEGL_FRAMES_IN_FLIGHT` 导出(默认 1) | 1..8,§14;显式设置覆盖导出值,仅供实验 | | `MOBILEGL_IPC_POLL_ESCALATE` | 64 | 未报告 fence 的零超时轮询本地答"未完成",同一 fence 连续第 N 次才往返(P10,`CONTRACT-P10.md` §1);`0` = 每次轮询都往返,是 A/B 对照 | -| `MOBILEGL_IPC_BATCH_WAITS` | 1 | lockstep 下值类记录发布即返回;verify 强制 0 | +| `MOBILEGL_IPC_BATCH_WAITS` | 1 | lockstep 下值类记录发布即返回;verify 构建里 `MOBILEGL_PIPE_VERIFY=1` 强制 0(`RUN_AHEAD` 同样强制 0,`ROLE_SPLIT_STATE` 强制关;其他构建不改它们) | | `MOBILEGL_IPC_EVENT_WAIT_MS` | 2000 | 反向事件遇满环时 server 等 client 排空的整笔预算(§11.7) | | `MOBILEGL_IPC_WIRE_DEFERRED_MB` | 64 | Magma wire 臂延迟回收的水位线;`0` 是 M2 阴性对照 | | `MOBILEGL_IPC_PERSISTENT_HASH_SUPPRESS` | 1 | persistent-map 推送只推变化的块(粒度固定 64 KiB,`PersistentMapTracker::BlockBytes()`);`0` 是整段推送的 A/B 对照 |