GLX: attempt to fix glean makeCurrent test cases.
authorDave Airlie <airlied@redhat.com>
Thu, 11 Jun 2009 00:50:32 +0000 (10:50 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 17 Jun 2009 03:59:28 +0000 (13:59 +1000)
Two parts to this:

One we don't keep pointers to possibly freed memory anymore once we unbind the
drawables from the context. Brian I need to figure out what the comment
you made there, can we get a glean/piglit test so we can fix it properly?

If the new gc is the same as the oldGC, we call the unbind even though
we just bound it in that function. doh.

src/glx/x11/glxcurrent.c
src/mesa/drivers/dri/common/dri_util.c

index 01f42332413ea0efb323f33a828e85ffe14ba1c6..d44e0dd1fc82879a87fb7928087b535caef2718f 100644 (file)
@@ -457,7 +457,7 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
                                     &dummy_reply);
    }
 #ifdef GLX_DIRECT_RENDERING
-   else if (oldGC->driContext) {
+   else if (oldGC->driContext && oldGC != gc) {
       oldGC->driContext->unbindContext(oldGC->driContext);
    }
 #endif
index ae0e61e515b77d90b37ffb59eff1f3d4beb96fd9..2b1493a6ded5440474cdc8fcdec432650ebbdfbc 100644 (file)
@@ -122,6 +122,9 @@ static int driUnbindContext(__DRIcontext *pcp)
     pdp = pcp->driDrawablePriv;
     prp = pcp->driReadablePriv;
 
+    /* already unbound */
+    if (!pdp && !prp)
+      return GL_TRUE;
     /* Let driver unbind drawable from context */
     (*psp->DriverAPI.UnbindContext)(pcp);
 
@@ -146,9 +149,10 @@ static int driUnbindContext(__DRIcontext *pcp)
      * window we can determine the last context bound to the window and
      * use that context's lock. (BrianP, 2-Dec-2000)
      */
+    pcp->driDrawablePriv = pcp->driReadablePriv = NULL;
+
 #if 0
     /* Unbind the drawable */
-    pcp->driDrawablePriv = NULL;
     pdp->driContextPriv = &psp->dummyContextPriv;
 #endif