Releasing a surfaceless EGL context doesn't release underlying DRI context.
authorAlexandros Frantzis <Alexandros.Frantzis@canonical.com>
Fri, 24 Oct 2014 10:03:13 +0000 (03:03 -0700)
committerTapani Pälli <tapani.palli@intel.com>
Thu, 6 Nov 2014 11:40:39 +0000 (13:40 +0200)
driUnbindContext() checks for valid drawables before calling the driver
unbind function. In case of Surfaceless contexts, the drawables are always
Null and we end up not releasing the underlying DRI context. Moving the
call to the driver function before the drawable validity checks fixes things.

Steps to trigger this bug are following:

   - create surfaceless context and make it current
   - make some other context current
   - {another thread} destroy surfaceless context
   - make another context current

Signed-off-by: Alexandros Frantzis <Alexandros.Frantzis@canonical.com>
Signed-off-by: Kalyan Kondapally <kalyan.kondapally@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=74563

src/mesa/drivers/dri/common/dri_util.c

index 6c78928ee7d288d6141af227cc285d8b1e656df1..02499f2daec07f951aaeee53e37bff5f1477a05e 100644 (file)
@@ -569,6 +569,12 @@ static int driUnbindContext(__DRIcontext *pcp)
     if (pcp == NULL)
        return GL_FALSE;
 
+    /*
+    ** Call driUnbindContext before checking for valid drawables
+    ** to handle surfaceless contexts properly.
+    */
+    pcp->driScreenPriv->driver->UnbindContext(pcp);
+
     pdp = pcp->driDrawablePriv;
     prp = pcp->driReadablePriv;
 
@@ -576,8 +582,6 @@ static int driUnbindContext(__DRIcontext *pcp)
     if (!pdp && !prp)
        return GL_TRUE;
 
-    pcp->driScreenPriv->driver->UnbindContext(pcp);
-
     assert(pdp);
     if (pdp->refcount == 0) {
        /* ERROR!!! */