Repository navigation
Tags
Tags
Texture packs: a This Game list in both browsers, shown while a game … …runs The Qt page and Big Picture both gain a This Game filter that appears only while a game is running and lists only the packs that match that game's serial. Both open on it when a game is running, instead of mixing the running game's packs into My Games. In a game's own settings window the filter is not offered, because the whole page is already that game's.
EE arm64: stop with a post-mortem when ERET returns to an unaligned a… …ddress ERET takes the pc from ErrorEPC when Status.ERL is set and from EPC otherwise, and the guest can store any value in either. recERET runs the interpreter's ERET and the block then dispatched to that pc, so an unaligned EPC reached DispatcherReg's 8-byte table load and crashed with no error line, the way five field reports die. After the call the block now loads cpuRegs.pc, tests its low two bits and branches, when set, to a cold island whose body sets recError's arguments and jumps to RecErrorExit. Three instructions on the normal path, in ERET blocks only. The check has to be generated code: recBranchCallNoGprWrite stores the cycle count and the caller-saved pins before the call but leaves the callee-saved pins in their registers, so a longjmp from inside the call would lose those guest values. RecErrorExit stores them all. The dialog says "ERET to unaligned address"; the log says which register the pc came from and why, worked out from the Status ERET left (it clears ERL and keeps EXL on the ErrorEPC path, clears EXL on the other), with the registers and the code before the ERET. The log now keys its once-only rule on (cpu, pc), so the Resume after an ERET error, which meets the pc through the entry check, does not log it a second time. Without the check both unaligned tests crash in the dispatcher. The aligned EPC and ErrorEPC returns are checked against the interpreter.
Translations: the 2.9.2 strings in all 19 languages The 163 strings added since 2.9.1 (problem reports, the microphone, the save manager and the on-screen controls) were English-only. Every key in the English table is in every language again. Each new key sits after its sorted neighbour; no existing line changed.
Android: regenerate the PGO profile on the GS span source Trained on 872de20 (the merge of gs-span-lean) on the Retroid Pocket Duo, Turnip axfl3-001: the same 16 games as the 2026-10-28 profile, 120 s each from a savestate, every game at full speed. Merged with the NDK 29 llvm-profdata, every game weight 1, not sparse: 41060 functions, total count 452,947,311,463. The previous profile was trained before the texture cache's dirty grid and the copy road kernels changed GSRendererHW::Draw and GSTextureCache, so it no longer matched those functions.
iOS: move the cheats list sections out of the view body Xcode 26.6, which CI uses, gives up on CheatsPatchesManagerView's body with "unable to type-check this expression in reasonable time", and the iOS job on upstream master fails the same way. The sections after the game row now sit in one view builder property, in the same order.
GS: keep shader caches in RAM, one pack per game, written in the back… …ground On slow storage (SD cards) the shader caches stalled play. The SPIR-V and GL program stores kept only their index in RAM and read each shader from disk on first use per session, under one lock, on the GS thread or a precompile worker; new shaders were written synchronously. The whole Vulkan pipeline cache was serialised and rewritten on the GS thread after every 32 new pipelines (256 on Android), on Android pause and at quit. Each pipeline first drawn in a session wrote and flushed a key-list record on the GS thread. GSCacheFile::Pack replaces the store and the fixed-record key file: an append-only log of checksummed records under a stamped header, read whole when it opens and served from RAM. Changes stay in RAM until a write, which appends them, or writes the pack whole when it is mostly garbage, cut by a broken record, of another stamp, or cleared. A write stops at a deadline; past a RAM cap a pack is only appended to. Another process writing the pack makes a pass skip. GSCacheFile::PackWriter writes a renderer's packs on a low-priority thread every 30 s, when asked, and once more within 2 s when the renderer closes. It also removes, once per process, the old shared stores and key lists once no build has written them for a week, packs unused for 60 days (never an open one), and interrupted writes. Vulkan keeps SPIR-V and the pipeline key list in packs under cache/gs_packs/<serial>_<CRC>/, read when the game identity is set, with the device's own shaders in gs_packs/_/. The pipeline cache is serialised and written on the writer thread, at most once a minute while it changes; vkGetPipelineCacheData puts no external-sync requirement on the cache, and the precompile workers already created pipelines during the old GS-thread flush. Android's pause hook now only asks the writer to save. OpenGL keeps its program binaries in packs the same way. Stamps are unchanged, so a cache becomes stale under exactly the same conditions as before. The clear empties open packs in place, and the Android settings clear now deletes gs_packs/ as well. Tests: pack round trip, newest record wins, erases persist, other stamp or kind replaced, broken record and torn tail cut, compaction (skipped in a pass with a deadline), RAM cap, deadline, clear, a file deleted from outside, a second writer, a full disk, the writer thread, the clear and the leftover cleanup; the libretro file-layer test moves to packs.
CI: Linux-only release runs, and stable Linux builds never save their… … compiler cache The Release workflow gets an "android" switch, on by default. With it off the run builds and uploads only the Linux AppImages and never touches the draft's .apk assets, for releases whose APKs are built by hand. A stable Linux build compiles the RetroAchievements client identity into its objects, and a ccache saved on the default branch can be restored by any pull request, forks included. Stable builds now only restore the nightly's cache.
PreviousNext