mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 10:03:23 +09:00
Two Iris cases died on the Redmi (Adreno 830v2, DirectVulkan inproc) with
Fatal{UnmigratedVerb, "Magma:mipmap-shader-format-or-shape"}, deterministically and
under both run-ahead and lockstep, while the monolith arm and the whole host lane
stayed green. That one line was the entire evidence, and five disjunctions share the
name, so the one thing the device could have told us - which format, at what shape,
missing which feature bit - was the one thing it did not.
The name stays first and unprefixed, because the census, the retrace refusal tally
and every log grep key on the leading word; the driver's own answer follows it:
format enum, the view's storage format when it reinterprets, extent, levels, aspect,
view type, usage bits, layer range, and the names of the optimalTilingFeatures bits
that are ABSENT. The next device run reads a line instead of re-deriving it.
The refusal also loses half its territory. The shader arm rendered STRAIGHT INTO the
next level, which needs the image to carry COLOR_ATTACHMENT usage - and a texture
whose format the device declines as a colour attachment never gets that bit, so every
sampled-only texture without BLIT support fell into the refusal rather than into a
fallback. When the FORMAT can be rendered and only the IMAGE cannot, an owned scratch
attachment of the destination level's size takes the pass and vkCmdCopyImage moves the
mip in: a raw texel move, no conversion, texels still from GPU contents rather than a
staged shadow, and the scratch retires with the submit that consumes it - the shape the
multisample resolve arm above it already uses.
Neither shader arm had ever executed on the gate machine. lavapipe reports
BLIT_SRC|BLIT_DST for every colour format this binary can create, so GenerateWireMipmap
takes its native arm for all of them; GenerateMipmapPackedFloatPixels next door looks
like it covers the shader arm and does not, because R11F_G11F_B10F blits natively here
too. MGITEST_MAGMA_FORCE_SHADER_MIPMAP drops the native arm instead, one tier per shape
(1 = render into the level, 2 = render into scratch and copy back), read once and
compiled only into the disaggregated build.
F1WireScenario.GenerateMipmapWithoutNativeBlitPixels paints two different halves rather
than one flat colour - a pass that loses GL's row order averages to the same number
everywhere, and a single-colour assertion would call that correct - and asserts level
one per half. It is registered on the three Magma arms twice, ONE ENVIRONMENT EACH: the
knob changes how every mipmap in the process is generated, so a lane-wide flip would
silently retarget the four green mipmap entries beside it.
Red once (executed, reverted): with the scratch arm forced off, the tier-2 entry dies
with Fatal{UnmigratedVerb, "Magma:mipmap-shader-format-or-shape format=37 extent=8x8x1
levels=4 aspect=0x1 view=1 usage=0x17 layers=0+1/1 missing=DEPTH_STENCIL_ATTACHMENT"},
by name and with the shape in it; restored, the same filter is 8/8 green.
Gates: integration-magma-split 75 (+2), -spawn 54 (+2), -tcp 56 (+2), 0 red;
ctest -L unit 2402/2402; informational integration-magma-full-split 511, 0 red, 58 skip
(the new case skips where the knob is unset); fatal_census green (79 abort sites, 43
family words, 0 unmarked - no site added, the funnel is unchanged); link_ratchet
--assert-monotone unchanged at 186, p7-magma bucket 101.
工作笔记(原 ~/w7/notes/)
这一层是 MGPipe 各阶段的工作笔记原件:包计划(BRIEF-*.md)、契约草稿、集成者逐条裁定
(INTEGRATOR-DECISIONS-*.md)、只读审计、普查、设备记录、包任务书(TASK-*.md)与阶段报告。
它们此前只存在于一台机器的 ~/w7/notes/ 下。上层那几份文档(ROADMAP.md、
CURRENT_STAGE_PROGRESS.md、MEASUREMENTS.md …)大量引用它们——裁定编号、审计行号、
逐门数字的出处几乎全在这里。一份引用了几百次、却只存在于本地未跟踪目录的记录,等于没有记录。
所以整体移进仓库。
路径映射
~/w7/notes/<phase>/<file>.md → docs/Disaggregated/notes/<phase>/<file>.md
上层文档里凡写作 ~/w7/notes/... 的 .md 引用,都按这条规则读。
移进来的是什么,没移的是什么
| 移进来了 | 全部 .md,415 份,约 11 MB,目录结构原样保留 |
| 没有移 | 脚本(.sh / .py)、运行日志(.log / .out / .err)、普查与门的结果数据(.json / .txt / .tsv)、补丁、APK 与 .idsig、nm 转储 |
没移的那些仍在 ~/w7/notes/ 与各构建树下。它们是证据数据而不是文档:体积大、随每次运行
重新产生、且多数只在产生它的那台机器上有意义(绝对路径、设备序列号、构建目录)。上层文档引用
它们时给的是路径,不是内容。
两个需要知道的例外
- P6 的包计划已提升为正式文档:原
~/w7/notes/p6/BRIEF-P6.md现在是../P6-SPAWN-PLAN.md,本目录不再保留副本,避免两份同源文档各自漂移。 契约草稿同理,见../P6-CONTRACT-DRAFT.md。 recovered/是从失败的 workflow 运行里捞回来的材料(wf1…wf5),与同名阶段目录 可能重复,保留是因为其中几份是当时唯一的完整版本。查阶段记录请先看阶段目录。
不受 citation lint 管
CI 的文档引用 lint 只吃 docs/Disaggregated/*.md(非递归,.github/workflows/test.yml),
本目录不在其中,这是有意的:这些笔记的 file:line 是写在各自当时的代码头上的,拿今天的
HEAD 去解析必然大面积失败,而那不是错误——那是它们作为历史记录的正确状态。要核对某份笔记的
引用,用它自己声明的那个 revision:
python3 scripts/check_doc_citations.py --rev <当时的头> docs/Disaggregated/notes/<phase>/<file>.md