Black screen after the intro movie: an idle decoder's buffers stay unreached until the next submission #235

Merged
Zorkats merged 1 commit from movie-end-black-screen into main 2026-11-07 23:46:13 +00:00
Zorkats commented 2026-11-07 17:07:26 +00:00 (Migrated from github.com)

Fixes the black screen after the intro movie: the movie never stopped, so the title screen never came.

When a movie ends, the movie library's VideoDecoder::Flush recycles output buffers until it finds one whose sync is not reached yet. Our HLE reported every buffer's sync as reached, so Flush looped forever and the game sat on a black screen.

Now a buffer handed out by a decoder with nothing left to decode gets a sync that stays unreached until the next submission, like the hardware's fence would. The library also waits for that sync through RequestSyncPointEvent, and the event callback aborts unless TryWaitNativeSync agrees, so an event for an unreached sync is signalled at the next submission instead of right away.

Tested on an RTX 3060 Ti: the intro plays to the end and the title screen shows. With HOS_VIDEO_LOG=1 the log goes Flush, one idle acquire, Stop, nn::movie::Finalize, and the second movie plays after it.

Fixes the black screen after the intro movie: the movie never stopped, so the title screen never came. When a movie ends, the movie library's `VideoDecoder::Flush` recycles output buffers until it finds one whose sync is not reached yet. Our HLE reported every buffer's sync as reached, so `Flush` looped forever and the game sat on a black screen. Now a buffer handed out by a decoder with nothing left to decode gets a sync that stays unreached until the next submission, like the hardware's fence would. The library also waits for that sync through `RequestSyncPointEvent`, and the event callback aborts unless `TryWaitNativeSync` agrees, so an event for an unreached sync is signalled at the next submission instead of right away. Tested on an RTX 3060 Ti: the intro plays to the end and the title screen shows. With `HOS_VIDEO_LOG=1` the log goes Flush, one idle acquire, Stop, `nn::movie::Finalize`, and the second movie plays after it.
NotRexed commented 2026-11-07 19:45:31 +00:00 (Migrated from github.com)

Thanks. This changes the sync semantics for the movie decoders (TryWaitNativeSync, RequestSyncPointEvent), so it needs a run test on the current tree before it goes in; the latest release already fixed a freeze after Load in the movie player's lock. Leaving it for the owner to test.

Thanks. This changes the sync semantics for the movie decoders (TryWaitNativeSync, RequestSyncPointEvent), so it needs a run test on the current tree before it goes in; the latest release already fixed a freeze after Load in the movie player's lock. Leaving it for the owner to test.
Commenting is not possible because the repository is archived.
No description provided.