Commit Graph
56 Commits
Author SHA1 Message Date
libretroadmin f1208a7a5a Make threading lock-free
The core and the headless tools no longer use mutexes, condition variables,
spinlocks, std::atomic, std::thread or volatile flags. Threads hand off through
libretro-common's retro_atomic and rthreads plus a few small pieces on top of
them in Common/Thread: Thread, MpscQueue, EventCounter, ParkingLot waits and
ReaderGate. Every wait blocks until it's woken; nothing polls on a timer.

State that only one thread touches just loses its lock. The PSP filesystem,
sceIo and the savedata dialog now belong to the emulation thread: async reads
and writes run when they're queued and complete later in emulated time, and
the IO and savedata threads are gone. The friend finder only talks to the
adhoc server and hands what it gets to the emulation thread. GPU init always
runs on the thread that starts the game.

The Vulkan render and compile queues, pipeline and render pass caches, delete
list and SPIR-V cache, the GL render queue, the software renderer's jit caches,
the file loader caches, the web debugger, UPnP, input, savestates, logging and
the GE debugger all hand off through queues and atomics. The IR jit's spinning
profiler thread goes.

A CPU thread with nothing to run now sleeps until work is queued instead of
spinning. Headless with --debugger waits for a client while stopped, and ends
the run once every client that connected has left. Web server shutdown keeps
servicing the CPU queue until the server has finished.
2026-10-09 04:56:16 +02:00
libretroadmin d56b453891 Replace zlib, zstd, libchdr, libzip and libpng with libretro-common
Deflate, zlib and gzip streams go through rinflate and rdeflate, zstd
through rzstd, CHD images through rchd, zip archives through
rzip_archive and PNG through rpng. The bundled libraries, their build
glue and the system-library options are gone; adler32 and uncompress
keep zlib's ABI for the prebuilt FFmpeg archives that still call them.
libretro-common is one CMake library that the core, the headless tool
and the unit tests all link.

The reads take shorter paths on the way. CHD decodes straight from the
loader's reads and a range of blocks at a time, and a file read at any
alignment decodes into place; CSO keeps one inflate stream instead of
one per block; a plain ISO serves a file read with one read of its exact
bytes; a stored zip member is read in place and a deflated one through
restart points rather than a copy of the whole image in memory; zip
members decode into the caller's buffer; sequential reads through the
frontend's VFS skip the seek, which also keeps its buffering.

libretro/test reads one image as ISO, CSO, CHD and zip through the block
devices, boots each, and checks the codecs against Python-made vectors;
a CI job runs it.
2026-10-08 14:14:38 +02:00
499cdd55ad Validate untrusted IDs before using them as directory names
Texture pack installs took the destination directory from the archive's
textures.ini, and PKG update installs from the PBOOT's DISC_ID, both
unchecked, so a crafted archive or package could write outside
PSP/TEXTURES or PSP/GAME. Add IsSafePathComponent() to PathUtil and check
both, replacing the WebServer's own upload filename check with it too.

DISC_ID from any PARAM.SFO also names configs, cheats, textures, exdata
and savestates, so ReadSFO now drops one that isn't a safe name and the
game gets a fake ID like homebrew. The same goes for a frame dump's ID.

Combines #22419 and #22420 by Acts1631.

Co-Authored-By: Acts1631 <acts1631kjv@proton.me>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 13:39:06 -06:00
Henrik RydgårdandClaude Opus 5.5 ab57dca598 GE dump playback: Restore the base after wrapping the list
The jump back to the start of the list buffer sets BASE to the buffer's,
but vertex and index addresses already queued for the next draw were made
for the previous one, so they pointed 16 MB away. Tiger Woods (ULUS10420)
read a skinned draw's indices as zeros and lost it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 15:09:43 -06:00
Henrik RydgårdandClaude Opus 5.5 80a03ead6a GE dump playback: Copy recorded buffers around what the replay drew
The software renderer has the real contents of what a replay drew, and a
recorded framebuffer texture can be stale or run over other buffers at its
recorded size. So a copy leaves out the areas the replay's draws could reach
(region and scissor, or the vertex bounds of a 2D draw), instead of skipping
it only when it starts at a drawn buffer:
- Princess Maker 5 textures from the right half of its 1024 wide
  framebuffer, and the copy blanked the whole frame.
- Rainbow Six (ULUS10206) copies its 512x512 frame texture, which covers its
  display buffer, before each strip it draws into that buffer.
- Burnout keeps a texture beside its frame in columns 480-511, which still
  comes through.
- Depth writes count as whole rows in 8-row bands, since the PSP stores
  depth swizzled (SOCOM UCUS98649's frame texture copy ran into its depth
  buffer's columns 480-511).
Copies also stop at the end of VRAM, and flush the software renderer's
queued draws before writing.

Memsets were also never applied with the software renderer, which leaves
them to the caller.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 15:09:43 -06:00
Henrik RydgårdandClaude Opus 5.5 b49fb11261 GE dump playback: Don't overwrite a buffer the replay drew to
With the software renderer, a FRAMEBUF texture snapshot of a framebuffer
this replay already rendered to is skipped: the dump's copy can be stale
(recorded on a hardware backend that never read it back), and it wiped the
frame in a GTA LCS dump (issue 18467's dump now matches the PSP exactly).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 15:09:43 -06:00
Henrik RydgårdandClaude Opus 5.5 2c5ff39238 Headless: Add --screenshot-render-target
Lets a dump replay stopped with --replay-end be compared against the PSP on
an offscreen buffer. The framebuffer commands after the draw limit are
dropped too, so it shows the buffer the last drawn primitive went to.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 15:09:42 -06:00
Henrik RydgårdandClaude Opus 5.5 3c450eed4b Headless: Add --depth-save and --replay-end for frame dump comparisons
--depth-save writes the depth buffer next to the screenshot (u32 width, u32
height, then u16 depths), and --replay-end stops a frame dump replay after
that many primitives. Both match pspautotests' ppdmp-playback, so a dump's
depth can be compared with the PSP's at any point in the frame.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 15:09:42 -06:00
Henrik Rydgård e9a3449ede More MIPSState * plumbing (manual) 2026-08-12 14:02:19 +02:00
Henrik Rydgård 0596ee97f6 More memory access cleanup 2026-08-11 20:14:01 +02:00
Henrik Rydgård 3fd9b42f95 Fix playback of framedumps for headless 2026-07-18 19:09:46 +02:00
Henrik Rydgård a317890c08 Remove the GPUDebugInterface class
Just a pointless extra layer in the class hiearchy, making it
unnecessarily hard to modify the interface.

Might as well hit GPUCommon directly.
2026-06-02 11:15:08 +02:00
Henrik Rydgård cdc3a19284 Fix exiting from framedump playback while paused inside a display list
Fixes #20304
2025-04-30 15:53:55 +02:00
Henrik Rydgård 4d215b1f54 Cleaner exit from when stepping through a frame dump 2025-04-07 16:34:17 +02:00
Henrik Rydgård 605daf879b Minor cleanup. Fix file handle leak when opening zip files from the main screen. 2025-04-07 15:42:51 +02:00
Henrik Rydgård 2cc631338b Correctly unload GE framedumps. Additionally, look up the title when possible and show in titlebar. 2025-03-06 14:58:33 +01:00
Henrik Rydgård 3ab625a0fa Windows: Lock when updating the window title 2025-03-06 14:24:40 +01:00
Henrik Rydgård 85c015efb8 Remove redundant shutdown callback 2025-02-13 15:13:25 -06:00
Henrik Rydgård 638607d29a Refactor: Make GPUCommon own the framedump "recorder". 2024-12-15 12:07:44 +01:00
Henrik Rydgård e3aaf93e28 Add a new log category 2024-12-10 10:34:26 +01:00
Henrik Rydgård 87e9bcdc09 Playback: Remove logging, improve locking, works now it seems 2024-12-10 01:27:25 +01:00
Henrik Rydgård 4befbeac7c Move the dump playback mips code to Playback.cpp. Assorted cleanup. 2024-12-10 01:27:25 +01:00
Henrik Rydgård f20266a089 Playback: Match the real sceGe functions better. 2024-12-10 01:27:25 +01:00
Henrik Rydgård 839df81852 thread solution: initial progress 2024-12-10 01:27:25 +01:00
Henrik Rydgård 8b706ba791 Break out a LoadReplay function 2024-12-10 01:27:25 +01:00
Henrik Rydgård 983ea69a57 Replay: Add some plumbing to propagate the Break status outwards 2024-12-10 01:27:25 +01:00
Henrik Rydgård 10445c97d8 Warning fix 2024-12-10 01:02:49 +01:00
Henrik Rydgård de3617529f const, rename a function 2024-12-10 01:01:31 +01:00
Henrik Rydgård a94431f4fa Remove an unnecessary wrapper function 2024-12-10 01:01:05 +01:00
Henrik Rydgård 474e7acf54 Hook up the new (bare-bones) ImGui debug window to GPU stepping, fix stepping. 2024-12-05 00:51:59 +01:00
Henrik Rydgård c25e6b3933 Add "Split syscall" mechanism 2024-12-05 00:05:39 +01:00
Henrik Rydgård e977906d75 Lift out running the display list to the callers.
This has one tricky case though...
2024-12-03 22:35:36 +01:00
Henrik Rydgård 0df2a40487 Remove the "GPUInterface" base class. Not really useful, GPUCommon is pretty much the same thing. 2024-12-02 11:12:14 +01:00
Henrik Rydgård e01ca5b057 Logging API change (refactor) (#19324)
* Rename LogType to Log

* Explicitly use the Log:: enum when logging. Allows for autocomplete when editing.

* Mac/ARM64 buildfix

* Do the same with the hle result log macros

* Rename the log names to mixed case while at it.

* iOS buildfix

* Qt buildfix attempt, ARM32 buildfix
2024-07-14 14:42:59 +02:00
Henrik Rydgård 8b99c9f9d9 GE dump playback: Don't flip unless DISPLAY is the last command. This messes up the frame structure. 2024-01-30 11:14:38 +01:00
Herman Semenov 309f0d97f2 [Common Data Net/Core Debugger HLE/GPU Debugger] Fixed reduction data type size to strict 32-bit integer 2023-12-14 19:26:10 +03:00
Unknown W. Brackets 6c2001d12d GE Debugger: Correct texture address corruption.
Happened when playing back frame dumps that set bufw after specifying the
texture address, but before drawing.

Seen in Syphon Filter.
2022-11-19 14:59:52 -08:00
Unknown W. Brackets 1ffdf0d5b8 GE Debugger: Respect unchanged VRAM each frame.
Oops, wasn't setting the version each run after caching the frame dump
data.
2022-11-01 22:56:29 -07:00
Unknown W. Brackets 55d5dc3834 GPU: Rename readback and buffer write operations.
Avoid download/upload and pack, which don't have clear directions.
2022-10-09 13:49:41 -07:00
Unknown W. Brackets 978fd9fc60 GE Debugger: Record the Edram translation value. 2022-10-01 23:48:06 -07:00
Unknown W. Brackets 7ff5434968 GE Debugger: Tag frame dump replay VRAM writes.
Just for debugging, it's helpful especially paired with softgpu tagging.
2022-09-23 21:20:14 -07:00
Unknown W. Brackets c3c5450b8f GE Debugger: Fix small tex/clut recopying.
If it's less than 256 bytes, we can't mark the entire VRAM area copied.
This still helps frame dumps avoid excessively slow VRAM recopying
situations, but fixes issues like missing trees in #12738.
2022-09-23 21:18:39 -07:00
Unknown W. Brackets fddcbfc5fa GE Debugger: Include rendered CLUTs in frame dumps.
Like with textures, this uses the VRAM address directly.
2022-09-19 12:01:34 -07:00
Unknown W. Brackets 132686513d GE Debugger: Correct base accounting in playback.
On a jump, was forgetting the base value which caused corruption.
2022-08-14 16:14:23 -07:00
Unknown W. Brackets 4467b7830f Debugger: Bump GE dump version to ignore bad flag. 2022-08-11 20:28:56 -07:00
Unknown W. Brackets 539e2bbbf8 Debugger: Track unchanged VRAM to avoid copy.
See #15251, the framedump here reused a VRAM texture for many draws, and
this caused it to recopy the texture over and over again.  Use a flag to
skip if possible.
2022-02-20 13:51:40 -08:00
Unknown W. Brackets f17f6465ac GE Debugger: Optimize slab lookup.
If the slab is the last one, we can grab it right away.
2022-02-07 23:55:10 -08:00
Unknown W. Brackets 1d37f24e17 GE Debugger: Reduce playback command noise.
No need to reassert these values each prim.
2022-02-05 19:27:20 -08:00
Unknown W. Brackets 2479d52202 Global: Reduce includes of common headers.
In many places, string, map, or Common.h were included but not needed.
2022-01-30 16:35:33 -08:00
Unknown W. Brackets a97030068c GE Debugger: Use zstd for save states. 2021-04-11 09:13:10 -07:00