feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend
Vulkan is the sole, user-signed-off backend (V10 landed) and step 1 already removed ImGui/Studio/DevTools. This step deletes the GL rendering backend itself: every Gpu/Gl/** implementation, the Wb ManagedGL*/GLHelpers/GLSLShader/GLStateScope/RenderStateCache/ BindlessSupport family, Shader/ShaderProgramConstruction/SamplerCache, RenderBootstrap, and RenderFrameGlStateController. GameWindow.cs's Run()/CreateGraphics()/CreateBackbufferReader()/ OnLoad() collapse to their Vulkan-only arm; GameWindowGraphics loses its OpenGlGameWindowGraphics subclass. RuntimeOptions.RenderBackend and RenderBackendKind (incl. the Gl member of GpuBackendKind) are gone — there is nothing left to select between. The five world-draw dual-arm renderers (WbDrawDispatcher, EnvCellRenderer, TerrainModernRenderer, ParticleRenderer, SkyRenderer) and the composition roots (WorldRenderComposition, HostInputCameraComposition, LivePresentationComposition, FrameRootComposition) collapse to their RHI-only arm. GL-only diagnostic properties with a live external reader (DynamicBufferCount and friends) simplify to a documented `=> 0`/no-op rather than disappearing, since the reader is out of this commit's scope. A few GL-flavored mechanisms turned out to be backend-neutral once isolated: GlConstructionCleanupLedger is renamed ResourceConstructionCleanupLedger (exception-chain walking has nothing to do with GL), and GlfwNativePlatformProbe moved out of the otherwise GL-only GraphicalCapabilityRecord.cs into GraphicalWindowBackendSelection.cs before the rest of that file was deleted. Test files with no surviving subject are deleted outright (GraphicalCapabilityRequirementsTests, ShaderProgramConstructionTests, PortalDepthShaderParityTests, TextureCacheBindlessTests, TextRendererFailureSafetyTests, ClipFrameUploadTests, every Gpu/Gl/*Tests, GlTextureOwnershipTests, RenderFrameGlStateControllerTests); others get their dead GL-only members trimmed while their live assertions stay (ClipFrameLayoutTests' MeshClipSsboBinding check now reads GpuBindingModel.StorageClipRegions, the same binding index under its new backend-neutral name; GpuResourceRetirementTransactionTests drops its OpenGLGraphicsDevice-subclassing test double and the two GL queue tests it existed for). EnvCellRendererTests' construction helper now builds a real ObjectMeshManager via VulkanMeshPipelineDevice instead of passing null through a null-forgiving operator, since the RHI constructor never tolerated a null mesh manager and the old GL constructor (which did) is gone. Deferred to the next two steps, deliberately not touched here: the Silk.NET.OpenGL/.Extensions.ARB package references, IMeshPipelineDevice.Gl (WbMeshAdapter's GL? threading stays in place), Chorizite.Core's stale csproj comment (the package itself is still load-bearing — TextureFormat and friends are used well beyond the deleted ManagedGLUniformBuffer), and the CI/gate scripts. Build: `dotnet build AcDream.slnx -c Release` — 0 warnings, 0 errors. Tests: full-solution `dotnet test` green across every project (App.Tests 3937/3940 + 3 skips, Core.Tests 3296/3298 + 2 skips, all others 100%); the 2 App.Tests names that flake under full-suite parallel execution (#250-family, documented pre-existing) pass in isolation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
b70b9832ff
commit
8a7a0837e1
121 changed files with 1243 additions and 19840 deletions
|
|
@ -15,7 +15,6 @@ using AcDream.Core.Physics;
|
|||
using AcDream.Core.Selection;
|
||||
using AcDream.Core.World;
|
||||
using Silk.NET.Input;
|
||||
using Silk.NET.OpenGL;
|
||||
using Silk.NET.Windowing;
|
||||
|
||||
namespace AcDream.App.Composition;
|
||||
|
|
@ -236,20 +235,15 @@ internal sealed class FrameRootCompositionPhase
|
|||
{
|
||||
FrameRootDependencies d = _dependencies;
|
||||
WorldRenderFoundation foundation = world.Foundation;
|
||||
// Campaign V slice V6h: the frame root is the one seam that genuinely
|
||||
// forks. On GL every world renderer exists and the render graph is
|
||||
// unchanged. On Vulkan none of them does, so the graph is the clear pass,
|
||||
// the private-presentation phase, and the retained UI inside it — the
|
||||
// client's own frame, drawn entirely through the RHI.
|
||||
GL? gl = d.Graphics.Gl;
|
||||
// Campaign V slice V6h: the frame root's raw-GL render graph fork was
|
||||
// deleted at slice V11. The graph is the clear pass, the private-
|
||||
// presentation phase, and the retained UI inside it — the client's
|
||||
// own frame, drawn entirely through the RHI.
|
||||
var teleportRenderState =
|
||||
new LocalPlayerTeleportRenderStateSource(session.LocalTeleport);
|
||||
var renderLoginState = new RenderLoginStateSource(
|
||||
d.Options.LiveMode,
|
||||
d.PlayerMode);
|
||||
RenderFrameGlStateController? renderFrameGlState = gl is null
|
||||
? null
|
||||
: new RenderFrameGlStateController(new SilkRenderFrameGlStateApi(gl));
|
||||
// Campaign V slice V6i-3: on Vulkan the frame's clear is a load op of the
|
||||
// world pass rather than a pass of its own, so the two phases share this
|
||||
// one value. See VulkanWorldScenePhase for why the merge is required
|
||||
|
|
@ -268,18 +262,8 @@ internal sealed class FrameRootCompositionPhase
|
|||
live.ParticleRenderer,
|
||||
d.FrameProfiler,
|
||||
d.FrameDiagnosticsEnabled);
|
||||
IRenderFrameClearPhase clearPhase = gl is not null
|
||||
? new RuntimeRenderFrameClearPhase(
|
||||
gl,
|
||||
d.WorldTime,
|
||||
d.Weather,
|
||||
teleportRenderState,
|
||||
d.ParticleVisibility,
|
||||
host.WorldRenderDiagnostics
|
||||
?? throw new InvalidOperationException(
|
||||
"The GL frame root requires the GL state tripwire."),
|
||||
renderFrameGlState!)
|
||||
: new AcDream.App.Rendering.Gpu.Vk.VulkanRenderFrameClearPhase(
|
||||
IRenderFrameClearPhase clearPhase =
|
||||
new AcDream.App.Rendering.Gpu.Vk.VulkanRenderFrameClearPhase(
|
||||
d.WorldTime,
|
||||
d.Weather,
|
||||
teleportRenderState,
|
||||
|
|
@ -335,27 +319,17 @@ internal sealed class FrameRootCompositionPhase
|
|||
?? new WorldRenderDiagnostics(
|
||||
NullRenderGlStateReader.Instance,
|
||||
d.RenderDiagnosticLog);
|
||||
IRenderFrameGlState worldFrameGlState =
|
||||
(IRenderFrameGlState?)renderFrameGlState
|
||||
?? NullRenderFrameGlState.Instance;
|
||||
IRenderFrameGlState worldFrameGlState = NullRenderFrameGlState.Instance;
|
||||
IWorldPassScope? worldPassScope = d.Graphics.WorldPassScope;
|
||||
var worldFramebufferSource =
|
||||
new SilkRetailPViewFramebufferSource(d.Window);
|
||||
IWorldPassSurface worldPassSurface = gl is not null
|
||||
? new GlWorldPassSurface(
|
||||
gl,
|
||||
live.ClipFrame,
|
||||
worldFramebufferSource,
|
||||
live.DrawDispatcher!,
|
||||
live.EnvCellRenderer!,
|
||||
foundation.Terrain)
|
||||
: new RhiWorldPassSurface(
|
||||
worldPassScope
|
||||
?? throw new InvalidOperationException(
|
||||
"A backend without a GL context must publish a world pass scope."),
|
||||
host.GpuFrameLifetime,
|
||||
live.ClipFrame,
|
||||
worldFramebufferSource);
|
||||
IWorldPassSurface worldPassSurface = new RhiWorldPassSurface(
|
||||
worldPassScope
|
||||
?? throw new InvalidOperationException(
|
||||
"The graphics backend must publish a world pass scope."),
|
||||
host.GpuFrameLifetime,
|
||||
live.ClipFrame,
|
||||
worldFramebufferSource);
|
||||
var worldFrameEnvironment =
|
||||
new RuntimeWorldFrameEnvironmentPreparation(
|
||||
d.Options,
|
||||
|
|
@ -438,7 +412,7 @@ internal sealed class FrameRootCompositionPhase
|
|||
// V11, so nothing is lost — composing it would throw on the
|
||||
// first wireframe frame rather than silently misdraw (plan
|
||||
// §5.5.14 item 7).
|
||||
gl is not null ? foundation.DebugLines : null,
|
||||
null,
|
||||
d.PhysicsEngine,
|
||||
d.PlayerMode,
|
||||
d.PlayerController,
|
||||
|
|
@ -488,21 +462,17 @@ internal sealed class FrameRootCompositionPhase
|
|||
d.RenderRange,
|
||||
worldSceneDiagnostics,
|
||||
live.WorldAvailability);
|
||||
if (gl is null)
|
||||
{
|
||||
// On Vulkan the world renderer runs INSIDE the frame's one
|
||||
// backbuffer pass, which this phase opens, publishes on the
|
||||
// scope, and closes.
|
||||
worldSceneRenderer =
|
||||
new AcDream.App.Rendering.Gpu.Vk.VulkanWorldScenePhase(
|
||||
host.GpuFrameLifetime,
|
||||
vulkanClear,
|
||||
() => d.Graphics.Vulkan?.SampleCount ?? 1,
|
||||
(d.Graphics as VulkanGameWindowGraphics)?.WorldPassScopeCore
|
||||
?? throw new InvalidOperationException(
|
||||
"The Vulkan world phase requires the Vulkan graphics handle."),
|
||||
worldSceneRenderer);
|
||||
}
|
||||
// The world renderer runs INSIDE the frame's one backbuffer pass,
|
||||
// which this phase opens, publishes on the scope, and closes.
|
||||
worldSceneRenderer =
|
||||
new AcDream.App.Rendering.Gpu.Vk.VulkanWorldScenePhase(
|
||||
host.GpuFrameLifetime,
|
||||
vulkanClear,
|
||||
() => d.Graphics.Vulkan?.SampleCount ?? 1,
|
||||
(d.Graphics as VulkanGameWindowGraphics)?.WorldPassScopeCore
|
||||
?? throw new InvalidOperationException(
|
||||
"The Vulkan world phase requires the Vulkan graphics handle."),
|
||||
worldSceneRenderer);
|
||||
}
|
||||
Fault(FrameRootCompositionPoint.WorldRendererCreated);
|
||||
bindings = new FrameRootRuntimeBindings();
|
||||
|
|
@ -591,17 +561,15 @@ internal sealed class FrameRootCompositionPhase
|
|||
?? NullRenderFramePostDiagnosticsPhase.Instance;
|
||||
var renderFrame = new RenderFrameOrchestrator(
|
||||
host.GpuFrameLifetime,
|
||||
gl is not null
|
||||
? new FrameProfilerGpuMeasurement(d.FrameProfiler, gl)
|
||||
// Campaign V slice V8: the Vulkan arm measures the same bracket
|
||||
// through its own timestamp scope. It stayed on the null adapter
|
||||
// from V6h until V8, which meant no [frame-prof] line existed on
|
||||
// Vulkan at all — see VulkanFrameGpuMeasurement.
|
||||
: d.Graphics.Vulkan is { } vulkanGraphics
|
||||
? new AcDream.App.Rendering.Gpu.Vk.VulkanFrameGpuMeasurement(
|
||||
d.FrameProfiler,
|
||||
vulkanGraphics.Device)
|
||||
: AcDream.App.Rendering.Gpu.Vk.NullRenderFrameGpuMeasurement.Instance,
|
||||
// Campaign V slice V8: the Vulkan arm measures the frame bracket
|
||||
// through its own timestamp scope — see VulkanFrameGpuMeasurement.
|
||||
// The raw-GL adapter (FrameProfilerGpuMeasurement) was deleted at
|
||||
// slice V11.
|
||||
d.Graphics.Vulkan is { } vulkanGraphics
|
||||
? new AcDream.App.Rendering.Gpu.Vk.VulkanFrameGpuMeasurement(
|
||||
d.FrameProfiler,
|
||||
vulkanGraphics.Device)
|
||||
: AcDream.App.Rendering.Gpu.Vk.NullRenderFrameGpuMeasurement.Instance,
|
||||
framePreparation,
|
||||
worldSceneRenderer,
|
||||
privatePresentation,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue