Reviewed-by: Jeremy Huddleston <[email protected]>

I think this series needs a Tested-by: though.  I'll give it a go on Monday if 
nobody beats me to it.

--Jeremy


On Oct 1, 2011, at 11:08 PM, Jamey Sharp wrote:

> In the process, move reference counting into FreePixmap instead of
> doing it inconsistently in the various screen hooks.
> 
> Commit by Jamey Sharp and Josh Triplett.
> 
> Signed-off-by: Jamey Sharp <[email protected]>
> Signed-off-by: Josh Triplett <[email protected]>
> ---
> Xext/saver.c                |    4 +-
> Xext/shm.c                  |   29 ++++++++-----------
> Xext/xvmain.c               |   10 ++----
> composite/compalloc.c       |    2 +-
> composite/compwindow.c      |    7 ++--
> dbe/midbe.c                 |   24 ++++-----------
> dix/dispatch.c              |    6 ++--
> dix/gc.c                    |   20 ++++++------
> dix/glyphcurs.c             |    4 +-
> dix/pixmap.c                |    7 +++-
> dix/window.c                |   18 ++++++------
> doc/Xserver-spec.xml        |   12 ++++----
> exa/exa_classic.c           |   45 ++++++++++++-----------------
> exa/exa_driver.c            |   23 +++++----------
> exa/exa_glyphs.c            |    8 ++--
> exa/exa_mixed.c             |   33 ++++++++-------------
> exa/exa_offscreen.c         |    2 +-
> exa/exa_priv.h              |    6 ++--
> exa/exa_render.c            |    4 +-
> fb/fb.h                     |    2 +-
> fb/fbgc.c                   |    4 +-
> fb/fboverlay.c              |    2 +-
> fb/fbpixmap.c               |    6 +---
> fb/fbwindow.c               |    2 +-
> hw/dmx/dmxpixmap.c          |   11 +------
> hw/dmx/dmxpixmap.h          |    2 +-
> hw/dmx/glxProxy/glxext.c    |    4 +-
> hw/xfree86/common/xf86DGA.c |    4 +-
> hw/xfree86/xaa/xaaInit.c    |   65 ++++++++++++++++++++-----------------------
> hw/xnest/Pixmap.c           |    6 +---
> hw/xnest/XNPixmap.h         |    2 +-
> include/scrnintstr.h        |    2 +-
> mi/miarc.c                  |    4 +-
> mi/mibitblt.c               |    6 ++--
> mi/midispcur.c              |   14 ++++----
> mi/migc.c                   |    2 +-
> mi/miglblt.c                |    6 ++--
> mi/miscrinit.c              |    3 +-
> miext/damage/damage.c       |   20 +++++--------
> miext/shadow/shadow.c       |    4 +-
> render/glyph.c              |    4 +-
> render/mipict.c             |    4 +-
> render/mirect.c             |    2 +-
> render/picture.c            |    2 +-
> render/render.c             |    4 +-
> 45 files changed, 195 insertions(+), 256 deletions(-)
> 
> diff --git a/Xext/saver.c b/Xext/saver.c
> index 142758c..a0fd8b6 100644
> --- a/Xext/saver.c
> +++ b/Xext/saver.c
> @@ -326,9 +326,9 @@ FreeAttrs (ScreenSaverAttrPtr pAttr)
>     CursorPtr     pCursor;
> 
>     if ((pPixmap = pAttr->pBackgroundPixmap) != 0)
> -     (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>     if ((pPixmap = pAttr->pBorderPixmap) != 0)
> -     (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>     if ((pCursor = pAttr->pCursor) != 0)
>       FreeCursor (pCursor, (Cursor) 0);
> }
> diff --git a/Xext/shm.c b/Xext/shm.c
> index 9c8beb2..5acc4e3 100644
> --- a/Xext/shm.c
> +++ b/Xext/shm.c
> @@ -118,7 +118,7 @@ static void SShmCompletionEvent(
>     xShmCompletionEvent * /* to */
>     );
> 
> -static Bool ShmDestroyPixmap (PixmapPtr pPixmap);
> +static void ShmDestroyPixmap (PixmapPtr pPixmap);
> 
> 
> static unsigned char ShmReqCode;
> @@ -257,26 +257,21 @@ ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs)
>     ShmInitScreenPriv(pScreen)->shmFuncs = funcs;
> }
> 
> -static Bool
> +static void
> ShmDestroyPixmap (PixmapPtr pPixmap)
> {
>     ScreenPtr     pScreen = pPixmap->drawable.pScreen;
>     ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
> -    Bool         ret;
> -    if (pPixmap->refcnt == 1)
> -    {
> -     ShmDescPtr  shmdesc;
> -     shmdesc = (ShmDescPtr)dixLookupPrivate(&pPixmap->devPrivates,
> -                                            shmPixmapPrivateKey);
> -     if (shmdesc)
> -         ShmDetachSegment ((pointer) shmdesc, pPixmap->drawable.id);
> -    }
> -    
> +    ShmDescPtr  shmdesc;
> +    shmdesc = (ShmDescPtr)dixLookupPrivate(&pPixmap->devPrivates,
> +                                           shmPixmapPrivateKey);
> +    if (shmdesc)
> +        ShmDetachSegment ((pointer) shmdesc, pPixmap->drawable.id);
> +
>     pScreen->DestroyPixmap = screen_priv->destroyPixmap;
> -    ret = (*pScreen->DestroyPixmap) (pPixmap);
> +    (*pScreen->DestroyPixmap) (pPixmap);
>     screen_priv->destroyPixmap = pScreen->DestroyPixmap;
>     pScreen->DestroyPixmap = ShmDestroyPixmap;
> -    return ret;
> }
> 
> void
> @@ -512,7 +507,7 @@ doShmPutImage(DrawablePtr dst, GCPtr pGC,
>       else
>           (void)(*pGC->ops->CopyArea)(&pPixmap->drawable, dst, pGC, 0, 0, sw, 
> sh,
>                                       dx, dy);
> -     (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>     }
> }
> 
> @@ -1021,7 +1016,7 @@ fbShmCreatePixmap (ScreenPtr pScreen,
> 
>     if (!(*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth,
>           BitsPerPixel(depth), PixmapBytePad(width, depth), (pointer)addr)) {
> -     (*pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>       return NullPixmap;
>     }
>     return pPixmap;
> @@ -1094,7 +1089,7 @@ CreatePmap:
>       rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
>                     pMap, RT_NONE, NULL, DixCreateAccess);
>       if (rc != Success) {
> -         pDraw->pScreen->DestroyPixmap(pMap);
> +         FreePixmap(pMap);
>           return rc;
>       }
>       dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
> diff --git a/Xext/xvmain.c b/Xext/xvmain.c
> index d21a56c..0f12ec4 100644
> --- a/Xext/xvmain.c
> +++ b/Xext/xvmain.c
> @@ -129,7 +129,7 @@ static void WriteSwappedPortNotifyEvent(xvEvent *, 
> xvEvent *);
> static Bool CreateResourceTypes(void);
> 
> static Bool XvCloseScreen(int, ScreenPtr);
> -static Bool XvDestroyPixmap(PixmapPtr);
> +static void XvDestroyPixmap(PixmapPtr);
> static Bool XvDestroyWindow(WindowPtr);
> static void XvResetProc(ExtensionEntry*);
> static int XvdiDestroyGrab(pointer, XID);
> @@ -341,10 +341,9 @@ XvGetRTPort(void)
>   return XvRTPort;
> }
> 
> -static Bool
> +static void
> XvDestroyPixmap(PixmapPtr pPix)
> {
> -  Bool status;
>   ScreenPtr pScreen;
>   XvScreenPtr pxvs;
>   XvAdaptorPtr pa;
> @@ -384,12 +383,9 @@ XvDestroyPixmap(PixmapPtr pPix)
>       pa++;
>     }
> 
> -  status = (* pScreen->DestroyPixmap)(pPix);
> +  (* pScreen->DestroyPixmap)(pPix);
> 
>   SCREEN_EPILOGUE(pScreen, DestroyPixmap, XvDestroyPixmap);
> -
> -  return status;
> -
> }
> 
> static Bool
> diff --git a/composite/compalloc.c b/composite/compalloc.c
> index f00bf4e..58f31c0 100644
> --- a/composite/compalloc.c
> +++ b/composite/compalloc.c
> @@ -331,7 +331,7 @@ compFreeClientWindow (WindowPtr pWin, XID id)
> 
>     if (pPixmap) {
>       compRestoreWindow (pWin, pPixmap);
> -     (*pScreen->DestroyPixmap) (pPixmap);
> +     FreePixmap (pPixmap);
>     }
> }
> 
> diff --git a/composite/compwindow.c b/composite/compwindow.c
> index d2a866d..977fe00 100644
> --- a/composite/compwindow.c
> +++ b/composite/compwindow.c
> @@ -169,7 +169,7 @@ compCheckRedirect (WindowPtr pWin)
>           PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
>           compSetParentPixmap (pWin);
>           compRestoreWindow (pWin, pPixmap);
> -         (*pScreen->DestroyPixmap) (pPixmap);
> +         FreePixmap (pPixmap);
>       }
>     } else if (should) {
>       if (cw->update == CompositeRedirectAutomatic)
> @@ -360,13 +360,12 @@ compImplicitRedirect (WindowPtr pWin, WindowPtr pParent)
> 
> static void compFreeOldPixmap(WindowPtr pWin)
> {
> -    ScreenPtr                pScreen = pWin->drawable.pScreen;
>     if (pWin->redirectDraw != RedirectDrawNone)
>     {
>       CompWindowPtr   cw = GetCompWindow (pWin);
>       if (cw->pOldPixmap)
>       {
> -         (*pScreen->DestroyPixmap) (cw->pOldPixmap);
> +         FreePixmap(cw->pOldPixmap);
>           cw->pOldPixmap = NullPixmap;
>       }
>     }
> @@ -596,7 +595,7 @@ compDestroyWindow (WindowPtr pWin)
>     if (pWin->redirectDraw != RedirectDrawNone) {
>       PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
>       compSetParentPixmap (pWin);
> -     (*pScreen->DestroyPixmap) (pPixmap);
> +     FreePixmap (pPixmap);
>     }
>     ret = (*pScreen->DestroyWindow) (pWin);
>     cs->DestroyWindow = pScreen->DestroyWindow;
> diff --git a/dbe/midbe.c b/dbe/midbe.c
> index b43ac1b..5cbf376 100644
> --- a/dbe/midbe.c
> +++ b/dbe/midbe.c
> @@ -184,7 +184,7 @@ miDbeAllocBackBufferName(WindowPtr pWin, XID bufId, int 
> swapAction)
>                                      pDbeWindowPriv->height,
>                                      pWin->drawable.depth, 0)))
>         {
> -            (*pScreen->DestroyPixmap)(pDbeWindowPrivPriv->pFrontBuffer); 
> +            FreePixmap(pDbeWindowPrivPriv->pFrontBuffer);
>             return BadAlloc;
>         }
> 
> @@ -478,15 +478,9 @@ miDbeWinPrivDelete(DbeWindowPrivPtr pDbeWindowPriv, XID 
> bufId)
> 
>     /* Destroy the front and back pixmaps. */
>     if (pDbeWindowPrivPriv->pFrontBuffer)
> -    {
> -        (*pDbeWindowPriv->pWindow->drawable.pScreen->DestroyPixmap)(
> -            pDbeWindowPrivPriv->pFrontBuffer);
> -    }
> +        FreePixmap(pDbeWindowPrivPriv->pFrontBuffer);
>     if (pDbeWindowPrivPriv->pBackBuffer)
> -    {
> -        (*pDbeWindowPriv->pWindow->drawable.pScreen->DestroyPixmap)(
> -            pDbeWindowPrivPriv->pBackBuffer);
> -    }
> +        FreePixmap(pDbeWindowPrivPriv->pBackBuffer);
> 
> } /* miDbeWinPrivDelete() */
> 
> @@ -652,14 +646,10 @@ miDbePositionWindow(WindowPtr pWin, int x, int y)
>         /* We failed at creating 1 or 2 of the pixmaps. */
> 
>         if (pFrontBuffer)
> -        {
> -         (*pScreen->DestroyPixmap)(pFrontBuffer);
> -        }
> +            FreePixmap(pFrontBuffer);
> 
>         if (pBackBuffer)
> -        {
> -         (*pScreen->DestroyPixmap)(pBackBuffer);
> -        }
> +            FreePixmap(pBackBuffer);
> 
>         /* Destroy all buffers for this window. */
>         while (pDbeWindowPriv)
> @@ -719,8 +709,8 @@ miDbePositionWindow(WindowPtr pWin, int x, int y)
>          * pixmaps.
>          */
> 
> -     (*pScreen->DestroyPixmap)(pDbeWindowPrivPriv->pFrontBuffer);
> -     (*pScreen->DestroyPixmap)(pDbeWindowPrivPriv->pBackBuffer);
> +        FreePixmap(pDbeWindowPrivPriv->pFrontBuffer);
> +        FreePixmap(pDbeWindowPrivPriv->pBackBuffer);
> 
>         pDbeWindowPrivPriv->pFrontBuffer = pFrontBuffer;
>         pDbeWindowPrivPriv->pBackBuffer  = pBackBuffer;
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index 43cb4d1..9cca8d9 100644
> --- a/dix/dispatch.c
> +++ b/dix/dispatch.c
> @@ -1349,8 +1349,8 @@ ProcListFontsWithInfo(ClientPtr client)
> int
> dixDestroyPixmap(pointer value, XID pid)
> {
> -    PixmapPtr pPixmap = (PixmapPtr)value;
> -    return (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
> +    FreePixmap(value);
> +    return TRUE;
> }
> 
> int
> @@ -1414,7 +1414,7 @@ CreatePmap:
>       rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
>                     pMap, RT_NONE, NULL, DixCreateAccess);
>       if (rc != Success) {
> -         (*pDraw->pScreen->DestroyPixmap)(pMap);
> +         FreePixmap(pMap);
>           return rc;
>       }
>       if (AddResource(stuff->pid, RT_PIXMAP, (pointer)pMap))
> diff --git a/dix/gc.c b/dix/gc.c
> index d33f934..9a39f57 100644
> --- a/dix/gc.c
> +++ b/dix/gc.c
> @@ -258,7 +258,7 @@ ChangeGC(ClientPtr client, GC *pGC, BITS32 mask, 
> ChangeGCValPtr pUnion)
>               {
>                   pPixmap->refcnt++;
>                   if (!pGC->tileIsPixel)
> -                     (* pGC->pScreen->DestroyPixmap)(pGC->tile.pixmap);
> +                     FreePixmap(pGC->tile.pixmap);
>                   pGC->tileIsPixel = FALSE;
>                   pGC->tile.pixmap = pPixmap;
>               }
> @@ -274,7 +274,7 @@ ChangeGC(ClientPtr client, GC *pGC, BITS32 mask, 
> ChangeGCValPtr pUnion)
>               {
>                   pPixmap->refcnt++;
>                   if (pGC->stipple)
> -                     (* pGC->pScreen->DestroyPixmap)(pGC->stipple);
> +                     FreePixmap(pGC->stipple);
>                   pGC->stipple = pPixmap;
>               }
>               break;
> @@ -582,7 +582,7 @@ CreateDefaultTile (GCPtr pGC)
>     if (!pTile || !pgcScratch)
>     {
>       if (pTile)
> -         (*pTile->drawable.pScreen->DestroyPixmap)(pTile);
> +         FreePixmap(pTile);
>       if (pgcScratch)
>           FreeScratchGC(pgcScratch);
>       return FALSE;
> @@ -663,7 +663,7 @@ CopyGC(GC *pgcSrc, GC *pgcDst, BITS32 mask)
>                       break;
>                   }
>                   if (!pgcDst->tileIsPixel)
> -                     (* pgcDst->pScreen->DestroyPixmap)(pgcDst->tile.pixmap);
> +                     FreePixmap(pgcDst->tile.pixmap);
>                   pgcDst->tileIsPixel = pgcSrc->tileIsPixel;
>                   pgcDst->tile = pgcSrc->tile;
>                   if (!pgcDst->tileIsPixel)
> @@ -675,7 +675,7 @@ CopyGC(GC *pgcSrc, GC *pgcDst, BITS32 mask)
>                   if (pgcDst->stipple == pgcSrc->stipple)
>                       break;
>                   if (pgcDst->stipple)
> -                     (* pgcDst->pScreen->DestroyPixmap)(pgcDst->stipple);
> +                     FreePixmap(pgcDst->stipple);
>                   pgcDst->stipple = pgcSrc->stipple;
>                   if (pgcDst->stipple)
>                       pgcDst->stipple->refcnt ++;
> @@ -775,9 +775,9 @@ FreeGC(pointer value, XID gid)
>     DestroyClip(pGC);
> 
>     if (!pGC->tileIsPixel)
> -     (* pGC->pScreen->DestroyPixmap)(pGC->tile.pixmap);
> +     FreePixmap(pGC->tile.pixmap);
>     if (pGC->stipple)
> -     (* pGC->pScreen->DestroyPixmap)(pGC->stipple);
> +     FreePixmap(pGC->stipple);
> 
>     (*pGC->funcs->DestroyGC) (pGC);
>     if (pGC->dash != DefaultDash)
> @@ -925,7 +925,7 @@ CreateDefaultStipple(int screenNum)
>     pgcScratch = GetScratchGC(1, pScreen);
>     if (!pgcScratch)
>     {
> -     (*pScreen->DestroyPixmap)(pScreen->PixmapPerDepth[0]);
> +     FreePixmap(pScreen->PixmapPerDepth[0]);
>       return FALSE;
>     }
>     (void)ChangeGC(NullClient, pgcScratch, 
> GCFunction|GCForeground|GCFillStyle, tmpval);
> @@ -944,7 +944,7 @@ void
> FreeDefaultStipple(int screenNum)
> {
>     ScreenPtr pScreen = screenInfo.screens[screenNum];
> -    (*pScreen->DestroyPixmap)(pScreen->PixmapPerDepth[0]);
> +    FreePixmap(pScreen->PixmapPerDepth[0]);
> }
> 
> int
> @@ -1099,7 +1099,7 @@ ChangeClip(GCPtr pGC, int type, pointer pvalue, int 
> nrects)
>     {
>       /* convert the pixmap to a region */
>       pGC->clientClip = BitmapToRegion(pGC->pScreen, (PixmapPtr) pvalue);
> -     (*pGC->pScreen->DestroyPixmap) (pvalue);
> +     FreePixmap(pvalue);
>     }
>     else if (type == CT_REGION)
>     {
> diff --git a/dix/glyphcurs.c b/dix/glyphcurs.c
> index fa2aeca..1d7de27 100644
> --- a/dix/glyphcurs.c
> +++ b/dix/glyphcurs.c
> @@ -102,7 +102,7 @@ ServerBitsFromGlyph(FontPtr pfont, unsigned ch, 
> CursorMetricPtr cm, unsigned cha
>     if (!ppix || !pGC)
>     {
>       if (ppix)
> -         (*pScreen->DestroyPixmap)(ppix);
> +         FreePixmap(ppix);
>       if (pGC)
>           FreeScratchGC(pGC);
>       free(pbits);
> @@ -132,7 +132,7 @@ ServerBitsFromGlyph(FontPtr pfont, unsigned ch, 
> CursorMetricPtr cm, unsigned cha
>                        XYPixmap, 1, pbits);
>     *ppbits = (unsigned char *)pbits;
>     FreeScratchGC(pGC);
> -    (*pScreen->DestroyPixmap)(ppix);
> +    FreePixmap(ppix);
>     return Success;
> }
> 
> diff --git a/dix/pixmap.c b/dix/pixmap.c
> index cbb5e7f..a0f7a39 100644
> --- a/dix/pixmap.c
> +++ b/dix/pixmap.c
> @@ -65,7 +65,7 @@ GetScratchPixmapHeader(ScreenPtr pScreen, int width, int 
> height, int depth,
>       if ((*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth,
>                                          bitsPerPixel, devKind, pPixData))
>           return pPixmap;
> -     (*pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>     }
>     return NullPixmap;
> }
> @@ -81,7 +81,7 @@ FreeScratchPixmapHeader(PixmapPtr pPixmap)
> 
>       pPixmap->devPrivate.ptr = NULL; /* lest ddx chases bad ptr */
>       if (pScreen->pScratchPixmap)
> -         (*pScreen->DestroyPixmap)(pPixmap);
> +         FreePixmap(pPixmap);
>       else
>           pScreen->pScratchPixmap = pPixmap;
>     }
> @@ -132,6 +132,9 @@ AllocatePixmap(ScreenPtr pScreen, int pixDataSize)
> void
> FreePixmap(PixmapPtr pPixmap)
> {
> +    if(--pPixmap->refcnt)
> +     return;
> +    (*pPixmap->drawable.pScreen->DestroyPixmap) (pPixmap);
>     dixFiniPrivates(pPixmap, PRIVATE_PIXMAP);
>     free(pPixmap);
> }
> diff --git a/dix/window.c b/dix/window.c
> index 1953f02..42cfef7 100644
> --- a/dix/window.c
> +++ b/dix/window.c
> @@ -932,9 +932,9 @@ FreeWindowResources(WindowPtr pWin)
>     if (wInputShape (pWin))
>       RegionDestroy(wInputShape (pWin));
>     if (pWin->borderIsPixel == FALSE)
> -     (*pScreen->DestroyPixmap)(pWin->border.pixmap);
> +     FreePixmap(pWin->border.pixmap);
>     if (pWin->backgroundState == BackgroundPixmap)
> -     (*pScreen->DestroyPixmap)(pWin->background.pixmap);
> +     FreePixmap(pWin->background.pixmap);
> 
>     DeleteAllWindowProperties(pWin);
>     /* We SHOULD check for an error value here XXX */
> @@ -1125,7 +1125,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID 
> *vlist, ClientPtr client)
>           if (pixID == None)
>           {
>               if (pWin->backgroundState == BackgroundPixmap)
> -                 (*pScreen->DestroyPixmap)(pWin->background.pixmap);
> +                 FreePixmap(pWin->background.pixmap);
>               if (!pWin->parent)
>                   SetRootWindowBackground(pWin, pScreen, &index2);
>               else {
> @@ -1142,7 +1142,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID 
> *vlist, ClientPtr client)
>                   goto PatchUp;
>               }
>               if (pWin->backgroundState == BackgroundPixmap)
> -                 (*pScreen->DestroyPixmap)(pWin->background.pixmap);
> +                 FreePixmap(pWin->background.pixmap);
>               if (!pWin->parent)
>                   SetRootWindowBackground(pWin, pScreen, &index2);
>               else
> @@ -1164,7 +1164,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID 
> *vlist, ClientPtr client)
>                       goto PatchUp;
>                   }
>                   if (pWin->backgroundState == BackgroundPixmap)
> -                     (*pScreen->DestroyPixmap)(pWin->background.pixmap);
> +                     FreePixmap(pWin->background.pixmap);
>                   pWin->backgroundState = BackgroundPixmap;
>                   pWin->background.pixmap = pPixmap;
>                   pPixmap->refcnt++;
> @@ -1181,7 +1181,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID 
> *vlist, ClientPtr client)
>           if (pWin->backgroundState == ParentRelative)
>               borderRelative = TRUE;
>           if (pWin->backgroundState == BackgroundPixmap)
> -             (*pScreen->DestroyPixmap)(pWin->background.pixmap);
> +             FreePixmap(pWin->background.pixmap);
>           pWin->backgroundState = BackgroundPixel;
>           pWin->background.pixel = (CARD32 ) *pVlist;
>                  /* background pixel overrides background pixmap,
> @@ -1202,7 +1202,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID 
> *vlist, ClientPtr client)
>               }
>               if (pWin->parent->borderIsPixel == TRUE) {
>                   if (pWin->borderIsPixel == FALSE)
> -                     (*pScreen->DestroyPixmap)(pWin->border.pixmap);
> +                     FreePixmap(pWin->border.pixmap);
>                   pWin->border = pWin->parent->border;
>                   pWin->borderIsPixel = TRUE;
>                   index2 = CWBorderPixel;
> @@ -1224,7 +1224,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID 
> *vlist, ClientPtr client)
>                   goto PatchUp;
>               }
>               if (pWin->borderIsPixel == FALSE)
> -                 (*pScreen->DestroyPixmap)(pWin->border.pixmap);
> +                 FreePixmap(pWin->border.pixmap);
>               pWin->borderIsPixel = FALSE;
>               pWin->border.pixmap = pPixmap;
>               pPixmap->refcnt++;
> @@ -1238,7 +1238,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID 
> *vlist, ClientPtr client)
>           break;
>         case CWBorderPixel:
>           if (pWin->borderIsPixel == FALSE)
> -             (*pScreen->DestroyPixmap)(pWin->border.pixmap);
> +             FreePixmap(pWin->border.pixmap);
>           pWin->borderIsPixel = TRUE;
>           pWin->border.pixel = (CARD32) *pVlist;
>                   /* border pixel overrides border pixmap,
> diff --git a/doc/Xserver-spec.xml b/doc/Xserver-spec.xml
> index 596a80a..4bcca7a 100644
> --- a/doc/Xserver-spec.xml
> +++ b/doc/Xserver-spec.xml
> @@ -3089,15 +3089,15 @@ See Xserver/fb/fbpixmap.c for the sample server 
> implementation.</para>
> <para>
> <blockquote><programlisting>
> 
> -     Bool pScreen->DestroyPixmap(pPixmap)
> +     void pScreen->DestroyPixmap(pPixmap)
>               PixmapPtr pPixmap;
> 
> </programlisting></blockquote>
> -This ScreenRec procedure must "destroy" a pixmap.
> -It should decrement the reference count and, if zero, it
> -must deallocate the PixmapRec and all attached devPrivate blocks.
> -If successful, it returns TRUE.
> -See Xserver/fb/fbpixmap.c for the sample server implementation.</para>
> +This ScreenRec procedure must "destroy" a pixmap. It must clean up
> +screen private data. It will only be called when the pixmap's reference
> +count has dropped to zero, and after the screen hooks return the pixmap
> +will be free'd. See Xserver/fb/fbpixmap.c for the sample server
> +implementation.</para>
> <para>
> <blockquote><programlisting>
> 
> diff --git a/exa/exa_classic.c b/exa/exa_classic.c
> index 919b29d..ce37c98 100644
> --- a/exa/exa_classic.c
> +++ b/exa/exa_classic.c
> @@ -98,7 +98,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, 
> int depth,
> 
>     if (pExaPixmap->fb_pitch > 131071) {
>       swap(pExaScr, pScreen, DestroyPixmap);
> -     pScreen->DestroyPixmap (pPixmap);
> +     FreePixmap(pPixmap);
>       swap(pExaScr, pScreen, DestroyPixmap);
>       return NULL;
>     }
> @@ -110,7 +110,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, 
> int depth,
> 
>     if (pExaPixmap->pDamage == NULL) {
>       swap(pExaScr, pScreen, DestroyPixmap);
> -     pScreen->DestroyPixmap (pPixmap);
> +     FreePixmap(pPixmap);
>       swap(pExaScr, pScreen, DestroyPixmap);
>       return NULL;
>     }
> @@ -210,40 +210,33 @@ exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int 
> width, int height, int dept
>     return ret;
> }
> 
> -Bool
> +void
> exaDestroyPixmap_classic (PixmapPtr pPixmap)
> {
>     ScreenPtr pScreen = pPixmap->drawable.pScreen;
>     ExaScreenPriv(pScreen);
> -    Bool ret;
> +    ExaPixmapPriv(pPixmap);
> +
> +    exaDestroyPixmap(pPixmap);
> 
> -    if (pPixmap->refcnt == 1)
> +    if (pExaPixmap->area)
>     {
> -     ExaPixmapPriv (pPixmap);
> -
> -     exaDestroyPixmap(pPixmap);
> -
> -     if (pExaPixmap->area)
> -     {
> -         DBG_PIXMAP(("-- 0x%p (0x%x) (%dx%d)\n",
> -                        (void*)pPixmap->drawable.id,
> -                      ExaGetPixmapPriv(pPixmap)->area->offset,
> -                      pPixmap->drawable.width,
> -                      pPixmap->drawable.height));
> -         /* Free the offscreen area */
> -         exaOffscreenFree (pPixmap->drawable.pScreen, pExaPixmap->area);
> -         pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr;
> -         pPixmap->devKind = pExaPixmap->sys_pitch;
> -     }
> -     RegionUninit(&pExaPixmap->validSys);
> -     RegionUninit(&pExaPixmap->validFB);
> +        DBG_PIXMAP(("-- 0x%p (0x%x) (%dx%d)\n",
> +                    (void*)pPixmap->drawable.id,
> +                     ExaGetPixmapPriv(pPixmap)->area->offset,
> +                     pPixmap->drawable.width,
> +                     pPixmap->drawable.height));
> +        /* Free the offscreen area */
> +        exaOffscreenFree (pPixmap->drawable.pScreen, pExaPixmap->area);
> +        pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr;
> +        pPixmap->devKind = pExaPixmap->sys_pitch;
>     }
> +    RegionUninit(&pExaPixmap->validSys);
> +    RegionUninit(&pExaPixmap->validFB);
> 
>     swap(pExaScr, pScreen, DestroyPixmap);
> -    ret = pScreen->DestroyPixmap (pPixmap);
> +    pScreen->DestroyPixmap (pPixmap);
>     swap(pExaScr, pScreen, DestroyPixmap);
> -
> -    return ret;
> }
> 
> Bool
> diff --git a/exa/exa_driver.c b/exa/exa_driver.c
> index 795cb00..e79875d 100644
> --- a/exa/exa_driver.c
> +++ b/exa/exa_driver.c
> @@ -96,7 +96,7 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int 
> depth,
> 
>     if (!pExaPixmap->driverPriv) {
>       swap(pExaScr, pScreen, DestroyPixmap);
> -     pScreen->DestroyPixmap (pPixmap);
> +     FreePixmap(pPixmap);
>       swap(pExaScr, pScreen, DestroyPixmap);
>       return NULL;
>     }
> @@ -184,29 +184,22 @@ out:
>     return ret;
> }
> 
> -Bool
> +void
> exaDestroyPixmap_driver (PixmapPtr pPixmap)
> {
>     ScreenPtr pScreen = pPixmap->drawable.pScreen;
>     ExaScreenPriv(pScreen);
> -    Bool ret;
> +    ExaPixmapPriv(pPixmap);
> 
> -    if (pPixmap->refcnt == 1)
> -    {
> -     ExaPixmapPriv (pPixmap);
> +    exaDestroyPixmap(pPixmap);
> 
> -     exaDestroyPixmap(pPixmap);
> -
> -     if (pExaPixmap->driverPriv)
> -         pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv);
> -     pExaPixmap->driverPriv = NULL;
> -    }
> +    if (pExaPixmap->driverPriv)
> +        pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv);
> +    pExaPixmap->driverPriv = NULL;
> 
>     swap(pExaScr, pScreen, DestroyPixmap);
> -    ret = pScreen->DestroyPixmap (pPixmap);
> +    pScreen->DestroyPixmap (pPixmap);
>     swap(pExaScr, pScreen, DestroyPixmap);
> -
> -    return ret;
> }
> 
> Bool
> diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c
> index 5c46ec9..a4d3dcc 100644
> --- a/exa/exa_glyphs.c
> +++ b/exa/exa_glyphs.c
> @@ -194,7 +194,7 @@ exaRealizeGlyphCaches(ScreenPtr    pScreen,
>                            CPComponentAlpha, &component_alpha, serverClient,
>                            &error);
> 
> -    (*pScreen->DestroyPixmap) (pPixmap); /* picture holds a refcount */
> +    FreePixmap(pPixmap); /* picture holds a refcount */
> 
>     if (!pPicture)
>       return FALSE;
> @@ -749,7 +749,7 @@ exaGlyphs (CARD8   op,
>       {
>           PictFormatPtr argbFormat;
> 
> -         (*pScreen->DestroyPixmap) (pMaskPixmap);
> +         FreePixmap(pMaskPixmap);
> 
>           if (!pMask)
>               return;
> @@ -772,7 +772,7 @@ exaGlyphs (CARD8   op,
>           pMask = CreatePicture (0, &pMaskPixmap->drawable, maskFormat, 0, 0,
>                                  serverClient, &error);
>           if (!pMask) {
> -             (*pScreen->DestroyPixmap) (pMaskPixmap);
> +             FreePixmap(pMaskPixmap);
>               return;
>           }
>       }
> @@ -858,6 +858,6 @@ exaGlyphs (CARD8   op,
>                         x, y,
>                         width, height);
>       FreePicture ((pointer) pMask, (XID) 0);
> -     (*pScreen->DestroyPixmap) (pMaskPixmap);
> +     FreePixmap(pMaskPixmap);
>     }
> }
> diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
> index 0b1a4a4..e853ac9 100644
> --- a/exa/exa_mixed.c
> +++ b/exa/exa_mixed.c
> @@ -238,38 +238,31 @@ out:
>     return ret;
> }
> 
> -Bool
> +void
> exaDestroyPixmap_mixed(PixmapPtr pPixmap)
> {
>     ScreenPtr pScreen = pPixmap->drawable.pScreen;
>     ExaScreenPriv(pScreen);
> -    Bool ret;
> -
> -    if (pPixmap->refcnt == 1)
> -    {
> -     ExaPixmapPriv (pPixmap);
> +    ExaPixmapPriv(pPixmap);
> 
> -     exaDestroyPixmap(pPixmap);
> +    exaDestroyPixmap(pPixmap);
> 
> -     if (pExaScr->deferred_mixed_pixmap == pPixmap)
> -         pExaScr->deferred_mixed_pixmap = NULL;
> +    if (pExaScr->deferred_mixed_pixmap == pPixmap)
> +        pExaScr->deferred_mixed_pixmap = NULL;
> 
> -     if (pExaPixmap->driverPriv)
> -         pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv);
> -     pExaPixmap->driverPriv = NULL;
> +    if (pExaPixmap->driverPriv)
> +        pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv);
> +    pExaPixmap->driverPriv = NULL;
> 
> -     if (pExaPixmap->pDamage) {
> -         free(pExaPixmap->sys_ptr);
> -         pExaPixmap->sys_ptr = NULL;
> -         pExaPixmap->pDamage = NULL;
> -     }
> +    if (pExaPixmap->pDamage) {
> +        free(pExaPixmap->sys_ptr);
> +        pExaPixmap->sys_ptr = NULL;
> +        pExaPixmap->pDamage = NULL;
>     }
> 
>     swap(pExaScr, pScreen, DestroyPixmap);
> -    ret = pScreen->DestroyPixmap (pPixmap);
> +    pScreen->DestroyPixmap (pPixmap);
>     swap(pExaScr, pScreen, DestroyPixmap);
> -
> -    return ret;
> }
> 
> Bool
> diff --git a/exa/exa_offscreen.c b/exa/exa_offscreen.c
> index 5abe3b8..a65eca1 100644
> --- a/exa/exa_offscreen.c
> +++ b/exa/exa_offscreen.c
> @@ -632,7 +632,7 @@ ExaOffscreenDefragment (ScreenPtr pScreen)
>     pDstPix->drawable.depth = 0;
>     pDstPix->drawable.bitsPerPixel = 0;
> 
> -    (*pScreen->DestroyPixmap) (pDstPix);
> +    FreePixmap(pDstPix);
> 
>     if (area->state == ExaOffscreenAvail && area->size > largest_size)
>       return area;
> diff --git a/exa/exa_priv.h b/exa/exa_priv.h
> index 64b2671..38ac4aa 100644
> --- a/exa/exa_priv.h
> +++ b/exa/exa_priv.h
> @@ -593,7 +593,7 @@ Bool
> exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int 
> depth,
>                     int bitsPerPixel, int devKind, pointer pPixData);
> 
> -Bool
> +void
> exaDestroyPixmap_classic (PixmapPtr pPixmap);
> 
> Bool
> @@ -608,7 +608,7 @@ Bool
> exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int 
> depth,
>                     int bitsPerPixel, int devKind, pointer pPixData);
> 
> -Bool
> +void
> exaDestroyPixmap_driver (PixmapPtr pPixmap);
> 
> Bool
> @@ -623,7 +623,7 @@ Bool
> exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int 
> depth,
>                     int bitsPerPixel, int devKind, pointer pPixData);
> 
> -Bool
> +void
> exaDestroyPixmap_mixed(PixmapPtr pPixmap);
> 
> Bool
> diff --git a/exa/exa_render.c b/exa/exa_render.c
> index 6f2af8a..6251362 100644
> --- a/exa/exa_render.c
> +++ b/exa/exa_render.c
> @@ -1112,7 +1112,7 @@ exaCreateAlphaPicture (ScreenPtr     pScreen,
>     pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
>     if (!pGC)
>     {
> -     (*pScreen->DestroyPixmap) (pPixmap);
> +     FreePixmap(pPixmap);
>       return 0;
>     }
>     ValidateGC (&pPixmap->drawable, pGC);
> @@ -1125,7 +1125,7 @@ exaCreateAlphaPicture (ScreenPtr     pScreen,
>     FreeScratchGC (pGC);
>     pPicture = CreatePicture (0, &pPixmap->drawable, pPictFormat,
>                             0, 0, serverClient, &error);
> -    (*pScreen->DestroyPixmap) (pPixmap);
> +    FreePixmap(pPixmap);
>     return pPicture;
> }
> 
> diff --git a/fb/fb.h b/fb/fb.h
> index eaa21ad..35fdb65 100644
> --- a/fb/fb.h
> +++ b/fb/fb.h
> @@ -1603,7 +1603,7 @@ extern _X_EXPORT PixmapPtr
> fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
>               unsigned usage_hint);
> 
> -extern _X_EXPORT Bool
> +extern _X_EXPORT void
> fbDestroyPixmap (PixmapPtr pPixmap);
> 
> extern _X_EXPORT RegionPtr
> diff --git a/fb/fbgc.c b/fb/fbgc.c
> index aa75d7a..481a18f 100644
> --- a/fb/fbgc.c
> +++ b/fb/fbgc.c
> @@ -210,7 +210,7 @@ fbValidateGC(GCPtr pGC, unsigned long changes, 
> DrawablePtr pDrawable)
>     }
>     if ((changes & GCTile) && fbGetRotatedPixmap(pGC))
>     {
> -     (*pGC->pScreen->DestroyPixmap) (fbGetRotatedPixmap(pGC));
> +     FreePixmap(fbGetRotatedPixmap(pGC));
>       fbGetRotatedPixmap(pGC) = 0;
>     }
>       
> @@ -225,7 +225,7 @@ fbValidateGC(GCPtr pGC, unsigned long changes, 
> DrawablePtr pDrawable)
>           if (!pNewTile || pNewTile ->drawable.bitsPerPixel != 
> pDrawable->bitsPerPixel)
>           {
>               if (pNewTile)
> -                 (*pGC->pScreen->DestroyPixmap) (pNewTile);
> +                 FreePixmap(pNewTile);
>               pNewTile = fb24_32ReformatTile (pOldTile, 
> pDrawable->bitsPerPixel);
>           }
>           if (pNewTile)
> diff --git a/fb/fboverlay.c b/fb/fboverlay.c
> index 255cc23..38c38f8 100644
> --- a/fb/fboverlay.c
> +++ b/fb/fboverlay.c
> @@ -89,7 +89,7 @@ fbOverlayCloseScreen (int iScreen, ScreenPtr pScreen)
> 
>     for (i = 0; i < pScrPriv->nlayers; i++)
>     {
> -     (*pScreen->DestroyPixmap)(pScrPriv->layer[i].u.run.pixmap);
> +     FreePixmap(pScrPriv->layer[i].u.run.pixmap);
>       RegionUninit(&pScrPriv->layer[i].u.run.region);
>     }
>     return TRUE;
> diff --git a/fb/fbpixmap.c b/fb/fbpixmap.c
> index a356c67..4045ee0 100644
> --- a/fb/fbpixmap.c
> +++ b/fb/fbpixmap.c
> @@ -94,13 +94,9 @@ fbCreatePixmap (ScreenPtr pScreen, int width, int height, 
> int depth,
>     return fbCreatePixmapBpp (pScreen, width, height, depth, bpp, usage_hint);
> }
> 
> -Bool
> +void
> fbDestroyPixmap (PixmapPtr pPixmap)
> {
> -    if(--pPixmap->refcnt)
> -     return TRUE;
> -    FreePixmap(pPixmap);
> -    return TRUE;
> }
> 
> #define ADDRECT(reg,r,fr,rx1,ry1,rx2,ry2)                     \
> diff --git a/fb/fbwindow.c b/fb/fbwindow.c
> index 7906f8d..f3148e4 100644
> --- a/fb/fbwindow.c
> +++ b/fb/fbwindow.c
> @@ -156,7 +156,7 @@ fbFixupWindowPixmap(DrawablePtr pDrawable, PixmapPtr 
> *ppPixmap)
>       pPixmap = fb24_32ReformatTile (pPixmap, pDrawable->bitsPerPixel);
>       if (!pPixmap)
>           return;
> -     (*pDrawable->pScreen->DestroyPixmap) (*ppPixmap);
> +     FreePixmap(*ppPixmap);
>       *ppPixmap = pPixmap;
>     }
>     if (FbEvenTile (pPixmap->drawable.width *
> diff --git a/hw/dmx/dmxpixmap.c b/hw/dmx/dmxpixmap.c
> index 81b7115..19f3ac7 100644
> --- a/hw/dmx/dmxpixmap.c
> +++ b/hw/dmx/dmxpixmap.c
> @@ -151,19 +151,15 @@ Bool dmxBEFreePixmap(PixmapPtr pPixmap)
> }
> 
> /** Destroy the pixmap pointed to by \a pPixmap. */
> -Bool dmxDestroyPixmap(PixmapPtr pPixmap)
> +void dmxDestroyPixmap(PixmapPtr pPixmap)
> {
>     ScreenPtr      pScreen = pPixmap->drawable.pScreen;
>     DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
> -    Bool           ret = TRUE;
> 
> #if 0
>     DMX_UNWRAP(DestroyPixmap, dmxScreen, pScreen);
> #endif
> 
> -    if (--pPixmap->refcnt)
> -     return TRUE;
> -
>     /* Destroy pixmap on back-end server */
>     if (dmxScreen->beDisplay) {
>       if (dmxBEFreePixmap(pPixmap)) {
> @@ -174,15 +170,12 @@ Bool dmxDestroyPixmap(PixmapPtr pPixmap)
>           dmxSync(dmxScreen, FALSE);
>       }
>     }
> -    FreePixmap(pPixmap);
> 
> #if 0
>     if (pScreen->DestroyPixmap)
> -     ret = pScreen->DestroyPixmap(pPixmap);
> +     pScreen->DestroyPixmap(pPixmap);
>     DMX_WRAP(DestroyPixmap, dmxDestroyPixmap, dmxScreen, pScreen);
> #endif
> -
> -    return ret;
> }
> 
> /** Create and return a region based on the pixmap pointed to by \a
> diff --git a/hw/dmx/dmxpixmap.h b/hw/dmx/dmxpixmap.h
> index 59da788..0bb19c3 100644
> --- a/hw/dmx/dmxpixmap.h
> +++ b/hw/dmx/dmxpixmap.h
> @@ -51,7 +51,7 @@ extern Bool      dmxInitPixmap(ScreenPtr pScreen);
> extern PixmapPtr dmxCreatePixmap(ScreenPtr pScreen,
>                                int width, int height, int depth,
>                                unsigned usage_hint);
> -extern Bool      dmxDestroyPixmap(PixmapPtr pPixmap);
> +extern void      dmxDestroyPixmap(PixmapPtr pPixmap);
> extern RegionPtr dmxBitmapToRegion(PixmapPtr pPixmap);
> 
> extern void      dmxBECreatePixmap(PixmapPtr pPixmap);
> diff --git a/hw/dmx/glxProxy/glxext.c b/hw/dmx/glxProxy/glxext.c
> index 7f63b6b..ab6fb45 100644
> --- a/hw/dmx/glxProxy/glxext.c
> +++ b/hw/dmx/glxProxy/glxext.c
> @@ -163,10 +163,10 @@ void __glXFreeGLXPixmap( __GLXpixmap *pGlxPixmap )
>        PixmapPtr pPixmap = (PixmapPtr) pGlxPixmap->pDraw;
> 
>       /*
> -     ** The DestroyPixmap routine should decrement the refcount and free
> +     ** The FreePixmap routine decrements the refcount and frees
>       ** only if it's zero.
>       */
> -     (*pGlxPixmap->pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>       free(pGlxPixmap->be_xids);
>       free(pGlxPixmap);
>     }
> diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
> index 74eb739..067902b 100644
> --- a/hw/xfree86/common/xf86DGA.c
> +++ b/hw/xfree86/common/xf86DGA.c
> @@ -363,7 +363,7 @@ xf86SetDGAMode(
>               if(oldPix->drawable.id)
>                   FreeResource(oldPix->drawable.id, RT_NONE);
>               else
> -                 (*pScreen->DestroyPixmap)(oldPix);
> +                 FreePixmap(oldPix);
>           }
>           free(pScreenPriv->current);
>           pScreenPriv->current = NULL;
> @@ -424,7 +424,7 @@ xf86SetDGAMode(
>           if(oldPix->drawable.id)
>               FreeResource(oldPix->drawable.id, RT_NONE);
>           else
> -             (*pScreen->DestroyPixmap)(oldPix);
> +             FreePixmap(oldPix);
>       }
>       free(pScreenPriv->current);
>       pScreenPriv->current = NULL;
> diff --git a/hw/xfree86/xaa/xaaInit.c b/hw/xfree86/xaa/xaaInit.c
> index 11443a6..e889468 100644
> --- a/hw/xfree86/xaa/xaaInit.c
> +++ b/hw/xfree86/xaa/xaaInit.c
> @@ -35,7 +35,7 @@ static void XAAGetSpans(DrawablePtr pDrawable, int wMax, 
> DDXPointPtr ppt,
>                       int *pwidth, int nspans, char *pdstStart);
> static PixmapPtr XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
>                                unsigned usage_hint);
> -static Bool XAADestroyPixmap(PixmapPtr pPixmap);
> +static void XAADestroyPixmap(PixmapPtr pPixmap);
> static Bool XAAEnterVT (int index, int flags);
> static void XAALeaveVT (int index, int flags);
> static int  XAASetDGAMode(int index, int num, DGADevicePtr devRet);
> @@ -307,7 +307,7 @@ XAAPixmapBPP (ScreenPtr pScreen, int depth)
>     bpp = pPix->drawable.bitsPerPixel;
>     destroyPixmap = pScreen->DestroyPixmap;
>     XAA_SCREEN_PROLOGUE (pScreen, DestroyPixmap);
> -    (*pScreen->DestroyPixmap) (pPix);
> +    FreePixmap(pPix);
>     XAA_SCREEN_EPILOGUE (pScreen, DestroyPixmap, destroyPixmap);
>     return bpp;
> }
> @@ -426,50 +426,45 @@ BAILOUT:
>     return pPix;
> }
> 
> -static Bool 
> +static void
> XAADestroyPixmap(PixmapPtr pPix)
> {
>     ScreenPtr pScreen = pPix->drawable.pScreen;
>     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
>     XAAPixmapPtr pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
> -    Bool ret;
> 
> -    if(pPix->refcnt == 1) {
> -        if(pPriv->flags & OFFSCREEN) {
> -         if(pPriv->flags & DGA_PIXMAP)
> -             free(pPriv->offscreenArea);
> -            else {
> -             FBAreaPtr area = pPriv->offscreenArea;
> -             PixmapLinkPtr pLink = infoRec->OffscreenPixmaps;
> -             PixmapLinkPtr prev = NULL;
> -
> -             while(pLink->pPix != pPix) {
> -                 prev = pLink;
> -                 pLink = pLink->next;
> -             }
> -
> -             if(prev) prev->next = pLink->next;
> -             else infoRec->OffscreenPixmaps = pLink->next;
> -
> -             if(!area) area = pLink->area;
> -
> -             xf86FreeOffscreenArea(area);
> -             pPriv->offscreenArea = NULL;
> -             free(pLink);
> -         } 
> +    if(pPriv->flags & OFFSCREEN) {
> +        if(pPriv->flags & DGA_PIXMAP)
> +            free(pPriv->offscreenArea);
> +        else {
> +            FBAreaPtr area = pPriv->offscreenArea;
> +            PixmapLinkPtr pLink = infoRec->OffscreenPixmaps;
> +            PixmapLinkPtr prev = NULL;
> +
> +            while(pLink->pPix != pPix) {
> +                prev = pLink;
> +                pLink = pLink->next;
> +            }
> +
> +            if(prev) prev->next = pLink->next;
> +            else infoRec->OffscreenPixmaps = pLink->next;
> +
> +            if(!area) area = pLink->area;
> +
> +            xf86FreeOffscreenArea(area);
> +            pPriv->offscreenArea = NULL;
> +            free(pLink);
>         }
> +    }
> 
> -        if(pPriv->freeData) { /* pixmaps that were once in video ram */
> -         free(pPix->devPrivate.ptr);
> -         pPix->devPrivate.ptr = NULL;
> -     }
> +    if(pPriv->freeData) { /* pixmaps that were once in video ram */
> +        free(pPix->devPrivate.ptr);
> +        pPix->devPrivate.ptr = NULL;
>     }
> 
>     XAA_SCREEN_PROLOGUE (pScreen, DestroyPixmap);
> -    ret = (*pScreen->DestroyPixmap) (pPix);
> +    (*pScreen->DestroyPixmap) (pPix);
>     XAA_SCREEN_EPILOGUE (pScreen, DestroyPixmap, XAADestroyPixmap);
> - 
> -    return ret;
> }
> 
> static Bool
> diff --git a/hw/xnest/Pixmap.c b/hw/xnest/Pixmap.c
> index eccf569..735f754 100644
> --- a/hw/xnest/Pixmap.c
> +++ b/hw/xnest/Pixmap.c
> @@ -68,14 +68,10 @@ xnestCreatePixmap(ScreenPtr pScreen, int width, int 
> height, int depth,
>   return pPixmap;
> }
> 
> -Bool
> +void
> xnestDestroyPixmap(PixmapPtr pPixmap)
> {
> -  if(--pPixmap->refcnt)
> -    return TRUE;
>   XFreePixmap(xnestDisplay, xnestPixmap(pPixmap));
> -  FreePixmap(pPixmap);
> -  return TRUE;
> }
> 
> RegionPtr
> diff --git a/hw/xnest/XNPixmap.h b/hw/xnest/XNPixmap.h
> index aa671ed..5816cef 100644
> --- a/hw/xnest/XNPixmap.h
> +++ b/hw/xnest/XNPixmap.h
> @@ -31,7 +31,7 @@ typedef struct {
> 
> PixmapPtr xnestCreatePixmap(ScreenPtr pScreen, int width, int height,
>                           int depth, unsigned usage_hint);
> -Bool xnestDestroyPixmap(PixmapPtr pPixmap);
> +void xnestDestroyPixmap(PixmapPtr pPixmap);
> RegionPtr xnestPixmapToRegion(PixmapPtr pPixmap);
> 
> #endif /* XNESTPIXMAP_H */
> diff --git a/include/scrnintstr.h b/include/scrnintstr.h
> index a9357e8..927ed04 100644
> --- a/include/scrnintstr.h
> +++ b/include/scrnintstr.h
> @@ -210,7 +210,7 @@ typedef    PixmapPtr (* CreatePixmapProcPtr)(
>       int /*depth*/,
>       unsigned /*usage_hint*/);
> 
> -typedef    Bool (* DestroyPixmapProcPtr)(
> +typedef    void (* DestroyPixmapProcPtr)(
>       PixmapPtr /*pPixmap*/);
> 
> typedef    Bool (* RealizeFontProcPtr)(
> diff --git a/mi/miarc.c b/mi/miarc.c
> index cd870fa..fdbf2f4 100644
> --- a/mi/miarc.c
> +++ b/mi/miarc.c
> @@ -1073,7 +1073,7 @@ miPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc 
> *parcs)
>       if (!polyArcs)
>       {
>           if (fTricky) {
> -             (*pDraw->pScreen->DestroyPixmap) ((PixmapPtr)pDrawTo);
> +             FreePixmap ((PixmapPtr)pDrawTo);
>               FreeScratchGC (pGCTo);
>           }
>           return;
> @@ -1164,7 +1164,7 @@ miPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc 
> *parcs)
> 
>       if(fTricky)
>       {
> -         (*pGCTo->pScreen->DestroyPixmap)((PixmapPtr)pDrawTo);
> +         FreePixmap((PixmapPtr)pDrawTo);
>           FreeScratchGC(pGCTo);
>       }
>     }
> diff --git a/mi/mibitblt.c b/mi/mibitblt.c
> index e302960..0944da1 100644
> --- a/mi/mibitblt.c
> +++ b/mi/mibitblt.c
> @@ -418,7 +418,7 @@ miOpqStipDrawable(DrawablePtr pDraw, GCPtr pGC, RegionPtr 
> prgnSrc,
>     pGCT = GetScratchGC(1, pDraw->pScreen);
>     if (!pGCT)
>     {
> -     (*pDraw->pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>       return;
>     }
>     /* First set the whole pixmap to 0 */
> @@ -528,7 +528,7 @@ miOpqStipDrawable(DrawablePtr pDraw, GCPtr pGC, RegionPtr 
> prgnSrc,
> 
>     ValidateGC(pDraw, pGC);
>     FreeScratchGC(pGCT);
> -    (*pDraw->pScreen->DestroyPixmap)(pPixmap);
> +    FreePixmap(pPixmap);
> 
> }
> 
> @@ -700,7 +700,7 @@ miGetImage( DrawablePtr pDraw, int sx, int sy, int w, int 
> h,
>       }
>       if (pPixmap)
>       {
> -         (*pGC->pScreen->DestroyPixmap)(pPixmap);
> +         FreePixmap(pPixmap);
>           FreeScratchGC(pGC);
>       }
>     }
> diff --git a/mi/midispcur.c b/mi/midispcur.c
> index 32c5c9d..a2c5162 100644
> --- a/mi/midispcur.c
> +++ b/mi/midispcur.c
> @@ -221,7 +221,7 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
>       pGC = GetScratchGC (32, pScreen);
>       if (!pGC)
>       {
> -         (*pScreen->DestroyPixmap) (pPixmap);
> +         FreePixmap(pPixmap);
>           free((pointer) pPriv);
>           return NULL;
>       }
> @@ -233,7 +233,7 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
>       FreeScratchGC (pGC);
>       pPriv->pPicture = CreatePicture (0, &pPixmap->drawable,
>                                       pFormat, 0, 0, serverClient, &error);
> -        (*pScreen->DestroyPixmap) (pPixmap);
> +     FreePixmap(pPixmap);
>       if (!pPriv->pPicture)
>       {
>           free((pointer) pPriv);
> @@ -253,7 +253,7 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
>     pPriv->maskBits =  (*pScreen->CreatePixmap) (pScreen, 
> pCursor->bits->width, pCursor->bits->height, 1, 0);
>     if (!pPriv->maskBits)
>     {
> -     (*pScreen->DestroyPixmap) (pPriv->sourceBits);
> +     FreePixmap(pPriv->sourceBits);
>       free((pointer) pPriv);
>       return NULL;
>     }
> @@ -306,9 +306,9 @@ miDCUnrealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
>     if (pPriv && (pCursor->bits->refcnt <= 1))
>     {
>       if (pPriv->sourceBits)
> -         (*pScreen->DestroyPixmap) (pPriv->sourceBits);
> +         FreePixmap(pPriv->sourceBits);
>       if (pPriv->maskBits)
> -         (*pScreen->DestroyPixmap) (pPriv->maskBits);
> +         FreePixmap(pPriv->maskBits);
> #ifdef ARGB_CURSOR
>       if (pPriv->pPicture)
>           FreePicture (pPriv->pPicture, 0);
> @@ -454,7 +454,7 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
>     if (!pSave || pSave->drawable.width < w || pSave->drawable.height < h)
>     {
>       if (pSave)
> -         (*pScreen->DestroyPixmap) (pSave);
> +         FreePixmap(pSave);
>       pBuffer->pSave = pSave =
>               (*pScreen->CreatePixmap) (pScreen, w, h, pScreen->rootDepth, 0);
>       if (!pSave)
> @@ -574,7 +574,7 @@ miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
>                  * free it again here. */
> #endif
> 
> -                if (pBuffer->pSave) 
> (*pScreen->DestroyPixmap)(pBuffer->pSave);
> +                if (pBuffer->pSave) FreePixmap(pBuffer->pSave);
> 
>                 free(pBuffer);
>                 dixSetScreenPrivate(&pDev->devPrivates, miDCDeviceKey, 
> pScreen, NULL);
> diff --git a/mi/migc.c b/mi/migc.c
> index bf9cf5a..f83208a 100644
> --- a/mi/migc.c
> +++ b/mi/migc.c
> @@ -48,7 +48,7 @@ void
> miDestroyGC(GCPtr pGC)
> {
>     if (pGC->pRotatedPixmap)
> -     (*pGC->pScreen->DestroyPixmap) (pGC->pRotatedPixmap);
> +     FreePixmap(pGC->pRotatedPixmap);
>     if (pGC->freeCompClip)
>       RegionDestroy(pGC->pCompositeClip);
> }
> diff --git a/mi/miglblt.c b/mi/miglblt.c
> index 9edb500..dcf08da 100644
> --- a/mi/miglblt.c
> +++ b/mi/miglblt.c
> @@ -130,7 +130,7 @@ miPolyGlyphBlt(
>     pGCtmp = GetScratchGC(1, pDrawable->pScreen);
>     if (!pGCtmp)
>     {
> -     (*pDrawable->pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>       return;
>     }
> 
> @@ -144,7 +144,7 @@ miPolyGlyphBlt(
>     pbits = malloc(height*nbyLine);
>     if (!pbits)
>     {
> -     (*pDrawable->pScreen->DestroyPixmap)(pPixmap);
> +     FreePixmap(pPixmap);
>       FreeScratchGC(pGCtmp);
>         return;
>     }
> @@ -189,7 +189,7 @@ miPolyGlyphBlt(
>       }
>       x += pci->metrics.characterWidth;
>     }
> -    (*pDrawable->pScreen->DestroyPixmap)(pPixmap);
> +    FreePixmap(pPixmap);
>     free(pbits);
>     FreeScratchGC(pGCtmp);
> }
> diff --git a/mi/miscrinit.c b/mi/miscrinit.c
> index fb01c68..7562cd2 100644
> --- a/mi/miscrinit.c
> +++ b/mi/miscrinit.c
> @@ -122,7 +122,8 @@ miModifyPixmapHeader(PixmapPtr pPixmap, int width, int 
> height, int depth,
> static Bool
> miCloseScreen (int iScreen, ScreenPtr pScreen)
> {
> -    return ((*pScreen->DestroyPixmap)((PixmapPtr)pScreen->devPrivate));
> +    FreePixmap(pScreen->devPrivate);
> +    return TRUE;
> }
> 
> /* With the introduction of pixmap privates, the "screen pixmap" can no
> diff --git a/miext/damage/damage.c b/miext/damage/damage.c
> index a24b6cc..9fba1b3 100644
> --- a/miext/damage/damage.c
> +++ b/miext/damage/damage.c
> @@ -1599,28 +1599,24 @@ damageInsertDamage (DamagePtr *pPrev, DamagePtr 
> pDamage)
>     *pPrev = pDamage;
> }
> 
> -static Bool
> +static void
> damageDestroyPixmap (PixmapPtr pPixmap)
> {
>     ScreenPtr pScreen = pPixmap->drawable.pScreen;
>     damageScrPriv(pScreen);
> +    DamagePtr        *pPrev = getPixmapDamageRef (pPixmap);
> +    DamagePtr        pDamage;
> 
> -    if (pPixmap->refcnt == 1)
> +    while ((pDamage = *pPrev))
>     {
> -     DamagePtr       *pPrev = getPixmapDamageRef (pPixmap);
> -     DamagePtr       pDamage;
> -
> -     while ((pDamage = *pPrev))
> -     {
> -         damageRemoveDamage (pPrev, pDamage);
> -         if (!pDamage->isWindow)
> -             DamageDestroy (pDamage);
> -     }
> +        damageRemoveDamage (pPrev, pDamage);
> +        if (!pDamage->isWindow)
> +            DamageDestroy (pDamage);
>     }
> +
>     unwrap (pScrPriv, pScreen, DestroyPixmap);
>     (*pScreen->DestroyPixmap) (pPixmap);
>     wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap);
> -    return TRUE;
> }
> 
> static void
> diff --git a/miext/shadow/shadow.c b/miext/shadow/shadow.c
> index 95f11cd..3230fa4 100644
> --- a/miext/shadow/shadow.c
> +++ b/miext/shadow/shadow.c
> @@ -106,7 +106,7 @@ shadowCloseScreen(int i, ScreenPtr pScreen)
>     RegionUninit(&pBuf->damage); /* bc */
> #endif
>     if (pBuf->pPixmap)
> -     pScreen->DestroyPixmap(pBuf->pPixmap);
> +     FreePixmap(pBuf->pPixmap);
>     free(pBuf);
>     return pScreen->CloseScreen(i, pScreen);
> }
> @@ -242,7 +242,7 @@ shadowInit(ScreenPtr pScreen, ShadowUpdateProc update, 
> ShadowWindowProc window)
>       return FALSE;
> 
>     if (!shadowSetup(pScreen)) {
> -     pScreen->DestroyPixmap(pPixmap);
> +     FreePixmap(pPixmap);
>       return FALSE;
>     }
> 
> diff --git a/render/glyph.c b/render/glyph.c
> index 7193d47..aae93d4 100644
> --- a/render/glyph.c
> +++ b/render/glyph.c
> @@ -663,7 +663,7 @@ miGlyphs (CARD8           op,
>                              serverClient, &error);
>       if (!pMask)
>       {
> -         (*pScreen->DestroyPixmap) (pMaskPixmap);
> +         FreePixmap(pMaskPixmap);
>           return;
>       }
>       pGC = GetScratchGC (pMaskPixmap->drawable.depth, pScreen);
> @@ -743,6 +743,6 @@ miGlyphs (CARD8           op,
>                         x, y,
>                         width, height);
>       FreePicture ((pointer) pMask, (XID) 0);
> -     (*pScreen->DestroyPixmap) (pMaskPixmap);
> +     FreePixmap(pMaskPixmap);
>     }
> }
> diff --git a/render/mipict.c b/render/mipict.c
> index 9a44c27..6179fdd 100644
> --- a/render/mipict.c
> +++ b/render/mipict.c
> @@ -53,7 +53,7 @@ miDestroyPictureClip (PicturePtr pPicture)
>     case CT_NONE:
>       return;
>     case CT_PIXMAP:
> -     (*pPicture->pDrawable->pScreen->DestroyPixmap) ((PixmapPtr) 
> (pPicture->clientClip));
> +     FreePixmap((PixmapPtr) (pPicture->clientClip));
>       break;
>     default:
>       /*
> @@ -85,7 +85,7 @@ miChangePictureClip (PicturePtr    pPicture,
>       if (!clientClip)
>           return BadAlloc;
>       clientClipType = CT_REGION;
> -     (*pScreen->DestroyPixmap) ((PixmapPtr) value);
> +     FreePixmap(value);
>       break;
>     case CT_REGION:
>       clientClip = value;
> diff --git a/render/mirect.c b/render/mirect.c
> index 73a1651..0ccc8e4 100644
> --- a/render/mirect.c
> +++ b/render/mirect.c
> @@ -177,7 +177,7 @@ miCompositeRects (CARD8           op,
> bail4:
>       FreeScratchGC (pGC);
> bail3:
> -     (*pScreen->DestroyPixmap) (pPixmap);
> +     FreePixmap(pPixmap);
> bail2:
> bail1:
>       ;
> diff --git a/render/picture.c b/render/picture.c
> index 5640c4d..7b5ec35 100644
> --- a/render/picture.c
> +++ b/render/picture.c
> @@ -1499,7 +1499,7 @@ FreePicture (pointer    value,
>             }
>             else if (pPicture->pDrawable->type == DRAWABLE_PIXMAP)
>             {
> -                (*pScreen->DestroyPixmap) ((PixmapPtr)pPicture->pDrawable);
> +                FreePixmap((PixmapPtr)pPicture->pDrawable);
>             }
>         }
>       dixFreeObjectWithPrivates(pPicture, PRIVATE_PICTURE);
> diff --git a/render/render.c b/render/render.c
> index cc13dbc..a46c774 100644
> --- a/render/render.c
> +++ b/render/render.c
> @@ -1178,7 +1178,7 @@ ProcRenderAddGlyphs (ClientPtr client)
> 
>               /* The picture takes a reference to the pixmap, so we
>                  drop ours. */
> -             (pScreen->DestroyPixmap) (pDstPix);
> +             FreePixmap(pDstPix);
>               pDstPix = NULL;
> 
>               if (! pDst)
> @@ -1602,7 +1602,7 @@ ProcRenderCreateCursor (ClientPtr client)
>           free(mskbits);
>           return error;
>       }
> -     (*pScreen->DestroyPixmap) (pPixmap);
> +     FreePixmap(pPixmap);
>       CompositePicture (PictOpSrc,
>                         pSrc, 0, pPicture,
>                         0, 0, 0, 0, 0, 0, width, height);
> -- 
> 1.7.5.4
> 
> _______________________________________________
> [email protected]: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 

---
Jeremy Huddleston

Rebuild Sudan
 - Board of Directors
 - http://www.rebuildsudan.org

Berkeley Foundation for Opportunities in Information Technology
 - Advisory Board
 - http://www.bfoit.org

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to