The ubsan row built with -fsanitize=undefined alone, which prints a
report and carries on: a suite that reached undefined behaviour still
passed, and the row was green whatever UBSan found. With the round-mode
fix reverted, dbload's apply lane reports the read past the name table
in this configuration and still exits 0.
-fno-sanitize-recover=undefined makes the first report end the run.
Every suite passes with it.
The GSdx OpenGL renderer had no frontend among the tests: nothing ran it
here, and a change to it went out tried on the Vulkan renderer alone.
tests/glnegotiate is one, as tests/vknegotiate is for Vulkan: an OpenGL
3.3 core context from EGL on a surfaceless display, no window or X
server, so Mesa's llvmpipe serves; the frontend's framebuffer for the
core to draw into (get_current_framebuffer) and its entry points
(get_proc_address), as RetroArch gives them; the frame taken in the
video callback as RETRO_HW_FRAME_BUFFER_VALID. EGL and GL are opened at
run time and declared in the harness, so it builds without their
headers and skips without them.
After the frames the picture is read back, rows top first as the Vulkan
frontend reads an image, hashed the same way (GN_RGB leaves the alpha
out), and dumped on request (GN_DUMP). build.sh boots eleven of
tests/swdraw's cases on it and holds each picture to the Vulkan
renderer's of the same case: on Mesa the two draw them to the pixel
(sprites, points, lines, mipmaps, the depth states, the destination
alpha test, CLUT draws and the dynamic siblings' cases). The 4-bit read
of a target, which Vulkan draws through its GPU view, only has to run.
The suite takes eighteen seconds. The Tests workflow installs EGL and
Mesa's software driver so it runs there.
Ps1CD.c calls abs() with nothing declaring it. On x86-64 the intrinsics
headers bring <stdlib.h> in through the common headers, so the call
compiles there; on arm64 nothing does, and the Android arm64-v8a and
webOS aarch64 jobs fail on the undeclared call.
Undeclared calls in C files are now an error on every GCC and Clang, not
only Clang and GCC 14, and a new workflow builds the core for Android
arm64-v8a and for aarch64 GCC in the webOS shape so these show up before
they reach master.
The WaitForEmpty defect that reached master (f50ea8b89) was found by
this suite on a loaded multi-core host - about a dozen early returns in
fifty thousand items - and the same suite passes every time on a quiet
single-core one. A race caught once in five runs is not caught by a
CI job that runs it once.
The producer/consumer half repeats WORKSEMA_REPS times, default one, and
the workflow sets two hundred. Only the last repetition prints its
counts unless one fails, in which case the run stops there and prints
that one. The deterministic halves - the contract and the state check -
run once, as they always did.
The suite already runs in CI through tests/run-all.sh, which picks up
every directory with a build.sh; what it did not do was repeat.
Passes here, plain and under TSan, at the default and at forty.
Two gaps, both of which let 0b7ca9035 through.
The settings suite tested the new surface -- the fixups, the folder
rules, the path truncation -- and never that a settings reload still did
what the settings map did. The map wrote only the entries it held, so
UseBOOT2Injection, the IRX and game-argument strings and the memory card
types passed through untouched; assigning the option config over
EmuConfig wrote them too, and fast boot reverted on every settings
change, taking the region and refresh rate with it. The suite now models
what ApplySettings does -- reset, carry the runtime config across,
reload -- and asserts both halves: the runtime state survives and a
field the options set still takes the option's value. Reintroducing the
assignment fails it.
And nothing in CI ran any of this. Sixteen suites, each with a build.sh,
covering the interpreter and both recompilers against the hardware
tests, the emitter, the settings path, the CDVD readers, the MTVU ring
and the fault handler, and no workflow invoked one of them. There is one
now: three rows -- plain, ASan, UBSan -- over run-all.sh, which finds
its suites, so a suite added later needs no change here. Twelve build
from SANFLAGS; the four concurrency ones run TSan themselves in every
row, which is the sanitizer that finds anything there.
The hardware-test suites check far less without the PS2 and PS1 test
images, which a hosted runner does not have, so a second job prints
which suites those are rather than letting a green tick imply they ran.
The Azure Ubuntu package server, in particular, seems to be very
unreliable. Hopefully within 10 attempts it'll complete the package
download in such cases.
Instead of shoehorning GS source files into the unit tests, we link with
the full PCSX2 core library. We stub out all the Host functions, as,
well, there isn't one, and they may be indirectly referenced.
- Remove unused build options
- Disable setcap by default
Applications should not need to call sudo as part of the build process.
- Rename XDG_STD to USE_LEGACY_USER_DIRECTORY
By default, we use ~/.config/PCSX2 now.
- Default Wayland support to on
I don't think there's any systems worth supporting that don't have it.
- Rework "install" logic
Linux no longer installs to GIT_ROOT/bin, it builds direct to BUILD/bin.
Saves a file copy, and running make install before running your developer
build was always silly.
- Don't require install target to build appimage
AppImage creator now just adds the entire bin directory as-is.
Everything needed is in there.