diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp index e4768801..ad3741b0 100644 --- a/app/streaming/session.cpp +++ b/app/streaming/session.cpp @@ -2156,7 +2156,6 @@ void Session::exec() // Fall through case SDL_RENDER_DEVICE_RESET: - case SDL_RENDER_TARGETS_RESET: if (event.type != SDL_WINDOWEVENT) { SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, @@ -2182,6 +2181,12 @@ void Session::exec() updateOptimalWindowDisplayMode(); } + // Now that the old decoder is dead, flush any events it may + // have queued to reset itself (if this reset was the result + // of device loss or an internal error). + SDL_PumpEvents(); + SDL_FlushEvent(SDL_RENDER_DEVICE_RESET); + { // If the stream exceeds the display refresh rate (plus some slack), // forcefully disable V-sync to allow the stream to render faster @@ -2219,13 +2224,6 @@ void Session::exec() } } - // Flush any events queued by the renderer to reset itself. These are - // usually from the old renderer, but they can also be queued by the - // new renderer in certain cases (like SDL3's direct3d9 renderer). - SDL_PumpEvents(); - SDL_FlushEvent(SDL_RENDER_DEVICE_RESET); - SDL_FlushEvent(SDL_RENDER_TARGETS_RESET); - // Request an IDR frame to complete the reset LiRequestIdrFrame(); diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp index 6c35c491..7d25a002 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp @@ -803,7 +803,7 @@ void D3D11VARenderer::renderFrame(AVFrame* frame) // The card may have been removed or crashed. Reset the decoder. SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; } diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.cpp b/app/streaming/video/ffmpeg-renderers/dxva2.cpp index 699314a3..1eaf520c 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.cpp +++ b/app/streaming/video/ffmpeg-renderers/dxva2.cpp @@ -943,7 +943,7 @@ void DXVA2Renderer::renderFrame(AVFrame *frame) "Clear() failed: %x", hr); SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; } @@ -954,7 +954,7 @@ void DXVA2Renderer::renderFrame(AVFrame *frame) "BeginScene() failed: %x", hr); SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; } @@ -980,7 +980,7 @@ void DXVA2Renderer::renderFrame(AVFrame *frame) "StretchRect() failed: %x", hr); SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; } @@ -997,7 +997,7 @@ void DXVA2Renderer::renderFrame(AVFrame *frame) "EndScene() failed: %x", hr); SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; } @@ -1015,7 +1015,7 @@ void DXVA2Renderer::renderFrame(AVFrame *frame) "PresentEx() failed: %x", hr); SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; } diff --git a/app/streaming/video/ffmpeg-renderers/eglvid.cpp b/app/streaming/video/ffmpeg-renderers/eglvid.cpp index 7e7524c2..0c7bd7dd 100644 --- a/app/streaming/video/ffmpeg-renderers/eglvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/eglvid.cpp @@ -777,7 +777,7 @@ void EGLRenderer::renderFrame(AVFrame* frame) // 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; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; diff --git a/app/streaming/video/ffmpeg-renderers/plvk.cpp b/app/streaming/video/ffmpeg-renderers/plvk.cpp index 3cdda40d..0d469734 100644 --- a/app/streaming/video/ffmpeg-renderers/plvk.cpp +++ b/app/streaming/video/ffmpeg-renderers/plvk.cpp @@ -871,7 +871,7 @@ void PlVkRenderer::renderFrame(AVFrame *frame) // Recreate the renderer SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); goto UnmapExit; } diff --git a/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm b/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm index 5d43bfb3..17522a31 100644 --- a/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm +++ b/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm @@ -204,7 +204,7 @@ public: // Trigger the main thread to recreate the decoder SDL_Event event; - event.type = SDL_RENDER_TARGETS_RESET; + event.type = SDL_RENDER_DEVICE_RESET; SDL_PushEvent(&event); return; }