The per-attribute append reallocated the attribute array by one element every time (the 'attribCount < groupAttribIndex+1' guard was always true), so a buffer group with K attributes cost O(K^2) copies. Reallocate with power-of-two capacity instead - O(K) amortized. Micro-benchmark: 2.2x faster at K=8 attributes, scaling to 8.3x at K=128.
Replace the byte-then-bit linear scan in IMLPhysRegisterSet::GetFirstAvailableReg / GetNextAvailableReg with std::countr_zero (single tzcnt / rbit+clz). Behaviour-identical (both return the index of the lowest set bit), branchless, and ~16x faster on the isolated scan in a micro-benchmark - it removes the mispredicted inner-loop branches.
Add targeted vcpkg overrides for openssl (3.5.0 -> 3.6.2) and curl (8.14.1 -> 8.20.0) to pick up security fixes, while leaving the builtin-baseline untouched to avoid a broad, risky version sweep (a full baseline bump pulled libusb 1.0.30, which needs autoreconf tooling not present on the Linux CI images).
Also bump the header-only Vulkan-Headers and the small ZArchive submodule to their latest upstream commits.
- stwcx. loaded the summary-overflow source from CR0[SO] instead of XER[SO], making the subsequent CR0[SO] assignment a no-op. Other compare paths already read XER[SO] correctly.
- Default the IMLReg/IMLInstruction copy constructors so IMLInstruction becomes trivially copyable, letting the IML instruction vectors relocate with memmove instead of per-element copies.
- Fix an infinite loop when removing a shader from the middle of a cache chain (the list traversal never advanced).
- Vulkan direct-access path: record the bound vertex-buffer offset so the redundant-bind check works; previously one vkCmdBindVertexBuffers per buffer group was issued on every draw.
- Fix an out-of-bounds __m256i lane read in the clang texture-hash path.
- Fix a use-after-free read in the texture-readback queue and an inverted fetch-shader cache assertion.
- Initialize MetalRenderer commit-threshold fields; avoid re-strlen'ing the shader source when assigning it.
- MemMapperUnix: mmap returns MAP_FAILED (not NULL) on failure; translate it to nullptr so the existing '!ptr' checks in the memory backend actually detect a failed reservation.
- coreinit: bound writes to the fixed 256-entry active-thread array.
- betype: operator|(betype) returned a reference to a local temporary; return by value like the sibling overload.
- WUD: compute the index-table size in 64-bit and validate it against the file size before allocating, and null-check the allocation. A crafted uncompressedSize could previously overflow a 32-bit size and under-allocate, leading to out-of-bounds access.
- WUHB: guard against a zero-sized hash table (division by zero) and cap hash-chain traversal to avoid an infinite loop on cyclic chains.
- WUHB directory listing and FSA ReadDir: use bounded, always-NUL-terminated name copies (a 128-255 byte filename could overflow the guest response).
- Verify the SHA-256 of the downloaded MoltenVK tarball before extracting it (macOS jobs).
- Add concurrency cancellation so superseded PR/push builds stop instead of running the full matrix to completion.
- Replace the removed ::set-output workflow command with $GITHUB_OUTPUT in the release version calculation.
Requires both VK_EXT_attachment_feedback_loop and VK_EXT_attachment_feedback_loop_dynamic_state to be provided by the driver. Otherwise it will fall back to the old code. Main benefit is for improving performance as it makes barriers cheaper and doesn't force us to unnecessarily interrupt renderpasses
Skips the overhead of having to lookup each shader stage individually. Additionally, having whole sets as a lookup key gives us a more trustworthy heuristic than if we only have independent information for each shader stage. We can use this to skip shader hashing most of the time when they are part of a known set.
When coreinit exit() is hit, then Cemu will only close when the game was launched directly via command line parameters (-g or -t). Otherwise it returns to the game list. In the case where Cemu closes it will forward the coreinit exit status code as it's own exit status code. This is useful for cases where Cemu is used as a CLI tool for testing homebrew