[scripts, docs] (P7): magma-b2.md counts the baseline as 73 + 11 + 2 + 2, carries the review round's §12 lines and gates, and the ratchet baseline names the tree that measured 173

ID-P7-31 review, note 3 and nits.

  * §0's preamble: the +4 over package B's 84/63/65 is not "package A landing after
    B" - A landed BEFORE B and is +2 (magma-a.md:151-153); package C is the other +2
    (magma-c.md:59-61). 73 + 11 (B) + 2 (A) + 2 (C) = 88/67/69.
  * §2.3 / §2.5: MsResolve1 is split+spawn only; the day-of +3 on tcp is marked as
    superseded.
  * §2.7 (the server-side knob has no tcp arm, measured) and §2.8 (flip mirrored,
    scale declined, X / cross-format mirror declined; three red-once lines).
  * §6: the lines for CONTRACT-P7 §12 - the scaled second leg is unclipped
    (VUID-vkCmdBlitImage-dstOffset-00248/00249, shared with the monolith);
    MagmaWireFatal("multisample-resolve-region") for a source rect outside the read
    buffer, where GL promises undefined values rather than an error; the 1->N
    identical-rect decline declines a legal shape (18.3.1 sample replication) because
    the monolith's own observable is a VU violation; the tcp lane cannot carry a
    server-side knob; X and cross-format Y mirrors of a depth/stencil resolve decline.
  * §7: the review round's gates - magma 94/73/70, full-split 525, unit 2423, parity
    RC 0 naming the five MAGMA_SERVER_ENV_KNOB_NO_TCP entries, census 79, ratchet 173,
    G1 .text 0xa52203 with 0/0 symbol drift, @P7 19 comment lines.
  * link_ratchet_baseline.txt: `base commit` points at 6af422b3, the tree that
    measured 173, not 4bee1313.

