mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2025-07-01 23:35:55 +00:00
Improve robustness of EGL retry logic for 10-bit color
This commit is contained in:
parent
1cbdd0e675
commit
3fcf31d009
@ -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)) {
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user