From cb16f193ecd87207a3a951e1536afe316fdac057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 30 Jan 2023 15:45:05 +0100 Subject: [PATCH] Fix the problem. Still need to leave the loop with SDL even if we supply a swap function. --- Common/GPU/OpenGL/GLRenderManager.cpp | 4 ++++ Common/GPU/OpenGL/GLRenderManager.h | 4 +++- SDL/SDLGLGraphicsContext.cpp | 2 +- Windows/GPU/WindowsGLContext.cpp | 2 +- headless/SDLHeadlessHost.cpp | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Common/GPU/OpenGL/GLRenderManager.cpp b/Common/GPU/OpenGL/GLRenderManager.cpp index 24a5ba5b74..f0a1cce354 100644 --- a/Common/GPU/OpenGL/GLRenderManager.cpp +++ b/Common/GPU/OpenGL/GLRenderManager.cpp @@ -515,6 +515,10 @@ bool GLRenderManager::Run(GLRRenderThreadTask &task) { if (swapFunction_) { VLOG(" PULL: SwapFunction()"); swapFunction_(); + if (!retainControl_) { + // get out of here. + swapRequest = true; + } } else { VLOG(" PULL: SwapRequested"); swapRequest = true; diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index 7516b22218..2d213be8b8 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -992,8 +992,9 @@ public: _dbg_assert_(foundCount == 1); } - void SetSwapFunction(std::function swapFunction) { + void SetSwapFunction(std::function swapFunction, bool retainControl) { swapFunction_ = swapFunction; + retainControl_ = retainControl; } void SetSwapIntervalFunction(std::function swapIntervalFunction) { @@ -1086,6 +1087,7 @@ private: std::function swapFunction_; std::function swapIntervalFunction_; + bool retainControl_ = false; GLBufferStrategy bufferStrategy_ = GLBufferStrategy::SUBDATA; int inflightFrames_ = MAX_INFLIGHT_FRAMES; diff --git a/SDL/SDLGLGraphicsContext.cpp b/SDL/SDLGLGraphicsContext.cpp index 945c9a950e..62fba14b81 100644 --- a/SDL/SDLGLGraphicsContext.cpp +++ b/SDL/SDLGLGraphicsContext.cpp @@ -429,7 +429,7 @@ int SDLGLGraphicsContext::Init(SDL_Window *&window, int x, int y, int mode, std: #else SDL_GL_SwapWindow(window_); #endif - }); + }, false); renderManager_->SetSwapIntervalFunction([&](int interval) { INFO_LOG(G3D, "SDL SwapInterval: %d", interval); diff --git a/Windows/GPU/WindowsGLContext.cpp b/Windows/GPU/WindowsGLContext.cpp index 1888b351b5..02cce76040 100644 --- a/Windows/GPU/WindowsGLContext.cpp +++ b/Windows/GPU/WindowsGLContext.cpp @@ -432,7 +432,7 @@ bool WindowsGLContext::InitFromRenderThread(std::string *error_message) { renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); renderManager_->SetInflightFrames(g_Config.iInflightFrames); SetGPUBackend(GPUBackend::OPENGL); - renderManager_->SetSwapFunction([&]() {::SwapBuffers(hDC); }); + renderManager_->SetSwapFunction([&]() {::SwapBuffers(hDC); }, true); if (wglSwapIntervalEXT) { // glew loads wglSwapIntervalEXT if available renderManager_->SetSwapIntervalFunction([&](int interval) { diff --git a/headless/SDLHeadlessHost.cpp b/headless/SDLHeadlessHost.cpp index 9d5524b15a..9960b01364 100644 --- a/headless/SDLHeadlessHost.cpp +++ b/headless/SDLHeadlessHost.cpp @@ -166,7 +166,7 @@ bool GLDummyGraphicsContext::InitFromRenderThread(std::string *errorMessage) { _assert_(success); renderManager_->SetSwapFunction([&]() { SDL_GL_SwapWindow(screen_); - }); + }, false); return success; }