Overhaul EmuWindow::PollEvents to fix yuzu-cmd calling SDL_PollEvents off main thread

EmuWindow::PollEvents was called from the GPU thread (or the CPU thread
in sync-GPU mode) when swapping buffers.  It had three implementations:

- In GRenderWindow, it didn't actually poll events, just set a flag and
  emit a signal to indicate that a frame was displayed.

- In EmuWindow_SDL2_Hide, it did nothing.

- In EmuWindow_SDL2, it did call SDL_PollEvents, but this is wrong
  because SDL_PollEvents is supposed to be called on the thread that set
  up video - in this case, the main thread, which was sleeping in a
  busyloop (regardless of whether sync-GPU was enabled).  On macOS this
  causes a crash.

To fix this:

- Rename EmuWindow::PollEvents to OnFrameDisplayed, and give it a
  default implementation that does nothing.

- In EmuWindow_SDL2, do not override OnFrameDisplayed, but instead have
  the main thread call SDL_WaitEvent in a loop.
This commit is contained in:
comex 2020-11-22 16:05:18 -05:00
parent 5d1447897a
commit 994f497781
10 changed files with 68 additions and 73 deletions

View file

@ -109,8 +109,6 @@ EmuWindow_SDL2_Hide::~EmuWindow_SDL2_Hide() {
SDL_Quit();
}
void EmuWindow_SDL2_Hide::PollEvents() {}
bool EmuWindow_SDL2_Hide::IsShown() const {
return false;
}

View file

@ -17,9 +17,6 @@ public:
explicit EmuWindow_SDL2_Hide();
~EmuWindow_SDL2_Hide();
/// Polls window events
void PollEvents() override;
/// Whether the screen is being shown or not.
bool IsShown() const override;