[PATCHv2 1/2] DRI2: Track DRI2 drawables as resources, not privates
Pauli Nieminen
suokkos at gmail.com
Mon Apr 26 06:14:18 PDT 2010
On Mon, Apr 26, 2010 at 3:44 PM, Pauli Nieminen <suokkos at gmail.com> wrote:
> 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.
>
Sorry. I can't reproduce the problem after recompilation. It looks
like some compilation problem in my original binary instead of code
bug.
>> 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