mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
Statics, reverse channel, Magma cross-role sites, EGL control plane, registry rekey, build/gate mechanics, the 15 BARRIER_PULLED fields' carrier rulings, and the dual-block mechanism's design recon.
34 KiB
34 KiB
f0 普查 · §2.1 BARRIER_PULLED 15 字段逐字段载体判定
基线:
feat/disaggregated @ 8b68b92c(代码头25fba0d5之后的提交只动文档)。行号均以该 HEAD 为准。 范围:MobileGL/MG_Pipe/FieldOwnership.def的 21 行 / 15 个 BARRIER_PULLED 字段,逐字段回答 (a) 存储形态 (b) 后端读者与 verb (c) 现有记录载体 (d) P5f 处置 (e) 依赖 / 工作量 / 包归属。 只读普查:本文件是唯一产物,未改任何代码、未构建、未跑测试。 姊妹篇:f0-magma.md(Magma 侧逐站点清单,本报告与之交叉引用而不重复)、f0-reverse-channel.md。
0. 总判断
- 15 个字段全部涉及 client 地址空间,无一例外。9 个非 sticky 行的存储全部是前端堆引用——
4 个
SharedPtr(m_boundVertexArray/m_programForDraw/m_programForDispatch/m_transformFeedbackProgram,PipeInputs.h:807、:812-814)+ 5 个裸指针基址/槽 (m_bufferBindingSlot[15]:808、m_bufferBindingPointBase[15]:809、m_framebufferBindingSlot[2]:810、m_imageTextureBindingBase:811、m_textureUnitBase:815);6 个 sticky forward 里 3 个直接交出前端对象或写前端(GetProgramObject / GetTextureObject / RecordError), 3 个是值类查找(GetBufferBindingPointCount / HasOpenTransformFeedbackSpan / ValidateProgramName)。 21 行 = 15 字段行 + 6 行 forward 行(FieldOwnership.def:53-165 与 :178-192)。 - P5e 的教训("数据已在线上,读者没跟上")在 15 个里命中 11 个。已有记录供给或线上已带等价
句柄的:GetBoundVertexArray(
bind_vertex_elements→BoundVertexElements)、GetBufferBindingPoint (set_shader_buffers→BoundShaderBuffers,XFB 目标除外)、GetFramebufferBindingSlot (set_framebuffer_state→BoundFramebuffer)、GetImageTextureBinding(set_shader_images)、 GetProgramForDraw / GetProgramForDispatch(set_draw_program/set_dispatch_program→DrawProgram/DispatchProgram)、GetTextureUnitObject(set_sampler_views→BoundSamplerViews)、 GetTextureObject(MGPCopyRegion.Src/Dst句柄就在 GL 名旁边,MGPipeTypes.h:1468-1476)、 GetProgramObject + ValidateProgramName(MGPStorageBlockBinding.ShaderCso就在 GlName 旁边, MGPipeTypes.h:1791-1792)、RecordError(kEventGlError已接线,PipeFill.cpp:2166-2178)。 需要扩记录或新载体的只有 4 个:GetTransformFeedbackProgram(begin_stream_output只带 PrimitiveMode,CONTRACT-P5B.md:215)、GetBufferBindingSlot 的 7 个无载体 target (Coverage.def:47-57)、HasOpenTransformFeedbackSpan(需 applier 自推)、GetBufferBindingPointCount (需 applier 自推或 constexpr 表)。 - 包归属有一个真实的缺口:计划 §5 的 fm 字面只覆盖"Magma 的 9 个字段",而 15 个里 GetBufferBindingPointCount / HasOpenTransformFeedbackSpan / GetProgramObject / ValidateProgramName / RecordError / GetBufferBindingSlot 六个不在其字面范围;fm 9 字段的 Espryt 残余(strict 车道 活着的 8 对非 escalation 标记里的 6 对,见 §2 各字段)也无家。建议 fm 改写为"对象类字段 (双后端)",或新增一个字段包;RecordError 归 fv 是计划 §2.6 文本直接支持的唯一年配。
- 顺序约束(ID-112 的绊线仍然有效):
PipeFill.cpp:2789-2809的两个static_assert(NoPointerBackedRowIsWhollySupplied等)把 7 个指针残余行钉在"仍被拉"状态;退役任一行的EmittedCallSuppliesTheWholeFieldFALSE 臂(PipeFill.cpp:2582-2602)必须与该字段最后一批 后端读者的迁移同提交落地,否则 Magma 第一帧 draw 就解引用空镜像——注释 :2773-2781 明说 "This residual fill is MAGMA'S ONLY SOURCE"。这不是建议,是构建期强制。 - strict 车道活标记 10 对与字段的映射(strict-expected-markers.txt:34-52):8 对表驱动
(disjunct 1/2)+ 2 对仅 escalation(disjunct 3)。出口门要求该文件清空,而
GetBoundVertexArray@DrawArrays/GetBufferBindingPoint@DrawArrays两对的退役题材是 P8 的 client vertex arrays(P5F 计划 §2.1 自注),P8 不在 P5f 的六个包里——要么 P5f 把这两对的 载体(client VA staging)拉进来,要么出口门 2 需要为 escalation 对留一个具名豁免。这是 计划文本内部的张力,f0 只记账不裁决。
1. 方法与口径
- 三重证据:(i)
MG_IntegrationTest/Harness/strict-expected-markers.txt的 10 对活标记 (车道实测,含 admitted 判据);(ii)rsp计数路径——非 sticky 读经MGP_INPUT_CHECK→MGPipeInputUnfreshRead→CountBarrierPull(PipeInputs.cpp:344),sticky forward 经MGPipeStickyForwardPull(PipeInputs.cpp:372-378,七个本体在 PipeFill.cpp:2119-2186 各自 第一行调MGP_STICKY_FORWARD_PULL);(iii) 全树 grepMGB_CTX-><Field>/ sink 侧gPipeInputs.<Field>。 - 推导规则(scripts/gen_pipe_field_ownership.py):RECORD_SUPPLIED 是推导值 =
Coverage.def 的
MGP_COVERAGE_EMITTED_LIST(48 行,Coverage.def:256-304)减去EmittedCallSuppliesTheWholeField的 8 个拒绝(PipeFill.cpp:2582-2602,解析见 gen 脚本parse_supplies_whole_field:157-175;self-test 钉住"恰为 8 个",:972-974)。 BARRIER_PULLED 手维护且每行必须有退役相(gen 脚本 :460-462 无相即构建失败)。 admitted 表是 ID-116 推导:BARRIER_PULLED ∧ 在 verb 类 may-read 罩内 ∧(verb 的 op 静态设障 ∨ 退役相不含本阶段)(gen 脚本build_admitted:312-375),再加运行时的 disjunct 3 (escalation,PipeInputs.cpp:170-174 起)。 - "今天为何能工作"的公共答案(下文各字段只写增量):inproc 下两角色共享一份
gPipeInputs(PipeInputs.h:835),client 的第 4 步残余填充(PipeFill.cpp:3712-3762, :3759 的CopyField)写入、server 在同一块上读,verb barrier 保证同一时刻只有一个写者 (PipeInputs.h:902-908 的裁定)。strict 下这类读要么具名 admitted 要么 Fatal。 - 行号漂移记录(内容判断不受影响,但引用者须知):FieldOwnership.def:68-71 引的
PipeFill.cpp:1902-1905对应现为CopyField的 GetBoundVertexArray 臂 :128-130; FieldOwnership.def:82-84 引的SyncCurrentFBO (:2995)现为 DirectGLES.cpp:4465,BindCurrentFBO (:4303-4353)现为 :5860 起;计划 §1.1 引的 PipeFill.cpp:245/:274 现为 :244-245/:272-274,:2591-2592 现为 :2591-2597(均只差一两行)。P5F 计划 §2.2 引的 T5 站点VulkanRenderer.cpp:1562-1590据 f0-magma.md §2 已漂移到 :1590-1637。
2. 逐字段判定
2.1 GetBoundVertexArray
- (a) 形态:
SharedPtr<VertexArrayObject> m_boundVertexArray(PipeInputs.h:807; accessor :597-601)。O 类,ReleaseObjectPins四行之一(PipeFill.cpp:95-100)。 - (b) 读者:Espryt 普通 draw 已走记录——
fromRecords三元 DirectGLES.cpp:2275、:2442、 :6185,VertexInputReadsRecords()门 :2195;残余读点全在 escalation 路径:SyncClientSideVertexArraysForDrawArrays:2207/:2213(client VA,P8)、:8539、 MultiDraw.cpp:223。Magma 6 站:DirectVulkan.cpp:805、:929,VulkanRenderer.cpp:6446、:6852、 :12550、:12651(逐站分析见 f0-magma.md §4.1;:805 的 LINE_LOOP 臂还叠加buffer-legacy-armFatal)。strict 标记:GetBoundVertexArray@DrawArrays(markers:51,仅 disjunct 3 escalation;普通 draw 对已在 P5e mv 退役,markers 头注 :29-30 与 ROADMAP P5e 行 item 5 的 red-once 证明:"倒掉 mv 的臂得 GetBoundVertexArray@DrawArrays")。 - (c) 载体:
bind_vertex_elements→ applierBoundVertexElements(PipeApply.h:662; 写入 PipeApply.cpp:2348)+VertexElementsCsos记录表。Espryt 读者已跟上;Magma 的 fast-path 句柄臂存在但句柄仍由前端对象推出(f0-magma.md §4.1,VulkanRenderer.cpp:6452-6458)。 - (d) 处置:Magma 六站改读
BoundVertexElements→ 升 RECORD_SUPPLIED(Coverage.def:36、 :262 的 emitted 行早已在;删 PipeFill.cpp:2585 的 FALSE 臂,与 ID-112 绊线同提交)。 Espryt 残余的 client-VA 对是 P8 题材——见 §0.5 的门张力。 - (e) 依赖:Magma vertex-input 句柄化(与 fm 的 GetBufferBindingPoint 同源)。 工作量:中。包:fm;escalation 对无包(缺口)。
2.2 GetBufferBindingPoint
- (a) 形态:裸指针基址
BindingSlotRange1D<BufferObject>* m_bufferBindingPointBase[15](PipeInputs.h:809;accessor :615-627,base[index]即前端活槽 :624-626)。填充 PipeFill.cpp:141-147(只填BufferBindPointTargets)。 - (b) 读者:Espryt 的记录臂已落——
SyncBufferBindingPointsByRecord读st.BoundShaderBuffers(DirectGLES.cpp:670-713,:684)、SyncAtomicCounterBuffers记录臂 :873-926、UBO 循环读BoundShaderBuffers[Uniform](:7295;CONTRACT-P5E.md:476)。 legacy 臂仍在:SyncBufferBindingPoints :724-761(:737)、:928-936(:935)。 XFB 目标无载体:SyncTransformFeedbackBindingPoints :796、StartPendingTransformFeedback :1891(kXfbSpan 罩住这两个字段,FillPoints.def:315-316)。Magma 3 站: UniformManager.cpp:1205、:2035,VulkanRenderer.cpp:11764(XFB)。strict 标记:GetBufferBindingPoint@DrawArrays(markers:52,仅 disjunct 3)。该对的具体读点本普查 不能从静态证据唯一确定——候选是 XFB-span draw 的 :1891(escalation (i),open span)或 client-VA draw;计划 §2.1 把两对都记为 client-VA(P8)。双块演习会直接报名字,f0 不裁决。 - (c) 载体:
set_shader_buffers→BoundShaderBuffers[3][84](PipeApply.h:776-779; 写入 PipeApply.cpp:2918)。XFB 目标明确不搭这条记录(CONTRACT-P5E.md:770: "XFB does NOT ride this state");set_stream_output_targets今天"has no applier and no producer"(CONTRACT-P5B.md:215)。 - (d) 处置:Magma 三站改读
BoundShaderBuffers;XFB 目标的载体是set_stream_output_targets的实体化(P9 题材,落入 P5f 范围)。之后删 PipeFill.cpp:2597 的 FALSE 臂、字段翻 RECORD_SUPPLIED(Coverage.def:71、:263 已在)。 - (e) 依赖:同 2.1 + XFB 记录实体化。工作量:中。包:fm + XFB 半无包(缺口)。
2.3 GetFramebufferBindingSlot
- (a) 形态:裸指针
BindingSlot<FramebufferObject>* m_framebufferBindingSlot[2](PipeInputs.h:810;accessor :628-637,空槽即 poison Fatal)。填充 PipeFill.cpp:190-195。 - (b) 读者:Espryt——记录臂
SyncCurrentFBOByRecord(DirectGLES.cpp:4479)+ 强制臂具名 abortRefuseFramebufferBindingSlotRead(:4490-4492,P5e fb);pre-handle 回落臂仍在 SyncCurrentFBO(:4465 起,:4507 的GetFramebufferBindingSlotChecked,helper 在 :184-202), 直接站点 :3261、:3491、:4212、:4426、:4507、:5625、:5923、:6096、:8349、:10696-10697, Managers.cpp:9903、:10299。FieldOwnership.def:82-84 的"8 Espryt + 13 Magma"与本次 grep 量级一致。strict 标记:GetFramebufferBindingSlot@ReadPixels(markers:40,disjunct 1——read_pixels是 kWaitReply);读点是 ReadPixels 内的FramebufferImpl::SyncCurrentFBO()(DirectGLES.cpp:14275)回落臂。Magma 13 站:UniformManager.cpp:560;VulkanRenderer.cpp:3158、 :5510、:5730、:6360、:6465、:6845、:7648、:8016、:9024-9025、:9660、:10371。 - (c) 载体:
set_framebuffer_state→BoundFramebuffer[2]+FramebufferRecords(PipeApply.h:714;写入 PipeApply.cpp:2558-2562),P5e fb 已给 Espryt 记录臂。 - (d) 处置:Espryt 的 ReadPixels 回落为何仍命中(记录臂 decline 的路径)需 f1 双块演习
定位——静态看 :4479 应先试记录臂,标记存活说明 ReadPixels 场景走了回落;Magma 13 站改读
BoundFramebuffer/FramebufferRecordFor(PipeApply.cpp:2609-2613)。之后删 PipeFill.cpp:2586 FALSE 臂、翻 RECORD_SUPPLIED(Coverage.def:84、:274 已在)。 - (e) 依赖:fm 的 FBO 记录消费是 Espryt 已铺好的路。工作量:中(Magma 站点多但形状单一)。 包:fm。
2.4 GetImageTextureBinding
- (a) 形态:裸指针
ImageTextureBinding* m_imageTextureBindingBase(PipeInputs.h:811; 两个 const 重载 :638-653,null 基址即 poison Fatal)。填充 PipeFill.cpp:196-199。 - (b) 读者:Espryt——pre-handle 形式 SyncImageTextureBinding :3842(注释 :3831-3837 自明 "what the pull build compiles and what a push-monolith build runs");transport 下已删的 MarkWritableImageBufferTexturesGpuWritten :3891(门 :3885-3887);Managers.cpp:11963(.Format)。 Magma 4 站:UniformManager.cpp:1021、:1312、:1867、:1955。strict 标记:无。
- (c) 载体:
set_shader_images→BoundShaderImages(PipeApply.h:751;写入 PipeApply.cpp:2857);Espryt 的记录重载已在(DirectGLES.cpp:3810-3829,ResolveShaderImageRecordSyncTextureToBackendByHandle)。bind_shader_imageverb 记录的参数全景也在线上 (PipeApplier.cpp:889-900 的注释)。
- (d) 处置:Magma 四站改读
BoundShaderImages;Espryt 残余是 monolith 臂,不动。 删 PipeFill.cpp:2587 FALSE 臂、翻 RECORD_SUPPLIED(Coverage.def:85、:275 已在)。 - (e) 依赖:无超出 fm 的。工作量:小-中。包:fm。
2.5 GetProgramForDraw
- (a) 形态:
SharedPtr<ProgramObject> m_programForDraw(PipeInputs.h:813;accessor :659-663)。填充 PipeFill.cpp:244-245(计划 §1.1 的 :245 引文)。O 类 pin 四行之一。 - (b) 读者:Espryt——PrepareForDraw 的提升读 :6215(
programFromRecords三元; :6132-6134 的注释记了这条提升本身的历史);记录臂:GetCurrentBackendProgram读MGPipeApplier().DrawProgram(:7659-7670),legacy 臂 :7672/:7744 只在ProgramHandleArm()==false时跑;:7029 同样带三元。Magma 3 站:VulkanRenderer.cpp:6384、 :6815、:6853。strict 标记:无——P5e pa 退役,markers 头注 :25-27 记了棘轮曾指名它消失, ROADMAP P5e 行 item 5 的 red-once 即此对。 - (c) 载体:
set_draw_program→DrawProgram(PipeApply.h:759)+bind_shader_state→BoundShaderCso(:761;写入 PipeApply.cpp:3208-3214);ShaderCso 记录带逐 link 的 ProgramArchive(ROADMAP P5e 行:"最大的那次迁移没有改动任何线上结构:记录早就带着逐 link 的 ProgramArchive,缺的是仍去问前端对象的读者"——本字段就是那句话的原主)。 - (d) 处置:Magma 三站改读记录即毕。删 PipeFill.cpp:2589 FALSE 臂、翻 RECORD_SUPPLIED (Coverage.def:100、:289 已在)。
- (e) 依赖:无。工作量:小-中。包:fm。
2.6 GetProgramForDispatch
- (a) 形态:
SharedPtr<ProgramObject> m_programForDispatch(PipeInputs.h:812;accessor :654-658)。填充 PipeFill.cpp:241-243。O 类 pin 四行之一。 - (b) 读者:Espryt——PrepareForCompute :8142(记录三元)+ :8154-8157 的
DispatchProgram句柄臂。Magma 2 站:VulkanRenderer.cpp:7424、:7476。strict 标记:无 (markers 头注 :28:pa 在它被写进表之前就退役了它)。 - (c) 载体:
set_dispatch_program→DispatchProgram(PipeApply.h:760)。 - (d) 处置:与 2.5 同形。删 PipeFill.cpp:2590 FALSE 臂、翻 RECORD_SUPPLIED (Coverage.def:99、:288 已在)。
- (e) 依赖:无。工作量:小。包:fm。
2.7 GetTextureUnitObject
- (a) 形态:裸指针
TextureUnit* m_textureUnitBase(PipeInputs.h:815;accessor :669-676, null 基址即 poison Fatal——计划 §1.1 的 :669 引文)。填充 PipeFill.cpp:272-274(计划的 :274)。 - (b) 读者:FieldOwnership.def:89-90 记"13 Espryt + 8 Magma",与 grep 一致。Espryt 13 站:
DirectGLES.cpp:2679、:2707、:2742、:2755、:3451、:6425、:6754、:7535、:10760、:11771、
:11887、:12120、:14451。Magma 8 站:UniformManager.cpp:511、:787、:826、:852、:1679;
VulkanRenderer.cpp:9652、:11157、:11401。strict 标记:
GetTextureUnitObject@CopyTexImage2D(markers:43,disjunct 1——copy_framebuffer_to_texture记为 verb CopyTexImage2D, FieldOwnership.def:285)。读点值得点名:UpdateTextureBindingAtTarget的MGB_CTX->GetTextureUnitObject(unit)(DirectGLES.cpp:10760)在 transport 分流检查 (:10769-10774 的VerbCopyTexDst句柄臂)之前无条件执行——句柄臂已经在了,读却先发生; 这正是"数据已在线上,读者顺序没跟上"的最小样本,也是双块演习下第一批会红的站点之一。 - (c) 载体:
set_sampler_views→BoundSamplerViews(PipeApply.h:741;写入 PipeApply.cpp:2828)+BoundSamplerStates(:746)。 - (d) 处置:Espryt 13 站 + Magma 8 站逐个改读记录(:10760 这类"读在分流前"的站点要 把读取移进各自臂内)。删 PipeFill.cpp:2588 FALSE 臂、翻 RECORD_SUPPLIED(Coverage.def:115、 :295 已在)。
- (e) 依赖:无超出 fm 的;站点数量是 fm 里最大的一批。工作量:中-大。包:fm。
2.8 GetTextureObject
- (a) 形态:sticky forward,无存储;按 GL 名返回
const SharedPtr<ITextureObject>&(PipeInputs.h:691;本体 PipeFill.cpp:2131-2135,null context 时返回NullShared)。 - (b) 读者:Espryt 后端本体无站点(DirectGLES 全树 grep 无
MGB_CTX->GetTextureObject); 读者在 server sink:ServerVerbSink::OnResourceCopyRegion用 GL 名重建两端点 (PipeApplier.cpp:853-859,注释明说"rspcounts every one of these and P7 is what retires them")。Magma:VkTextureManager.cpp:810。strict 标记:GetTextureObject@CopyImageSubData(markers:42,disjunct 2 退役相 P7;gen 脚本 self-test :998-999 与 :1039-1041 钉住它同时被 disjunct 1/2 覆盖)。 - (c) 载体:
MGPCopyRegion.Src/Dst句柄与 GL 名并排在线(MGPipeTypes.h:1468-1476; 注释 :1455-1464 自明"A GL name is NEVER an identity; it is the lookup key of a pull the handle beside it will replace")。 - (d) 处置:sink 改按
Src/Dst句柄经 server 纹理 twin 表解析(FieldOwnership.def:183-184 的 forward 机制"a server-side texture handle table"),forward 删除、字段行出表。 Magma 的 :810 同批。无法升 RECORD_SUPPLIED——sticky forward 没有存储可供"供给",退役形态 是 accessor 死亡(仿 InvalidateCompileEnv 的 P5c ev 处置,FieldOwnership.def:157-163: 字段行改 FATAL + forward 删除)。 - (e) 依赖:server 端纹理句柄表(fm 的公共底座,与 2.7 共用)。工作量:小-中。 包:fm 边缘——读者在"后端无关的 sink"而非 Magma 本体,fm 的字面范围需要为此扩写(§0.3)。
2.9 GetBufferBindingPointCount
- (a) 形态:sticky forward,值类
SizeT,按 target 查前端绑定点的容量(不是绑定状态)。 Coverage.def:145 的 sticky 理由原文:"keyed by target: a constexpr capacity table, not verb state"。本体 PipeFill.cpp:2119-2123。 - (b) 读者:Espryt 1 站:SyncAtomicCounterBuffers 的 legacy 臂 :928——它的记录臂 (:873-877)已改读 applier 窗口,注释 :871-872 自明"the bound is the applier's window instead of GetBufferBindingPointCount's sticky forward, which is the row this site was the Espryt reader of"(即 Espryt 侧读者已退役,legacy 臂只在非记录配置跑)。Magma 2 站: UniformManager.cpp:1200、:2030。strict 标记:无。
- (c) 载体:
set_shader_buffers的窗口(ShaderBufferStart/Count,PipeApply.h:778-779) 回答"用到哪";容量本身是常量(线上 84,kMGPipeMaxBufferBindingPoints;CONTRACT-P5E.md:650)。 - (d) 处置:升 APPLIER_DERIVED——applier 从
BoundShaderBuffers窗口/容量表回答, 读者改读之(FieldOwnership.def:179-180 的 forward 机制就是"a server-side binding-point table")。注意它与 2.2 同源:Magma 的 UniformManager 两站把 count 与 point 成对读 (:1200/:1205、:2030/:2035),应同批迁移。 - (e) 依赖:同 2.2。工作量:小。包:fm(字面外,缺口)。退役相标 P7/P13——P13 的半边 (transfer target 的容量)本普查未见读者,未见不等于没有,标未知。
2.10 HasOpenTransformFeedbackSpan
- (a) 形态:sticky forward,值类
Bool,按 lifetime id 查前端 XFB span 开闭 (PipeInputs.h:692;本体 PipeFill.cpp:2137-2141;前端实现 Core.cpp:1299)。 - (b) 读者:仅 Magma 1 站:VulkanRenderer.cpp:11684(
m_xfbCounterSlotOwner的归并检查)。 Espryt 无后端读者。strict 标记:无。 - (c) 载体:无现成字段级载体,但 applier 已具备自推的全部输入:
begin/end/pause/resume _stream_output四个 verb 记录(FieldOwnership.def:267-270 的 stamp 行)+bind_stream_output(带LifetimeId,MGPipeTypes.h:1773-1778)+ 已有的MGPipeApplierState::IsTransformFeedbackActive镜像(PipeApply.h:805,P5e §2.1 escalation (i) 的两侧同值论证是先例)。注意 CONTRACT-P5B.md:215 记begin_stream_output的 sink 今天是 stub——自推依赖 t2 sink 实体化。 - (d) 处置:升 APPLIER_DERIVED(FieldOwnership.def:185-186 的机制"server-side XFB span state"):applier 从 stream-output 记录序列维护 per-lifetime-id 的 span 开闭集。
- (e) 依赖:t2 sink 实体化(P9 题材的边缘)。工作量:小-中。包:无明确归属(缺口; 读者在 Magma,可挂 fm)。
2.11 GetTransformFeedbackProgram
- (a) 形态:
SharedPtr<ProgramObject> m_transformFeedbackProgram(PipeInputs.h:814; accessor :664-668)。填充 PipeFill.cpp:285-287。O 类 pin 四行之一。 - (b) 读者:Espryt 1 站:StartPendingTransformFeedback(DirectGLES.cpp:1871,PrepareForDraw
尾部,kDraw 罩住——FieldOwnership.def:102-105 的"XFB itself is off the reduced path, but
kDraw's may-read mask carries it"即此);同一函数 :1891 还读 GetBufferBindingPoint(2.2 的
XFB 半)。Magma 2 站:VulkanRenderer.cpp:11725、:11824。strict 标记:
GetTransformFeedbackProgram@DrawArrays(markers:44;gen 脚本 self-test :996-997 钉住它由 disjunct 2 承载,CONTRACT-P5E §5.7 把 XFB 整体划出 P5e)。 - (c) 载体:今天没有。
begin_stream_output只带PrimitiveMode(CONTRACT-P5B.md:215 原文,且同文明说 capture program 靠的就是 kXfbSpan/kDraw 的 BARRIER-PULLED 读);set_stream_output_targets无 producer 无 applier。这是 15 个里"线上没数据"的代表。 - (d) 处置:升 RECORD_SUPPLIED 需要先造数据:给
begin_stream_output增加 capture program 的 ShaderCso handle(或实体化set_stream_output_targets并让它带上),两端读者 (Espryt :1871、Magma 两站)改读 applier 状态。不能降 FATAL:kDraw 罩内有活读者, 缩减路径(OpenRA 的 XFB 用例)会读。 - (e) 依赖:记录 schema 扩展(线上行,须与 gen 管线同步)+ 双后端读者。工作量:中。 包:fm(Magma 半);Espryt 半的退役相标的是 P3b/P4b(与 fr 的 registry 重键同源不同事, 归属需在 §5 定包时裁决)。
2.12 GetProgramObject
- (a) 形态:sticky forward,按 GL 名返回
const SharedPtr<ProgramObject>&(PipeInputs.h:690;本体 PipeFill.cpp:2125-2129)。 - (b) 读者:Espryt 2 站,成对出现在 ValidateProgramName 之后:GetBackendProgramId :8204
(+:8199)、ShaderStorageBlockBinding :12600(+:12599;:12603-12606 还背着 G6 的
MGPipeFrontendKeyedRegistryScope)。Magma 1 站:DirectVulkan.cpp:278(+:275)。 sink 侧注释 PipeApplier.cpp:921-923 自明"Both backends resolve the PROGRAM through the barrier-pulled GetProgramObject(GlName) … retired by P9"。strict 标记:GetProgramObject@ShaderStorageBlockBinding(markers:41;SetStorageBlockBinding是 kWaitApplied,PipeCalls.def:297,disjunct 1/2 皆覆盖)。 - (c) 载体:
MGPStorageBlockBinding.ShaderCso已在记录里(MGPipeTypes.h:1791-1792: "the identity, and what P7 dispatches on"),名字 blob 走 SEG_STAGE。数据已在线上。 - (d) 处置:两端 backend 的
ShaderStorageBlockBindingslot 改按 ShaderCso 句柄解析 (esp. Espryt :12597-12620 的"只推给已建成 program"优化路径,其 frontend-keyedFind一并 随 fr 的 registry 重键消失);forward 删除,字段行参照 2.8 的 ev 形态出表。无法升 RECORD_SUPPLIED(无存储),处置形态是 accessor 死亡。 - (e) 依赖:fr 的 program registry 句柄化(:12603 的 scope 是 P5c G6 债,两包有交集)。 工作量:小-中。包:无明确归属(缺口;可挂 fm 或并入 fr 的 program 半边)。
2.13 ValidateProgramName
- (a) 形态:sticky forward,值类
Bool,前端名表探测(PipeInputs.h:694;本体 PipeFill.cpp:2158-2162;Coverage.def:127 记 kClientResolved——"the server is never asked" 是设计答案,今天的实现恰恰相反)。 - (b) 读者:与 GetProgramObject 完全同点成对(2.12 的四处;另 DirectGLES.cpp:8199)。
strict 标记:
ValidateProgramName@ShaderStorageBlockBinding(markers:45)。 - (c) 载体:不需要载体——发射端 client 在发
set_storage_block_binding时名字必然已过 前端 validator;server 按 ShaderCso 解析到记录即隐含合法(与 2.12 是同一笔迁移)。 - (d) 处置:随 2.12 一起退役;字段行出表(机制"a client-resolved program name probe", FieldOwnership.def:187-188)。
- (e) 依赖:同 2.12。工作量:小(与 2.12 同提交)。包:同 2.12。
2.14 RecordError
- (a) 形态:sticky forward,写前端(错误队列)(PipeInputs.h:695-697;本体 PipeFill.cpp:2164-2186)。15 个里唯一的写方向。
- (b) 读者(写者):Espryt:Managers.cpp:14858、DirectGLES.cpp:11124(另有
Managers.cpp:14949-14951 自明"NO RecordError HERE"的反向先例)。Magma:DirectVulkan.cpp:735、
VulkanRenderer.cpp:1367、:1371、:1427。strict 标记:无(车道不制造 GL 错误)。
rsp 口径注意:
MGPipeStickyForwardPull(RecordError)在分流之前(PipeFill.cpp:2165), 所以即使 transport 臂根本不碰前端(:2166-2178 直接PostGlError后 return),server-stamped verb 内的每次调用仍被记一次 pull——这是机制的保守,不是残余的债。 - (c) 载体:已存在且已接线:P5c ev 把 transport 臂改成了
kEventGlError事件 (CONTRACT-P5C §4.2;ServerSessionInstance().PostGlError,PipeFill.cpp:2174-2177), 错误消息经info->toString()过线。剩在 P9 的只是有序化(:2170-2173 的注释: "preserves per-thread program order of error-then-read but not cross-verb interleaving")。 - (d) 处置:这是 15 个里唯一"载体已通、剩记账口径"的字段。建议仿 InvalidateCompileEnv 的
P5c ev 处置(FieldOwnership.def:157-163 的先例与 :160-161 的"FieldOwnership 只描述 split
server 的读"论证):把
MGP_STICKY_FORWARD_PULL移到分流之后(或 transport 臂豁免计数), 字段行降 FATAL——论据是"transport 下分流臂已是完整答案,server 侧再落到 monolith 臂即真 缺陷"。需先逐写者核OnGlError覆盖(消息保真已由 :2174 保证,有序化仍是 P9 的)。 若 f1 双块演习显示monolith 臂在 split 下仍被合法触达,则退而维持 BARRIER_PULLED 到 P9—— 双块的红就是判据。 - (e) 依赖:fv 的反向通道有序化口径(P9 的边界划分)。工作量:小。包:fv——计划 §2.6 明列"OnGlError 有序化",其中触碰 client 内存的部分归 P5f,而本字段 transport 下已不 触碰,剩余正好是有序化与计数口径。
2.15 GetBufferBindingSlot
- (a) 形态:裸指针
BindingSlot<BufferObject>* m_bufferBindingSlot[15](PipeInputs.h:808; accessor :605-614,空槽/越界即 poison Fatal)。填充 PipeFill.cpp:131-140——只填GlobalBufferTargets,Index 恒 null(:132-136 的注释:GLContext 经绑定 VAO 的 element-buffer 槽推导,"a derivation no FillPoints.def row can copy")。 - (b) 读者:按 target 分片(Coverage.def:37-70 的权威拆分:8 个 target 有记录载体,7 个
没有——CopyRead/CopyWrite/PixelPack/PixelUnpack/Texture/DispatchIndirect/Query)。
Espryt:PixelPack 读回 6 站(DirectGLES.cpp:12809、:13791、:14028、:14338、:14769,
Utils.cpp:2353);DrawIndirect/Parameter 族 :440、:976、:1422、:8921、:8999-9000、:9078、
:9151-9152、:9332、:9381,MultiDraw.cpp:308。Magma:DirectVulkan.cpp:283、:407、:470、:538、
:591;VulkanRenderer.cpp:7520(DispatchIndirect)、:11126、:12560-12561、:12661-12662、:12731。
strict 标记两对:
GetBufferBindingSlot@ReadPixels(markers:34,disjunct 1——读点是 ReadPixels 的 PBO 槽 :14337-14338 一带)与GetBufferBindingSlot@DrawArrays(markers:36-39, wave-3 新:multi-draw 五档被强制后 indirect 档浮出,注释 :35-38 记了它"was named before it could fire")。 - (c) 载体:
set_indirect_buffers只带 DrawIndirect+Parameter 对(Coverage.def:44-45, MGPIndirectBuffers 的自明范围);resource_readback(MGPReadback)带目标 buffer 句柄 (MGPipeTypes.h:1439-1443)但 PixelPack 槽的读在 verb 内、不在记录解析点。PixelPack 等 7 target 无任何 call(Coverage.def:47-57 逐 target 点名)。 - (d) 处置:本字段不能一次翻类,只能按 target 渐进——而字段按 Coverage.def:61-69 的裁定
必须保持一行,所以 P5f 的工具是
MGP_FIELD_OWNERSHIP_ARG_LIST的按参数例外行 (GetPixelStoreParameters,1 已是先例,FieldOwnership.def:214-216):有载体的 target 逐批窄出 BARRIER_PULLED,Query target 两端都无读者(Coverage.def:56-57)可率先窄为 FATAL, DispatchIndirect(Coverage.def:50-55 点名"两端都读且无 call")需要扩set_indirect_buffers或新记录(P13 题材),PixelPack 随 readback 记录改造(P9 题材)。全部窄完后字段行出表。 - (e) 依赖:readback 记录化(P9)+ indirect 扩 target(P8/P13)——三个退役相分属三个 后续阶段,是 15 个里唯一需要 P5f 主动把外阶段题材拉进来的字段。工作量:大 (15 target × 双后端 × 三类载体)。包:无归属(缺口最大的一行)。
3. 包归属汇总与缺口
| 字段 | 处置方向 | 载体状态 | 包(计划 §5 字面) | 建议包 |
|---|---|---|---|---|
| GetBoundVertexArray | 升 RECORD_SUPPLIED | bind_vertex_elements 已在 | fm(Magma 半);escalation 对无包 | fm + P8 议题 |
| GetBufferBindingPoint | 升 RECORD_SUPPLIED | set_shader_buffers 已在(XFB 除外) | fm;XFB 半无包 | fm |
| GetFramebufferBindingSlot | 升 RECORD_SUPPLIED | set_framebuffer_state 已在 | fm | fm |
| GetImageTextureBinding | 升 RECORD_SUPPLIED | set_shader_images 已在 | fm | fm |
| GetProgramForDraw | 升 RECORD_SUPPLIED | set_draw_program 已在 | fm | fm |
| GetProgramForDispatch | 升 RECORD_SUPPLIED | set_dispatch_program 已在 | fm | fm |
| GetTextureUnitObject | 升 RECORD_SUPPLIED | set_sampler_views 已在 | fm | fm |
| GetTextureObject | accessor 死亡(FATAL 形态) | MGPCopyRegion 句柄已在 | fm 边缘(读者在 sink) | fm |
| GetBufferBindingPointCount | 升 APPLIER_DERIVED | applier 窗口可推 | 无 | fm |
| HasOpenTransformFeedbackSpan | 升 APPLIER_DERIVED | 需 applier 自推(依赖 t2 sink) | 无 | fm 或 P9 边界 |
| GetTransformFeedbackProgram | 升 RECORD_SUPPLIED(须先造数据) | 无——begin_stream_output 需扩 | fm(Magma 半);Espryt 半标 P3b/P4b | fm + fr 裁决 |
| GetProgramObject | accessor 死亡 | MGPStorageBlockBinding.ShaderCso 已在 | 无 | fm 或 fr |
| ValidateProgramName | accessor 死亡 | 随 2.12,无需载体 | 无 | 同 2.12 |
| RecordError | 降 FATAL(计数口径修正后) | kEventGlError 已接线 | fv(唯一字面匹配的) | fv |
| GetBufferBindingSlot | 按 target 渐进(ARG 例外行) | 8/15 有载体,7/15 无 | 无(P8/P9/P13 混合) | 缺口最大 |
三个给 §5 定包的输入:
- fm 的字面"Magma 的 9 个字段"应扩写为"对象类字段的双后端退役"——否则 6 个字段无家可归, 且 fm 内部还混着 sink 侧读者(GetTextureObject)与 Espryt 残余读者(GetTextureUnitObject@ CopyTexImage2D、GetFramebufferBindingSlot@ReadPixels、GetTransformFeedbackProgram@DrawArrays)。
- 两个 escalation 对(client VA,P8 题材)与 GetBufferBindingSlot 的 P8/P9/P13 混合退役, 是出口门 2(markers 清空)与范围表 §3(不取 P8 staging)之间唯一的正面冲突,需要计划 层面裁决:拉进来,或为 escalation 对留具名豁免。
- 顺序约束:7 个指针行的
EmittedCallSuppliesTheWholeFieldFALSE 臂删除(PipeFill.cpp :2582-2602)与对应最后一批改者必须同提交,ID-112 的两个static_assert(PipeFill.cpp:2789-2809)是构建期强制执行者;FieldOwnershipTest钉住非 sticky BARRIER_PULLED 清单(FieldOwnership.def:66-67),gen 脚本 self-test 钉住拒绝集恰为 8 (scripts/gen_pipe_field_ownership.py:972-974)——每退役一行,这三处与 strict-expected-markers.txt 的同提交更新是机械义务。