acdream/tests/AcDream.App.Tests/Rendering/Wb
Erik 5b3d72a90c refactor(render): Campaign V slice V6i-2 commit 3 — the mesh pipeline stops naming a backend
Plan §5.5.10 recorded the blocker as a fact about types: "WbMeshAdapter owns an
OpenGLGraphicsDevice, so it is not constructible on Vulkan until slice V4t" —
which is the entire reason NullWbMeshAdapter exists. §5.5.12 item 6 then measured
how wide that dependency really is, and the answer is seven members out of a
760-line class: a GL context, the retirement queue, the shared instance VBO, and
two capability flags.

IMeshPipelineDevice is exactly that surface. OpenGLGraphicsDevice declares it and
every member already existed under a GL-specific name, so the shipping backend
executes not one changed statement — these are aliases, not behaviour.

Two casts moved, and they are what actually blocked construction:

- ObjectMeshManager downcast IGpuDevice to GlGpuDevice in its CONSTRUCTOR, so a
  Vulkan-composed pipeline threw before running a statement. V4t put it there
  because the class registered bindless handles itself; commit 2 moved that into
  the array, leaving the field a pass-through for the raw-GL renderers' handle
  table. The cast now lives on that one property and names the backend it was
  composed against instead of reporting a failed cast.
- The atlas array factory is selected by IWorldTextureArrayFactory.For, which is
  the one place the texture stack branches on a backend.

MeshPipelineDeviceSeamTests proves the decoupling rather than describing it: it
builds ObjectMeshManager against a device whose Gl is null, asserts it constructs,
asserts construction built no GL object, asserts the handle table refuses by name,
and asserts the factory picks the RHI arm. A reflection test pins the seam's
member set so a later slice cannot quietly widen it back out — the whole value
here is that it is narrow.

What this does NOT claim: the mesh pipeline does not RUN on Vulkan. Its upload
bodies are still raw GL — GlobalMeshBuffer, the VAO/IBO construction, the layer
transfers — and they now fail through one RequireGl() accessor that names the
slice that owns porting them, instead of failing at construction. WbMeshAdapter
still creates an OpenGLGraphicsDevice in its GL constructor, because there is no
second implementation to create yet. Those bodies are items 3–5 of §5.5.12's
remainder list, along with RetailPViewPassExecutor and the three world renderers'
submission arms.

§5.5.13 reports the whole of V6i-2 and the slice table gains its V6i row.

Gates: Release build; App tests 4,109 / 3 skips (the 4,086 baseline plus 23 across
the three commits); complete Release suite 9,172 / 5; strict GL offline pixel gate
vs 0ca802cd 1.60e-05 (9 px of 563,200 — the low end of the documented 9–31 px
control band, and fewer than a same-commit control has measured); GL connected
tools/run-repeat-connected-gate.ps1 -Runs 3 at 3/3 RENDERED on the desktop witness
and 3/3 on the client capture; one Vulkan composition-host run with
VK_LAYER_KHRONOS_validation proven inserted by the loader at zero errors, zero
warnings, no [shutdown] diagnostic, and a captured frame.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 14:09:48 +02:00
..
BuildingLoaderTests.cs perf(streaming): cursor publication across frame budgets 2026-07-24 19:10:18 +02:00
BuildingRegistryTests.cs feat(render): Phase A8 RR3 — Building + BuildingRegistry + BuildingLoader 2026-05-27 11:08:43 +02:00
BuildingTests.cs feat(render): Phase A8 RR3 — Building + BuildingRegistry + BuildingLoader 2026-05-27 11:08:43 +02:00
CompositeWarmupEntitySourceTests.cs perf(streaming): scope reveal warmup spatially 2026-07-25 04:39:48 +02:00
ContiguousRangeAllocatorTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
EntitySpawnAdapterLifetimeTests.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
EnvCellLandblockBuildTests.cs fix(streaming): commit EnvCell landblocks atomically (#214) 2026-07-13 18:45:24 +02:00
EnvCellRendererTests.cs Revert "feat(render): Campaign V slice V4c - move the world draw path onto the RHI" 2026-07-27 22:38:02 +02:00
EnvCellSceneryInstanceTests.cs fix(streaming): commit EnvCell landblocks atomically (#214) 2026-07-13 18:45:24 +02:00
GpuRetiredRangeAllocatorTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
InstanceGroupClearTests.cs feat(render): Campaign V slice V4t-2 — the world texture stack crosses to GpuTextureSlot 2026-07-28 12:43:50 +02:00
LandblockSpawnAdapterReadinessTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
MeshPipelineDeviceSeamTests.cs refactor(render): Campaign V slice V6i-2 commit 3 — the mesh pipeline stops naming a backend 2026-07-28 14:09:48 +02:00
MeshUploadCachesTests.cs fix(streaming): prepare quiesced destination entities 2026-07-24 20:21:57 +02:00
ModernBatchDataLayoutTests.cs feat(render): Campaign V slice V2a - mesh path texture-index migration 2026-07-27 15:51:26 +02:00
ObjectMeshUploadBudgetTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
ObjectMeshWorkerLifecycleTests.cs fix #225: stabilize render pacing and frame CPU 2026-07-19 06:29:30 +02:00
PackedDispatcherOracleTests.cs fix(rendering): match empty packed submissions 2026-07-25 01:48:02 +02:00
PackedProjectionClassificationCacheTests.cs perf(rendering): retain packed classification 2026-07-25 02:46:40 +02:00
RetryableResourceReleaseLedgerTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
RhiWorldTextureArrayTests.cs feat(render): Campaign V slice V6i-2 commit 2 — world texture creation crosses to IGpuTexture 2026-07-28 13:57:43 +02:00
TextureAtlasCapacityTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
TextureAtlasSlotAllocatorTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
WbDrawDispatcherClipSlotTests.cs feat(render): indoor render WORKS — terminating portal flood + every-cell seal + look-in FPS 2026-06-07 10:14:43 +02:00
WbDrawDispatcherCompositeWarmupTests.cs fix(rendering): decouple portal warmup discovery 2026-07-25 04:27:17 +02:00
WbDrawDispatcherIndoorFlagTests.cs fix(lighting): #142 — per-instance sun gate for windowed-building interiors 2026-06-20 12:55:56 +02:00
WbDrawDispatcherTorchGateTests.cs fix(lighting): A7 Fix D round 2 — outdoor objects get NO torches (retail useSunlight gate) (#140) 2026-06-19 23:56:49 +02:00
WbFrustumTests.cs feat(render): Phase A8 Wave 1 — WB scaffolding extraction + stencil low-level method 2026-05-27 14:46:07 +02:00
WbTextureResolutionPolicyTests.cs perf(content): remove exception-driven setup probes 2026-07-24 15:12:21 +02:00