diff --git a/docs/plans/2026-07-27-vulkan-campaign.md b/docs/plans/2026-07-27-vulkan-campaign.md index 24a17245..474afc38 100644 --- a/docs/plans/2026-07-27-vulkan-campaign.md +++ b/docs/plans/2026-07-27-vulkan-campaign.md @@ -573,7 +573,7 @@ dialect slice. **V6f closed all three** (the third was the frag's GL-only tenth pair with no consumer at all; see the V6e report. | **V6g** | The four Vulkan validation defects §5.5.7 and its log left open: the dynamic-descriptor split (an architect decision, §5.5.8 item 1), per-pass depth-format pipeline variants, first-use backbuffer attachment layout transitions, and a backbuffer capture that no longer reads a presented swapchain image. Confined to `Gpu/Vk/`; the GL backend executes not one changed statement. | validation-clean bring-up run (0 errors / 0 warnings over 39,855 frames, against 7 VUIDs + 1 UNASSIGNED at the parent), App tests, GL offline pixel gate 4.08e-05 — its own same-commit control value | -| **V6h** ✅ | **The Vulkan composition host**, specified by §5.5.9 and reported in §5.5.10. `ACDREAM_RENDER_BACKEND=vulkan` runs the real `GameWindow` composition — DAT load, streaming, camera, entity table, session, and the real retained `UiHost` through the RHI — with no world renderers. Three seams: the already-generic platform acquisition now publishes a `GameWindowGraphics`; `VulkanHostInputCameraCompositionFactory` is the host-phase fork; the frame root gains a Vulkan arm. `VulkanBringUpHost` is reduced to the capability-probe harness over the extracted `VulkanGraphicsContext`. | offline Vulkan launch reaching the real composition with the client's own UI captured, one validation-layer run at 0 errors / 0 warnings, converging ownership ledger, App tests 4,075/3, complete Release suite 9,138/5, GL offline pixel gate 1.24e-05 | +| **V6h** ✅ | **The Vulkan composition host**, specified by §5.5.9 and reported in §5.5.10. `ACDREAM_RENDER_BACKEND=vulkan` runs the real `GameWindow` composition — DAT load, streaming, camera, entity table, session, and the real retained `UiHost` through the RHI — with no world renderers. Three seams: the already-generic platform acquisition now publishes a `GameWindowGraphics`; `VulkanHostInputCameraCompositionFactory` is the host-phase fork; the frame root gains a Vulkan arm. `VulkanBringUpHost` is reduced to the capability-probe harness over the extracted `VulkanGraphicsContext`. | offline Vulkan launch reaching the real composition with the client's own UI captured, one validation-layer run at 0 errors / 0 warnings, converging ownership ledger, App tests 4,075/3, complete Release suite 9,138/5, GL offline pixel gate 1.78e-05 | | **V7** | GL-versus-Vulkan differential: `tools/run-backend-differential-gate.ps1`, strict paired-PNG compare, divergences fixed in the Vulkan backend only, then lifecycle + R6 soak natively on Vulkan, one validation-layer-clean run, one RenderDoc capture. **Milestone: parity.** | every differential checkpoint passes; both connected routes green on VK | | **V8** | Perf gate on the RX 9070 XT, uncapped, both backends, same route. | §2 acceptance table; parity is the floor | | **V9** | Linux + CI: X11/Wayland surfaces; a `linux-vulkan` job on lavapipe (probe accepts on a real 1.3 software device, a short real render under xvfb, forced-unsupported → exit 4, `.spv` freshness). Physical Linux GPU row deferred post-cutover, as for Slice L. | CI green including the new job | @@ -1363,15 +1363,24 @@ it at V4h; and the portal tunnel, whose renderer is raw GL — the teleport owne drives a presentation reporting "no tunnel showing" while reveal generation, destination latch, placement and session run unchanged. -**Gate results.** The strict GL offline pixel gate against `46d893f7` measured -**1.24e-05** (7 differing pixels of 563,200) — inside the documented 15–23 px / -≤4.1e-05 band, so GL behaviour did not move. App tests 4,075 / 3 skips; complete -Release suite 9,138 / 5 skips. One full Vulkan run with -`VK_LAYER_KHRONOS_validation`: **zero errors, zero warnings**. Both Vulkan runs -shut down with the ownership ledger converged — no `[shutdown]` diagnostic on -either stream, which is `GameWindowLifetimeStatus.Complete`. The reduced probe -harness (`ACDREAM_VULKAN_PROBE=1`) presented 34,811 validation-clean frames and -resolved its GPU timer scopes. +**Gate results, at the committed `b16f8206`.** The strict GL offline pixel gate +against `46d893f7` measures **1.78e-05** (10 differing pixels of 563,200), and +measured 1.24e-05 on the immediately preceding tree — both well inside the +documented 15–23 px / ≤4.1e-05 band, so GL behaviour did not move. App tests +4,075 / 3 skips; complete Release suite 9,138 / 5 skips. One full Vulkan run with +`VK_LAYER_KHRONOS_validation`: **zero errors, zero warnings**, an empty stderr, +and the captured UI frame identical to the pre-commit one. Every Vulkan run shut +down with the ownership ledger converged — no `[shutdown]` diagnostic on either +stream, which is `GameWindowLifetimeStatus.Complete`. The reduced probe harness +(`ACDREAM_VULKAN_PROBE=1`) presented 34,811 validation-clean frames and resolved +its GPU timer scopes. + +**One pre-existing test-isolation defect was found and is not this slice's.** +`StreamingControllerPriorityApplyTests.DungeonCollapseBeforePromotionBase_RetiresProvisionalTerrainAndPendingStatics` +fails when run alone under `--filter` and passes when its project runs whole. It +does so identically at `46d893f7` with none of this slice's changes present, so +it is an order dependency in the test itself, not a regression. Worth fixing on +its own; a test that only passes with its siblings is not evidence. **Next is V4t**, the texture stack, which the world arm cannot be written without. §5.5.9 sized it: 69 references across 9 source and 4 test files for the