[PATCH 01/14] glx: Do something unpleasant to current drawable tracking

Adam Jackson ajax at redhat.com
Tue Mar 8 09:17:39 PST 2011


This is wrong, very wrong.  Almost as wrong as what it replaces.  Do not
merge me, ever.
---
 glx/glxcmds.c |    6 ++++--
 glx/glxext.c  |   12 ++++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 9b4bc9e..59df1c8 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -643,8 +643,10 @@ DoMakeCurrent(__GLXclientState *cl,
 	/*
 	** Make the previous context not current.
 	*/
-	if (!(*prevglxc->loseCurrent)(prevglxc)) {
-	    return __glXError(GLXBadContext);
+	if (prevglxc->readPriv && prevglxc->drawPriv) {
+	    if (!(*prevglxc->loseCurrent)(prevglxc)) {
+		return __glXError(GLXBadContext);
+	    }
 	}
 	__glXFlushContextCache();
 	if (!prevglxc->isDirect) {
diff --git a/glx/glxext.c b/glx/glxext.c
index 4bd5d6b..90711f4 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -145,6 +145,7 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
 	    if (c == __glXLastContext)
 		__glXFlushContextCache();
 
+#if 0
 	    for (i = 1; i < currentMaxClients; i++) {
 		if (clients[i]) {
 		    __GLXclientState *cl = glxGetClient(clients[i]);
@@ -159,13 +160,16 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
 		    }
 		}
 	    }
+#endif
 	}
 	if (c->drawPriv == glxPriv)
 	    c->drawPriv = NULL;
 	if (c->readPriv == glxPriv)
 	    c->readPriv = NULL;
+#if 0
 	if (!c->idExists && !c->isCurrent)
 	    __glXFreeContext(c);
+#endif
     }
 
     glxPriv->destroy(glxPriv);
@@ -439,6 +443,14 @@ __GLXcontext *__glXForceCurrent(__GLXclientState *cl, GLXContextTag tag,
 	    *error = __glXError(GLXBadCurrentWindow);
 	    return 0;
     	}
+	if (cx->readPriv == NULL) {
+	    /*
+	     * hack of the century
+	     */
+	    __glXFlushContextCache();
+	    *error = 0;
+	    return NULL;
+	}
     }
     
     if (cx->wait && (*cx->wait)(cx, cl, error))
-- 
1.7.3.5



More information about the xorg-devel mailing list