From 24004a24359af16fcb8671e6b0478f3adee509a7 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 12 May 2016 16:33:30 -0600 Subject: st/wgl: release the pbuffer DC at the end of wglBindTexImageARB() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Otherwise we were leaking DC GDI objects and if wglBindTexImageARB() was called enough we'd eventually hit the GDI limit of 10,000 objects. Things started failing at that point. v2: also release DC if we return early, per Charmaine. Reviewed-by: Charmaine Lee Reviewed-by: José Fonseca --- src/gallium/state_trackers/wgl/stw_ext_rendertexture.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/wgl/stw_ext_rendertexture.c b/src/gallium/state_trackers/wgl/stw_ext_rendertexture.c index 18df2ebd1fa..5eeb0df21f1 100644 --- a/src/gallium/state_trackers/wgl/stw_ext_rendertexture.c +++ b/src/gallium/state_trackers/wgl/stw_ext_rendertexture.c @@ -104,6 +104,7 @@ BOOL WINAPI wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) { HDC prevDrawable = stw_get_current_dc(); + HDC dc; struct stw_context *curctx = stw_current_context(); struct stw_framebuffer *fb; GLenum texFormat, srcBuffer, target; @@ -164,10 +165,12 @@ wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) */ pixelFormatSave = fb->iPixelFormat; fb->iPixelFormat = curctx->iPixelFormat; - retVal = stw_make_current(wglGetPbufferDCARB(hPbuffer), curctx->dhglrc); + dc = wglGetPbufferDCARB(hPbuffer); + retVal = stw_make_current(dc, curctx->dhglrc); fb->iPixelFormat = pixelFormatSave; if (!retVal) { debug_printf("stw_make_current(#1) failed in wglBindTexImageARB()\n"); + wglReleasePbufferDCARB(hPbuffer, dc); return FALSE; } @@ -181,6 +184,8 @@ wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) debug_printf("stw_make_current(#2) failed in wglBindTexImageARB()\n"); } + wglReleasePbufferDCARB(hPbuffer, dc); + return retVal; } -- cgit v1.2.3