125 lines
7.3 KiB
Markdown
125 lines
7.3 KiB
Markdown
# Client startup and world-rendering probes
|
||
|
||
Compilation does not show whether a client creates its graphics device, reaches
|
||
the menu, enters a world or reads back a rendered frame. The private graphics
|
||
probe runs the actual pinned game and performance mods to check those steps.
|
||
It is a separate test mod, excluded from production JARs and playable packs.
|
||
|
||
The required macOS CI cases use the recommended OpenGL `core-performance` and
|
||
`m2-balanced` profiles. Each profile starts at the title screen and then, in a
|
||
separate instance, creates or opens an ordinary limited-demo world. World mode
|
||
dismisses the demo-help popup, waits for focused, unpaused gameplay, reads back
|
||
the main render target, and stops the client so its integrated server saves.
|
||
The readiness counter resets while a loading overlay is present: a title screen
|
||
object can already exist underneath asynchronous loading. Private screenshots
|
||
must have a nonuniform sample grid and a verified file hash;
|
||
world mode also checks for saved world data after a clean process exit.
|
||
|
||
The startup wrapper observes backend library/device creation and preserves the
|
||
original calls and thrown exceptions. Selected diagnostics contain initialization
|
||
stages, bounded exception type names, Vulkan error-code identifiers and device
|
||
labels. Failed probes also select up to eight graphics stack method names, without
|
||
module prefixes, filenames, line numbers or messages. Those observed locations
|
||
do not by themselves identify a root cause. Expected demo authentication errors
|
||
are reported separately. Full log
|
||
messages, raw screenshots, assets and world files stay under gitignored `.local/`.
|
||
Nonuniform pixels are not proof of correct visuals, full LOD completion or
|
||
exhaustive gameplay equivalence.
|
||
|
||
The [selected live observations](../benchmarks/client-graphics-2026-10-04/live-observations.json)
|
||
record passing title and demo-world readbacks for both profiles on the hosted
|
||
macOS ARM64 runner. Both world cases are focused, produce saved data and exit
|
||
cleanly. All four CI jobs pass for that source head. Its independently built
|
||
macOS production JAR matches published 0.20.0 byte-for-byte and contains neither
|
||
probe class. The observed macOS OpenGL device is **Apple Software Renderer**;
|
||
these are platform runtime checks, not physical Apple GPU performance results.
|
||
|
||
## Run locally
|
||
|
||
Build the original mod first, then use the platform's display:
|
||
|
||
```sh
|
||
python3 tools/build_mod.py
|
||
python3 tools/test_client_graphics.py --native-display
|
||
python3 tools/test_client_graphics.py --native-display --world
|
||
```
|
||
|
||
These default to core and balanced, with a 3 GiB heap. That budget can trigger
|
||
DH's low-memory warning; the 16 GB Mac starter suggests 6 GiB. A short startup
|
||
check is not a recommendation for sustained memory or distant-generation load.
|
||
On headless Linux, omit `--native-display` to use Xvfb, or run through `vscreen`
|
||
with its display available. World mode creates private, disposable demo worlds
|
||
in its isolated runtime folders. No Microsoft credentials are needed for the
|
||
game's limited demo. It does not accept the dedicated-server EULA.
|
||
|
||
The selected output is `dist/client-graphics-smoke.json`. Each case records the
|
||
observed backend rather than inferring it from the preference. Normal CI retains
|
||
separate title/world JSONs. Neither the fixture nor screenshots enter releases.
|
||
|
||
## Vulkan investigation
|
||
|
||
The manual **macOS Vulkan research** workflow separately probes vanilla, core and
|
||
the distant-terrain Vulkan profile. It runs every case, retains selected successful
|
||
and failed outcomes, and exits unsuccessfully when a case fails. Its exploratory
|
||
results do not count as passing the required OpenGL checks.
|
||
Its optional `world` input selects disposable demo-world probes for every case;
|
||
the default still probes titles.
|
||
|
||
Local Linux software OpenGL/Vulkan title readbacks passed. Early macOS OpenGL
|
||
title checks for core and balanced also passed with **Apple Software Renderer**.
|
||
The macOS runner's **Apple Paravirtual device**, using MoltenVK 1.4.2, created
|
||
Vulkan devices but all three Vulkan cases failed with `VK_ERROR_FEATURE_NOT_PRESENT`.
|
||
The failure also occurs with vanilla; these observations do not isolate an
|
||
optimization-mod fault or prove behavior on a physical M2 GPU.
|
||
|
||
The separate [readback-stage observations](../benchmarks/mac-vulkan-2026-10-04/live-observations.json)
|
||
from manual run 37193558884 show that all three cases reached the client test
|
||
initializer and requested readback before failing. They produced no completed
|
||
readback report. This narrows the observed sequence; it does not establish whether
|
||
the screenshot operation itself or subsequent rendering failed. Graphics stack
|
||
locations from the next run, 37193954843, place each observed failure in the
|
||
screenshot callback after Vulkan submission. Later probes also record callback
|
||
entry, a whitelist of numeric readback dimensions/sample counts, and fixed failure
|
||
categories from our own assertions. Separately logged Vulkan codes are not
|
||
treated as the cause of a probe assertion.
|
||
|
||
Run 37194354615 identifies the actual probe assertion: each callback received a
|
||
1280×646 image, but its 4,160 sampled pixels had only one distinct RGB colour.
|
||
The strict nonuniform-readback assertion rejected all three cases. Overlay state
|
||
was not recorded in those failures; later probes wait for its removal before
|
||
counting readiness. This tests an initialization hypothesis while preserving the
|
||
same nonuniform-image requirement. It is not evidence that the game's displayed
|
||
Vulkan window was uniform or that a physical M2 GPU has the same problem.
|
||
|
||
After the overlay guard, run 37194690645 has mixed results: core and distant-terrain
|
||
title probes pass on the Apple Paravirtual Vulkan device, with no overlay and
|
||
nonuniform readback, then exit cleanly. Vanilla still fails the uniform-readback
|
||
assertion. The overall research run therefore remains failed. These outcomes
|
||
justify retaining the readiness guard; they do not establish the cause of the
|
||
remaining failure, full visual correctness, world rendering or physical M2 speed.
|
||
|
||
The subsequent world-mode run 37195149166 passes all three cases on the hosted
|
||
Apple Paravirtual Vulkan device. Each reaches focused gameplay without an overlay,
|
||
returns a nonuniform framebuffer, produces saved demo-world data and exits with
|
||
code zero. This verifies short Vulkan world startup on that runner, while the
|
||
failed title observations remain retained. A local Linux core Vulkan world probe
|
||
also passes, and its private screenshot was visually inspected. These checks do
|
||
not prove exhaustive graphics/gameplay equivalence, completed distant terrain,
|
||
physical M2 GPU compatibility or an FPS improvement.
|
||
|
||
For an isolated private preference override:
|
||
|
||
```sh
|
||
python3 tools/test_client_graphics.py --native-display --profile baseline --backend vulkan
|
||
python3 tools/test_client_graphics.py --native-display --profile core-performance --backend vulkan
|
||
```
|
||
|
||
Overrides use separate runtime folders. The shipped profiles retain their
|
||
configured preferences. These probes make no FPS, CPU/RAM reduction, hardware-GPU
|
||
compatibility or M2 Pro performance claim. Actual-world performance comparisons
|
||
still use the [Mac first-test procedure](mac-first-test.md).
|
||
|
||
For a shader-enabled world rather than a disabled shader configuration, use the
|
||
separate [cinematic shader probe](shader-world-smoke.md). It requires actual Iris
|
||
runtime activation and the pinned pack identity.
|