From ae2c31ed669abab66a8c4b68d8d746e94b9ebf28 Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Tue, 18 Mar 2008 15:02:57 +0800 Subject: [PATCH] glx: Add isDirect back to __GLXcontextRec. It is needed 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 | 5 +++++ src/glx/x11/glxcmds.c | 2 ++ src/glx/x11/glxext.c | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h index 730caf73024..ea90282b08f 100644 --- a/src/glx/x11/glxclient.h +++ b/src/glx/x11/glxclient.h @@ -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". diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c index adf53116745..8d0f07fd0a1 100644 --- a/src/glx/x11/glxcmds.c +++ b/src/glx/x11/glxcmds.c @@ -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 diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c index 1d9be297414..525faab10e9 100644 --- a/src/glx/x11/glxext.c +++ b/src/glx/x11/glxext.c @@ -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 -- 2.30.2