The nid_patcher turns each *_nid_no_patch_cut alias into a second dynamic
symbol with the same name as the plain alias exported next to it, seven
names in all. With those duplicates, LD_DEBUG=bindings shows libstdc++ keeping its own __cxa_allocate_exception, __cxa_throw,
__cxa_begin_catch, __cxa_end_catch, __cxa_rethrow, __gxx_personality_v0
and _Unwind_Resume while taking __cxa_init_primary_exception,
_Unwind_RaiseException and std::terminate from libc.prx. An exception
thrown inside libstdc++ (std::stoi, a stream with exceptions enabled) got
a libc header laid over a libstdc++ allocation, reached the libc
personality as a foreign exception, matched no typed handler and ended in
"terminate called without an active exception". The plain aliases already
export these names, so the duplicates go.
libstdc++ also describes std::__ios_failure with __iosfail_type_info, a
class that privately derives from __si_class_type_info at the same
address. Kind now follows such single same-address bases to the
__cxxabiv1 class, so catching std::ios_base::failure or std::exception
matches a stream failure.
The plain aliases came in a4c519b26 next to the cut aliases from
14f8c16ac.
On RADV the overlay's fragment shader read parameters.palette[paletteIndex]
as palette[0] for the text and graph rectangles, so they were drawn in the
panel's colour (0,0,0,0.6) and darkened the panel a second time instead of
drawing white or green. On an AMD Radeon RX 7600 (NAVI33) with Mesa 26.0.8,
agc_performance_overlay failed in its SDR case at "'6' of 'FPS: 60.0' glyph
pixel 2,0 is not white text: 0x4280161290": 0xff1e140a is the clear colour
(191,128,64) darkened by 0.4 twice, where the panel alone gives 0xff4c331a.
An integrated Radeon 660M failed at the full panel's first glyph.
The shader was valid SPIR-V: a flat uint input indexing a push-constant
array (the palette at offset 0, the extent at 48). The index is per
rectangle, and fragments of the panel and of its glyphs share waves, so it
varies within a wave; RADV read that divergent index into the push-constant
array as 0. The shader now reads each entry at a constant index and selects
one by the colour index. Every case passes on that RX 7600 with this change,
full panel included, and still passes on llvmpipe from the same Mesa.
A build keeps all of its own lookup records, so one over many textures
grows the thread-local log far past the 1024-record bound, and the vector
kept that peak capacity for the life of the thread: 2048 records after a
1500-texture build, on every thread that ever ran one.
When the outermost build or full walk ends, the log is trimmed back to
the newest 1024 records, as logLookup would have kept, and its capacity
is released once it exceeds one and a half times the bound. A log within
the bound never reaches that capacity, whether the vector grows by
doubling or by half, so ordinary builds do not reallocate. Nothing reads
the log after a build ends: captureValidation runs inside it and clears
it, a full walk clears it before its lookups, and resolveImageTables
reads only the record its own lookup just added.
The debt entry cited ARB_multisample's centermost-sample shortcut as
what a single-sample scan into a multisampled depth target draws. The
draw tests each depth and stencil sample with the depth at the pixel
center, which is the rule above that shortcut (L185-L190 and
L422-L425); the shortcut is now named as an unmeasured alternative.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A draw with PA_SC_AA_CONFIG.MSAA_NUM_SAMPLES 0 and MSAA_ENABLE clear
into a 4x depth target threw "the depth target's sample count differs
from the rasterizer's", which stops METAL GEAR SOLID: Peace Walker
(PPSA18216) at its first presentation. Such a draw now rasterizes the
depth target's sample count with every sample at the pixel center, as
a single-sample scan into a multisampled color target already does.
radeonsi programs this MSAA_ENABLE and PA_SC_AA_CONFIG with the depth
buffer's own sample count when GL multisampling is disabled, and GL
then gives full coverage with every depth and stencil sample set from
the pixel center.
Triangles and rectangles are accepted. Points, lines, alpha-to-coverage,
DB_EQAA Z interpolation or overrasterization, a pixel program reading
the sample index and a sample-mask export throw on this path, as does
a single-sample color target next to the multisampled depth target.
The primitive check is shared with the single-sample MSAA_ENABLE rule,
whose behaviour and messages are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The overlay's render pass starts in the layout the image was left in and
ends in the one its caller needs next, but the attachment view allowed only
COLOR_ATTACHMENT usage. A pass that starts in TRANSFER_DST_OPTIMAL (the
present path when nothing was drawn, and the tests) or ends in
TRANSFER_SRC_OPTIMAL (the tests' readback) then broke
VUID-vkCmdBeginRenderPass-initialLayout-00898 and -00899. The view now
also allows TRANSFER_DST or TRANSFER_SRC when the pass names that layout.
Swapchain images have TRANSFER_DST and their pass ends in PRESENT_SRC, so
the present path asks only for that; the test's cost report image, whose
pass ends in TRANSFER_SRC_OPTIMAL, is now created with TRANSFER_SRC.
unwrap_self matched SELF records to PT_LOADs by size only and placed
every segment without a vaddr by the shift of the last mapped one. In the
19 modules of PPSA03743/PPSA03363 (Soul Hackers 2) the SCE comment
segment has a record of its own, after a 0x20-byte digest block, so it
and the version segment behind it were read 0x20 bytes too early, and in
the sce_module libraries, where the ELF puts a PT_NOTE between them, the
version segment was cut to a few bytes at the end of the file.
A record with flag 0x800 now places the program header whose index is in
flags bits 20 and up. Segments without a vaddr that follow the last
recorded one are read back to back after it; the PT_NOTE among them is
not stored in the container and is emitted without file bytes.
Unreal titles end in their own libc fatal path with the UTF-16
LowLevelFatalError message in a register, and the crash report shows
only the first 64 bytes of it as hex words, so the message is lost
(#4238: Demon Slayer PPSA03490, Stray PPSA02100).
For every general register that points at readable memory starting
with at least four printable ASCII characters, as UTF-16LE or as single
bytes, the report now prints the text up to a NUL, the first other
character, 512 characters or the end of readable memory (each page is
checked with VirtualQuery before it is read).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
agc_driver_rect_list_indirect compared the indirect draws' output with
the direct draws only, so it also passed when the records were read on
the CPU. Its records lived in a static array that is not guest memory,
so every indirect draw fell back to the CPU path as not imported.
The records now sit in a registered 64 KiB guest allocation, the test
turns on APS5_PROFILE_DRAW and reads the indirect-draw counters through
the new Graphics::IndirectDrawCounts, and it requires all four indirect
draws on the GPU path. It fails with APS5_NO_RECT_INDIRECT=1 and with
the IndirectDraw.cpp and Draw.cpp changes reverted (4 non-vertex path).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The fixture builds its project under a directory symlink so that the
paths CMake records differ from the resolved ones. Creating a symlink on
Windows needs SeCreateSymbolicLinkPrivilege, which a user without
Developer Mode or elevation lacks, so setUpClass failed with WinError
1314 and select_tests failed on every local Windows run. On that error
the link is now a directory junction, a reparse point realpath resolves
the same way. Where symlinks can be created nothing changes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
WindowsThreadLocal<T>::slot was a template static, so its dynamic
initialization was unordered against the timer self-test in Time.cpp.
With APS5_TRACE_TIMERS set, the self-test ran first, used slot 0 and
aborted every title with "Cannot bind native thread state". The slot is
now a function-local static. guest_nanosleep_timer_self_test runs
guest_nanosleep_tests with APS5_TRACE_TIMERS=1 on Windows.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01KwsvKtVsZDLefysUM9m2QS
A copy reads its source when the pipeline runs it, so it sees the fill ahead of it. Large immediate fills stay buffer fills, host copies stay counted, and marker push and pop still update the queue.