diff --git a/docs/30_设计/STEP-097_V13三轮问题去重与修复矩阵_v1.md b/docs/30_设计/STEP-097_V13三轮问题去重与修复矩阵_v1.md index 4f690b800..cb94a46b2 100644 --- a/docs/30_设计/STEP-097_V13三轮问题去重与修复矩阵_v1.md +++ b/docs/30_设计/STEP-097_V13三轮问题去重与修复矩阵_v1.md @@ -56,3 +56,10 @@ - 02:`mtl_retained_attachments.test.cpp` 检查实际离屏资源的 color/depth/stencil 绑定、simulator/x86 combined attachment、无 depth/stencil 时跳过 clear;生产 `RenderPass` 共用的 clear 辅助函数可检查 load/clear/store。设备资源创建失败与 encoder 失败的运行注入仍待 RDC 验证。 - 03:`render_orchestrator_error.test.cpp` 注入正/反向范围 visitor 异常,核对 observer/failed 标志,并用 cache 状态机核对失败后继续 Build、成功重试后 Reuse。真实 GPU 绘制故障与完整 renderer fallback 仍待 RDC 注入验证。 - 01/02/03 均保持 `WAITING_RDC_BUILD_AND_RUNTIME`;源码入口准备不等于编译或运行 PASS。19 的既有实测状态不变。 + +## 2026-09-26 A1 Android/Core 实测收口 + +- 01:same-source tiled fixture RR/RCR/CRR 两轮、rebuild/cache OFF/ON 共 18 点,屏幕中心与区域外采样两组像素均 18/18 一致;状态 valid=true/fallback=false,Android FZG1 实测通过。源码/测试提交 `d0ced7235`,编译修正 `8c006ac83`。 +- 02:Metal host runner 已编译,GTest 两个测试均因没有 Metal device SKIP;用户决定不执行 iOS 运行测试,记 `USER_ACCEPTED_WITHOUT_IOS_RUNTIME_TEST`,不得称 Metal 实测 PASS。 +- 03:`RenderOrchestratorError.*` 原生测试 2/2 PASS;真实 Android GPU fault injection 不在本次证据中。 +- 19:前述 Core 1/1 PASS、诊断组 5/5 PASS、FZG1 辅助测试均保留。A1 在 Android/Core 验收及 iOS 用户豁免口径下进入 A2;详细事实见 `docs/报告/STEP-097_A1_Android专项验收报告_v1.md`。 diff --git a/docs/50_Step记录/STEP-097_V13三轮审查问题合并修复_v1.md b/docs/50_Step记录/STEP-097_V13三轮审查问题合并修复_v1.md index a92d2388b..97e80de54 100644 --- a/docs/50_Step记录/STEP-097_V13三轮审查问题合并修复_v1.md +++ b/docs/50_Step记录/STEP-097_V13三轮审查问题合并修复_v1.md @@ -5,7 +5,7 @@ | 检查点 | 状态 | 实际事实、阻塞和下一步 | | --- | --- | --- | | 阶段 0 基线与反证 | 完成(静态) | 读取三轮审查、STEP-094~096 交付及 C-001/RFC-001 本地副本。当前 HEAD 比任务书基线只新增任务文档;远端 particle/main 经 `git ls-remote` 核对一致。建立 24 项矩阵。Integration 远端同步状态待 RDC 复核。 | -| A1 Renderer 正确性 | 阻塞 | `e67e4961b` 记录 01/02/03/19 的部分代码;19 有 GTest。01/02/03 缺少任务要求的专用可执行像素/附件/故障注入测试入口;且未进行 GL/Metal 编译。故 A1 不判完成,严格停止于此,不进入 A2。 | +| A1 Renderer 正确性 | Android/Core 检查点完成,iOS runtime 用户豁免 | `e67e4961b` 记录 01/02/03/19 的部分代码;19 有 GTest。01/02/03 缺少任务要求的专用可执行像素/附件/故障注入测试入口;且未进行 GL/Metal 编译。故 A1 不判完成,严格停止于此,不进入 A2。 | | A2 Field/粒子正确性 | 计划 | 尚未开始。 | | B 输入/生命周期 | 计划 | 尚未开始。 | | C 安全性能 | 计划 | 尚未开始;必须先完成 A1 正确性。 | @@ -36,3 +36,9 @@ - 新增 Android 同源同 tile 的 R-R/R-C-R/C-R-R 本地 fixture 与诊断菜单;新增 Metal 附件/clear GTest 源码;新增 LayerGroup 正反范围异常、observer 与 cache 失败后重试 GTest 源码。生产 Metal clear 逻辑抽成仅内部调用的辅助函数,使测试检查同一路径,不调整公开协议。 - 本轮只做静态检查;构建、GTest、Jest、设备像素、Metal validation 均 **NOT RUN**。01/02/03 仍需 RDC 编译与设备验证;A1 保持 PARTIAL,A2/B/C 未启动。第 19 项原有 RDC 1/1 PASS 不受影响。 + +## 2026-09-26 A1 收口,允许进入 A2 + +- A1 新 Android APK 源码 `8c006ac83`,构建/安装/设备内 SHA-256 复核成功;FZG1 18 个同源同 tile RR/RCR/CRR 检查点、中心/区域外像素采样均一致,脚本 exit 0,实时日志无崩溃。03 原生异常恢复 GTest 2/2 PASS;19 已有 GTest 1/1 和诊断组 5/5 PASS。 +- Metal host 可编译,但无 Metal device,两项测试均 SKIP;用户明确不做 iOS runtime,本轮验收按用户决定接受,不能记为 iOS 实测 PASS。B/D 的 topPresent 历史疑点保留;详见 `docs/报告/STEP-097_A1_Android专项验收报告_v1.md`。 +- A1 Android/Core 阶段完成;下一步严格 A2→B→C,每阶段保留独立 RDC 构建及验证。STEP-098 未启动、未提交;`.13` 发布冻结不动。 diff --git a/docs/60_测试/STEP-097_V13修复后集中验证清单_v1.md b/docs/60_测试/STEP-097_V13修复后集中验证清单_v1.md index 0b0432b46..a3cb0ad1a 100644 --- a/docs/60_测试/STEP-097_V13修复后集中验证清单_v1.md +++ b/docs/60_测试/STEP-097_V13修复后集中验证清单_v1.md @@ -72,3 +72,9 @@ build-step088-opengl/mbgl-test-runner --gtest_filter='RenderOrchestratorError.*: 预期异常 observer/failed 与 cache 不复用、重试后 Reuse;第 19 项保持 1/1 PASS。Metal GTest `MetalRetainedAttachments.*` 需由 RDC 使用可在 Mac 主机执行且配置 `MLN_WITH_METAL=ON` 的 `mbgl-test-runner` 构建目录执行;先检查所用目录的 CMakeCache、目标和 Metal device,再编译、执行并记录命令与日志。不能用 iOS 静态库构建替代主机 GTest。真机/simulator 的创建失败、encoder 失败与 API Validation 仍单独执行。 Android 同源 stencil:以本提交标准脚本构建 Validation APK,打开 Particle Core Layer Validation → STEP-093 → STEP-097 SAME SOURCE STENCIL;依次选择 RR、RCR、CRR。每种拓扑在 CACHE ON 首帧、稳定 reuse、REBUILD CURRENT 后,再切 CACHE OFF 与 ON;保存每个检查点截图、`STEP097_STENCIL_PLAN/READY/DIAGNOSTICS` 日志及 `READ SNAPSHOT`。预期 `accepted=true`、`valid=true`、`fallback=false`,多个 retained 段分别 build/reuse,四层同一 source 的轮廓与填充在缓存切换后无残影/漏裁剪。再以相机移动强制重建;记录主目标与离屏结果。此清单是待执行判据,不能据此宣称像素 PASS。真正 GPU 绘制异常及下一帧 full fallback/recovery 需 RDC 专项注入;GTest 状态机不能代替它。 + +## 2026-09-26 A1 实测结果(覆盖上方待运行记录) + +- Android/FZG1:新 APK 源码 `8c006ac83`,SHA-256 `48df19cf5a4c4250934efa2596423d3ad9571fe49a65b9b704a81cdb41f58671`;同 source/tile RR/RCR/CRR、重建、缓存 OFF/ON 18/18 状态与像素采样检查通过,无本次捕获的 FATAL。 +- Core:03 `RenderOrchestratorError.*` 2/2 PASS;19 `OldCacheReleaseCannotChargeReplacementAtSameIndex` 1/1 PASS,诊断组 5/5 PASS。 +- Metal:编译通过,2/2 SKIP(无 Metal device);用户豁免 iOS runtime,标 `USER_ACCEPTED_WITHOUT_IOS_RUNTIME_TEST`,不是 iOS 运行测试 PASS。详见 `docs/报告/STEP-097_A1_Android专项验收报告_v1.md`。后续 A2/B/C 未执行。 diff --git a/docs/报告/STEP-097_A1_Android专项验收报告_v1.md b/docs/报告/STEP-097_A1_Android专项验收报告_v1.md new file mode 100644 index 000000000..6180b7827 --- /dev/null +++ b/docs/报告/STEP-097_A1_Android专项验收报告_v1.md @@ -0,0 +1,38 @@ +# STEP-097 A1 Android 专项验收报告 v1 + +## 结论及范围 + +**A1 Android/Core 已完成本轮可执行检查点;iOS/Metal 运行测试按用户决定豁免。** 不将豁免写成实际 Metal PASS。STEP-097 总体仍进行中,A2/B/C 尚待实现和验证;无新软件发布。 + +- 仓库:`/Users/tei/dev/MapLibreParticleLab`,`particle/main`,源码提交 `8c006ac83d16c2683037f90484fd86fb917a9d78`。Integration `main` 核对 `318f8ccf911ac3136c3086a1d14e61f83e2d4bce`。 +- Android/FZG1-2:直接 ADB `192.168.200.139:5555`,非 Win11 虚拟机。APK OpenGL Debug/x86_64,60,311,571 bytes,SHA-256 `48df19cf5a4c4250934efa2596423d3ad9571fe49a65b9b704a81cdb41f58671`。标准脚本编译成功、ZIP/ABI 校验通过;`install -r` 返回 Success,设备安装文件哈希一致。 +- 构建记录 `git_dirty=true` 的原因是用户另行放在 `docs/40_任务/` 的未跟踪 STEP-098 MD;本次构建起始及源码提交无 tracked 修改,未将 STEP-098 纳入编译或提交。冻结 `.13` 未修改。 + +## 01:同源同 tile Stencil — Android 实测 + +新入口为 `Step097StencilFixture`,单一 `step097-shared-polygon` GeoJSON tiled source 的四层同一 Polygon,运行中仅改变 R/C 连续 Segment 排列,不改来源、几何及图层视觉参数。 + +- 实测 RR、RCR、CRR 各两轮,稳定帧、REBUILD CURRENT、CACHE OFF/ON 与再次拓扑切换,共 **18 个检查点**,18 张 1920×1200 PNG 与 18 份 UI XML。 +- 所有检查点均 `valid=true`、`fallback=false` 且实际策略序列匹配当前选项;缓存 OFF 时各 R 报告 fallback,ON 后重新构建,拓扑有效不变。代码回归脚本退出码 0;实时日志含 10 条 `STEP097_STENCIL_READY`,没有本次采集范围内的 FATAL/SIGSEGV/SIGABRT。 +- 使用 AppKit 对原始 PNG 采样:18 张中心像素全部为 RGB `[193,176,119]`,区域外像素全部为 `[27,49,75]`,中心与区域外有明显差异。两种采样均一致,不以截图文字代替像素核验。 +- 以上证明这组固定 same-source scene 在指定采样点和可见完整画面未出现异常;它不是对所有 tile/camera/pitch/zoom 组合的数学证明。 + +证据在忽略目录 `artifacts/maplibre-particle/step097-a1-fzg1/`:`run-stencil.log`、`pixel-check.log`、`after/*.png`、`after/*.xml`、`after/live-logcat.txt`、`after/step097-events.txt`、`after/fatal-events.txt`、`after/observations.json`、`install.log`、`installed.sha256`。 + +## 02:Metal 附件 — 源码与编译,不执行 iOS runtime + +Metal 宿主测试二进制中包含 `MetalRetainedAttachments.*` 两个 GTest,Metal host CMake 增量编译退出码 0。当前 Mac 没有可用 `MTL::CreateSystemDefaultDevice()`,两个测试均按守卫 SKIP;没有将 0/2 误记为 PASS。针对 `metal-cpp` 对象指针解引用的最小编译修正已提交 `8c006ac83`。 + +用户于 2026-09-26 明确决定:本轮不执行 iOS 测试,Android 验收通过后 iOS 按其决定视作接受。记录为 `USER_ACCEPTED_WITHOUT_IOS_RUNTIME_TEST`,不宣称 iOS GPU/Metal 实际验证。 + +## 03:绘制异常恢复 — 原生测试 + +`RenderOrchestratorError.*` 两个新增原生测试实际执行 **2/2 PASS,exit 0**,覆盖 opaque/translucent 绘制异常、错误上报、失败 cache 不发布/不复用及干净重试恢复。日志:`artifacts/maplibre-particle/step097-a1-fzg1/render-exception.log`。本次不将 GTest 扩写为 Android GPU 真实异常注入 PASS。 + +## 19:资源释放归属 — 已有结果 + +`OldCacheReleaseCannotChargeReplacementAtSameIndex` 已在此前重新编译的 Mac Core 原生 runner 实测 **1/1 PASS**;诊断组 **5/5 PASS**。FZG1 资源辅助冒烟 20 个检查点已经单独报告。精确 revision 归属由原生 GTest 负责,不据设备摘要断言不存在 GPU 内存泄漏。 + +## A1 交接与限制 + +A1 在 Android/Core 验证和用户 iOS 豁免口径下可进入 A2;保留 B/D `topPresent=true` 的旧诊断疑点,不将其冒充已修复。下一阶段按原任务书 A2→B→C 严格串行;每阶段 Codex 实现/测试入口,RDC 负责实际构建、执行与独立审查;不加入 Jest、不覆盖 `.13`。 diff --git a/粒子开发记录.md b/粒子开发记录.md index aa4b49a57..ffa0bb0e8 100644 --- a/粒子开发记录.md +++ b/粒子开发记录.md @@ -968,3 +968,8 @@ Android V3-08 单次综合验收已完成并关闭。Native `13.4.1-particle.2` ### 2026-09-26 STEP-097 A1 专项测试入口续作 - Codex 增加本地同源 GeoJSON 的 R-R/R-C-R/C-R-R Android 操作入口、Metal 附件及 clear GTest、LayerGroup 异常与 cache 重试 GTest;仅静态检查,未运行构建、GTest、Jest 或设备。A1 仍待 RDC 验证,A2/B/C 不启动。 + +### 2026-09-26 STEP-097 A1 Android/Core 收口 + +- RDC 标准脚本构建 `8c006ac83` Android x86_64 OpenGL APK,FZG1-2 覆盖安装与 SHA-256 核对通过。18 组同 source/tile Stencil 屏幕、诊断与像素采样一致,03 异常恢复原生 2/2 PASS,19 之前原生 1/1 PASS。证据与限制见 `docs/报告/STEP-097_A1_Android专项验收报告_v1.md`。 +- Metal host 编译可用但设备无 Metal,2 项 SKIP;依用户决定不做 iOS runtime,不虚报 iOS 实测。允许进入 A2,STEP-098 未启动、未纳入提交。