From: Pauli Nieminen <ext-pauli.niemi...@nokia.com> glx should cleanup DRI2Drawable when GLXDrawable is destroyed.
v3: * Fix resource destruction order between GLX and DRI2 when client disconnects. Signed-off-by: Pauli Nieminen <ext-pauli.niemi...@nokia.com> --- glx/glxdri2.c | 12 ++++++++++++ hw/xfree86/dri2/dri2.c | 18 ++++++++++++++++++ hw/xfree86/dri2/dri2.h | 18 ++++++++++++++++++ 3 files changed, 48 insertions(+), 0 deletions(-) diff --git a/glx/glxdri2.c b/glx/glxdri2.c index 027615a..37b522a 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -89,6 +89,8 @@ struct __GLXDRIdrawable { __DRIdrawable *driDrawable; __GLXDRIscreen *screen; DRI2DrawablePtr pDRI2Draw; + XID id; + ClientPtr client; /* Dimensions as last reported by DRI2GetBuffers. */ int width; @@ -102,6 +104,12 @@ __glXDRIdrawableDestroy(__GLXdrawable *drawable) { __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable; const __DRIcoreExtension *core = private->screen->core; + DRI2DrawablePtr pTmp; + + pTmp = DRI2DrawableUnref(private->pDRI2Draw); + + if (pTmp) + DRI2DestroyDrawable(private->client, pTmp, private->id); (*core->destroyDrawable)(private->driDrawable); @@ -479,6 +487,10 @@ __glXDRIscreenCreateDrawable(ClientPtr client, } private->pDRI2Draw = DRI2GetDrawable(pDraw); + private->id = drawId; + private->client = client; + + DRI2DrawableRef(private->pDRI2Draw); private->driDrawable = (*driScreen->dri2->createNewDrawable)(driScreen->driScreen, diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 4b31447..4085ccb 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -426,6 +426,24 @@ static int DRI2DrawableGone(pointer p, XID id) return Success; } +void +DRI2DrawableRef(DRI2DrawablePtr pPriv) +{ + pPriv->refcnt++; +} + +DRI2DrawablePtr +DRI2DrawableUnref(DRI2DrawablePtr pPriv) +{ + pPriv->refcnt--; + + if (pPriv->refcnt > 0) + return pPriv; + + DRI2DrawableGone(pPriv, 0); + return NULL; +} + static int find_attachment(DRI2DrawablePtr pPriv, unsigned attachment) { diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h index 7b49e7f..bdd4d04 100644 --- a/hw/xfree86/dri2/dri2.h +++ b/hw/xfree86/dri2/dri2.h @@ -350,6 +350,24 @@ extern _X_EXPORT DRI2DrawablePtr DRI2GetDrawable(DrawablePtr pDraw); */ extern _X_EXPORT unsigned char DRI2DrawableGetType(DRI2DrawablePtr pPriv); +/** + * Notify DRI2 that there is long living reference to the drawable. + * + * If someone needs long living reference to DRI2 drawable that may out live + * the DRI2 client resource the caller has to notify DRI2 about the reference. + * + * \param pPriv DRI2 private drawable + */ +extern _X_EXPORT void DRI2DrawableRef(DRI2DrawablePtr pPriv); + +/** + * Free long living reference to DRI2Drawable + * + * \param pPriv DRI2 private drawable + * \return pointer DRI2Drawable or NULL if DRI2Drawable was freed + */ +extern _X_EXPORT DRI2DrawablePtr DRI2DrawableUnref(DRI2DrawablePtr pPriv); + extern _X_EXPORT int DRI2LookupDrawableComplex(ClientPtr client, XID id, DRI2DrawablePtr *pPriv); -- 1.7.0.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel