Files
MobileGL/docs/Disaggregated/notes/p5f/fr-report.md
T

91 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`,未修改参考树。