acdream/tests/AcDream.App.Tests/Rendering
Erik b16f820643 feat(render): Campaign V slice V6h — the Vulkan composition host
ACDREAM_RENDER_BACKEND=vulkan now runs the real GameWindow composition rather
than a second main(). All nine phases execute: DAT load, streaming, camera,
entity table, session, and the real retained UiHost drawing through the RHI.
No world renderers — they are raw GL until V4t and the world arm behind it.

The offline log is the client's own (acdream.pak opened, 6266 spells, Region
0x13000000, "loading world view centered on 0xA9B4FFFF", fourteen retail
LayoutDesc lines, streaming radii), and the captured frame is the retail
retained UI: vitals, combat/spell bar with DAT scarab icons, the nine-slot
toolbar, chat with tabs and Send, radar/compass with dat-font glyphs. Sampled
against the GL capture the widgets agree — chat interior RGBA (25,24,27,158)
vs (22,21,23,158), vitals bar (117,1,0) and toolbar slot (0,11,17) identical.

Three seams, as §5.5.9 specified:

1. Platform acquisition — already generic — publishes GameWindowGraphics
   instead of a bare GL. Phases that still speak raw GL read Graphics.Gl and
   take their Vulkan arm when it is null; each branch names the slice that
   removes it.
2. VulkanHostInputCameraCompositionFactory is a new file and the whole of the
   Phase-1 fork: four graphics members differ, input/camera/pointer delegate.
   The default factory is chosen inside the phase from the platform result.
   HostInputCameraResult gained backend-neutral Retirement and FrameSlots.
3. The frame root forks on one condition. The GL world-scene assembly is
   unchanged, wrapped in `if (gl is not null)`; the Vulkan arm's graph is one
   backbuffer clear pass computing the same RenderFrameFoundation from the same
   clock and weather owners, then private presentation over it.

§5.5.9's three TextureCache couplings are unpicked: the constructor takes GL?
and rejects bindless without one, world entry points route through a Gl
property that throws naming V4t, and the (GlGpuTexture) VRAM-accounting cast
became a backend test. That cast's stated reason — DrawSprite's texture-unit
binding — was already stale, deleted at V6d.

VulkanBringUpHost is reduced to the capability-probe harness it is named for:
the instance/surface/device/swapchain sequence moved into VulkanGraphicsContext,
which the composition host and the harness now share. It is reached only with
ACDREAM_VULKAN_PROBE=1.

One latent Vulkan defect surfaced and is fixed here. The first composition-host
frame died with ErrorDeviceLost; validation named VUID-vkCmdDraw-None-08600 —
descriptor set 2 never bound. VulkanGpuPassEncoder bound sets 0/1/2 only as a
side effect of BindStorageBuffer/BindUniformBuffer, so a pass sampling the
texture table while binding no buffer — every retained-UI and debug-line pass —
drew with the table unbound. It survived V6c-V6g because the bring-up host
always drew VulkanRhiScene first and the UI pass inherited its binds; the
composition host has no 3-D scene. The fix is one line in the encoder's
constructor beside the viewport and scissor defaults, which exist for exactly
the same reason: a pass opens with complete binding state rather than depending
on what preceded it.

Gates: strict GL offline pixel gate against 46d893f7 measures 1.24e-05 (7 of
563,200 pixels), 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 converged the ownership ledger — no [shutdown]
diagnostic on either stream. The reduced probe harness presented 34,811
validation-clean frames.

No divergence-register row: GL is the shipping backend and the pixel gate proves
it unmoved; the Vulkan arm is not a retail deviation but a backend under
construction.

