mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
docs: record P5f fr registry audit and guard red-once
This commit is contained in:
@@ -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`,未修改参考树。
|
||||
|
||||
Reference in New Issue
Block a user