Improve robustness of EGL retry logic for 10-bit color

This commit is contained in:
Cameron Gutman 2022-01-29 01:12:38 -06:00
parent 1cbdd0e675
commit 3fcf31d009
2 changed files with 18 additions and 4 deletions

View File

@ -59,6 +59,7 @@ typedef struct _OVERLAY_VERTEX
"EGLRenderer: " __VA_ARGS__)
SDL_Window* EGLRenderer::s_LastFailedWindow = nullptr;
int EGLRenderer::s_LastFailedVideoFormat = 0;
EGLRenderer::EGLRenderer(IFFmpegRenderer *backendRenderer)
:
@ -457,7 +458,11 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params)
// HACK: Work around bug where renderer will repeatedly fail with:
// SDL_CreateRenderer() failed: Could not create GLES window surface
if (m_Window == s_LastFailedWindow) {
// Don't retry if we've already failed to create a renderer for this
// window *unless* the format has changed from 10-bit to 8-bit.
if (m_Window == s_LastFailedWindow &&
(params->videoFormat & VIDEO_FORMAT_H265_MAIN10) ==
(s_LastFailedVideoFormat & VIDEO_FORMAT_H265_MAIN10)) {
EGL_LOG(Error, "SDL_CreateRenderer() already failed on this window!");
return false;
}
@ -504,10 +509,11 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params)
return false;
}
if (!(m_DummyRenderer = SDL_CreateRenderer(m_Window, renderIndex, SDL_RENDERER_ACCELERATED))) {
m_DummyRenderer = SDL_CreateRenderer(m_Window, renderIndex, SDL_RENDERER_ACCELERATED);
if (!m_DummyRenderer) {
// Print the error here (before it gets clobbered), but ensure that we flush window
// events just in case SDL re-created the window before eventually failing.
EGL_LOG(Error, "SDL_CreateRenderer() failed: %s", SDL_GetError());
s_LastFailedWindow = m_Window;
return false;
}
// SDL_CreateRenderer() can end up having to recreate our window (SDL_RecreateWindow())
@ -527,6 +533,13 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params)
SDL_FlushEvent(SDL_WINDOWEVENT);
}
// Now we finally bail if we failed during SDL_CreateRenderer() above.
if (!m_DummyRenderer) {
s_LastFailedWindow = m_Window;
s_LastFailedVideoFormat = params->videoFormat;
return false;
}
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
if (!SDL_GetWindowWMInfo(params->window, &info)) {

View File

@ -68,4 +68,5 @@ private:
// HACK: Work around bug where renderer will repeatedly fail with:
// SDL_CreateRenderer() failed: Could not create GLES window surface
static SDL_Window* s_LastFailedWindow;
static int s_LastFailedVideoFormat;
};