The "@P7 = 24 lines" nit needed no edit: the note already reads 19 at 6af422b3, which
is what the tree measures.
This commit is contained in:
2026-09-22 20:05:28 -04:00
parent 645dd96f69
commit cc3c18c578
2 changed files with 130 additions and 5 deletions
+129 -4
View File
@@ -12,7 +12,10 @@
>
> 基线门读数(本树实测,非引自包 B):`integration-magma-split` **88**、`-spawn` **67**、
> `-tcp` **69**、`integration-magma-full-split` **521**、`ctest -L unit` **2420**,全绿。
> (包 B 的报告写的是 84 / 63 / 65;差的四条是包 A 在它之后落地的。)
> 包 B 的报告写的是 84 / 63 / 65,差的四条**不是**「包 A 在它之后落地」——那句是错的,
> 审查round 已更正:包 A 在 B **之前**落地(`5a14e5a1..2f48ccf4` 在 `c5fa52f9` 之前)且只有 +2
> (`magma-a.md:151-153`),另外 +2 是包 C(`magma-c.md:59-61`)。本树的基线因此是
> 73 + 11(B)+ 2(A)+ 2(C)= **88 / 67 / 69**。
## 0. 每片一条提交,每片至少一次 red-once
@@ -127,14 +130,15 @@ Vulkan 里不用 shader 把深度或模板 aspect resolve 下来的**唯一**办
aspect 都读回、并检查只做深度的 resolve 没动目的地的模板、反之亦然),而且**本来就在三条 Magma 臂
的信息档(`…Full.`)里跑**。缺的只是一条 gating 条目。
每臂两条(`MsResolve0.` / `MsResolve1.`),第二条是它那条臂在此唯一可达的方式:lavapipe 两个 resolve
扩展都有,扩展臂会接下本机的每一次 resolve。`MGITEST_MAGMA_FORCE_SHADER_DEPTH_RESOLVE` 丢掉扩展臂。
`MsResolve0.` 在三臂都注册;`MsResolve1.` **只在 split 和 spawn**(审查 round 的修正,见 §2.7)。
第二条是那条臂在此唯一可达的方式:lavapipe 两个 resolve 扩展都有,扩展臂会接下本机的每一次
resolve。`MGITEST_MAGMA_FORCE_SHADER_DEPTH_RESOLVE` 丢掉扩展臂。
**它在本机不 skip**:lavapipe 也带 `VK_EXT_shader_stencil_export`,所以 shader 臂深度和模板都走通了。
新增的 F1 用例是那条 decline。
> 集成者交代里写的「可能在 lavapipe 上 SKIP(分离的 D24/S8 不支持)」本树**没有发生**:
> 提拔的这条用例用的是**合并**的 `DEPTH24_STENCIL8`,分离 D24/S8 是同一文件里另一条用例
> (`SeparateDepthAndStencilAttachmentsAreBothReadable`)的事,没有提拔。三臂 6/6 绿。
> (`SeparateDepthAndStencilAttachmentsAreBothReadable`)的事,没有提拔。
`MOBILEGL_BAKED_INTERNAL_SHADERS` 的表从 8 行涨到 **11 行**。
@@ -158,11 +162,86 @@ aspect 都读回、并检查只做深度的 resolve 没动目的地的模板、
`bake_internal_shaders.py --check` 五个头全新鲜;`fatal_census` 79 / 44 / 0;
`link_ratchet --assert-monotone` 186 不变;G1 `.text` `0xa52203`、符号表逐行相同。
> 上面这三个 `+3` 是**片 2 落地当天**的读数,那时 `MsResolve1.` 还注册在 tcp 上。审查 round
> 把它从 tcp 摘掉了(§2.7),tcp 的最终读数在 §7。
### 2.6 欠设备核对
shader resolve 臂正是**手机**在没有 `VK_KHR_depth_stencil_resolve` 时会走的那条,而本机只能经旋钮
到达它。它的几何要在 Redmi 上看一眼。
### 2.7 审查 round:一个 server 端旋钮**没有** tcp 臂
`MGITEST_MAGMA_FORCE_*` 三个旋钮都由 **server** 读(`WireFramebuffer.inc` 的三个 `std::getenv`
跑在 apply 线程上),而 ctest 的 `ENVIRONMENT` 属性只到达 ctest 启动的那个进程,也就是 **client**。
三条臂的 server 来处不同:
| 臂 | server 从哪来 | 旋钮到得了吗 |
|---|---|---|
| inproc | 同进程的一个线程 | 到 |
| spawn | `ServerSpawn.cpp:106` 把 `::environ` 复制进子进程 | 到 |
| tcp | **车道级** `TcpServer.Start` fixture,由 `scripts/ci/tcp_server_fixture.py` 用**它自己的** `os.environ` 在任何用例之前启动一次,每个 Hello fork 一个会话子进程 | **到不了** |
所以一条 tcp 的旋钮条目跑的是**默认**臂,名字却宣称不是——对 ShaderMip 而言,这正是那条用例自己的
skip 文案说不许发生的事(「would assert the native blit twice over」)。
**实测,不是推导**:在三个 reader 里各放一个临时 fatal,五条 knob=1 条目在 split **全死**、在
spawn **全死**、在 tcp **五条全绿**;五条 knob=0 的孪生条目三臂全绿。
修法用的是 ID-P7-14 `MAGMA_INPROC_ONLY` 的先例:`scripts/ci/spawn_lane_parity.py` 新增
`MAGMA_SERVER_ENV_KNOB_NO_TCP`,并给 `compare_arms` 加一个 `no_tcp=` 参数。它和 `inproc_only=`
**不是**同一个形状,这一点是承重的:`inproc_only` 把键从**每一条**非 split 臂的比较里拿掉,而这五条
必须在 spawn 上**仍然被要求**——spawn 才是它们干活最多的地方。受影响的五条是
`.ShaderMip1.` `.ShaderMip2.` `.DepthMip.` `.DefaultBlitShape1.` `.MsResolve1.`;knob=0 的
`.DefaultBlitShape0.` / `.MsResolve0.` 留在三臂,因为零就是默认值,那两条在三臂含义相同。
其中三条(`ShaderMip1/2`、`DepthMip`、`DefaultBlitShape1`)是**包 B 既有的**同种空转,一并修。
**这是一笔债而不是一个结论**:要让 tcp 车道也能带这些条目,fixture 得接受**每用例的 server 环境**
——那是一个 supervisor 控制项,不是一个 ctest 属性。记在 §6。
### 2.8 审查 round:翻转和缩放的深/模板 resolve 不再带走会话
`ResolveWireDepthStencil` 的区域判据要求 `sx1 > sx0` 且 `sy1 > sy0`,否则
`Magma:multisample-depth-resolve-region` 带走会话。于是
```
glBlitFramebuffer(0, h, w, 0, 0, 0, w, h, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
```
从一个多重采样 framebuffer 出发时,**颜色 blit 正确完成**(颜色臂自 P5f 起就会翻转,本包又给了它
缩放),**然后死在深度上**。GL 4.6 core 18.3.1 要求的是**尺寸**相同而不是角点相同(Mesa 比的是
`abs()`),所以翻转是一次合法的 blit,欠一张镜像的图。
拆成三块:
1. **缩放** → 规则 I (a) 具名 decline。18.3.1 说尺寸不同就是 `INVALID_OPERATION`,没有「正确结果」。
2. **Y 翻转、同格式** → **退役**:copy-out 那一步本来就是「image → buffer → image」,而 buffer copy
是按**行**寻址的,所以每行一个 `VkBufferImageCopy`、倒着走,就是一次垂直镜像。`bufferRowLength`
/ `bufferImageHeight` 保持 0:每个 region 正好描述一行,默认的「紧贴 imageExtent」就是要的。
3. **X 翻转**,以及**跨格式的 Y 翻转** → 具名 decline。横向镜像要一个 region 一个 **texel**,那已经
不是 copy 了;跨格式重编码走 `BlitDepthAcrossFormats`(与 monolith 臂共用),它也没有翻转。
两条都进 §6。
span 从此是**有符号**的,下游一律用 min 角(`sxMin/syMin/dxMin/dyMin`),render pass 的 renderArea、
shader 臂的 scissor、buffer copy 的 imageOffset、`BlitDepthAcrossFormats` 的四个角全部跟着改。
**场景**:`DepthStencilReadbackMatrixScenario.AFlippedMultisampleResolveMirrorsTheBandsAndAScaleDeclines`,
三臂各一条,前缀 `MsFlip.`,**不需要旋钮**(两种形状都在能力问题之前由矩形决定)。
**颜色和深度在同一次调用里**,因为那正是让这件事显形的形状;两条带子深度不等(下 0.25 / 上 0.75),
并且颜色也断言了同一个方向——一次「假翻转」(比如只是把读回顺序倒过来)会让颜色和深度不一致。
**red-once(R-16,三条,均已执行并还原,split + spawn 各一遍;审查 round 的第二个会话又亲手各跑了一遍)**:
1. 把旧判据放回去(`spanX <= 0 || spanY <= 0 || spanX != dstSpanX || spanY != dstSpanY` → Fatal)
→ 两臂都死于 `Fatal{UnmigratedVerb, "Magma:multisample-depth-resolve-region"}`;
2. 只把**缩放**那条 decline 换回旧 Fatal(翻转路径不动)→ 翻转那一半通过,两臂都在缩放那一步死于
同一个名字——证明缩放 decline 是承重的,而不是被翻转那条红顺带盖住;
3. 把 copy-out 的 `if (!mirrorY)` 改成恒真(即拿掉逐行倒序,其余一律不动)→ 两臂都**活着**但深度
带子上下颠倒:`flipped resolve: the destination's bottom band: 768 of 768 depth values differ
from 0.75; first bad value 0.25`(顶带反之)。这一条才是对**新代码**的断言——它证明那张镜像的图
是逐行倒序产生的,不是别处的副作用。
---
## 3. 片 3:两处 `MagmaP7AllocatorDebtScope`
@@ -315,3 +394,49 @@ monolith 臂在 **Android 的 disaggregated 包**里现在跑的是烘焙 blit
3. **片 4**:`ROTATE_90/180/270` 下 monolith 臂的烘焙 blit 几何(§4.5)。
4. 包 B 遗留、本包未碰:非恒等旋转下的 `default-color-blit-shape` scratch 臂,以及
OpenRA 三次 `pm clear` 冷跑的 1.0 验收。
---
## 6. 记录债(写给 CONTRACT-P7 §12 的几行)
1. **缩放后的第二段没有裁剪**(`WireFramebuffer.inc:856-870`)。多重采样颜色 resolve 的第二段
`vkCmdBlitImage` 把目的矩形原样交给驱动;一个越出目的图像的矩形是
`VUID-vkCmdBlitImage-dstOffset-00248/00249`,不是一张被裁过的图。**这条与 monolith 臂共有**
(`VulkanRenderer.cpp:10061` 的 blit 臂同样不裁),所以它不是分离缺陷,也不该由本包单独改;
两条臂一起裁是一件独立的活。
2. **`MagmaWireFatal("multisample-resolve-region")`**(`WireFramebuffer.inc:802`)仍然对
**源矩形越出读缓冲**的 blit 带走会话。GL 对这种形状的承诺是「那些像素的值未定义」,不是一个
错误——所以正确的收口是 decline 或钳制,不是 Fatal。本包没有改它,因为它不带 `@P7`、也不是
§3.2 点名的行;记在这里。
3. **1 → N 的等矩形 decline**(`WireFramebuffer.inc:1019-1049`)拒绝的是一个**合法**形状:
18.3.1 说单采样源写进多重采样目的地是**样本复制**。本包 decline 它,是因为 Vulkan 没有命令能
表达它,而 monolith 臂对同一形状的「可观测」是一次 VU 违规(`vkCmdBlitImage` 的两侧都必须是
单采样)——即没有一个正确的对照读数可抄。要真的实现它需要一条以目的地采样数建管线的 draw,
也就是 resolve 机器反过来再写一遍。
4. **tcp 车道带不了 server 端测试旋钮**(§2.7)。五条 knob 条目因此只注册在 split + spawn,并在
`spawn_lane_parity.py` 里具名。要收回这条,`tcp_server_fixture.py` 得接受每用例的 server
环境——一个 supervisor 控制项。
5. **X 镜像与跨格式 Y 镜像的深/模板 resolve**(§2.8)decline。前者要逐 texel 的 region,后者要
`BlitDepthAcrossFormats`(与 monolith 共用)长出翻转。两者都不是一个片的体量。
---
## 7. 审查 round 的门(ID-P7-31 三条修正落地之后)
在 `5d896170`(§2.7 与 §2.8 两条代码提交之上;本节所在的提交只动文档与棘轮基线的头注释)实测:
| 门 | 读数 |
|---|---|
| `integration-magma-split` | **94**(93 + `MsFlip.`),全绿 |
| `integration-magma-spawn` | **73**(72 + `MsFlip.`),全绿 |
| `integration-magma-tcp` | **70**(74 − 5 条 server 端旋钮条目 + `MsFlip.`),全绿 |
| `integration-magma-full-split` | **525**(524 + 新场景),全绿 |
| `ctest -L unit` | **2423**,全绿 |
| `spawn_lane_parity.py build-split` | RC 0;gated 档点名 5 条 `MAGMA_SERVER_ENV_KNOB_NO_TCP` 条目 |
| `fatal_census` | 79 / 44 / 0,RC 0 |
| `link_ratchet --assert-monotone` | 173 不变,RC 0 |
| G1 pull 构建 | RC 0,`.text` `0xa52203`,`nm --defined-only` 与 `~/w7/p7-before/pull-syms.txt` 0 增 0 减 |
| `@P7` | 19 行,全是注释 |
`scripts/data/link_ratchet_baseline.txt` 的 `base commit` 头注释改指 `6af422b3`——173 是在那棵树上量出来的,
不是在 `4bee1313` 上。
+1 -1
View File
@@ -2,7 +2,7 @@
# Regenerate: python3 scripts/link_ratchet.py --build-dir <dir> \
# --baseline scripts/data/link_ratchet_baseline.txt \
# --write-baseline scripts/data/link_ratchet_baseline.txt
# base commit : 4bee13136585c1333823796500ed12a86b991e61
# base commit : 6af422b3e85a7d24bcfc32473bd8a0f99afaa3cd
# configure : -DMOBILEGL_BUILD_DISAGGREGATED=ON -DMOBILEGL_BUILD_DISAGGREGATED_INPROC=ON -DMOBILEGL_PIPE_PUSH=ON -DCMAKE_BUILD_TYPE=Release
# build dir : build-split
# count : 173