feat(render): Vulkan campaign V11 step 4 — retire GL from CI and gate scripts

Closes out the GL deletion by fixing the CI workflow and developer gate
scripts that still assumed a GL arm existed to compare against, build,
or select via ACDREAM_RENDER_BACKEND.

.github/workflows/headless-portability.yml: linux-graphical's "Verify
actionable unsupported-driver gate" step is deleted outright — it ran
the deleted `ui-studio` CLI verb (Studio was removed at Commit 1) to
prove the GL capability gate rejects Mesa's llvmpipe driver, and there
is no more GL capability gate for any driver to pass or fail. Its test
filter dropped two dead entries (GraphicalCapabilityRequirementsTests,
deleted at Commit 2; StudioWindowTests, already gone). Its package
contract check dropped the libcimgui.so assertion (ImGui's native
bridge, deleted at Commit 1). linux-vulkan's explanatory comment, which
described GL's rejection as the reason no cross-backend pixel diff runs
in CI, is rewritten to explain there is no GL arm left at all. Two dead
src/AcDream.UI.ImGui/** path triggers (that project no longer exists)
are removed from both the pull_request and push filters.

tools/run-backend-differential-gate.ps1 and its dedicated route file
tools/connected-backend-differential.route.txt are deleted: the whole
script's purpose was comparing a GL launch against a Vulkan launch of
the same route, and there is no second arm left to compare. Single-arm
regression checking already exists via run-offline-pixel-gate.ps1's
-Baseline mechanism.

tools/run-portal-churn-soak.ps1 is simplified rather than deleted: its
repeated-portal-churn methodology (within-arm capture comparison,
memory/entity/GPU trend analysis) has value independent of the
GL-versus-Vulkan question it was built to answer for issues #256/#257
before V11. -Backends now defaults to @('vulkan') alone; the doc
comments are rewritten from "step 0 discriminator, run before V11" to
an ongoing single-arm regression soak.

tools/run-offline-pixel-gate.ps1 drops its now-nonfunctional -Backend
parameter (ACDREAM_RENDER_BACKEND has read zero call sites since
RuntimeOptions.RenderBackend was removed at Commit 2 — passing -Backend
gl silently launched Vulkan anyway) along with its GL-escape-hatch
example and every comment that referenced the now-deleted differential
gate. tools/run-connected-world-lifecycle-gate.ps1,
tools/run-offline-vulkan-capture.ps1, and
tools/run-repeat-connected-gate.ps1 keep their (harmless, already
no-op) ACDREAM_RENDER_BACKEND set/clear lines but have their
now-inaccurate "escape hatch" / "GL run" comments corrected to state
plainly that the variable is unread and the line is kept only for the
historical record.

No .cs files touched; `dotnet build AcDream.slnx -c Release` unaffected
(0 warnings, 0 errors, matching the prior commit's build).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-29 03:06:45 +02:00
parent 7a0227c12e
commit 5852bdb877
8 changed files with 72 additions and 604 deletions

View file

@ -1,15 +1,15 @@
<#
.SYNOPSIS
Campaign V slice V11 step 0: the #256/#257 discriminator, run on both backends.
Repeated-portal-churn regression soak: memory growth and visual drift.
.DESCRIPTION
Issues #256 (server-spawned signs and portals go invisible after repeated
portal runs, while staying interactive) and #257 (working set grows to
~1.5 GB over the same session) were both observed on the Vulkan backend in
one long live session. Both filings demand the SAME discriminator, and both
demand it BEFORE V11 deletes the OpenGL backend:
run the same repeated-churn route on GL and on Vulkan.
Originated as Campaign V slice V11 step 0: the #256/#257 discriminator, run
on both the GL and Vulkan backends before V11 deleted the former. Issues
#256 (server-spawned signs and portals go invisible after repeated portal
runs, while staying interactive) and #257 (working set grows to ~1.5 GB
over the same session) were both observed on the Vulkan backend in one long
live session, and running the same repeated-churn route on both arms told
the campaign whether either bug predated Vulkan or was new to it:
growth / drift on BOTH arms -> a pre-existing publication or resource
lifetime bug that the campaign merely
@ -17,11 +17,17 @@
growth / drift on VULKAN ONLY -> the new arm's resource lifecycle, and
deleting its predecessor would destroy
the only reference implementation that
can answer the question.
could answer the question.
After V11 the GL arm does not exist and this question costs far more to
answer, which is why this script runs first and why its verdict can stop the
slice.
Campaign V slice V11 deleted the GL backend, so that specific
before-and-after question can no longer be asked of any future bug but
the soak itself does not depend on having two arms. Comparing a fresh
Holtburg capture against a much-later one from the SAME arm is still the
closest automated instrument to what a user's long session actually shows,
and the memory/entity/GPU trend analysis below never needed a second arm to
begin with. -Backends now defaults to Vulkan alone; pass additional values
only to compare arms that still exist (a future backend, a driver
variant) 'gl' is no longer a valid launch and the app ignores it.
WHAT IT MEASURES, per stop, per cycle:
@ -58,10 +64,10 @@
determinism levers the differential gate forces are forced here for the same
reason -- an unpinned sun or cloud sheet would swamp the signal.
NOT A PIXEL GATE. This script never compares the two backends to each other;
that is run-backend-differential-gate.ps1's job and its thresholds are the
campaign's. Here each arm is compared only with itself, and the verdict is
about growth and drift.
NOT A PIXEL GATE. This script never compares two backends to each other
even when -Backends names more than one arm, each is still compared only
with itself. The verdict is about growth and drift within an arm, not
parity between arms.
.PARAMETER Out
Directory for both arms' logs, checkpoints, captures, samples and the verdict.
@ -72,8 +78,8 @@
warmup", and three stops per cycle makes 90 transits at the default.
.PARAMETER Backends
Which arms to run, in order. Default gl then vulkan, so the arm under
suspicion runs second and cannot be blamed for warming the machine.
Which arms to run, in order. Default 'vulkan' alone the only backend
that exists since Campaign V slice V11 deleted the GL arm.
.PARAMETER ShotCycles
Cycles on which Holtburg is captured. Default 1, 10, 20 and the last cycle.
@ -89,7 +95,7 @@
param(
[Parameter(Mandatory = $true)][string]$Out,
[int]$Cycles = 30,
[string[]]$Backends = @('gl', 'vulkan'),
[string[]]$Backends = @('vulkan'),
[int[]]$ShotCycles,
[int]$SettleMilliseconds = 6000,
[int]$ShotSettleMilliseconds = 12000,
@ -150,7 +156,7 @@ $stops = @(
)
$lines = [System.Collections.Generic.List[string]]::new()
$lines.Add('# GENERATED by tools/run-portal-churn-soak.ps1 -- the V11 step-0 discriminator.')
$lines.Add('# GENERATED by tools/run-portal-churn-soak.ps1 -- the portal-churn regression soak.')
$lines.Add("# $Cycles cycles x $($stops.Count) stops. Do not hand-edit; regenerate.")
$lines.Add('')
$lines.Add('wait world-ready 90000')