summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/wgl
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2016-05-12 16:33:30 -0600
committerBrian Paul <[email protected]>2016-06-30 12:43:49 -0600
commit24004a24359af16fcb8671e6b0478f3adee509a7 (patch)
treeb963aca6e332fe142c1bdad0163fedfe10a4bed4 /src/gallium/state_trackers/wgl
parent058c70bae1a70d63671b2f37a10950b21e615802 (diff)
st/wgl: release the pbuffer DC at the end of wglBindTexImageARB()
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 <[email protected]> Reviewed-by: José Fonseca <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/wgl')
-rw-r--r--src/gallium/state_trackers/wgl/stw_ext_rendertexture.c7
1 files changed, 6 insertions, 1 deletions
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;
}