diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 77afbf4..95a667a 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -1086,6 +1086,7 @@ __glXDrawableInit(__GLXdrawable *drawable, XID drawId, __GLXconfig *config) { drawable->pDraw = pDraw; + drawable->xDrawId = pDraw->id; drawable->type = type; drawable->drawId = drawId; drawable->config = config; diff --git a/glx/glxdrawable.h b/glx/glxdrawable.h index 2a365c5..227bc95 100644 --- a/glx/glxdrawable.h +++ b/glx/glxdrawable.h @@ -52,6 +52,7 @@ struct __GLXdrawable { void (*waitGL)(__GLXdrawable *); DrawablePtr pDraw; + XID xDrawId; XID drawId; /* diff --git a/glx/glxdri2.c b/glx/glxdri2.c index e791bf6..adfb18e 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -102,12 +102,16 @@ __glXDRIdrawableDestroy(__GLXdrawable *drawable) { __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable; const __DRIcoreExtension *core = private->screen->core; - + DrawablePtr pDraw; + int err; + (*core->destroyDrawable)(private->driDrawable); /* If the X window was destroyed, the dri DestroyWindow hook will * aready have taken care of this, so only call if pDraw isn't NULL. */ - if (drawable->pDraw != NULL) + err = dixLookupDrawable(&pDraw, drawable->xDrawId, serverClient, 0, + DixWriteAccess); + if (err == Success && pDraw) DRI2DestroyDrawable(drawable->pDraw); __glXDrawableRelease(drawable);