mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
9.3 KiB
9.3 KiB
P8-SV:Magma split 残项
2026-09-30,分支
p8/sv(基线cbbaf77f,第一波集成头)。计划:PLAN-P8.md第二波 SV;来源:F.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. 整套门(~/w7/notes/p8/gate.sh,树外)
| 项 | 读数 | 相对第一波集成头(ID-P8-12) |
|---|---|---|
| G1 | 符号增 0 减 0,.text a5ba13 |
不变 |
| census / ratchet / parity / 修订 | 78 / 20 / 45;172;0;5 | 不变 |
| wire-declines | 61 行、66 站点、0 未记日志 | +3 行(MipmapDepthStencilAspect、DispatchIndirect{BufferUnbound,Range}),+7 站点(新派发函数另复用 4 个 Compute* 行) |
| split_coverage | Espryt monolith 706 = 门控 617 + 豁免 89;Magma 706:门控 227、只在信息层 447、豁免 32;missing 0 | +5 例(2 mip + 3 派发),无新豁免行 |
| 车道 | unit 2721;split / spawn / tcp 740 / 654 / 666;Magma 277 / 253 / 220 / 673;gpu monolith / inproc 3709 / 3709,全部 100 % | +5 / +5 / +5;Magma +6 / +5 / +4 / +5;gpu +25 |
retrace(2edb2aa8,只改测试的提交之前) |
230 / 236,只挂已知 6 例 iterationrp | 同第一波 |
6. 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 |
7. 发现但未修
mipmap-shader-format-or-shape的明细对深度形状也打印missing=COLOR_ATTACHMENT(1D 深度的真实原因是view=0);是 F 的MagmaWireShapeDetail口径,未改。- create 系列 fixture 没有
glDispatchComputeIndirect(D.md§7),item 4 的真实负载收益未测。 gen_pipe_dirty_surface.py的「根外写者」扫描读整个MobileGL/(gen_pipe_dirty_surface.py:394),集成测试源也在内:派发用例的 fixture 成员曾叫m_parameters,让 NEW_PATCH_STATE 的 shutter 看起来在根外被写,自检否定对照 16(gen_pipe_dirty_surface.py:1770-1778)不再触发、门红。本包把成员改名m_groupCounts;扫描口径未改,任何新测试 fixture 用到 GLContext 的成员名都会再撞上。