acdream/tests/AcDream.App.Tests/Rendering
Erik e8a4c1af3f feat(render): Campaign V slice V5 - Vulkan bring-up, dark
Instance, physical-device selection, logical device, queues, swapchain, and the
three-layer capability gate, behind ACDREAM_RENDER_BACKEND=vulkan. Nothing of
the game renders through it. OpenGL stays the default and the only live backend
until V10, and with the variable unset or set to gl the GL path executes not one
new statement.

The shape of the slice. Plan §4.11 asks the Vulkan gate to mirror the GL one
exactly - passive record, active probes, an Evaluate producing operator-facing
sentences, NotSupportedException into Program.cs's exit-code-4 contract, and an
atomic JSON report. The harder question was where to put the seam, because a
capability gate is precisely the code you cannot exercise on the machine that
already passes it: this box has one discrete GPU, so device ranking, the split-
queue path, an sRGB-only surface, a minimised window and a device missing
descriptorBindingVariableDescriptorCount are all unreachable by running the
client. So every decision the gate makes is a pure function over plain records,
and the Silk interop layer only has to be right about which Vulkan field feeds
which property. VulkanPhysicalDeviceSelection ranks candidates,
VulkanExtensionSelection does the required-versus-optional set arithmetic,
VulkanSwapchainConfigurationFactory chooses format, present mode, image count,
extent, usage, transform and composite alpha, VulkanSwapchainRecreationPolicy
classifies every acquire and present result, and
VulkanCapabilityRequirements.Evaluate turns a captured record into failure
sentences. All of it is unit-tested with no driver, no device and no window.

This commit is the integration of that work onto the post-revert tree. The V5
branch was written on b064668b, before V4c/V4d were reverted, so GameWindow.cs
had to be merged rather than taken: the file here is eb2ba4e5's GameWindow plus
V5's fifteen-line backend branch, and it keeps _terrainModernShader, which the
revert restored and which the V5 branch never had. Every other file is byte-
identical to the branch - git diff e1ef4313 over Rendering/Gpu/Vk,
tests/.../Gpu/Vk and RenderBackendKind.cs is empty, no BOM was introduced, and
CRLF is uniform across all seventeen files.

Gate results, recorded verbatim.

Release build: succeeded, 0 warnings, 0 errors.

App tests, Release: Failed 0, Passed 3981, Skipped 3, Total 3984 - the 3,866
baseline plus V5's 115 new tests, exactly.

Offline pixel gate against eb2ba4e5: PASS world-offline.png, differing fraction
1.06534090909091E-05, which is 6 differing pixels out of the 563,200 compared
after the top 280 sky rows are masked. §5.1's re-measured same-commit control
band is 15-23 pixels at fraction <= 4.1e-05, so this sits below the noise floor
rather than merely inside it - the expected result for a slice that adds no
statement to the GL path.

Vulkan check (a), ACDREAM_RENDER_BACKEND=vulkan on the RX 9070 XT with an
automation artifact directory:

  vulkan: capability gate passed (Windows, AMD Radeon RX 9070 XT, Vulkan
  1.4.349, vendor 0x1002, device 0x7550, driver 2.0.395 (raw 0x0080018B));
  swapchain B8G8R8A8Unorm/PresentModeImmediateKhr 1280x720 x3
  vulkan: device selection - automatic: 'AMD Radeon RX 9070 XT' (DiscreteGpu,
  15.92 GiB device-local) ranked first of 2 enumerated device(s).
  [world-gate] screenshot-complete name=vulkan-bringup path=...
  artifacts\vk-bringup\vulkan-bringup.png size=1280x720
  vulkan: presented 64609 clear-colour frame(s); shutting down.

Exit code 0 on CloseMainWindow. The PNG is 5,238 bytes, 1280x720, and uniformly
RGBA(11,19,39,255) - exactly ClearColor [0.043, 0.075, 0.153, 1] scaled to
UNORM. Orientation is right-side-up by construction rather than by inspection,
which a uniform clear could not show: VulkanBackbufferSwizzle.ToGlOriginRgba
writes source row y into destination row height-1-y precisely because
FrameScreenshotController flips again on the way to the PNG, so the two
cancel. That double-flip is unit-tested.

Vulkan check (b), ACDREAM_VULKAN_FORCE_UNSUPPORTED=timelineSemaphore:

  [ERR] acdream's Vulkan renderer is unsupported by the selected device.
  Platform: win-x64, Windows, AMD Radeon RX 9070 XT (DiscreteGpu), Vulkan
  1.4.349, vendor 0x1002, device 0x7550, driver 2.0.395 (raw 0x0080018B)
   - timelineSemaphore is required; the frame serial is the semaphore value.
  Full capability report: ...\diagnostics\graphical-capabilities-vulkan.json

Exit code 4. The report records ForcedUnsupportedFeature timelineSemaphore,
TimelineSemaphore false against an otherwise complete feature set, and the
matching SupportFailures sentence, so the injected rejection is distinguishable
from a genuinely absent feature. Both enumerated devices, all five surface
formats, all four present modes and a clean FunctionProbe with no failures are
recorded beside it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 07:11:50 +02:00
..
Gpu feat(render): Campaign V slice V5 - Vulkan bring-up, dark 2026-07-28 07:11:50 +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 refactor(runtime): cut graphical host over to canonical root 2026-07-26 19:06:09 +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): Campaign V slice V4a - port TextRenderer/BitmapFont/DebugLineRenderer/TextureCache UI path onto IGpuDevice 2026-07-27 19:37:19 +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): Campaign V slice V2c - particle texture-index migration 2026-07-27 16:02:59 +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): Campaign V slice V4a - port TextRenderer/BitmapFont/DebugLineRenderer/TextureCache UI path onto IGpuDevice 2026-07-27 19:37:19 +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
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 Revert "feat(render): Campaign V slice V4d-2 - move terrain onto the RHI" 2026-07-27 22:38:02 +02:00
TextRendererFailureSafetyTests.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +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