mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
An interrupt with no handler to run, a vblank with none registered for example, switched the running thread off to idle and left it there until some later event rescheduled: ~775us of every frame in a game that spins without a vblank handler. It now reschedules at once. Taking an interrupt also clears the ll bit directly, which that switch had been doing. Interrupt handlers can now carry a cost before they run and after the last queued one returns. Alarms use it: on hardware a thread that keeps running loses ~70us to an alarm handler, and a thread the handler wakes runs ~50us after it (pspautotests threads/scheduling/alarmcosts), so 17us in and 40us out. sceKernelSetAlarm's 40us is split evenly around the deadline, keeping the handler ~1040us after a 1000us alarm. A handler's return value re-arms its alarm counting from the previous deadline, so a repeating alarm doesn't drift by those costs, unless that's already past, as after interrupts were suspended for a while. The vblank's own cost (~62us of CPU on hardware) isn't charged yet: with it, a waiter ~90us after the vblank still reads hcount 1 on hardware, but line 2 here. Hardware evidently raises the interrupt ~40us before the line count wraps. That's noted where the waiters are released. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>