diff --git a/docs/Disaggregated/notes/p8/SV.md b/docs/Disaggregated/notes/p8/SV.md new file mode 100644 index 00000000..27cfc5aa --- /dev/null +++ b/docs/Disaggregated/notes/p8/SV.md @@ -0,0 +1,63 @@ +# P8-SV:Magma split 残项 + +> 2026-09-30,分支 `p8/sv`(基线 `cbbaf77f`,第一波集成头)。计划:[`PLAN-P8.md`](PLAN-P8.md) 第二波 SV;来源:[`F.md`](F.md)「发现但未修」三条、[`D.md`](D.md) §7 第一条。主机 lavapipe,只动 Magma(Espryt 作对照)。 + +## 1. 结论 + +| 项 | 改动 | 位置 | 之前 | 之后 | +|---|---|---|---|---| +| 1 | 3D 原生 mip blit 的子资源 `layerCount` 改为 1,深度只走 z 偏移(逐级减半,原本就对) | `WireFramebuffer.inc:1626-1636` | `layerCount = Depth >> level`(`VkTextureManager.cpp:2738-2740` 的切片寻址)当层数,图像 `arrayLayers = 1`;验证层报 `VUID-vkCmdBlitImage-srcImage-00240`、`-srcSubresource-01707`、`-dstSubresource-01708` | 与 monolith 同形(`VulkanRenderer.cpp:12303`、`:12403`);验证层 0 条 | +| 2 | 深度模板 mip 拒绝补 `WireDeclineTally` 行 | `WireDeclines.def:124`;站点 `WireFramebuffer.inc:1401` | 只有 `MGLOG_E_ONCE`,`MGWIRE-DECLINES` 看不到 | `MGL_WIRE_DECLINE_AT(MipmapDepthStencilAspect, …)`,日志原文保留 | +| 3 | 深度着色器 mip 拒 1D / 1D 数组 / 3D | 生长前判定 `WireFramebuffer.inc:1426`、`:1437`;pass 自身 `WireDepthMipmap.inc:67-74`;调用方传 view 类型 `WireFramebuffer.inc:1491` | 只拒 `is3D`,调用方从不设置;1D 深度链进 pass,对 1D 图像建 2D view(`WireDepthMipmap.inc:244`) | 生长前具名拒绝 `MipmapShaderFormatOrShape`(`WireFramebuffer.inc:1465`);pass 的拒绝是漂移保护(`:1508-1513`) | +| 4 | wire 臂 `glDispatchComputeIndirect` 原生化 | `DispatchWireComputeIndirect`(`WireDraw.inc:789`),入口 `VulkanRenderer.cpp:7790-7797`,`DirectVulkan.cpp:938-945` | `ReadWireBuffer` 在 CPU 读 3 个字,shader 写过则整 GPU 等待 | `vkCmdDispatchIndirect`(`WireDraw.inc:844`);不再有 CPU 路径 | + +## 2. 设计 + +| 项 | 内容 | +|---|---| +| 1 | `ResolveWireTextureStorage` 不动:Tex3D 的 `layers` 是附件、描述符、回读共用的切片寻址;只在 blit 处按 `resource->viewType == 3D` 改用 `{层 0, 1 层}` | +| 2 | 行追加在 `WireDeclines.def` 末尾(只追加);宏同时计数与 `_ONCE` 日志 | +| 3 | 两层:生长前 `depthArmTakesShape` 加 `planar`(与颜色臂同一谓词,决定在 `GrowWireTextureMipChain` 之前,`WireFramebuffer.inc:1469`);pass 按 `WireImage::viewType` 再拒一次。monolith 调用方(`VulkanRenderer.cpp:4866`、`:4905`)不设 viewType,行为不变 | +| 4 | 形状同 monolith(`VulkanRenderer.cpp:7862`),store 取自 `VerbDispatchIndirectBuffer`(`AcquireWireSlice` 打 `lastUseSerial`) | +| 4 屏障 | P8-D 规则:store 被标 shader 写过(`VkBufferManager.cpp:603`)则首个 indirect 读前录一次 `ALL_COMMANDS/MEMORY_WRITE → DRAW_INDIRECT/INDIRECT_COMMAND_READ`(`WireDraw.inc:808`);在绑定本次 dispatch 的 SSBO **之前** 取标,否则本次 dispatch 若把参数 store 也当输出,会吃掉下一个读者的标 | +| 4 拒绝 | store 缺失 `DispatchIndirectBufferUnbound`、越界 / 未 4 对齐 / 负偏移 `DispatchIndirectRange`(`WireDeclines.def:127-128`);程序、纹理、管线、绑定四处拒绝复用 `DispatchWireCompute` 的行 | +| 4 计数 | 新 `wdsp`(`PipeStats.h:289`、`PipeStats.cpp:706`),屏障计入 D 的 `wibar`,等待仍是 `whw`;`WireIndirectCounters::nativeDispatches` 追加在结构末尾 | +| G1 | 全部在 `MOBILEGL_BUILD_DISAGGREGATED` / `MOBILEGL_PIPE_PUSH` 下 | + +## 3. 门 + +| 用例 | 断言 | 登记 | +|---|---|---| +| `WireMipShapeScenario.VolumeChainIsGeneratedAlongItsDepth`(`WireMipShapeScenario.cpp:82`) | 8³ RGBA8,层 0 按切片对着色;1..3 级每片等于上一级两片均值;`GL_TEXTURE_DEPTH` 逐级 | 两后端 monolith + 各 split 臂;Magma 门控 `.Mip3D.` 三臂 | +| 同上,`.Mip3DValidation.` | `VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation`,输出含 `VUID-vkCmdBlitImage-` 即红(`FAIL_REGULAR_EXPRESSION`);用例从 `/proc/self/maps` 证实层已加载(`WireMipShapeScenario.cpp:51`、`:156`) | 只 inproc(`MobileGL/MG_IntegrationTest/CMakeLists.txt:4931-4937`),`spawn_lane_parity.py:67-72` 的 `MAGMA_INPROC_ONLY`;CI 跑 `integration-magma-split` 的作业装了验证层(`.github/workflows/test.yml:1700`、`:1986`) | +| `WireMipShapeScenario.Depth1DChainWithoutANativeBlitDeclinesByName`(`WireMipShapeScenario.cpp:167`) | 1D `DEPTH_COMPONENT32F`,`MGITEST_MAGMA_FORCE_SHADER_MIPMAP=1`:无 GL 错误、两次回读、层 1 仍是哨兵;inproc 上 `MipmapShaderFormatOrShape` +1 | Magma `.ShaderMipDepth1D.` split + spawn(server 读旋钮),`spawn_lane_parity.py:150` | +| `F1WireScenario.GenerateMipmapDepthStencilDeclinesAndKeepsTheSession` | 原像素断言 + inproc 上 `MipmapDepthStencilAspect` +1(`F1WireScenario.cpp:663-683`,经 `WireDeclinePeek.cpp:23`) | 原登记不变 | +| `WireIndirectDispatchScenario` 三例(`WireIndirectDispatchScenario.cpp:219`、`:239`、`:267`) | 网格逐 work group 标记;inproc Magma:`wdsp` = 调用数、`whw` = 0、`wibar` = 写次数(读数在结果回读之前取) | 两后端各臂;Magma 门控 `.IndirectDispatch.` 三臂;第三例(无应用屏障)只 Magma split 臂 | + +## 4. red-once(全部执行并还原:拷贝比对 + touch) + +| # | 变异 | 载体 | 观察到的红 | +|---|---|---|---| +| R1 | blit 改回 `{baseLayer, layerCount}` | `.Mip3D.` 三臂、`.Mip3DValidation.`、两后端 monolith / 各臂 | `.Mip3DValidation.` 红:`Error regular expression found`,三条 VUID 各 6 次;像素用例全绿(lavapipe 3D blit 按 z 偏移、不看 layerCount) | +| R2 | 站点改回裸 `MGLOG_E_ONCE` | `F1WireScenario.GenerateMipmapDepthStencilDeclines*` 各臂 | inproc 两例红(`.Split.Fm.`、`.Split.Full.`):计数差 0 ≠ 1;spawn / tcp 绿 | +| R2b | 同上,静态 | `wire_declines_audit.py` | rc 1:`row MipmapDepthStencilAspect has NO SITE` | +| R3 | 生长前 `planar` 与 pass 的 view 类型拒绝都去掉 | `.ShaderMipDepth1D.` split、spawn | 两例红:层 1 被写成 0.25(哨兵 0.75),无拒绝计数;pass 在 1D 图像上建 2D view 仍产出像素 | +| R3b | 只去生长前判定 | 同上 | 绿:pass 拒绝兜住(`the depth pass refused level 1`,计数 1),漂移保护有效 | +| R4 | wire 分支恢复 `ReadWireBuffer` + CPU dispatch | `WireIndirectDispatchScenario` 各臂 | inproc 9 例红(3 例 × `.Split.IndirectDispatch.` / `.Split.` / `.Split.Full.`):`wdsp` 0、GPU 写过的 `whw` 2、`wibar` 0;spawn / tcp / monolith 绿(CPU 路径网格正确) | +| R5 | 去屏障(`if (false && …)`) | 同上 | inproc 6 例红(两个 shader 写用例 × 3 登记):`wibar` 0 ≠ 2;网格在 lavapipe 上不红(按序执行),spawn / tcp 绿 | +| R6 | `wdsp=` 改成 `wds=` | `PipeStatsTest.WireIndirectCountersPrintInTheirOwnBracket` | 红 | +| R7a | 删 `.ShaderMipDepth1D.` 例外行 | `spawn_lane_parity.py build-split` | rc 1:tcp 臂缺该例 | +| R7b | 删 `.Mip3DValidation.` 例外行 | 同上 | rc 1:spawn、tcp 两臂缺该例 | + +验证层后验:`.Split.IndirectDispatch.` 三例、`.Split.ShaderMipDepth1D.`、`.Split.Mip3D.`、`.Split.Fm.` 深度模板例在层下全绿,VUID 0 条。 + +## 5. monolith 观察(记给 dev / P13,本包不修) + +| 观察 | 位置 | 证据 | +|---|---|---| +| split 构建的 monolith 臂深度着色器 mip 同样不传 view 类型:设备无深度 BLIT_DST 时,1D 深度链会对 1D 图像建 2D view;Release 下 `MOBILEGL_ASSERT` 是空的 | `VulkanRenderer.cpp:4905`、`:12321` | 推断:lavapipe 原生 blit 深度,主机红不出;monolith 不读 `MGITEST_MAGMA_FORCE_SHADER_MIPMAP` | + +## 6. 发现但未修 + +- `mipmap-shader-format-or-shape` 的明细对深度形状也打印 `missing=COLOR_ATTACHMENT`(1D 深度的真实原因是 `view=0`);是 F 的 `MagmaWireShapeDetail` 口径,未改。 +- create 系列 fixture 没有 `glDispatchComputeIndirect`([`D.md`](D.md) §7),item 4 的真实负载收益未测。