From 25eb320f235a1138ce594dce7afbf27337257e16 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 4 Nov 2015 10:20:03 +0100 Subject: [PATCH] Hook wglSwapBuffers, wglSwapLayerBuffers and wglSwapMultipleBuffers --- renderdoc/driver/gl/gl_hooks_win32.cpp | 37 ++++++++++++++++++++++++-- renderdoc/os/win32/win32_hook.cpp | 2 ++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/gl/gl_hooks_win32.cpp b/renderdoc/driver/gl/gl_hooks_win32.cpp index 9b6f47972..c30390548 100644 --- a/renderdoc/driver/gl/gl_hooks_win32.cpp +++ b/renderdoc/driver/gl/gl_hooks_win32.cpp @@ -312,6 +312,9 @@ class OpenGLHook : LibraryHook Hook wglMakeCurrent_hook; Hook wglGetProcAddress_hook; Hook SwapBuffers_hook; + Hook wglSwapBuffers_hook; + Hook wglSwapLayerBuffers_hook; + Hook wglSwapMultipleBuffers_hook; Hook ChangeDisplaySettingsA_hook; Hook ChangeDisplaySettingsW_hook; Hook ChangeDisplaySettingsExA_hook; @@ -565,8 +568,8 @@ class OpenGLHook : LibraryHook return ret; } - - static BOOL WINAPI SwapBuffers_hooked(HDC dc) + + static void ProcessSwapBuffers(HDC dc) { HWND w = WindowFromDC(dc); @@ -581,10 +584,37 @@ class OpenGLHook : LibraryHook SetLastError(0); } + } + + static BOOL WINAPI SwapBuffers_hooked(HDC dc) + { + ProcessSwapBuffers(dc); return glhooks.SwapBuffers_hook()(dc); } + static BOOL WINAPI wglSwapBuffers_hooked(HDC dc) + { + ProcessSwapBuffers(dc); + + return glhooks.wglSwapBuffers_hook()(dc); + } + + static BOOL WINAPI wglSwapLayerBuffers_hooked(HDC dc, UINT planes) + { + ProcessSwapBuffers(dc); + + return glhooks.wglSwapLayerBuffers_hook()(dc, planes); + } + + static BOOL WINAPI wglSwapMultipleBuffers_hooked(UINT numSwaps, CONST WGLSWAP *pSwaps) + { + for(UINT i=0; pSwaps && i < numSwaps; i++) + ProcessSwapBuffers(pSwaps[i].hdc); + + return glhooks.wglSwapMultipleBuffers_hook()(numSwaps, pSwaps); + } + static LONG WINAPI ChangeDisplaySettingsA_hooked(DEVMODEA *mode, DWORD flags) { if((flags & CDS_FULLSCREEN) == 0 || RenderDoc::Inst().GetCaptureOptions().AllowFullscreen) @@ -686,6 +716,9 @@ class OpenGLHook : LibraryHook success &= wglCreateLayerContext_hook.Initialize("wglCreateLayerContext", DLL_NAME, wglCreateLayerContext_hooked); success &= wglMakeCurrent_hook.Initialize("wglMakeCurrent", DLL_NAME, wglMakeCurrent_hooked); success &= wglGetProcAddress_hook.Initialize("wglGetProcAddress", DLL_NAME, wglGetProcAddress_hooked); + success &= wglSwapBuffers_hook.Initialize("wglSwapBuffers", DLL_NAME, wglSwapBuffers_hooked); + success &= wglSwapLayerBuffers_hook.Initialize("wglSwapLayerBuffers", DLL_NAME, wglSwapLayerBuffers_hooked); + success &= wglSwapMultipleBuffers_hook.Initialize("wglSwapMultipleBuffers", DLL_NAME, wglSwapMultipleBuffers_hooked); success &= SwapBuffers_hook.Initialize("SwapBuffers", "gdi32.dll", SwapBuffers_hooked); success &= ChangeDisplaySettingsA_hook.Initialize("ChangeDisplaySettingsA", "user32.dll", ChangeDisplaySettingsA_hooked); success &= ChangeDisplaySettingsW_hook.Initialize("ChangeDisplaySettingsW", "user32.dll", ChangeDisplaySettingsW_hooked); diff --git a/renderdoc/os/win32/win32_hook.cpp b/renderdoc/os/win32/win32_hook.cpp index 261eb3e81..4ef4a4627 100644 --- a/renderdoc/os/win32/win32_hook.cpp +++ b/renderdoc/os/win32/win32_hook.cpp @@ -136,6 +136,8 @@ struct CachedHookData // for safety (and because we don't need to), ignore these modules if(!_stricmp(modName, "kernel32.dll") || !_stricmp(modName, "powrprof.dll") || + !_stricmp(modName, "opengl32.dll") || + !_stricmp(modName, "gdi32.dll") || strstr(lowername, "msvcr") == lowername || strstr(lowername, "msvcp") == lowername) return;