st/wgl: release the pbuffer DC at the end of wglBindTexImageARB()
authorBrian Paul <brianp@vmware.com>
Thu, 12 May 2016 22:33:30 +0000 (16:33 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 30 Jun 2016 18:43:49 +0000 (12:43 -0600)
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 <charmainel@vmware.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/state_trackers/wgl/stw_ext_rendertexture.c

index 18df2ebd1faa0d6d715799fd5db2eb7fb89a5122..5eeb0df21f18d185af72ff36642e1036ea11f9a5 100644 (file)
@@ -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;
 }