 src/glx/dri2_glx.c   |    5 ++---
 src/glx/dri_common.c |   26 +++++++++++++++++++-------
 src/glx/dri_glx.c    |    6 ++++--
 src/glx/drisw_glx.c  |    6 ++++--
 src/glx/glxclient.h  |    1 +
 src/glx/glxcurrent.c |   14 +++++++-------
 6 files changed, 37 insertions(+), 21 deletions(-)
 
 glx: implement drawable refcounting
 16.6.2011 00:22 by Stephane Marchesin [marcheu@chromium.org]

Index: Mesa-7.10.3/src/glx/dri2_glx.c
===================================================================
--- Mesa-7.10.3.orig/src/glx/dri2_glx.c
+++ Mesa-7.10.3/src/glx/dri2_glx.c
@@ -143,6 +143,8 @@ dri2_bind_context(struct glx_context *co
    pdraw = (struct dri2_drawable *) driFetchDrawable(context, draw);
    pread = (struct dri2_drawable *) driFetchDrawable(context, read);
 
+   driReleaseDrawables(&pcp->base);
+
    if (pdraw == NULL || pread == NULL)
       return GLXBadDrawable;
 
@@ -170,9 +172,6 @@ dri2_unbind_context(struct glx_context *
    struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc;
 
    (*psc->core->unbindContext) (pcp->driContext);
-
-   if (context == new)
-      driReleaseDrawables(&pcp->base);
 }
 
 static struct glx_context *
Index: Mesa-7.10.3/src/glx/dri_common.c
===================================================================
--- Mesa-7.10.3.orig/src/glx/dri_common.c
+++ Mesa-7.10.3/src/glx/dri_common.c
@@ -367,8 +367,10 @@ driFetchDrawable(struct glx_context *gc,
    if (priv->drawHash == NULL)
       return NULL;
 
-   if (__glxHashLookup(priv->drawHash, glxDrawable, (void *) &pdraw) == 0)
+   if (__glxHashLookup(priv->drawHash, glxDrawable, (void *) &pdraw) == 0) {
+      pdraw->refcount ++;
       return pdraw;
+   }
 
    pdraw = psc->driScreen->createDrawable(psc, glxDrawable,
                                           glxDrawable, gc->config);
Index: Mesa-7.10.3/src/glx/dri_glx.c
===================================================================
--- Mesa-7.10.3.orig/src/glx/dri_glx.c
+++ Mesa-7.10.3/src/glx/dri_glx.c
@@ -503,6 +503,8 @@ dri_destroy_context(struct glx_context *
    struct dri_context *pcp = (struct dri_context *) context;
    struct dri_screen *psc = (struct dri_screen *) context->psc;
 
+   driReleaseDrawables(&pcp->base);
+
    if (context->xid)
       glx_send_destroy_context(psc->base.dpy, context->xid);
 
@@ -526,6 +528,8 @@ dri_bind_context(struct glx_context *con
    pdraw = (struct dri_drawable *) driFetchDrawable(context, draw);
    pread = (struct dri_drawable *) driFetchDrawable(context, read);
 
+   driReleaseDrawables(&pcp->base);
+
    if (pdraw == NULL || pread == NULL)
       return GLXBadDrawable;
 
@@ -543,8 +547,6 @@ dri_unbind_context(struct glx_context *c
    struct dri_screen *psc = (struct dri_screen *) pcp->base.psc;
 
    (*psc->core->unbindContext) (pcp->driContext);
-
-   driReleaseDrawables(&pcp->base);
 }
 
 static const struct glx_context_vtable dri_context_vtable = {
Index: Mesa-7.10.3/src/glx/drisw_glx.c
===================================================================
--- Mesa-7.10.3.orig/src/glx/drisw_glx.c
+++ Mesa-7.10.3/src/glx/drisw_glx.c
@@ -244,6 +244,8 @@ drisw_destroy_context(struct glx_context
    struct drisw_context *pcp = (struct drisw_context *) context;
    struct drisw_screen *psc = (struct drisw_screen *) context->psc;
 
+   driReleaseDrawables(&pcp->base);
+
    if (context->xid)
       glx_send_destroy_context(psc->base.dpy, context->xid);
 
@@ -266,6 +268,8 @@ drisw_bind_context(struct glx_context *c
    pdraw = (struct drisw_drawable *) driFetchDrawable(context, draw);
    pread = (struct drisw_drawable *) driFetchDrawable(context, read);
 
+   driReleaseDrawables(&pcp->base);
+
    if (pdraw == NULL || pread == NULL)
       return GLXBadDrawable;
 
@@ -283,8 +287,6 @@ drisw_unbind_context(struct glx_context
    struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc;
 
    (*psc->core->unbindContext) (pcp->driContext);
-
-   driReleaseDrawables(&pcp->base);
 }
 
 static const struct glx_context_vtable drisw_context_vtable = {
Index: Mesa-7.10.3/src/glx/glxclient.h
===================================================================
--- Mesa-7.10.3.orig/src/glx/glxclient.h
+++ Mesa-7.10.3/src/glx/glxclient.h
@@ -138,6 +138,7 @@ struct __GLXDRIdrawableRec
    GLenum textureTarget;
    GLenum textureFormat;        /* EXT_texture_from_pixmap support */
    unsigned long eventMask;
+   int refcount;
 };
 
 /*
Index: Mesa-7.10.3/src/glx/glxcurrent.c
===================================================================
--- Mesa-7.10.3.orig/src/glx/glxcurrent.c
+++ Mesa-7.10.3/src/glx/glxcurrent.c
@@ -249,8 +249,6 @@ MakeContextCurrent(Display * dpy, GLXDra
    if (oldGC != &dummyContext) {
       oldGC->vtable->unbind(oldGC, gc);
       oldGC->currentDpy = 0;
-      oldGC->currentDrawable = None;
-      oldGC->currentReadable = None;
       oldGC->thread_id = 0;
    }
 
