[PATCHv2 1/2] DRI2: Track DRI2 drawables as resources, not privates

Pauli Nieminen suokkos at gmail.com
Mon Apr 26 05:44:47 PDT 2010


2010/4/19 Michel Dänzer <michel at daenzer.net>:
> On Fre, 2010-04-09 at 14:18 -0400, Kristian Høgsberg wrote:
>> The main motivation here is to have the resource system clean up the
>> DRI2 drawable automatically so glx doesn't have to.  Right now, the
>> glx drawable resource must be destroyed before the X drawable, so that
>> calling DRI2DestroyDrawable doesn't crash.  By making the DRI2
>> drawable a resource, GLX doesn't have to worry about that and the
>> resource destruction order becomes irrelevant.
>>
>> https://bugs.freedesktop.org/show_bug.cgi?id=26394
>>
>> Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>
>
> There's a problem with this change (and potentially in DRI2SwapEvent()
> even before it): at least the pixmaps backing redirected windows still
> have ->drawable.id == 0. This can result in weird behaviour with a GLX
> compositing manager, e.g. when running the same app twice in a row: the
> second window will show a static snapshot of the first one, because the
> compositing manager gets the DRI2 front buffer from the first, since
> destroyed window.
>
> The patch below fixes that symptom, but I'm not sure it's correct. Right
> now I'm getting memory corruption when logging out or just restarting
> compiz, but then again people seem to be reporting such symptoms against
> server-1.8-branch anyway.
>
> BTW, shouldn't ProcDRI2DestroyDrawable() still destroy/unreference the
> DRI2 drawable resource?
>
>
> diff --git a/glx/glxdri2.c b/glx/glxdri2.c
> index 9752003..87918d9 100644
> --- a/glx/glxdri2.c
> +++ b/glx/glxdri2.c
> @@ -451,7 +451,7 @@ __glXDRIscreenCreateDrawable(__GLXscreen *screen,
>     private->base.waitGL       = __glXDRIdrawableWaitGL;
>     private->base.waitX                = __glXDRIdrawableWaitX;
>
> -    if (DRI2CreateDrawable(pDraw)) {
> +    if (DRI2CreateDrawable(pDraw, drawId)) {
>            xfree(private);
>            return NULL;
>     }
> diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
> index 642ea19..05da225 100644
> --- a/hw/xfree86/dri2/dri2.c
> +++ b/hw/xfree86/dri2/dri2.c
> @@ -125,13 +125,16 @@ DRI2GetDrawable(DrawablePtr pDraw)
>  }
>
>  int
> -DRI2CreateDrawable(DrawablePtr pDraw)
> +DRI2CreateDrawable(DrawablePtr pDraw, XID id)
>  {
>     DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
>     DRI2DrawablePtr pPriv;
>     CARD64          ust;
>     int                    rc;
>
> +    if (!pDraw->id)
> +       pDraw->id = id;
> +

I have to always set pDraw->id to id here or there is some rendering
errors. But I don't yet know where the incorrect old value is coming
from.

>     rc = dixLookupResourceByType((pointer *) &pPriv, pDraw->id,
>                                 dri2DrawableRes, NULL, DixReadAccess);
>     if (rc == Success || rc != BadValue)
> diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
> index a695c6d..42dd66e 100644
> --- a/hw/xfree86/dri2/dri2.h
> +++ b/hw/xfree86/dri2/dri2.h
> @@ -199,7 +199,7 @@ extern _X_EXPORT Bool DRI2Connect(ScreenPtr pScreen,
>
>  extern _X_EXPORT Bool DRI2Authenticate(ScreenPtr pScreen, drm_magic_t magic);
>
> -extern _X_EXPORT int DRI2CreateDrawable(DrawablePtr pDraw);
> +extern _X_EXPORT int DRI2CreateDrawable(DrawablePtr pDraw, XID id);
>
>  extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
>
> diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
> index 78f897b..6015126 100644
> --- a/hw/xfree86/dri2/dri2ext.c
> +++ b/hw/xfree86/dri2/dri2ext.c
> @@ -167,7 +167,7 @@ ProcDRI2CreateDrawable(ClientPtr client)
>                       &pDrawable, &status))
>        return status;
>
> -    status = DRI2CreateDrawable(pDrawable);
> +    status = DRI2CreateDrawable(pDrawable, stuff->drawable);
>     if (status != Success)
>        return status;
>
>
>
> --
> Earthling Michel Dänzer           |                http://www.vmware.com
> Libre software enthusiast         |          Debian, X and DRI developer
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list