Next is V4t, the texture stack, which the world arm cannot be written without.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 11:47:37 +02:00
..
Gpu fix(render): Campaign V slice V6g — the Vulkan frame stops lying to the driver 2026-07-28 10:47:52 +02:00
Residency feat(diagnostics): complete residency pressure ledger 2026-07-24 16:40:17 +02:00
Vfx refactor(runtime): own canonical entity and object lifetime 2026-07-26 05:54:46 +02:00
Wb Revert "feat(render): Campaign V slice V4c - move the world draw path onto the RHI" 2026-07-27 22:38:02 +02:00
ArchRenderSceneTests.cs Reapply "perf(rendering): draw retained frame product" 2026-07-25 08:36:11 +02:00
AttachmentUpdateOrderTests.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
BoundedUnownedResourceCacheTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
BuildingGroupScratchTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
CameraCollisionIndoorTests.cs T6 (BR-7) C3: per-cell shadow architecture - flood registration, building channel, per-cell query; b3ce505 stopgap DELETED (closes #99) 2026-06-11 14:37:50 +02:00
CameraCollisionUpdateViewerTests.cs feat(A): wire SweepEye to the verbatim update_viewer (start-cell + fallbacks) 2026-06-05 11:10:32 +02:00
CameraControllerTests.cs refactor(runtime): extract local teleport and player mode 2026-07-22 02:50:15 +02:00
CameraFrameControllerTests.cs refactor(camera): extract the update frame 2026-07-22 03:08:58 +02:00
CellViewDedupTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
CellVisibilityCommitTests.cs fix(streaming): commit EnvCell landblocks atomically (#214) 2026-07-13 18:45:24 +02:00
CellVisibilityFromRootTests.cs refactor(render): Stage 3 T3.1 — delete FindCameraCell AABB grace-frame fallback 2026-06-02 15:36:47 +02:00
CellVisibilityPortalPolygonsTests.cs fix(streaming): commit EnvCell landblocks atomically (#214) 2026-07-13 18:45:24 +02:00
ClipFrameAssemblerTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
ClipFrameLayoutTests.cs feat(render): Phase U.3 — GPU clip-plane gate (gl_ClipDistance), no-clip default 2026-05-30 17:27:30 +02:00
ClipFrameUploadTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
ClipPlaneSetTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
CompositeTextureArrayCachePolicyTests.cs fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
CornerFloodReplayTests.cs fix(streaming): commit EnvCell landblocks atomically (#214) 2026-07-13 18:45:24 +02:00
CreatureAppraisalPresentationTests.cs feat(ui): port retail creature appraisal presentation 2026-07-23 12:55:24 +02:00
CurrentRenderSceneOracleTests.cs perf(runtime): remove measured steady allocations 2026-07-25 17:50:30 +02:00
DebugVmRenderFactsPublisherTests.cs refactor(render): extract frame presentation diagnostics 2026-07-22 05:02:31 +02:00
DevToolsFramePresenterTests.cs refactor(runtime): move session lifetime and ordered transport 2026-07-25 19:39:24 +02:00
DevToolsRuntimeSourcesTests.cs refactor(app): compose session and player startup 2026-07-22 18:28:32 +02:00
DisplayFramePacingControllerTests.cs fix(rendering): survive display topology handoff 2026-07-25 13:15:24 +02:00
DollCameraTests.cs fix(D.2b): Slice 2 — retail-exact doll pose, camera + heading (visual gate) 2026-06-25 13:16:27 +02:00
DollEntityBuilderTests.cs feat(D.2b): Slice 2 — DollEntityBuilder (player Setup+ObjDesc -> doll WorldEntity) 2026-06-23 09:07:02 +02:00
DynamicBufferCapacityTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
EntityClipTests.cs fix(render): R1 — repurpose the ParentCellId==null cell-gate bypass (#78) 2026-06-02 20:10:26 +02:00
EntityPhysicsHostTests.cs refactor(world): canonicalize live physics host ownership 2026-07-21 14:05:34 +02:00
EquippedChildProjectionWithdrawalTests.cs fix(interaction): restore retail loot placement and world-drop projection 2026-07-27 00:03:15 +02:00
FixedEntityTextureOwnerLeaseTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
FramebufferResizeControllerTests.cs refactor(app): compose settings and developer tools 2026-07-22 16:11:34 +02:00
FramePacingControllerTests.cs fix #225: stabilize render pacing and frame CPU 2026-07-19 06:29:30 +02:00
FramePacingPolicyTests.cs fix #225: stabilize render pacing and frame CPU 2026-07-19 06:29:30 +02:00
GameWindowLifetimeTests.cs refactor(app): extract focused window lifetime 2026-07-22 19:43:52 +02:00
GameWindowRenderLeafCompositionTests.cs perf(diag): complete trustworthy Slice A capture tooling 2026-07-24 12:46:51 +02:00
GameWindowSlice8BoundaryTests.cs feat(render): Campaign V slice V6h — the Vulkan composition host 2026-07-28 11:47:37 +02:00
GlBindlessHandleTableTests.cs feat(render): Campaign V slice V2a - mesh path texture-index migration 2026-07-27 15:51:26 +02:00
GlTextureOwnershipTests.cs feat(render): put the retained UI and debug lines on both backends 2026-07-28 08:51:32 +02:00
GpuFrameFlightControllerTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
GpuResourceRetirementTransactionTests.cs feat(render): Campaign V slice V4b - move the mesh arena onto IGpuBuffer 2026-07-27 20:02:50 +02:00
GpuRetiredTerrainSlotAllocatorTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
HostQuiescenceGateTests.cs refactor(app): own native window callback lifetime 2026-07-22 09:59:10 +02:00
HouseExitWalkReplayTests.cs refactor(render): extract typed retail pview passes 2026-07-22 06:40:09 +02:00
IndoorDrawPlanTests.cs feat(render): IndoorDrawPlan.ShellPass — every visible cell, no drawable filter (R1) 2026-06-06 21:59:26 +02:00
InteriorEntityPartitionTests.cs T1 (fused BR-2/3): retail frame order - dynamics last, punch+seal, shell chop deleted 2026-06-11 11:16:27 +02:00
Issue95DungeonFloodDiagnosticTests.cs test(#95): headless dungeon-flood diagnostic — measure visible-cell count on 0x0007 2026-06-13 18:52:00 +02:00
Issue113DrawingBspFilterTests.cs fix(render): #113 root cause #2 - GfxObj meshes draw only DrawingBSP-referenced polys (the REAL phantom staircase) 2026-06-10 20:52:52 +02:00
Issue113MeetingHallFloodTests.cs fix(streaming): commit EnvCell landblocks atomically (#214) 2026-07-13 18:45:24 +02:00
Issue120ReciprocalPingPongTests.cs #119-residual: tower-ascent harness pins the roof-lip flood gap; barrel claim RETRACTED (user axiom: not in retail) 2026-06-11 18:34:45 +02:00
Issue124LookInSeedRegionTests.cs fix #124: interior-root building look-ins as a landscape-stage sub-pass 2026-06-12 15:59:29 +02:00
Issue127FloodFlipReplayTests.cs close #127 (user-gated + desk pin): distant-building flood flap died with the W=0 clip port 2026-06-13 10:03:33 +02:00
Issue129PunchBiasTests.cs fix #129: cap the punch mark bias's eye-space reach (was unbounded at distance) 2026-06-12 13:38:59 +02:00
Issue130DoorwayStripTests.cs fix #130 (the real strip): drawn-shell lift vs draw-space portal consumers 2026-06-12 14:28:16 +02:00
Issue131SetupProbeTests.cs fix #131 (root cause 4, structurally forced): look-in cells draw their DYNAMICS - the town portal is a server object in the hall's porch cell 2026-06-12 20:52:34 +02:00
Issue177StairDescentCameraFloodTests.cs park #177: retail cdb trace DISPROVES the portal-flood theory 2026-07-07 08:43:21 +02:00
Issue181CameraParkStabilityTests.cs diag #181: root-cause chain complete - flapping cell 0x0181, wall-press excitation, and the REAL defect: camera-flood-scoped light application 2026-07-06 21:04:34 +02:00
Issue181VisFlapReplayTests.cs diag #181 (refined): 0x0181's region is a zero-area sliver; the amplifier is per-drawn-cell state shifting with the cell list, not light-pool scoping 2026-07-06 21:46:49 +02:00
Issue181WallPressEquilibriumTests.cs port #181: retail viewer step subdivision (calc_num_steps 0x0050a0b0) - radius-anchored steps + remainder final step + viewer-exempt small-offset abort 2026-07-06 22:30:37 +02:00
Issue176177FacilityHubFloodReplayTests.cs docs+test #176/#177: 12 mechanisms refuted, apparatus shipped, probe protocol staged 2026-07-05 21:20:03 +02:00
LinuxMonotonicFramePacingWaiterTests.cs feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
LinuxPlatformBoundaryTests.cs feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
LiveAppearanceAnimationTests.cs refactor(runtime): own canonical entity and object lifetime 2026-07-26 05:54:46 +02:00
LiveEntityAnimationPresenterTests.cs refactor(runtime): own canonical entity and object lifetime 2026-07-26 05:54:46 +02:00
LiveEntityAnimationSchedulerTests.cs refactor(runtime): own projectile simulation 2026-07-26 14:17:42 +02:00
LiveEntityCreateSupersessionRecoveryTests.cs refactor(runtime): own canonical entity and object lifetime 2026-07-26 05:54:46 +02:00
LiveRenderProjectionJournalTests.cs refactor(runtime): own canonical entity and object lifetime 2026-07-26 05:54:46 +02:00
NdcScissorRectTests.cs fix #130: doorway-slice scissor cut the aperture's top/right pixel row 2026-06-12 13:31:43 +02:00
OrderedResourceTeardownTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
OutdoorCellNodeTests.cs feat(render): R-A2 — per-building floods (the flap fix) 2026-06-08 18:44:43 +02:00
OwnerScopedResourceRegistryTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
PaperdollFramePresenterTests.cs fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
ParticleBindlessInstanceTests.cs feat(render): V6e — both particle shaders cross the dialect 2026-07-28 09:26:13 +02:00
ParticleEmitterRetirementTrackerTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
PhysicsCameraCollisionProbeTests.cs feat(A): wire SweepEye to the verbatim update_viewer (start-cell + fallbacks) 2026-06-05 11:10:32 +02:00
PortalProjectionTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
PortalTunnelAssetTests.cs feat(headless): share immutable gameplay content 2026-07-27 09:00:48 +02:00
PortalViewTests.cs feat(render): Phase A8.F — ViewPolygon + CellView clip-region data model 2026-05-29 11:30:28 +02:00
PortalVisibilityBuilderTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
PortalVisibilityRobustnessTests.cs feat(render): R-A2 — per-building floods (the flap fix) 2026-06-08 18:44:43 +02:00
PrivatePresentationRendererTests.cs feat(ui): port retail creature appraisal presentation 2026-07-23 12:55:24 +02:00
RendererResourceDisposalLedgerTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
RenderFrameDiagnosticsControllerTests.cs perf(diagnostics): expose prepared asset source counters 2026-07-24 15:16:32 +02:00
RenderFrameGlStateControllerTests.cs refactor(render): extract world scene frame owner 2026-07-22 07:22:09 +02:00
RenderFrameOrchestratorTests.cs perf(diag): complete trustworthy Slice A capture tooling 2026-07-24 12:46:51 +02:00
RenderFramePreparationControllerTests.cs refactor(render): compose render frame orchestrator 2026-07-22 08:03:49 +02:00
RenderFrameProductTests.cs feat(rendering): pack scene dispatcher inputs 2026-07-25 00:44:58 +02:00
RenderFrameRecoveryIntegrationTests.cs perf(diag): complete trustworthy Slice A capture tooling 2026-07-24 12:46:51 +02:00
RenderFrameResourceControllerTests.cs feat(render): Campaign V slice V4a - port TextRenderer/BitmapFont/DebugLineRenderer/TextureCache UI path onto IGpuDevice 2026-07-27 19:37:19 +02:00
RenderFrameRouteOwnerSelectorTests.cs refactor(rendering): prepare retained particle routing 2026-07-25 08:45:18 +02:00
RenderInstanceCandidateTests.cs refactor(rendering): isolate dispatcher candidate values 2026-07-25 01:06:57 +02:00
RenderSceneArchitectureTests.cs feat(rendering): contain incremental render scene 2026-07-24 21:42:42 +02:00
RenderScenePViewFrameProductTests.cs Reapply "perf(rendering): draw retained frame product" 2026-07-25 08:36:11 +02:00
RenderSceneShadowRuntimeTests.cs perf(rendering): retain packed classification 2026-07-25 02:46:40 +02:00
ResourceCleanupGroupTests.cs feat(render): put the retained UI and debug lines on both backends 2026-07-28 08:51:32 +02:00
ResourceShutdownTransactionTests.cs refactor(app): extract focused window lifetime 2026-07-22 19:43:52 +02:00
RetailAlphaQueueTests.cs perf(render): bound animation and alpha scratch residency 2026-07-24 16:34:28 +02:00
RetailChaseCameraTests.cs fix(world): match retail portal passage and exit warp 2026-07-15 22:14:21 +02:00
RetailParticleGeometryClassifierTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
RetailPViewPassExecutorTests.cs perf(rendering): retire production entity partition 2026-07-25 10:50:57 +02:00
RetailSelectionAssetTests.cs feat(headless): share immutable gameplay content 2026-07-27 09:00:48 +02:00
RetailSelectionLightingPulseTests.cs fix(interaction): bind selection to live incarnations 2026-07-21 07:07:58 +02:00
RetailSelectionSceneTests.cs fix(rendering): isolate world selection transactions 2026-07-24 22:31:15 +02:00
RetailStaticAnimatingObjectSchedulerTests.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
RollingTimingSampleWindowTests.cs refactor(render): extract frame presentation diagnostics 2026-07-22 05:02:31 +02:00
RuntimeResourceSlotTests.cs refactor(app): compose atomic frame roots 2026-07-22 19:02:08 +02:00
ScreenPolygonClipTests.cs feat(render): Phase A8.F — ScreenPolygonClip 2D convex-polygon intersection 2026-05-29 11:37:30 +02:00
ShaderProgramConstructionTests.cs refactor(lifetime): own render resource prefixes 2026-07-22 14:42:14 +02:00
SilkWindowCallbackBindingTests.cs fix(rendering): survive display topology handoff 2026-07-25 13:15:24 +02:00
SkyParamsLayoutTests.cs feat(render): V6e — the sky's uniforms become a buffer and its texture a table slot 2026-07-28 09:54:13 +02:00
SkyProjectionTests.cs fix(runtime): align portal and movement presentation 2026-07-17 08:48:27 +02:00
SpawnMotionInitializerTests.cs fix(animation): preserve wire motion on every spawn path 2026-07-12 14:27:44 +02:00
StandaloneBindlessTextureCacheTests.cs feat(render): unify physical residency accounting 2026-07-24 16:20:48 +02:00
StaticRenderProjectionJournalTests.cs fix(rendering): preserve exact scene traversal order 2026-07-25 02:03:58 +02:00
SyntheticEntityMeshReferenceOwnerTests.cs fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
TerrainCullOrientationTests.cs fix #108-residual (root cause): terrain drew DOUBLE-SIDED - port retail landPolysDraw eye-side gate as terrain backface cull 2026-06-12 22:05:31 +02:00
TerrainDrawDiagnosticsControllerTests.cs refactor(render): extract typed retail pview passes 2026-07-22 06:40:09 +02:00
TerrainParticleCellVisibilityTests.cs perf(vfx): port retail particle visibility degradation 2026-07-17 15:27:36 +02:00
TerrainTextureTilingTableTests.cs feat(render): Campaign V slice V6f-2 - terrain's tiling table becomes a buffer 2026-07-28 10:11:00 +02:00
TextRendererFailureSafetyTests.cs feat(render): put the retained UI and debug lines on both backends 2026-07-28 08:51:32 +02:00
TowerAscentReplayTests.cs #119-residual ROOT CAUSE: the +0.02 m render lift leaked into the portal-visibility graph - horizontal portals side-culled anyone standing on them 2026-06-11 19:26:06 +02:00
ViewconeCullerReuseTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
WorldRenderDiagnosticsTests.cs refactor(render): extract frame presentation diagnostics 2026-07-22 05:02:31 +02:00
WorldRenderFrameBuilderTests.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
WorldRevealRenderResourceSchedulerTests.cs fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
WorldSceneRendererTests.cs refactor(runtime): own teleport destination correlation 2026-07-26 17:52:34 +02:00