Skip to content

OpenNOW PS5 (PPSA99082) presents only on view changes; older builds' continuous presents were likely padding residue #7501

Closed as not planned

Description

@LeandroLP23

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.

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 0x0 waits in Driver::run for work, and DrawPipeline::run and both PipelineCache::run threads 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

  1. pushkarreddyy commented on Oct 18, 2026

    @pushkarreddyy
    Contributor

    I am investigating this frame presentation stall on OpenNOW PS5 (PPSA99082) following #4855 and preparing a reproduction/fix branch.

  2. babyhuey commented on Oct 18, 2026

    @babyhuey
    Contributor

    The same stall on NVIDIA, so it isn't specific to the Radeon. Windows 11, RTX 3080, WinLibs GCC 15.2, Release, main 13e48ed29, OpenNOW PS5 (PPSA99082, catalog zip matching its sha256), one 60 s run, title bar polled every 3 s:

    • The title bar reads FPS: 0.00 (3) at about 3 s and FPS: 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.
    • A screenshot at about 57 s shows the sign-in screen fully drawn ("Press CROSS to sign in with NVIDIA", "X SIGN IN / O CLOSE APP", "OUTPUT 3840x2160 / 120 HZ / SDR"). So the seventh present has a complete frame, and nothing is presented after it.
    • With APS5_TRACE_WAITS=1 no [waits] report is printed in 60 s: no instrumented equeue, semaphore, event-flag, address or condition wait completes after the first few seconds.
    • Its own data/opennow/media.log ends after qualifying its decode profiles (4K120 SDR, 4K90 SDR and 1080P60 SDR H.264 qualified=1; the HDR HEVC profiles qualified=0 error=ffffffff), and then it waits for sign-in.

    AI-assisted: yes

  3. babyhuey commented on Oct 18, 2026

    @babyhuey
    Contributor

    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, main c34e9d855.

    The title only presents when its view changes. In GPU mode its render loop (src/demo_renderer.cpp, run()) does if (draw(canvas)) { drawInterface(...); gpu::swap(); } else sceKernelUsleep(1000);. draw() in src/main.cpp returns 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):

    • It settles at 8 presents by about 4 s.
    • D-pad Down at 12 s: no change, as expected, since that screen has nothing to navigate.
    • Cross at 22 s: it starts the device-code sign-in (new worker threads and non-blocking connects in its own 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.
    • Along the way: the end-of-pipe marker, flip count and flip events all advance normally through frame 7. VideoOut's buffer labels are only ever cleared, and the title never asks for them. Delaying the idle storage flush to 30 s changes nothing. fix(agc): wake queue 0 when storage results are pending #7535 doesn't change the frame count either.

    So the question flips: why does 72c5eed1f present continuously at about 28 FPS on a static screen? One possibility I haven't tested: View and CloudView have padding bytes (View ends with two bools after an unsigned), and memcmp compares those too. If the copies that fill v and cv carry stack residue from host calls on the render thread, such as scePadReadState, the mutexes and Driver::Submit through swap(), the comparison could differ every loop depending on how AnyPS5 is compiled. That would fit the never-taken branches in Submit changing 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

  4. LeandroLP23 commented on Oct 18, 2026

    @LeandroLP23
    ContributorAuthor

    @babyhuey yes, it matches here. The "stalled" build answers input. Radeon 860M, Windows 11 26300, the relinked OpenNOW from my earlier runs (a main that shows the 7-frame stop), with Cross sent through APS5_PAD_INPUT_FILE and tools/pad_input.py so it doesn't depend on window focus:

    time presents (window title)
    10 s 7
    18 s 7
    18 s pad_input.py ... cross
    22 s 13
    26 s 17
    30 s 21
    38 s 28

    After Cross it presents about once a second, and its network.log shows the sign-in sockets and a non-blocking connect (errno=36). So on current builds the sign-in screen is idle by design, as your reading of draw() 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::Submit brought the "rendering" back. That changes what is left on the render thread's stack, and with it the padding bytes your memcmp theory 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

  5. changed the title [-]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[/+] on Oct 18, 2026
  6. LeandroLP23 commented on Oct 18, 2026

    @LeandroLP23
    ContributorAuthor

    Closing: AnyPS5 isn't stuck here.

    • OpenNOW's sign-in screen presents only when its view changes (draw() in its main.cpp returns 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.
    • Sending Cross through tools/pad_input.py restarts presents at about one a second, with the sign-in sockets opening (numbers above). The same holds on NVIDIA.
    • The bisect to feat(agc): keep the last submissions per queue and dump them on a stall or crash #4855 and the never-taken branches in Driver::Submit changing the result fit memcmp reading 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 as stalled. 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions