mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 18:13:23 +09:00
[Docs] (P9 W2): W2-REMINT - no pull protocol, the census, the coverage matrix and the red-once record; design/04 8.4, the P5c/P5e contract amendments, open question 2 and the P7 census attribution
This commit is contained in:
@@ -140,7 +140,11 @@ The client shadow for such levels is stale and that is CORRECT: the two readers
|
||||
observe the staleness are both named refusals under split — `glGetTexImage` served from the
|
||||
client shadow (class C, P9) and `texture-remint-pull` (`Fatal{UnmigratedEmulation}`). This is
|
||||
i1's copy-image-shadow-mirror ruling (CONTRACT-P5B §2) applied to the mip chain, and tx
|
||||
reports which scenarios reach either Fatal.
|
||||
reports which scenarios reach either Fatal. **AMENDED (P9 W2):** the second reader is gone rather
|
||||
than refused — under a transport a re-mint reads the GPU level itself
|
||||
(`RequireImageBindableStorageByHandle`) and never the client shadow, so a GPU-generated level
|
||||
survives it; the marker and `OnTexturePullRequest` were deleted
|
||||
(`docs/Disaggregated/notes/p9/W2-REMINT.md`).
|
||||
|
||||
### 2.4 The audit gate (E-P5c #2)
|
||||
|
||||
|
||||
@@ -494,7 +494,12 @@ per unit, not every slot of every touched unit; coverage is unchanged (views ∪
|
||||
attachment lists ∪ the waited texture ops). `RequireImageBindableStorage`'s re-dirty arm
|
||||
(`Managers.cpp:5930-5962`, already aborting three frames deep) becomes a NAMED refusal at its
|
||||
entry under a transport, `Fatal{UnmigratedEmulation, "image-bindable-redirty"}`; `ImageBindableHint`
|
||||
is the prevention, P9 owns the pull. `GenerateMipmap(target)` under a transport resolves the
|
||||
is the prevention, P9 owns the pull. **AMENDED (P9 W2):** there is no pull. `c1bf7e15` (P5f) made the
|
||||
by-handle arm a server-owned promotion (`RequireImageBindableStorageByHandle`: GPU level read back,
|
||||
staged store for pending boxes, immutable core formats kept) and the frontend re-dirty arm is
|
||||
monolith-only; P9 W2 closed its two holes (a level the driver does not hold is not read; a refused
|
||||
readback falls back to a covered staged level) and deleted `OnTexturePullRequest` and the
|
||||
`texture-remint-pull` marker (`docs/Disaggregated/notes/p9/W2-REMINT.md`). `GenerateMipmap(target)` under a transport resolves the
|
||||
texture from `VerbMipRes` (as `EnsureGenerateMipmapStorageAllocated` already does, `DirectGLES.cpp:8736`),
|
||||
never the active unit (`:9563-9566`), and its row flips to `kWaitNone`. `m_force*Resync` are
|
||||
server-set and never cleared by the wire; the wire bits are never cleared by the server (D-E2, now
|
||||
|
||||
@@ -32,9 +32,21 @@
|
||||
- **唯一允许同步 ack 的入口是 `glBufferStorage`**:`ResourceRespecify` 的 `kNeedsAck` 由逐记录谓词收窄到"不可变 **buffer**"(D-A2),纹理 OOM 在 monolith 里本来就推迟到 sync 时刻。respecify 带逐 level 作用域与"只换元数据"的形式,不误丢已接受的待上传。
|
||||
- 其余错误一律晚到,走有序的 `OnGlError`。
|
||||
|
||||
### 8.4 唯一的新停顿类:server 发起的纹理重铸拉取(D-B6)
|
||||
### 8.4 纹理重铸:字节全在 server 手里,没有拉取(P9 W2 撤销原「唯一的新停顿类」D-B6)
|
||||
|
||||
server 不保留纹素;image-bindable 重铸、整格式再生、view 源重铸会要求重发 level。缓解:`ImageBindableHint` 预防主因;拉取异步(阻塞 apply 线程,不阻塞应用线程);保留 LRU 默认关(`MOBILEGL_PIPE_TEXEL_RETAIN_MB=0`);显式终止符可带零个 region。真实语料上发生率可忽略(780 个统计窗口 2 次);split 下这条路径今天仍是具名 `Fatal{UnmigratedEmulation, "texture-remint-pull"}`,归 P9。
|
||||
原设计假设 server 不保留纹素、重铸要把 level 从 client 拉回来。P5c 之后 server 有 `StagedTextureStore`,GPU 写过的层本来就在 GPU 图像里——**两个后端的重铸都不需要 client 的任何字节**:
|
||||
|
||||
| | split 下重铸的字节来源 | monolith |
|
||||
|---|---|---|
|
||||
| Espryt | `RequireImageBindableStorageByHandle`:驱动上确实存在的层逐层读回旧 GPU 纹理,pending 盒用 store 合并;驱动没有的层(最后一次 sync 之后才定义)不读,store 覆盖就重放 store,否则跳过;驱动拒读而 store 覆盖时退回 store;已 immutable 且无需加宽的原样保留 | 前端臂重放 client 影子 |
|
||||
| Magma | 重建带 `STORAGE` 的 VkImage,`PreserveTextureContentsOnRecreate` GPU→GPU 拷贝 | 同左 |
|
||||
|
||||
- 只改读 store 不够:GPU 写过的层 store 里是旧字节或没有字节;语料里 Espryt 的两次重铸(`iris-photon`、`iris-derivative`)都是 store 无字节的渲染目标。
|
||||
- 「整格式再生」两臂都只上传 pending 层、不回读也不拉取;「view 源重铸」只剩源需要加宽,走同一条 ByHandle 路径。
|
||||
- 删除:`OnTexturePullRequest`(回调 9 → 8)、`texture-remint-pull` 标记。op 50 `ResourceSubDataComplete` 只追加不删,留作退役行(解码拒收)。`MOBILEGL_PIPE_TEXEL_RETAIN_MB` 已无消费者,但在 pull 构建里,随 P13 删(G1)。
|
||||
- `ImageBindableHint` 仍是预防:hint 在第一次 sync 前到达就直接按 image-bindable 分配,省掉一次 server 回读 + 重传。
|
||||
- 已知 dev 缺陷(非 P9):monolith Espryt 的前端臂重放 client 影子,覆盖 GPU 写过的纹素。
|
||||
- 普查、覆盖矩阵、门与 red-once:[`notes/p9/W2-REMINT.md`](../notes/p9/W2-REMINT.md)。
|
||||
|
||||
### 8.5 XFB scatter 留在 server
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
P0 已回答的不再列出(spike A 的域、spike B 的分档、`posix_spawn` 不可用、OOM 探测惯用法、`GetInteger64i_v`/`GetProgramiv` 退役、D21 与 `RenderbufferObject` lifetime id、动态 accessor 基线)。
|
||||
|
||||
1. **client 侧 dirty 走查的真实每 draw CPU 代价。** 已答(P2–P4a):推送没有在拉取基线之下净减少;Release 下 P2 边界 +6–12%,P3a 在 VAO 切换密的 rd12 上再加 +17–19 pt,P4a 在 Espryt 上 +3.4–5.7 pt(`MEASUREMENTS.md` §3–§5)。用户 2026-09-08 接受,性能自此只记录。
|
||||
2. **真实语料上纹理重铸拉取的发生率。** 已答(P4a):可忽略,保留 LRU 维持默认 0——79 例 × 两后端 780 个统计窗口里共 2 次(`iris-photon`、`iris-derivative` 各 1,只在 DirectGLES)。但 P5b 下这条路径是具名 Fatal,正是这两条 trace 加 `create-indirect` GLES 的首阻塞(P9)。
|
||||
2. **真实语料上纹理重铸拉取的发生率。** 已答(P4a):可忽略,保留 LRU 维持默认 0——79 例 × 两后端 780 个统计窗口里共 2 次(`iris-photon`、`iris-derivative` 各 1,只在 DirectGLES)。但 P5b 下这条路径是具名 Fatal,正是这两条 trace 加 `create-indirect` GLES 的首阻塞(P9)。**P9 W2 关闭**:重铸不需要拉取——server 读 GPU 层、store 补 pending 盒(Espryt),GPU→GPU 拷贝(Magma);77 行 × {monolith, inproc} 普查仍是同两次(都是 store 无字节的渲染目标),`OnTexturePullRequest` 已删([`p9/W2-REMINT.md`](p9/W2-REMINT.md))。
|
||||
3. **spike B 的 `untrusted_app` 域复核。** 两台设备的分档在 `shell` 域测得;从应用进程再跑一次 `extmem_probe`(spike A 的 exec 钩子已可用)。P11 前做。**2026-09-22 降级**:只对同机臂的 T0 / T1 有意义,stream 数据面不需要。
|
||||
4. **渲染状态的 wire 粒度。** 已答(P2):16 个边界 / 15 个 chunk,7 pipeline 396 B + 8 dynamic 772 B;CSO LRU 64 暂定,P13 重调。
|
||||
5. **无存储的 capability。** 已答(P2):`FramebufferSrgb`、`DepthClamp`、`TextureCubeMapSeamless` 三个都补了真存储,`sizeof(RenderStateParameters)` 仍 1168。
|
||||
|
||||
@@ -160,6 +160,7 @@
|
||||
- **#6(`iris-derivative` × DirectGLES)**:P5b 在这一格停在 `Fatal{UnmigratedEmulation, "texture-remint-pull"}`;在头上该站点**未被到达**
|
||||
(transport 下 `MGPipeUnmigratedEmulation` 无条件 `MGLOG_F` + `abort`,`PipeApply.cpp:3517-3524`,日志里没有这一行即没有到达),所以这 26.9k px **不是 remint 拉取**。
|
||||
monolith 自身在这条 trace 上两轮就不逐字节(630 px、最大差 3),系统差(最大差 56)比噪声大一个量级、split 对 golden 更近。**未归因**,记在 §7。
|
||||
**2026-09-29 P9 W2 已归因**:是 monolith 的错,不是 split 的——monolith Espryt 在该 trace 上重铸一张 RGBA16F 渲染目标时重放 client 影子(全零),覆盖了 GPU 写过的纹素;split 读 GPU 层所以对。让 monolith 改放 GPU 字节后 `actual.png` 与 split 逐字节相同(SSIM 0.996196552 → 0.996376198),见 [`../p9/W2-REMINT.md`](../p9/W2-REMINT.md) §6。
|
||||
- **#7**:噪声,不是分歧;列出是因为单遍普查会把它读成分歧。
|
||||
|
||||
## 4. P9 例外表
|
||||
@@ -206,7 +207,7 @@ P5b 的 72 个通过格在头上两臂全活。
|
||||
|
||||
- **TCP 臂**:`MOBILEGL_TRACE_TCP_ENDPOINT` 未配置(`tools/trace_replay/CMakeLists.txt:503-506` 只在配置时注册),本普查无 TCP 读数。
|
||||
- `rd12-odinlite`(`ci: false`)与 `iterationrp` × DirectGLES(已注册、不在 CI 矩阵)未跑;verify 臂不在本包。
|
||||
- 逐 draw 二分:§3 #1–#6 的第一条分歧 draw 未定位;#6 的系统差未归因(候选方向:monolith 自身在该 trace 上不确定,先要一个确定的 monolith 对照)。
|
||||
- 逐 draw 二分:§3 #1–#6 的第一条分歧 draw 未定位;#6 的系统差未归因(候选方向:monolith 自身在该 trace 上不确定,先要一个确定的 monolith 对照)。**#6 已由 P9 W2 归因**(monolith Espryt 重铸重放过期影子,[`../p9/W2-REMINT.md`](../p9/W2-REMINT.md) §6)。
|
||||
- 三遍逐字节只对 7 个分歧行做了;其余 70 行是单遍 `=`。
|
||||
- 设备:本包全在主机;设备上的 P9 例外(若有)由 wave 4 的门 3 终局跑回答。
|
||||
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
# P9 W2:`texture-remint-pull`——重铸不需要拉取
|
||||
|
||||
> 2026-09-29,分支 `p9/w2`(基线 `ad705a73`)。交接:[`HANDOFF-P9.md`](HANDOFF-P9.md) §3 W2 / W4。
|
||||
> 裁定(集成方):采纳 A——不做拉取协议,删 `OnTexturePullRequest`;monolith Espryt 的缺陷不在 P9 修(§6 单列);W2-b 只退回 store;W4 不做(§5 只记测量)。
|
||||
|
||||
## 1. 结论
|
||||
|
||||
两个后端在 split 下重铸都只用 server 自己的字节,client 从不参与:
|
||||
|
||||
| 后端 | split | monolith |
|
||||
|---|---|---|
|
||||
| Espryt | `RequireImageBindableStorageByHandle`(`MobileGL/MG_Backend/DirectGLES/Managers.cpp:6289`,`c1bf7e15` 落地):驱动上存在的层逐层读回旧 GPU 纹理(`ReadTextureLevelTight`),pending 盒用 `StagedTextureStore` 合并后整层重放;已 immutable 且无需加宽的原样保留(keep) | 前端臂 `RequireImageBindableStorage`(`Managers.cpp:6459`)重放 client 影子 |
|
||||
| Magma | 重建带 `STORAGE` 的 VkImage,`PreserveTextureContentsOnRecreate`(`MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp:289`)GPU→GPU;wire 臂 `SyncWireTextureShape` 的 `preserve`(`:2254`) | 同一套(`SyncTextureResource`,`:3313`) |
|
||||
|
||||
- **只读 store 不够**:store 只有 client 上传过的字节;GPU 写过的层(渲染目标、clear、生成的 mip)在 store 里是旧的或没有。普查里 Espryt 的两次重铸都是 store 无字节的渲染目标(§4)。
|
||||
- `Fatal{UnmigratedEmulation, "texture-remint-pull"}` 的两处标记都在前端臂里,transport 下不可达(P7 与本次普查都是 0 次),随本包删除。
|
||||
|
||||
## 2. 改了什么
|
||||
|
||||
| 包 | 内容 |
|
||||
|---|---|
|
||||
| W2-a | 回读前问驱动这一层在不在、尺寸对不对(`NativeTextureLevelHasExtent`,`WireTextureReadback.inc:288`,`glGetTexLevelParameteriv`)。不在:store 覆盖就重放 store,否则跳过(GL 定义为未定义内容)。修的是:在最后一次 sync 之后才定义(空数据,或空数据 + 局部上传)的层,旧代码去读它 → FBO 不完整 → `Fatal{ResourceUnavailable, "image-promotion-readback"}`,合法 GL 让会话死掉 |
|
||||
| W2-b | 驱动拒绝回读(设备上 SNORM / 16 位 norm / 无 `EXT_color_buffer_float` 的浮点不可渲染)而 store 覆盖该层 → 重放 store(= monolith 的答案),`MGLOG_W_ONCE` 带 `remint-readback-fallback`;store 也不覆盖才保留原 Fatal。测试旋钮 `MGITEST_ESPRYT_FORCE_REMINT_READBACK_FAILURE`(server 读) |
|
||||
| W2-c | 删两处 `texture-remint-pull` 标记(transport 专用的提前标记块 + 循环内标记);`PipeCatalogue.EveryUnmigratedEmulationIsNamedOnce` 5 → 4;「remint stall class」注释改写 |
|
||||
| W2-d | `TextureRemintPulls`(`trp=`)在 server 路径也计:ByHandle 重铸已有存储时 +1(keep 不计),名字不改 |
|
||||
| W2-e | 删 `OnTexturePullRequest`,`kMGPipeCallbackCount` 9 → 8;op 50 `ResourceSubDataComplete` 留作退役行(解码仍拒收),不改 `protocol.fbs` |
|
||||
| W2-f/g | `TextureRemintPullScenario`:14 例 × 两后端 × {monolith, Split, Spawn, Tcp};另有 `DirectGLES.{Split,Spawn}.RemintFallback.` 4 例(W2-b 旋钮,tcp 不带,理由同 `MAGMA_SERVER_ENV_KNOB_NO_TCP`) |
|
||||
|
||||
没改:Magma 无功能改动;`MOBILEGL_PIPE_TEXEL_RETAIN_MB`(`Config.h:400-403`)已无消费者但不在 PUSH 守卫内,删它动 pull 的 `Features` / `ConfigLoader`(G1),留到 P13。
|
||||
|
||||
## 3. 覆盖矩阵(场景 14 例)
|
||||
|
||||
内容 → 采样 draw(让后端持有存储)→(按例)GPU 写 → `glBindImageTexture` → compute `imageLoad` 拷到一张「sync 之前就 image 绑定」的 RGBA8 → FBO 回读,比 GL 正确答案。
|
||||
|
||||
| 例 | 内容来源 | store | 驱动上的层 | Espryt mono / pull | Espryt split / spawn / tcp | Magma 全部臂 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| A 可变,上传 | 上传 | 有,= GPU | 有 | ✓ | ✓ | ✓ |
|
||||
| B 可变,上传 → GPU clear | GPU | 旧 | 有 | **✗ 旧影子** | ✓ | ✓ |
|
||||
| C immutable RGBA8,上传 → clear | GPU | 旧 | 有 | **✗** | ✓(keep) | ✓ |
|
||||
| D 空定义 → clear | GPU | 无 | 有 | **✗ 零** | ✓ | ✓ |
|
||||
| E clear → 未 sync 的局部上传 | GPU + 盒 | 盒 | 有 | **✗** | ✓(合并) | ✓ |
|
||||
| F `glGenerateMipmap` 的 level 1 | GPU | 无 | 有 | **✗ 零** | ✓ | ✓ |
|
||||
| F2 上传的 level 1 → clear | GPU | 旧 | 有 | **✗** | ✓ | ✓ |
|
||||
| G sync 后空定义 level 1,绑 level 0 | — | 无 | **无** | ✓ | ✓(W2-a 前 Fatal) | ✓ |
|
||||
| G2 sync 后以更大尺寸空定义 level 0 | — | 无 | 旧尺寸 | 不 Fatal | 不 Fatal | 不 Fatal |
|
||||
| G3 G + 局部上传,绑 level 1 | 上传 | 整层 | **无** | ✓ | ✓(W2-a 前 Fatal) | ✓ |
|
||||
| H 加宽 rg8 immutable,上传 → clear | GPU | 旧 | 有 | **✗** | ✓(promote) | ✓ |
|
||||
| H2 / I / J 加宽 rg8 / RGBA8_SNORM / RGBA16_SNORM,仅上传 | 上传 | 有 | 有 | ✓ | ✓ | ✓ |
|
||||
|
||||
「谁都没有字节」只剩 G / G3,而那里 GL 不要求字节(G)或字节就在 store(G3)。Espryt 重铸代价:一次 `glFinish` + 逐层回读 + 整层重传,主机 0.3–6.5 ms / 次;GPU→GPU 是优化,只记录。
|
||||
|
||||
## 4. 普查(主机 lavapipe/llvmpipe,77 行 × {monolith, inproc} = 154 次,`MOBILEGL_PIPE_STATS=1`)
|
||||
|
||||
口径同 P7 E1(CI 旋钮、每条单独 `ctest`、`-j 2`);154 次 rc 全 0、`Fatal{` 0 行。只有下表非零,其余 71 行全零:
|
||||
|
||||
| case | 后端 | monolith 重铸已有存储(`trp`) | split | mono / split SSIM |
|
||||
|---|---|---|---|---|
|
||||
| `iris-photon-v1.3b` | GLES | 1,RGBA16F 1 层,GPU ≠ 影子 | promote 1,回读 165,888 B,store 无字节,0.3 ms | 0.998774617 / 同(纹理随后被整张覆盖) |
|
||||
| `iris-derivative` | GLES | 1,RGBA16F 1 层,GPU ≠ 影子 | promote 1,回读 3,279,360 B,store 无字节,6.5 ms | **0.996196552 / 0.996376198**(§6) |
|
||||
| `create-indirect` | GLES | 0(首次分配,9 层) | 0(首次分配) | 0.999961275 / 同 |
|
||||
| `iris-photon-v1.3b` / `iris-derivative` / `iris-iterationrp` | Vulkan | STORAGE 升级 1 / 1 / 4 | 1 / 1 / 5 | 全 `preserve`(GPU→GPU) |
|
||||
|
||||
与 P4a 的「780 个统计窗口 2 次」同两条 trace。测量用的是临时插桩(未提交),跑器与原始数据在 `~/w7/notes/p9/w2census/`。
|
||||
|
||||
## 5. W4:反向通道事件量(inproc,server 侧逐事件计,同一次普查)
|
||||
|
||||
| 量 | 读数 |
|
||||
|---|---|
|
||||
| `OnBufferWriteback` | 只有 `create-indirect`:两后端各 6 片、7,180 B,最大单片 6,656 B(上限 SEG_EVENT / 4 = 64 KiB) |
|
||||
| `OnGpuWritten` | 只有 `create-indirect` × Vulkan:7,093 条(每条 1 个 whole-buffer range,几乎全在第一帧);Espryt 同 trace 0 条 |
|
||||
| `OnGlError` / 阻塞(ring 满)/ 丢弃 | 0 / 0 / 0 |
|
||||
|
||||
Magma 的 7,093 条是冗余的:transport 臂每次 draw / dispatch 对每个可写 SSBO / texel buffer / XFB 目标发一条 whole-buffer `OnGpuWritten`(`VkBufferManager.cpp` 的 `MarkWireBufferGpuWritten`),而 client 早已按同一组绑定自标保守集(`MG_Remote/Client/GpuWritePending.h`);Espryt 的同名生产者 P5e fb 已在 transport 下删掉。**裁定:没有阻塞、没有丢弃 = 没有实测需求,不做。** 以后要做,改动是「transport 下只保留 server 簿记、不发事件」。今天没有逐 EventKind 的计数器,`eventDropped` 也不进 stats 行。
|
||||
|
||||
## 6. dev 缺陷:monolith Espryt 重铸重放过期影子(不在 P9 修,单独立项)
|
||||
|
||||
- **一句话原因**:前端臂 `RequireImageBindableStorage`(`Managers.cpp:6459`)把每个已定义层标脏、从 client `MipmapStorage` 重放进新 carrier,而影子从没见过 GPU 写的内容(渲染目标、clear、`glGenerateMipmap` 的层、`imageStore`);immutable RGBA8 也走这条(monolith 没有 split 的 keep)。
|
||||
- **复现**:本场景的 B、C、D、E、F、F2、H 在 `DirectGLES.TextureRemintPullScenario.*`(monolith)和 pull 构建(`build-linux`)逐例同错(B:读到上传的图案而不是 clear 的绿;D、F:读到零)。Magma 两臂全对。场景对 monolith DirectGLES 这 7 例按名 skip,理由指向本节。
|
||||
- **真实证据**:`iris-derivative` × DirectGLES,P7 普查 §3 #6 那个「未归因」的 ~26.9k px 系统差。monolith 在该 trace 重铸一张 854×480 RGBA16F(GPU ≠ 影子);把前端臂改成重放 GPU 字节(临时实验)后 monolith 的 `actual.png` 与 split 逐字节相同(sha `ebbe8e9d…`),SSIM 0.996196552 → 0.996376198(更近 golden)。`iris-photon-v1.3b` 同样重铸一次,但纹理随后被整张覆盖,无可见差。
|
||||
- **建议修法**:前端臂在重放前,对 `hadBackendStorage` 且无 pending 的层从旧驱动纹理读回(Espryt 已有同一把工具 `ReadTextureLevelTight`,目前只编进 `MOBILEGL_BUILD_DISAGGREGATED`)写进影子再重放;或更干净地学 Magma:`glCopyImageSubData` / 着色器拷贝 GPU→GPU,影子不参与。
|
||||
- **G1**:函数主体是 pull 构建共用代码;任何修法都会动 pull 的 `.text`(`ReadTextureLevelTight` 还得搬出 disaggregated 守卫)。按规矩在 dev 上单独修,不在 P9。
|
||||
|
||||
## 7. 未决 / 观察
|
||||
|
||||
- **keep 路径的一个排序缺口(非重铸问题)**:C 在 Espryt split 上不加 barrier 时 30 次里 3 次读到 clear 之前的纹素(加 `glMemoryBarrier(GL_ALL_BARRIER_BITS)` 后 0 / 30),失败与通过两种运行里 server 的每个同步决定完全一样(临时日志:keep、无 regen、无上传)。GL 不要求 framebuffer 写之后、imageLoad 之前加 barrier;promote 路径因 `glFinish` 回读被串行化,所以只有 keep 暴露。怀疑 llvmpipe 的 compute image 读没有等待挂起的光栅场景,未归因。场景在 dispatch 前加了 barrier(注释写明),这件事单独记。
|
||||
- **设备格式风险**:Adreno 830 上 SNORM 等格式的回读是否被拒没测(本包不碰设备);W2-b 让这种情况退回 store,只有「GPU 写过 + 不可读 + store 无字节」才 Fatal。
|
||||
- 多重采样:`ReadTextureLevelTight` 对 MS 直接失败;ES 没有 MS image 单元,只有「MS + 需加宽 + 已有存储」才进 promote。理论可达,没见过。
|
||||
|
||||
## 8. 门与 red-once(R-16)
|
||||
|
||||
| 门 | 红的方式(临时改动,已还原,真跑过) | 结果 |
|
||||
|---|---|---|
|
||||
| G:`ALevelDefinedWithoutDataAfterTheLastSyncDoesNotEndTheSession` | 去掉 W2-a 检查 | Split / Spawn / Tcp 3 / 3 `Subprocess aborted` |
|
||||
| G3:`APartialUploadIntoALevelDefinedAfterTheLastSyncReachesTheImage` | W2-a 与 W2-b 一起去掉(G3 被两者各自兜住) | 3 / 3 aborted(G 同) |
|
||||
| `RemintFallback.*`(W2-b) | 退路改回 Fatal | 8 / 8 aborted |
|
||||
| `trp=`(W2-d) | 删 server 路径的 +1 | inproc 上 A、H 红,C(keep)保持绿 |
|
||||
| Espryt 读 GPU 是承重的 | 不改代码,整组 split 场景带 `MGITEST_ESPRYT_FORCE_REMINT_READBACK_FAILURE=1`(= 只读 store) | B、E、F2、H 读到旧字节,D、F aborted(store 无字节);C(keep)、A、G、G2、G3、H2、I、J 绿 |
|
||||
| Magma 的 GPU→GPU 保留 | 两臂 `preserve` 恒 false | 4 臂 × 12 例红(G2、G3 除外) |
|
||||
| 回调数、名单 | `static_assert` + `PipeCatalogue.ReverseChannelHasTenCallbacks`(断言 8)、`EveryUnmigratedEmulationIsNamedOnce`(断言 4) | 编译期 / 名单钉 |
|
||||
Reference in New Issue
Block a user