From 4c505e7030f2f0b7dab9c51125ac45cf3c28adb1 Mon Sep 17 00:00:00 2001 From: Palana Date: Mon, 30 May 2016 19:38:38 +0200 Subject: [PATCH] win-capture: Track gl "swap" invocations to prevent duplicate work Tested using FTL (steam): SwapBuffers ultimately calls wgl_swap_buffers causing an additional copy which just isn't necessary This also causes game capture to sometimes capture overlays even when not intended --- .../win-capture/graphics-hook/gl-capture.c | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/plugins/win-capture/graphics-hook/gl-capture.c b/plugins/win-capture/graphics-hook/gl-capture.c index 9e4a0c270..e3e10cc88 100644 --- a/plugins/win-capture/graphics-hook/gl-capture.c +++ b/plugins/win-capture/graphics-hook/gl-capture.c @@ -30,6 +30,7 @@ static struct func_hook wgl_delete_context; static bool darkest_dungeon_fix = false; struct gl_data { + int swap_recurse; HDC hdc; uint32_t base_cx; uint32_t base_cy; @@ -773,20 +774,36 @@ static void gl_capture(HDC hdc) } } +static inline void gl_swap_begin(HDC hdc) +{ + if (data.swap_recurse++) + return; + + if (!global_hook_info->capture_overlay) + gl_capture(hdc); +} + +static inline void gl_swap_end(HDC hdc) +{ + if (--data.swap_recurse) + return; + + if (global_hook_info->capture_overlay) + gl_capture(hdc); +} + static BOOL WINAPI hook_swap_buffers(HDC hdc) { BOOL ret; - if (!global_hook_info->capture_overlay) - gl_capture(hdc); + gl_swap_begin(hdc); unhook(&swap_buffers); BOOL (WINAPI *call)(HDC) = swap_buffers.call_addr; ret = call(hdc); rehook(&swap_buffers); - if (global_hook_info->capture_overlay) - gl_capture(hdc); + gl_swap_end(hdc); return ret; } @@ -795,16 +812,15 @@ static BOOL WINAPI hook_wgl_swap_buffers(HDC hdc) { BOOL ret; - if (!global_hook_info->capture_overlay) - gl_capture(hdc); + gl_swap_begin(hdc); unhook(&wgl_swap_buffers); + BOOL (WINAPI *call)(HDC) = wgl_swap_buffers.call_addr; ret = call(hdc); rehook(&wgl_swap_buffers); - if (global_hook_info->capture_overlay) - gl_capture(hdc); + gl_swap_end(hdc); return ret; } @@ -813,16 +829,15 @@ static BOOL WINAPI hook_wgl_swap_layer_buffers(HDC hdc, UINT planes) { BOOL ret; - if (!global_hook_info->capture_overlay) - gl_capture(hdc); + gl_swap_begin(hdc); unhook(&wgl_swap_layer_buffers); + BOOL (WINAPI *call)(HDC, UINT) = wgl_swap_layer_buffers.call_addr; ret = call(hdc, planes); rehook(&wgl_swap_layer_buffers); - if (global_hook_info->capture_overlay) - gl_capture(hdc); + gl_swap_end(hdc); return ret; }