Files

7.0 KiB
Raw Permalink Blame History

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,未修改参考树。