On Tue, Feb 08, 2011 at 11:42:49PM +0200, ext Pauli wrote: > From: Pauli Nieminen <[email protected]> > > To let DRI2Drawable exists longer than Drawable driver has to use > DRI2DrawablePtr to complete swaps and MSC waits. This allows DRI2 to > clean up after all operations complete without accessing the freed > DrawablePtr. > > v2: > * Refactor interface to allow tracking when client is gone > > Signed-off-by: Pauli Nieminen <[email protected]> > --- > hw/xfree86/dri2/dri2.c | 118 +++++++++++++++++++++++++++++------------------ > hw/xfree86/dri2/dri2.h | 41 +++++++++++++++- > 2 files changed, 111 insertions(+), 48 deletions(-) > > diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c > index 91ae1a0..7e3e0fd 100644 > --- a/hw/xfree86/dri2/dri2.c > +++ b/hw/xfree86/dri2/dri2.c > @@ -95,11 +95,11 @@ typedef struct _DRI2Screen { > unsigned int lastSequence; > > DRI2CreateBufferProcPtr CreateBuffer; > - DRI2DestroyBufferProcPtr DestroyBuffer; > + DRI2DestroyBuffer2ProcPtr DestroyBuffer; > DRI2CopyRegionProcPtr CopyRegion; > DRI2ScheduleSwapProcPtr ScheduleSwap; > DRI2GetMSCProcPtr GetMSC; > - DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC; > + DRI2ScheduleWaitMSC2ProcPtr ScheduleWaitMSC; > DRI2AuthMagicProcPtr AuthMagic; > > HandleExposuresProcPtr HandleExposures; > @@ -107,6 +107,11 @@ typedef struct _DRI2Screen { > ConfigNotifyProcPtr ConfigNotify; > } DRI2ScreenRec; > > +typedef struct _DRI2SwapCompleteDataRec { > + ClientPtr client; > + void *data; > +} DRI2SwapCompleteDataRec, *DRI2SwapCompleteDataPtr; > + > static DRI2ScreenPtr > DRI2GetScreen(ScreenPtr pScreen) > { > @@ -137,6 +142,12 @@ DRI2DrawableGetDrawable(DRI2DrawablePtr pPriv) > return pPriv->drawable; > } > > +ScreenPtr > +DRI2DrawableGetScreen(DRI2DrawablePtr pPriv) > +{ > + return pPriv->dri2_screen->screen; > +} > + > static unsigned long > DRI2DrawableSerial(DrawablePtr pDraw) > { > @@ -323,6 +334,7 @@ static int DRI2DrawableGone(pointer p, XID id) > return Success; > > pDraw = pPriv->drawable; > + > if (pDraw->type == DRAWABLE_WINDOW) { > pWin = (WindowPtr) pDraw; > dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, NULL); > @@ -333,7 +345,7 @@ static int DRI2DrawableGone(pointer p, XID id) > > if (pPriv->buffers != NULL) { > for (i = 0; i < pPriv->bufferCount; i++) > - (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]); > + (*ds->DestroyBuffer)(pPriv, pPriv->buffers[i]); > > free(pPriv->buffers); > } > @@ -394,7 +406,7 @@ update_dri2_drawable_buffers(DRI2DrawablePtr pPriv, > DrawablePtr pDraw, > if (pPriv->buffers != NULL) { > for (i = 0; i < pPriv->bufferCount; i++) { > if (pPriv->buffers[i] != NULL) { > - (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]); > + (*ds->DestroyBuffer)(pPriv, pPriv->buffers[i]); > } > } > > @@ -531,7 +543,7 @@ err_out: > > for (i = 0; i < count; i++) { > if (buffers[i] != NULL) > - (*ds->DestroyBuffer)(pDraw, buffers[i]); > + (*ds->DestroyBuffer)(pPriv, buffers[i]); > } > > free(buffers); > @@ -684,14 +696,11 @@ DRI2CanExchange(DrawablePtr pDraw) > } > > void > -DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw, int frame, > - unsigned int tv_sec, unsigned int tv_usec) > +DRI2WaitMSCComplete2(DRI2DrawablePtr pPriv, int frame, > + unsigned int tv_sec, unsigned int tv_usec, > + void *data) > { > - DRI2DrawablePtr pPriv; > - > - pPriv = DRI2GetDrawable(pDraw); > - if (pPriv == NULL) > - return; > + ClientPtr client = data;
Why void* instead of ClientPtr? -- Ville Syrjälä _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
