Mesa (master): Releasing a surfaceless EGL context doesn' t release underlying DRI context.

Tapani Pälli tpalli at kemper.freedesktop.org
Thu Nov 6 11:56:47 UTC 2014


Module: Mesa
Branch: master
Commit: f53b6d0134d9ad66e8ec3d7c09daaba8192834be
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f53b6d0134d9ad66e8ec3d7c09daaba8192834be

Author: Alexandros Frantzis <Alexandros.Frantzis at canonical.com>
Date:   Fri Oct 24 03:03:13 2014 -0700

Releasing a surfaceless EGL context doesn't release underlying DRI context.

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 at canonical.com>
Signed-off-by: Kalyan Kondapally <kalyan.kondapally at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=74563

---

 src/mesa/drivers/dri/common/dri_util.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index 6c78928..02499f2 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -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!!! */




More information about the mesa-commit mailing list