From 9014c5330a6f733ce94be4bf65fbb03374313a5d Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 18 Nov 2016 18:58:55 +0100 Subject: [PATCH] Take global GL lock when inside SwapBuffers & Start/EndFrameCapture * If we don't have this lock, we can end up trampling serialisation as two threads try to serialise at once. --- renderdoc/driver/gl/gl_driver.cpp | 5 +++++ renderdoc/driver/gl/gl_hooks_linux.cpp | 7 +++++++ renderdoc/driver/gl/gl_hooks_win32.cpp | 7 +++++++ 3 files changed, 19 insertions(+) diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 03fa36913..171136b01 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1030,6 +1030,7 @@ WrappedOpenGL::ContextData &WrappedOpenGL::GetCtxData() } // defined in gl__hooks.cpp +Threading::CriticalSection &GetGLLock(); void MakeContextCurrent(GLWindowingData data); // for 'backwards compatible' overlay rendering @@ -2330,6 +2331,8 @@ void WrappedOpenGL::StartFrameCapture(void *dev, void *wnd) if(m_State != WRITING_IDLE) return; + SCOPED_LOCK(GetGLLock()); + RenderDoc::Inst().SetCurrentDriver(RDC_OpenGL); m_State = WRITING_CAPFRAME; @@ -2386,6 +2389,8 @@ bool WrappedOpenGL::EndFrameCapture(void *dev, void *wnd) if(m_State != WRITING_CAPFRAME) return true; + SCOPED_LOCK(GetGLLock()); + CaptureFailReason reason = CaptureSucceeded; GLWindowingData prevctx = m_ActiveContexts[Threading::GetCurrentID()]; diff --git a/renderdoc/driver/gl/gl_hooks_linux.cpp b/renderdoc/driver/gl/gl_hooks_linux.cpp index f2e1d86b1..c595271de 100644 --- a/renderdoc/driver/gl/gl_hooks_linux.cpp +++ b/renderdoc/driver/gl/gl_hooks_linux.cpp @@ -1065,6 +1065,8 @@ __attribute__((visibility("default"))) void glXSwapBuffers(Display *dpy, GLXDraw if(OpenGLHook::glhooks.glXSwapBuffers_real == NULL) OpenGLHook::glhooks.SetupExportedFunctions(); + SCOPED_LOCK(glLock); + // if we use the GLXDrawable in XGetGeometry and it's a GLXWindow, then we get // a BadDrawable error and things go south. Instead we track GLXWindows created // in glXCreateWindow/glXDestroyWindow and look up the source window it was @@ -1336,6 +1338,11 @@ const GLHookSet &GetRealGLFunctions() return OpenGLHook::glhooks.GetRealGLFunctions(); } +Threading::CriticalSection &GetGLLock() +{ + return glLock; +} + void MakeContextCurrent(GLWindowingData data) { OpenGLHook::glhooks.MakeContextCurrent(data); diff --git a/renderdoc/driver/gl/gl_hooks_win32.cpp b/renderdoc/driver/gl/gl_hooks_win32.cpp index de92ac0ad..a4bf79027 100644 --- a/renderdoc/driver/gl/gl_hooks_win32.cpp +++ b/renderdoc/driver/gl/gl_hooks_win32.cpp @@ -705,6 +705,8 @@ private: if(w != NULL && glhooks.m_HaveContextCreation) { + SCOPED_LOCK(glLock); + RECT r; GetClientRect(w, &r); @@ -1307,6 +1309,11 @@ const GLHookSet &GetRealGLFunctions() return OpenGLHook::glhooks.GetRealGLFunctions(); } +Threading::CriticalSection &GetGLLock() +{ + return glLock; +} + void MakeContextCurrent(GLWindowingData data) { OpenGLHook::glhooks.MakeContextCurrent(data);