mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2025-07-02 15:55:39 +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__)
|
"EGLRenderer: " __VA_ARGS__)
|
||||||
|
|
||||||
SDL_Window* EGLRenderer::s_LastFailedWindow = nullptr;
|
SDL_Window* EGLRenderer::s_LastFailedWindow = nullptr;
|
||||||
|
int EGLRenderer::s_LastFailedVideoFormat = 0;
|
||||||
|
|
||||||
EGLRenderer::EGLRenderer(IFFmpegRenderer *backendRenderer)
|
EGLRenderer::EGLRenderer(IFFmpegRenderer *backendRenderer)
|
||||||
:
|
:
|
||||||
@ -457,7 +458,11 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params)
|
|||||||
|
|
||||||
// HACK: Work around bug where renderer will repeatedly fail with:
|
// HACK: Work around bug where renderer will repeatedly fail with:
|
||||||
// SDL_CreateRenderer() failed: Could not create GLES window surface
|
// 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!");
|
EGL_LOG(Error, "SDL_CreateRenderer() already failed on this window!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -504,10 +509,11 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params)
|
|||||||
return false;
|
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());
|
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())
|
// 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);
|
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_SysWMinfo info;
|
||||||
SDL_VERSION(&info.version);
|
SDL_VERSION(&info.version);
|
||||||
if (!SDL_GetWindowWMInfo(params->window, &info)) {
|
if (!SDL_GetWindowWMInfo(params->window, &info)) {
|
||||||
|
@ -68,4 +68,5 @@ private:
|
|||||||
// HACK: Work around bug where renderer will repeatedly fail with:
|
// HACK: Work around bug where renderer will repeatedly fail with:
|
||||||
// SDL_CreateRenderer() failed: Could not create GLES window surface
|
// SDL_CreateRenderer() failed: Could not create GLES window surface
|
||||||
static SDL_Window* s_LastFailedWindow;
|
static SDL_Window* s_LastFailedWindow;
|
||||||
|
static int s_LastFailedVideoFormat;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user