glx: Add isDirect back to __GLXcontextRec. It is needed
authorXiang, Haihao <haihao.xiang@intel.com>
Tue, 18 Mar 2008 07:02:57 +0000 (15:02 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Tue, 18 Mar 2008 07:02:57 +0000 (15:02 +0800)
to check whether oldGC is used for direct rendering in
function MakeContextCurrent. However it is possible
oldGC->driContext is already freed. fix bug #14926.

src/glx/x11/glxclient.h
src/glx/x11/glxcmds.c
src/glx/x11/glxext.c

index 730caf73024b1dccb551b5e494600c9772f841b4..ea90282b08fea60c455de0336fc2bd71d03d8b1c 100644 (file)
@@ -309,6 +309,11 @@ struct __GLXcontextRec {
      */
     GLenum error;
 
+    /**
+     * Whether this context does direct rendering.
+     */
+    Bool isDirect;
+
     /**
      * \c dpy of current display for this context.  Will be \c NULL if not
      * current to any display, or if this is the "dummy context".
index adf53116745aedc1b8ea7ed5bc239ff7aad063b4..8d0f07fd0a1045bc5ab1661e3825c547362e5008 100644 (file)
@@ -313,6 +313,7 @@ GLXContext AllocateGLXContext( Display *dpy )
     gc->fillImage = __glFillImage;
     gc->pc = gc->buf;
     gc->bufEnd = gc->buf + bufSize;
+    gc->isDirect = GL_FALSE;
     if (__glXDebug) {
        /*
        ** Set limit register so that there will be one command per packet
@@ -404,6 +405,7 @@ CreateContext(Display *dpy, XVisualInfo *vis,
                gc->screen = mode->screen;
                gc->psc = psc;
                gc->mode = mode;
+               gc->isDirect = GL_TRUE;
            }
        }
 #endif
index 1d9be2974145ef0ee406f02cf07820360d52751f..525faab10e9288200cf8de4787cd00b8be179bcf 100644 (file)
@@ -1256,7 +1256,7 @@ static Bool MakeContextCurrent(Display *dpy, GLXDrawable draw,
        /* Send a glXMakeCurrent request to bind the new context. */
        bindReturnValue = 
          SendMakeCurrentRequest(dpy, opcode, gc ? gc->xid : None,
-                                ((dpy != oldGC->currentDpy) || oldGC->driContext)
+                                ((dpy != oldGC->currentDpy) || oldGC->isDirect)
                                 ? None : oldGC->currentContextTag,
                                 draw, read, &reply);
     }
@@ -1267,7 +1267,7 @@ static Bool MakeContextCurrent(Display *dpy, GLXDrawable draw,
     }
 
     if ((dpy != oldGC->currentDpy || (gc && gc->driContext)) &&
-       !oldGC->driContext && oldGC != &dummyContext) {
+       !oldGC->isDirect && oldGC != &dummyContext) {
        xGLXMakeCurrentReply dummy_reply;
 
        /* We are either switching from one dpy to another and have to