The driver refuses a draw that enables a cull distance when the device
has no shaderCullDistance, and agc_driver_vertex_clip_cull_distances,
agc_driver_vertex_clip_cull_draw (with and without the draw key) and
agc_driver_vertex_user_data_tail ran their cull distance cases anyway,
so on MoltenVK all four failed at that refusal. They now skip only
those cases when the target lacks CapabilityCullDistance, as they
already skip the mesh case without VK_EXT_mesh_shader, and the shader
debt entry records the refusal.
macOS mmap treats a non-null address as a hint, so the reused-address
test could get a heap away from the freed one. Allocate it with
mach_vm_allocate and VM_FLAGS_FIXED instead, which places it exactly
at the address or fails without replacing an existing mapping, as
MAP_FIXED_NOREPLACE does on Linux.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
FrameRecorder.cpp reads environ without declaring it, and macOS headers
do not declare it. ResidentHeapMirror.cpp passes MAP_FIXED_NOREPLACE,
which exists only on Linux; elsewhere the existing address check rejects
a mapping placed away from the hint.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A valid font-set handle with a null output now returns
SCE_FONT_ERROR_INVALID_PARAMETER instead of throwing, matching the
handle, then output, order of the firmware.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
agc_storage_idle_writeback_race refills a dead storage volume's memory on the CPU while its results are pending, idles every queue and checks the refill survives in watched and GPU-mapped direct memory, both for a plain idle write-back and after a shadow publish.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
When every queue idles the driver stores all pending storage results. Into a
host import that was a GPU copy landing after the batch ran, so guest stores
made while it was in flight were overwritten by the older results: MC D2
reuses a freed 3D storage image's memory for a CPU volume during loading and
crashes on the stale texels. Idle write-backs now take the CPU path, and idle
shadow publishes copy to a host buffer and store per 64 KiB unit at
completion unless the guest wrote that unit since.
Minecraft Legends (PPSA05510) imports _ZTISt15underflow_error (NID
oNRAB0Zs2+0). Add it next to overflow_error, with the same single-inheritance
record over runtime_error, its vtable and the destructor that releases the
allocated message.
A thread_local with a destructor in a module runs after emulated TLS freed
it on Windows, which prx_thread_local_destructors refuses. The per-thread
read event now lives in HostThreadLocal, as the other per-thread driver
state does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A handle opened without FILE_FLAG_OVERLAPPED serializes its reads, so
replay threads reading modules from the journal waited for each other on
Windows even though each ReadFile passed its own offset. The journal is
now opened overlapped, and each read waits on a per-thread event with
GetOverlappedResult.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The journal was read whole into one buffer that the decoded modules
viewed, so a replay held the entire file (1 GiB at the default
APS5_PIPELINE_JOURNAL_MAX_MIB) until its last entry was built. The load
now parses the file a record at a time through positioned reads and keeps
it open; a replay thread reads an entry's modules again when it builds the
entry and rejects it when a record no longer reads back as loaded. The
replay report gains the peak module bytes held at once.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
LinuxElfPatcher wrote --rpath into DT_RUNPATH unchanged, so an empty
entry (an empty value, a leading or trailing colon, or a double colon)
reached the output, where glibc searches the working directory for it,
while the macOS and Windows outputs reject empty run paths. The guest
module rule that each entry is absolute or begins with $ORIGIN only
looked at the start of the whole value, so "$ORIGIN/libs:" or
"$ORIGIN:relative/libs" passed. The Linux patcher now rejects an empty
entry with the message the macOS patcher uses, the guest rule checks
every colon-separated entry, and USAGE.md says so.
Bases() counted only base subobjects reached through public paths, so a
class with the same base once publicly and once privately looked like it
had a unique base. Catch matching, the RTTI upcast callbacks and
__dynamic_cast's cross-cast then accepted it, where C++ requires an
unambiguous public base and libsupc++'s __do_upcast/__do_dyncast reject
it as ambiguous. Count every path to the base for ambiguity, and accept
the single subobject only when at least one path to it is public.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
On the hosted Windows runner the CRT keeps the system's daylight bias (0) when TZ changes, so PST8PDT in July converted with -(28800 + 0) = -28800 instead of -25200. The two Windows zone checks now save the bias, set it to -3600 after each PST8PDT or EST5EDT zone is selected, and restore it on exit. The expected winter and summer offsets and daylight flags are unchanged.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
ComputeFontGlyphsOutlineProfile read font->library before checking the
handle and cleared the output only after the context lookup, relying on
sceFontGetFontGlyphsOutlineProfile to have validated the handle. It now
rejects a null or non-font handle with SCE_FONT_ERROR_INVALID_FONT_HANDLE
first, clearing a non-null output, then checks the output, then clears it
before the library and context lookups, matching the firmware 13.60 order.
The test also covers a null output with a bad handle and a handle with no
library.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The batch summary passed the total file and module counts through the
byte formatter, so two apps with 1519 files and 5 modules showed
"1.5 KiB files" and "5 B modules". Counts are now printed as numbers,
as the per-app list and the single-app summary already do.
Co-Authored-By: Claude Opus 5.5 <[email protected]>