Black screen after the intro movie: an idle decoder's buffers stay unreached until the next submission #235
No reviewers
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
question
testing wanted
wontfix
No milestone
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Hookshot!235
Loading…
Reference in a new issue
No description provided.
Delete branch "movie-end-black-screen"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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::Flushrecycles output buffers until it finds one whose sync is not reached yet. Our HLE reported every buffer's sync as reached, soFlushlooped 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 unlessTryWaitNativeSyncagrees, 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=1the log goes Flush, one idle acquire, Stop,nn::movie::Finalize, and the second movie plays after it.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.