mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-08 10:33:24 +09:00
[docs] (P7): W4 §3b - the OpenRA hole is one draw (call 30376) reading vertex bytes other than call 30366's
Lens D placed 100 % of the wrong pixels inside the screen-space union of a single glDrawArrays whose vertex data was the frame's first glBufferSubData into the streaming buffer; the palette respecify is not the mechanism. The candidates are WriteWireBuffer's serial-gated branch and the mid-frame drain that bumps the frame serial without a fence.
This commit is contained in:
@@ -70,8 +70,8 @@ B 的 mip 形状半退役 + 深度 mip 烘焙(ID-P7-23)在真机上兑现;
|
||||
|
||||
1. **不是旧帧**:monolith 在 call 30194 的图 = golden(场景静态),所以两张错图都是本帧、少了东西。
|
||||
2. **不是错纹理**:调色板(texture 3,256×32 BGRA,每帧 call 30232+1055k 用 `glTexImage2D` 重指定)在快照时刻的内容在所有失败跑里与 monolith 逐字节相同。
|
||||
3. **是被丢掉的 draw**:调查镜头 A 对 `fb75d412` 的 diff 做连通域——正好 9 块 = 14658 像素,每块 golden 有精灵(油井、管线、石堆、单位、贴花)而 actual 是干净的地形;同一油井贴图在 (240,120)/(560,70) 缺、在 (395,378) 在——**按 draw 丢,不按纹理丢**。两臂日志逐行相同 = 丢失路径没有任何日志(rule I 的反例)。镜头 A 指认的无日志路径:`SetupWireDraw`(`VulkanRenderer.cpp:12744-12747` 裸 `return;`)← `PrepareWireTextureResources`(`WireDraw.inc:230`)← `SyncTextureResourceByHandle`(`UniformManager.cpp:2971`)← `UploadPendingWireLevels` 五个 false 出口(`VkTextureManager.cpp:2404-2508`)。每帧重指定的调色板正好在这条路上。
|
||||
4. **两进程臂同样掷硬币**(spawn 3 遍 红/绿/红),且第三张图 `4e5ba514`(9836 像素)在 run-ahead 下也出现——丢掉的 draw 段有两种量化长度。归因与修复交 **B3**(`p7-magma-b3`);主机 red-once 走 `integration-magma-spawn`。
|
||||
3. **是一次 draw 画了个空**:调查镜头 A 对 `fb75d412` 的 diff 做连通域——正好 9 块 = 14658 像素,每块 golden 有精灵(油井、管线、石堆、单位、贴花)而 actual 是干净的地形;镜头 D 再从 trace 反解投影与顶点布局(program 3:vec3 pos + vec4 STUV + vec2 palette,stride 36;`Scroll=(1298,1766)` 1:1),证明 **100% 的错像素都落在 call 30376 `glDrawArrays(GL_TRIANGLES, 0, 318)`(53 个 quad)一次 draw 的屏幕并集里、并集外零个**——这次 draw 执行了(没有日志)但什么都没画出来:它的顶点是 call 30366 `glBufferSubData(buffer 1, 0, 11448)` 送的字节(buffer 1 = 294912 B `GL_DYNAMIC_DRAW`、从不 map、每帧被重写 ~24 次),draw 读到的不是这 11448 字节。两臂日志逐行相同 = 出错路径没有任何日志。候选机制(镜头 B/D,均有引文):`VkBufferManager::WriteWireBuffer` 按 `lastUseSerial > GetCompletedSerial()`(`VkBufferManager.cpp:254`)在「有序 `vkCmdCopyBuffer`」与「立即 host memcpy」之间二选一,而 `TryDrainFrameTransients` 每第 8 次成功 drain 调 `BeginFrame` 让 `m_frameSerial` 无 fence 地 +1 并回卷该槽的 transient arena(`VulkanRenderer.cpp:13568`、`VkBufferManager.cpp:521-528`)——drain 只在 GPU 追平时才成功,正是掷硬币的来源;另有 `WaitForSubmitIndex` / `WaitForFrameSerial` 两处「等一个 fence 就退休它之前所有记录」(B 在回读路径修过的同一形状)。调色板每帧 `glTexImage2D` 重指定不是原因(快照时刻内容正确)。
|
||||
4. **两进程臂同样掷硬币**(spawn 3 遍 红/绿/红),且第三张图 `4e5ba514`(9836 像素)在 run-ahead 下也出现——应是同帧另一对 `glBufferSubData → draw`(30403→30413 / 30440→30450 / 30531→30541)空掉。归因与修复交 **B3**(`p7-magma-b3`);主机 red-once 走 `integration-magma-spawn`。
|
||||
5. 附带:Magma 从不发布 `kCapRunAheadApply`,DirectVulkan 客户端本来就是逐记录 lockstep(`ClientSession.cpp:1984-1988`),`RUN_AHEAD=0` 改变的只是时序。
|
||||
|
||||
## 3c. bsl-esc-menu-854:spawn 臂也死,是内存缺陷(`bsl-spawn.log`、`bsl-mem-*.log`)
|
||||
|
||||
Reference in New Issue
Block a user