Repository navigation
Description
OpenNOW PS5 (PPSA99082 00.002.038, homebrew) reached its "Press CROSS to sign in with NVIDIA" screen at 25.8 FPS on d8888df9b (catalog run). On current main (1c523bdb4) it presents 7 frames and then stops presenting; the process stays alive. First-parent bisect points at #4855, but the stall also happens with the PM4 ring disabled, so the ring itself does not look like the cause.
Setup
Windows 11 (26300), Radeon 860M (RDNA 3.5, driver 32.0.13058.8001), WinLibs GCC 15.2.0, Release. Each result below is a 40 to 60 s run started by tools/title_run.py (#7264) or by hand, with an empty AnyPS5 shader cache. The d8888df9b build from 2026-10-15 still reaches the sign-in screen today (25.76 FPS), so the machine and driver have not changed.
Bisect
git bisect start --first-parent 5859889b2 d8888df9b, with the relinker and every core/libs/libs/*.prx rebuilt at each step. Commits that do not contain #6814 crash at start-up in LinkPipelineFromLibraries (the prebuild race #6814 fixes), so #6814's change was applied on top of those steps.
72c5eed1f(parent of the feat(agc): keep the last submissions per queue and dump them on a stall or crash #4855 merge): renders, 3 runs of 3 (33.9, 38.7 FPS and the bisect run)a4782fe11(merge of feat(agc): keep the last submissions per queue and dump them on a stall or crash #4855): stalls after 7 presents, 3 runs of 3
What in #4855 makes the difference
Builds of a4782fe11 with parts of the change reverted, two runs each:
| Build | Result |
|---|---|
a4782fe11 |
stalled, stalled |
a4782fe11, APS5_PM4_RING=0 |
stalled, stalled |
QueueWorker.cpp, Submission.cpp and WaitMemory.cpp as in 72c5eed1f |
rendering, rendering |
only QueueWorker.cpp as in 72c5eed1f |
stalled, stalled |
only WaitMemory.cpp as in 72c5eed1f |
stalled, stalled |
executeRewindTail changes removed |
stalled, stalled |
every ring call removed from Submission.cpp (ReadSubmissionRingSettings, PrepareSubmissionRing, RecordSubmission) |
rendering, rendering |
ring read once at namespace scope, APS5_PM4_RING=0 |
stalled, stalled |
APS5_PM4_RING=abc aborts at the first submission, so the variable does reach the process. With the ring off, the remaining difference in Driver::Submit and executeRewindTail is branches that are never taken, yet removing them brings rendering back. That points at something already in or around Driver::Submit that depends on how the function is compiled (a race or undefined behaviour), which #4855 happens to expose. I have not found it.
State when stalled
Thread stacks of the stalled process on main (gdb, no debug info):
queue worker 0x0waits inDriver::runfor work, andDrawPipeline::runand bothPipelineCache::runthreads are idle.- The title's main thread waits in libkernel
TimedWait::TimerWait. - No thread is blocked inside the driver.
The title's own log (/data/opennow/media.log) and the sequence of opened files and started threads are the same as on d8888df9b up to /data/opennow/account.bin. The last AnyPS5 line is the creation of a 1920x1080 storage texture (tile=7 format=56); on d8888df9b storage texture write-backs follow there.
Reproduce
Get OpenNOW PS5 0.1 (PPSA99082) and relink it with default flags. Run it for 40 s: title_run.py reports stalled and the window title shows FPS: 0.00 (7).
@fdfawef324, in case the shape of Submit around the ring calls rings a bell.
AI-assisted
Activity
pushkarreddyy commentedon Oct 18, 2026
I am investigating this frame presentation stall on OpenNOW PS5 (
PPSA99082) following #4855 and preparing a reproduction/fix branch.babyhuey commentedon Oct 18, 2026
The same stall on NVIDIA, so it isn't specific to the Radeon. Windows 11, RTX 3080, WinLibs GCC 15.2, Release,
main13e48ed29, OpenNOW PS5 (PPSA99082, catalog zip matching its sha256), one 60 s run, title bar polled every 3 s:FPS: 0.00 (3)at about 3 s andFPS: 0.00 (7)at about 9 s, then stays at 7 presents until the run ends. The process stays alive, with no throw, FATAL or UCRT report.APS5_TRACE_WAITS=1no[waits]report is printed in 60 s: no instrumented equeue, semaphore, event-flag, address or condition wait completes after the first few seconds.data/opennow/media.logends after qualifying its decode profiles (4K120 SDR, 4K90 SDR and 1080P60 SDR H.264qualified=1; the HDR HEVC profilesqualified=0 error=ffffffff), and then it waits for sign-in.AI-assisted: yes
babyhuey commentedon Oct 18, 2026
Follow-up to my NVIDIA comment above: on the current build this looks like OpenNOW's sign-in screen being event-driven, not a presentation stall. Windows 11, RTX 3080,
mainc34e9d855.The title only presents when its view changes. In GPU mode its render loop (
src/demo_renderer.cpp,run()) doesif (draw(canvas)) { drawInterface(...); gpu::swap(); } else sceKernelUsleep(1000);.draw()insrc/main.cppreturns false when nothing changed:if (!first && !searchChanged && !searchInput.open && memcmp(&previous,&v,sizeof(v))==0 && memcmp(&previousCloud,&cv,sizeof(cv))==0 && ...) return false;. On the idle "Press CROSS" screen nothing changes, so a handful of frames and then nothing is what the code asks for.Input confirms it (keys posted to the title's own window; AnyPS5's default bindings, so arrows = D-pad and Return = Cross):
network.log) and draws the code page, "ENTER THIS CODE" with a QR code and "EXPIRES IN ... SECONDS". From then on it presents about once per second (13 frames at 26 s, 27 at 40 s), which matches the countdown changing once a second.So the question flips: why does
72c5eed1fpresent continuously at about 28 FPS on a static screen? One possibility I haven't tested:ViewandCloudViewhave padding bytes (Viewends with twobools after anunsigned), andmemcmpcompares those too. If the copies that fillvandcvcarry stack residue from host calls on the render thread, such asscePadReadState, the mutexes andDriver::Submitthroughswap(), the comparison could differ every loop depending on how AnyPS5 is compiled. That would fit the never-taken branches inSubmitchanging the result. Does that match what you see when you press a button on the stalled build, @LeandroLP23? cc @pushkarreddyy since #7535 targets this.AI-assisted: yes
LeandroLP23 commentedon Oct 18, 2026
@babyhuey yes, it matches here. The "stalled" build answers input. Radeon 860M, Windows 11 26300, the relinked OpenNOW from my earlier runs (a
mainthat shows the 7-frame stop), with Cross sent throughAPS5_PAD_INPUT_FILEandtools/pad_input.pyso it doesn't depend on window focus:pad_input.py ... crossAfter Cross it presents about once a second, and its
network.logshows the sign-in sockets and a non-blockingconnect(errno=36). So on current builds the sign-in screen is idle by design, as your reading ofdraw()says, and the title isn't stuck. (A key posted to the window while it sat unfocused behind others did nothing. AnyPS5 drops keyboard input without focus, so the pad input file was the way in.)That also fits what the bisect could never explain: removing never-taken branches from
Driver::Submitbrought the "rendering" back. That changes what is left on the render thread's stack, and with it the padding bytes yourmemcmptheory points at. I haven't checked the padding directly. Unless someone sees a reason to keep it, I'll retitle this as "OpenNOW presents only on view changes; older builds' continuous presents were likely padding residue" and close it, since nothing in AnyPS5 is stuck.AI-assisted
[-]AGC: since #4855, OpenNOW PS5 (PPSA99082) stops presenting after 7 frames, also with APS5_PM4_RING=0[/-][+]OpenNOW PS5 (PPSA99082) presents only on view changes; older builds' continuous presents were likely padding residue[/+]LeandroLP23 commentedon Oct 18, 2026
Closing: AnyPS5 isn't stuck here.
draw()in itsmain.cppreturns false when nothing changed, as @babyhuey found), so a handful of presents and then none is what the title asks for on the idle "Press CROSS" page.tools/pad_input.pyrestarts presents at about one a second, with the sign-in sockets opening (numbers above). The same holds on NVIDIA.Driver::Submitchanging the result fitmemcmpreading padding bytes whose contents depend on what is left on the render thread's stack. I haven't confirmed that directly, but it doesn't change the conclusion: the title answers input.tools/title_run.py(#7264) reports such a screen asstalled. Its documentation now says so and how to tell it from a stuck title. Thanks @babyhuey, @pushkarreddyy and @fdfawef324 for looking into it.AI-assisted