Protect against recursive/re-entrant swapbuffers calls

* E.g. internally SwapBuffers might call wglSwapBuffers which we also
  hook, and we'd process it twice redundantly. Only process the first
  one we come across, whichever that is.
This commit is contained in:
baldurk
2017-05-22 11:00:33 +01:00
parent 188481e881
commit 16bc831c16
+31 -5
View File
@@ -866,11 +866,15 @@ private:
return ret;
}
// Make sure that even if internally SwapBuffers calls wglSwapBuffers we don't process both of
// them separately
bool m_InSwap = false;
static void ProcessSwapBuffers(HDC dc)
{
HWND w = WindowFromDC(dc);
if(w != NULL && glhooks.m_HaveContextCreation)
if(w != NULL && glhooks.m_HaveContextCreation && !glhooks.m_InSwap)
{
SCOPED_LOCK(glLock);
@@ -887,23 +891,41 @@ private:
static BOOL WINAPI SwapBuffers_hooked(HDC dc)
{
SCOPED_LOCK(glLock);
ProcessSwapBuffers(dc);
return glhooks.SwapBuffers_hook()(dc);
glhooks.m_InSwap = true;
BOOL ret = glhooks.SwapBuffers_hook()(dc);
glhooks.m_InSwap = false;
return ret;
}
static BOOL WINAPI wglSwapBuffers_hooked(HDC dc)
{
SCOPED_LOCK(glLock);
ProcessSwapBuffers(dc);
return glhooks.wglSwapBuffers_hook()(dc);
glhooks.m_InSwap = true;
BOOL ret = glhooks.wglSwapBuffers_hook()(dc);
glhooks.m_InSwap = false;
return ret;
}
static BOOL WINAPI wglSwapLayerBuffers_hooked(HDC dc, UINT planes)
{
SCOPED_LOCK(glLock);
ProcessSwapBuffers(dc);
return glhooks.wglSwapLayerBuffers_hook()(dc, planes);
glhooks.m_InSwap = true;
BOOL ret = glhooks.wglSwapLayerBuffers_hook()(dc, planes);
glhooks.m_InSwap = false;
return ret;
}
static BOOL WINAPI wglSwapMultipleBuffers_hooked(UINT numSwaps, CONST WGLSWAP *pSwaps)
@@ -911,7 +933,11 @@ private:
for(UINT i = 0; pSwaps && i < numSwaps; i++)
ProcessSwapBuffers(pSwaps[i].hdc);
return glhooks.wglSwapMultipleBuffers_hook()(numSwaps, pSwaps);
glhooks.m_InSwap = true;
BOOL ret = glhooks.wglSwapMultipleBuffers_hook()(numSwaps, pSwaps);
glhooks.m_InSwap = false;
return ret;
}
static LONG WINAPI ChangeDisplaySettingsA_hooked(DEVMODEA *mode, DWORD flags)