Commit Graph
28 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5 44b832f755 Debugger: add game.speed.get/set for fast-forward and a speed percentage
Both mechanisms already existed and just weren't reachable from the WebSocket
API: PSP_CoreParameter().fastForward for unlimited, and an FPSLimit mode plus a
target frame rate for everything else. FrameTimingLimit() in sceDisplay.cpp is
where they all resolve to a single number.

The one thing worth being careful about is which knob to drive. Reusing
CUSTOM1/CUSTOM2 - the user's own alternative speeds - would have meant writing
g_Config.iFpsLimit1, which is persisted per game, so a debugger session would
permanently overwrite whatever speed the user had configured. Same class of
mistake as a debug setting leaking into the saved config. So this gets its own
FPSLimit::DEBUGGER mode and a debuggerFpsLimit field on CoreParameter, which
isn't persisted and is value-initialized on every boot. Two things fall out for
free: the analog-speed handler already backs off for any mode it doesn't own
(EmuScreen.cpp), and a debugger can't leave a game slowed down after a restart.

Percentages are relative to 60 FPS, the same convention GameSettingsScreen uses
when presenting the alternative speeds, so "200%" means one thing across the
app. Unlimited is fastForward rather than percent 0, so there's a single way to
express it.

The response reports limitFps straight from FrameTimingLimit(), exposed for the
purpose. That's the number the frame timing actually consumes, so a client never
has to reconstruct the interaction between fast-forward, this override and the
user's own hotkeys - which is exactly the sort of thing that goes stale.

Requests fail rather than being quietly ignored when something else owns the
speed: achievements hardcore mode, or netplay without the "allow speed control
while connected" option. Being ignored with a successful response is the worst
outcome for an automation client.

Verified against a running headless instance: percent 200 with fast-forward off
resolves to limitFps 120, fast-forward takes it to 0 while remembering the 200
underneath, an explicit null clears it, and out-of-range or empty requests are
rejected. The throttle *behaviour* is not verified end to end - a debug,
software-rendered headless build runs this game at about 1% of real time, so it
never reaches any of these targets and the limit can't be observed. That path is
shared with the existing CUSTOM1/CUSTOM2 speeds and unchanged.

sceNet.h is forward-declared rather than included: it reaches windows.h through
proAdhoc.h, which redefines the OPTIONAL macro that collides with
DebuggerParamType::OPTIONAL - the hazard this file's header comment already
warns about.

pspautotests 314/314, UnitTest 55/55.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9
2026-08-18 13:42:13 +02:00
Henrik Rydgård a44c2c0bde Replace System_SendDebugOutput with a registered callback
I normally try to avoid registrations when not needed, but in this case
only headless uses this, so it's motivated.
2026-08-11 22:36:47 +02:00
Henrik Rydgård 67010ff2af Split the display layout config between landscape and portrait orientations 2025-11-05 12:49:51 +01:00
Nabile Rahmani 7af15c73bc [Feature] Option to override the display refresh rate
This adds a per-game graphics option, `DisplayRefreshRate`, to override the display refresh rate.

It defaults to 60 Hz, and is located in Dev tools.

Games using variable timesteps benefit from higher refresh rates.

Closes #19319
2024-07-13 15:04:20 +02:00
Lubos 2887671e6f OpenXR - Refactor display framerate 2022-08-17 16:55:19 +02:00
LunaMoo 0dcf8242f5 Add Fixed60FPShack for GOW, should work smoother than the ForceMax60FPS.
Also more stable than it's CWCheat version, unfortunately because of that,
still causes softlock in GOW:GOS vortex stage.
2022-07-02 19:39:35 +02:00
Unknown W. Brackets 48b597a1b9 Display: Move core counters/stats to HW file.
This separates things better, so not everything is pulling in HLE.
2022-01-30 11:53:48 -08:00
Unknown W. Brackets ad2e380987 Display: Move listeners to separate HW file.
Mixing this in with the HLE management funcs was messy.
2022-01-30 09:41:08 -08:00
Unknown W. Brackets a06efdd222 Display: Allow threadsafe listeners.
Also add a flip listener.
2021-10-19 10:01:40 -07:00
Unknown W. Brackets ce694da5ff UI: Separate sleep time in frame time graph.
It's useful to know how much of the frame time is active vs inactive.
2020-02-17 11:29:32 -08:00
iota97 90ff68e6c9 Framegraph in devmenu 2020-02-11 08:19:30 +01:00
Unknown W. Brackets 82beb726fc GE Debugger: Record init state and display buf.
Some things are now visible, but still drawing wrong...
2017-06-04 10:38:52 -07:00
Henrik Rydgard 727058fc27 Remove an entry from GPUStats that didn't really belong. 2016-04-02 11:06:05 +02:00
Henrik Rydgard 02a89306d1 Warning fixes, sprintf->snprintf 2014-09-13 23:51:07 +02:00
Henrik Rydgard 3b2fed472e Correct timing on resume, avoids small speed burst when resuming gameplay from pause 2014-06-14 23:56:16 +02:00
sum2012 f0ad992b67 Add sceCtrl_driver and sceDisplay_driver 2014-02-17 20:46:57 +08:00
Henrik Rydgård 7c7c4aaadc Add "u_time" uniform to postprocessing shaders. 2013-12-02 17:24:55 +01:00
Sacha fb7c3d96fd Introduce Timer Hack.
Has been used in previous Symbian releases to improve speed. Was thought to only work on Wipeout but actually works on most games?
Games that run based on internal timer will experience 60 VPS without frameskip.
2013-11-16 02:16:17 +10:00
Henrik Rydgard 6ca3b43b9a Measure actual fps (frameskip+unthrottle included), show all three on one line if you choose "both" (which I probably should rename)
Also prevent annoying scrolls in key mapping dialog
2013-08-19 22:06:49 +02:00
Unknown W. Brackets 50eb11c66f Log some additional things during reporting. 2013-05-19 22:12:39 -07:00
Henrik Rydgard 7900a6d807 Don't use PPGe for debug overlays. Fixes fps counter in games where it didn't work before. 2013-04-07 22:43:59 +02:00
Unknown W. Brackets f875e3699f Handle the emit screenshot headless command.
But, it doesn't work.  Shouldn't the vram have the graphics?
2013-02-07 22:44:54 -08:00
Unknown W. Brackets 5999fac10d Start saving the state of the GPU.
Not 100% sure this is all that's needed, but let's try it.
2012-12-28 13:55:30 -08:00
Henrik Rydgård d95dbca9be Cleanup GPU init/shutdown a bit 2012-12-25 22:42:19 +01:00
Unknown W. Brackets fd2d666191 Add ctrl sampling (vblank).
This makes it work like the PSP does with number of buffers, etc.
Still doesn't wait yet.
2012-12-02 15:44:23 -08:00
Henrik Rydgård fb25b7405c Synchronize the mainloop to the display end-of-frame on nonWindows
platforms.
2012-11-19 14:16:37 +01:00
Henrik Rydgard 64cc573703 Switch to "GPL 2.0 or later" for various reasons. I wrote most of the code I imported from Dolphin (which is GPL2-but-not-later), so it should be OK. 2012-11-04 23:24:00 +01:00
Henrik Rydgard 4f7ad15758 Add snapshot of the whole source code. 2012-11-01 16:19:01 +01:00