acdream/tests/AcDream.App.Tests/Rendering
Erik 59c6b2ae94 feat(render): Campaign V slice V6m commit 1 - portal space draws on Vulkan
PortalTunnelPresentation was the last raw-GL world-adjacent renderer. It now
draws on both arms, and the composition that used to hand the Vulkan arm a
portal-less teleport presentation is gone with it.

Nothing about the scene changed. Same synthetic DAT Setup resolved through the
same client-enum mapping, same 40 fps CSequence, same retail rotation cadence,
same distant light, drawn through the same already-dual-arm WbDrawDispatcher.
What forked is only where the draw is recorded:

  * GL keeps its GLStateScope, its viewport/scissor/depth/cull/blend statements
    and its depth-only glClear, untouched.
  * The RHI arm opens a backbuffer pass of its own and publishes it on
    IWorldPassScope for the span of the draw - the shape V6l gave the two
    offscreen viewports, and required for the same reason: the dispatcher's RHI
    arm borrows its pass rather than opening one. Publication comes after
    BeginPass and before UploadRetailLight, because publishing resets the
    frame-global sections and this scene wants its own light, not the world's.

The one substantive decision is the pass's COLOUR load op, and it is a Clear
rather than a Load. Retail preserves the colour target and only clears depth
(UIViewportObject::DrawContent @ 0x006950A5 -> Clear(4) = D3DCLEAR_ZBUFFER), and
so does the GL arm. A Vulkan pass cannot inherit an image the way a bound
framebuffer can: under MSAA the frame's world pass RESOLVES into the swapchain
image and stores DontCare into the multisampled scratch, so a second
multisampled pass declaring Load would load undefined contents - plan section
5.5.12 item 5, the same hazard that merged the clear into the world pass.

Re-clearing is exact rather than approximate because of an invariant the frame
graph already enforces. RenderFrameFoundation.PortalViewportVisible and this
scene's IsVisible are the same value, read once at the top of the frame, and
WorldSceneRenderer returns without drawing when it is set. So whenever portal
space draws, the backbuffer holds exactly the opaque black
SceneTool::BeginScene @ 0x0043DAD0 establishes and nothing else, and clearing to
that same black changes no pixel. The alternative - a single-sampled Load pass
over the resolved image - would have been both a silent MSAA divergence and
invalid, since the backbuffer's depth attachment is multisampled.

The pass takes IWorldPassScope.SampleCount, so WbDrawDispatcher's sample-count
pipeline variants (V6l) select the backbuffer set, and depth matches the
attachment.

CreateRequired becomes internal: its two new seams are internal RHI contracts
and composition is its only caller. The TYPE keeps its visibility - plan section
7.1 rule 3.

Gates. Release build green. App tests 4,132 / 3 skips against the 4,129
baseline (three new: the retail black constant, the RHI arm's composition
precondition, and the both-arms composition assertion). Complete Release suite
9,195 / 5; one AcDream.Content failure in the solution-wide run that passes
124/124 rerun alone - the documented rerun-singly flake class, not carried
forward as a claim. Strict GL offline pixel gate against 280f3b3f: 28 px of
563,200, fraction 4.97e-05, inside the documented 9-31 band, with a same-commit
control pair at 20 px / 3.55e-05 taken immediately afterwards. GL connected
-Runs 3: 3/3 RENDERED on the desktop witness and 3/3 on the client capture. One
offline Vulkan run with VK_LAYER_KHRONOS_validation proven inserted by the
loader: zero validation errors, zero warnings.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 18:25:49 +02:00
..
Gpu feat(render): Campaign V slice V6l commit 2 - the portal mask draws on Vulkan 2026-07-28 17:36:45 +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 feat(render): Campaign V slice V6i-3 commit 1 — the mesh pipeline's upload bodies cross the seam 2026-07-28 14:31:20 +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 feat(render): Campaign V slice V4t-2 — the world texture stack crosses to GpuTextureSlot 2026-07-28 12:43:50 +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 V6j commit 2 - Dereth draws on Vulkan 2026-07-28 15:46:54 +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
PortalDepthShaderParityTests.cs feat(render): Campaign V slice V6l commit 2 - the portal mask draws on Vulkan 2026-07-28 17:36:45 +02:00
PortalProjectionTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
PortalTunnelAssetTests.cs feat(render): Campaign V slice V6m commit 1 - portal space draws on Vulkan 2026-07-28 18:25:49 +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
RhiCompositeTextureArrayBackendTests.cs feat(render): Campaign V slice V6i-2 commit 2 — world texture creation crosses to IGpuTexture 2026-07-28 13:57:43 +02:00
RhiVertexLayoutStrideTests.cs feat(render): Campaign V slice V6l commit 1 - particles draw on Vulkan 2026-07-28 17:20:59 +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
SkyVertexLayoutTests.cs feat(render): Campaign V slice V6k commit 1 - the sky draws on Vulkan 2026-07-28 16:31:37 +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): Campaign V slice V4t-2 — the world texture stack crosses to GpuTextureSlot 2026-07-28 12:43:50 +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): Campaign V slice V6l commit 2 - the portal mask draws on Vulkan 2026-07-28 17:36:45 +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