Reset the EGL renderer when specialization fails

This commit is contained in:
Cameron Gutman 2022-05-17 17:10:40 -05:00
parent 63a5bc5e12
commit 8aa42ff1d9
2 changed files with 18 additions and 0 deletions

View File

@ -1653,6 +1653,12 @@ void Session::execInternal()
case SDL_RENDER_DEVICE_RESET: case SDL_RENDER_DEVICE_RESET:
case SDL_RENDER_TARGETS_RESET: case SDL_RENDER_TARGETS_RESET:
if (event.type != SDL_WINDOWEVENT) {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Recreating renderer by internal request: %d",
event.type);
}
SDL_AtomicLock(&m_DecoderLock); SDL_AtomicLock(&m_DecoderLock);
// Destroy the old decoder // Destroy the old decoder

View File

@ -893,6 +893,18 @@ void EGLRenderer::renderFrame(AVFrame* frame)
if (!specialize()) { if (!specialize()) {
m_EGLImagePixelFormat = AV_PIX_FMT_NONE; m_EGLImagePixelFormat = AV_PIX_FMT_NONE;
// Failure to specialize is fatal. We must reset the renderer
// to recover successfully.
//
// Note: This seems to be easy to trigger when transitioning from
// maximized mode by dragging the window down on GNOME 42 using
// XWayland. Other strategies like calling glGetError() don't seem
// to be able to detect this situation for some reason.
SDL_Event event;
event.type = SDL_RENDER_TARGETS_RESET;
SDL_PushEvent(&event);
return; return;
} }
} }