diff --git a/docs/Disaggregated/notes/p5f/fr-report.md b/docs/Disaggregated/notes/p5f/fr-report.md new file mode 100644 index 00000000..bf3c4f28 --- /dev/null +++ b/docs/Disaggregated/notes/p5f/fr-report.md @@ -0,0 +1,91 @@ +# P5f / fr — registry 身份边收口 + +> 分支 `codex/p5f-fr`,基线 `4667e13b`。工作树 `MobileGL-p5f-fr`; +> 独立 Linux 验证树 `/home/swung/w7/p5f-fr`。这是波次 3 的 fr 包, +> fe/fm 已迁移的 CopyImage 和 storage-block 接线不重复计数。 + +## 1. 结果与边界 + +所有 transport apply 对 client allocator 的访问都具名拒绝,设障、后端种类和历史 +scope 均不再豁免。`MGPipeSlots()` 本身新增守卫,覆盖旧三方法守卫之外的 +`Allocate`、`IsLive`、`HighWater` 等入口;backend 私有 allocator 不经这个 singleton。 + +`BackendSlotTable` 的 `GetOrCreate(StatePtr)`、`HandleOf`、`NoteStateForHandle`、 +`StateForHandle` 在所有 apply 上拒绝 frontend 身份;`Find(StateObject*)` 经 `HandleOf`。 +上层 `StateBackendObjectRegistry` 的 frontend lookup/mint/iterator 在臂选择之前检查, +不能靠关闭 slot-table 位退回裸地址 map。按 handle 的查找、创建、遍历、释放仍正常工作。 +拒绝为 `Fatal{RoleViolation, "MGPipeSlots"}`,日志还包含具体成员名。 + +两种历史 scope 现在是无状态标记,不持有深度、不产生豁免。P3b/P4b 可随 monolith +glue 一起删除这些标记;P5f 不删掉对应的 monolith 功能来消除 grep 结果。 + +自由函数 `DirectGLES::GetBackendProgramId(GLuint)` 全树无声明、调用者或 dispatch 槽。 +本包以 `!MOBILEGL_BUILD_DISAGGREGATED` 隔离,D-P 中不再存在;保留非 D-P 函数体, +避免仅为删除死代码改变 pull 的 `.text` 与符号。它不等于仍被大量使用的 +`BackendProgramObjectImpl::GetBackendProgramId() const` 成员。 + +## 2. 原 13 个 DirectGLES scope 的重新核对 + +这里按函数名定位,不沿用 f0 的旧行号。家族位关闭导致的 legacy 回退不视为安全的 wire +功能;新的无条件身份守卫和字段收口会拒绝它,不能用“client 已停在 barrier”解释放行。 + +| 原 scope 所在函数 | 当前 transport 路线 / 阻断点 | +|---|---| +| `SyncTextureObjectToBackend` | `OnResourceCopyRegion` 已由 fe/fm 将 `Src/Dst` 放入 `CopyImageEndpoint.TextureHandle`,GLES endpoint 走 `SyncTextureToBackendByHandle`;旧对象 overload 留 monolith。 | +| `SyncCurrentFBO` | 先走 `SyncCurrentFBOByRecord`;开启 family 后的 decline 经 `RefuseFramebufferBindingSlotRead`,不会落入对象 lookup。 | +| `ResolveGlobalConstantsRecord(program)` | transport 的调用点用 `ResolveGlobalConstantsRecordForHandle`;旧对象 overload 留 monolith。 | +| `SyncCurrentProgram(program)` | draw/dispatch 经 `ProgramHandleArm()` 选 `SyncCurrentProgramByHandle`。 | +| `BindCurrentFBO` | record 的 `Fbo` 经 `FindByHandle`;mandatory record 臂 decline 即拒绝。 | +| `ResolveAndBindUnitTextures` | `UnitTexturesByHandle()` 的 record 分支先行返回;legacy unit pass 留 monolith。 | +| `ResolveUnitSamplerBackend` | transport 在 scope 前以 `BindSamplerStates.Count` 拒绝 identity sampler 家族。 | +| `BindCurrentProgramWithResources` | `handleArm` 经句柄 stash / `ResolveProgramTwin`,对象 registry 在另一臂。 | +| `GetCurrentBackendProgram` | `ProgramHandleArm` 在旧 scope 前返回。 | +| 自由函数 `GetBackendProgramId(GLuint)` | 无调用者;本包从 D-P 编译中排除。 | +| `ScopedDetachedTextureFramebufferAttachments(texture)` | transport mipmap 用 handle 构造与 record reverse-index;对象构造及 `StateForHandle` 留 monolith。 | +| `ShaderStorageBlockBinding` | fe 已用 `VerbStorageBlockProgram` → `FindByHandle` → native program id,并先行返回;旧 GL-name 查对象路径留 monolith。 | +| `GetTexImage` | wire 槽仍在 `MGR_UNMIGRATED_TAIL_SLOTS`,`Fatal{UnmigratedVerb, "GetTexImage"}`;不能因为本包关闭 scope 就宣称 P9 功能已实现。 | + +## 3. Managers 的 11 个 scope 与普查遗漏 + +`HandleOfBuffer` 的 frontend overload 在 legacy buffer path;transport buffer consumers +用 handle 入口。`HandleOfSamplerViewForTexture` 全树没有调用者,仍是 monolith glue。 +`RequireImageBindableStorage` 的 object overload 在 legacy texture path;transport 使用 +`RequireImageBindableStorageByHandle`。`ResolveOwnRecord` 在 transport twin 已带 +`m_pushedSyncHandle`,不进入对象 lookup。 + +`SyncAttachmentObject` 的 texture/renderbuffer 两站和 FBO verify 的两站位于 object +`BackendFramebufferObject::SyncToBackend`;transport 使用 `SyncToBackendByHandle`。 +program serial 盖章和 renderbuffer record 解析位于各自 object `SyncToBackend`; +transport 的 by-handle overload 不问 frontend identity。 + +**第 11 项 sampler registration probe 不能照 f0 写成不可达。** transport 的 +`BindCurrentProgramWithResources` 在 depth-texture、普通 `sampler2D`、需要强制 nearest +的组合下实际调用 `GetRawDepthFetchSampler()`;该 helper 原来创建 `SamplerObject`, +setter 还会读 client context,随后 `BackendSamplerObject::SyncToBackend` 的无 CSO 分支 +进入这个 registration probe。此遗漏已交 fs 包改为 server native sampler,并补世代测试。 +fr 关闭所有 registry 豁免后,这个遗漏不会再静默放行。 + +同时发现 `VulkanRenderer::Initialize()` 仍无条件创建 blit/depth-mipmap 隐藏 +frontend program;相应两个 shutdown scope 不能当作不可达依据。已交 fv 包将 transport +初始化改道。原有 host Magma 用例通过不能代替完整 surface 初始化证据;本报告不声称 +另有已经核实的 headless 初始化豁免。fr 仍无条件关闭 Magma allocator 豁免。 + +## 4. 验证 + +- 行为代码 `8377e6cf` 的独立 split `RemoteClientTest` 构建成功,新增四个测试; + `RemoteGuards` 44/44 通过,完整 executable 147/147 通过(`fr-remoteclient-full.log`)。 +- `BarrieredLegacyScopesCannotExemptAllocator` 在 GLES / Vulkan 两 backend 都打开两种旧 + scope,然后实际调用 client singleton 的 `HighWater`,必须在访问前具名 abort。 +- `BarrieredFrontendRegistryMembersRefuseBothLegacyScopes` 对四个身份入口逐项检查;对象 + 和表在 client 创建,只有被测操作运行在 apply,日志核对具体成员名,避免在无关构造处死掉。 +- wrapper 测试覆盖 frontend `Find`、mint 和 iterator,核对 wrapper 自己的 marker。 +- handle 正对照在 barriered / unbarriered 两种记录下验证创建、查找、遍历、释放。 +- **真实 red-once**:临时在两个 production guard 恢复“当前记录 barriered 就放行”的旧 + 条件,构建并执行两条 barriered 测试,**2/2 真红**,失败为预期 abort 没有发生;恢复健康 + 源码并重建后守卫测试全绿。日志为 `fr-red-once.log`、`fr-restored-green.log`,临时修改未提交。 +- 非 D-P 行为改动全部由预处理隔离。pull / push、G1/G2/G14、完整 unit/GPU、strict 与 + dualblock 在 fs/fr/fv 合并树由集成者执行;本包不拿单测结果冒充整阶段门。 + +Linux 新树的子模块递归初始化遇到本地缺少 apitrace nested commit,随后复用了现有 +`p5f-int` 的依赖与 fixture 文件;未运行 `git lfs pull/checkout`,未修改参考树。 +