[PATCH 3/4 v2] Introduce CreatePixmap, allocating a header and calling screen hooks.

Jamey Sharp jamey at minilop.net
Fri Sep 17 15:54:50 PDT 2010


This replaces AllocatePixmap, which was previously called by the screen
hooks.

Commit by Jamey Sharp and Josh Triplett.

Signed-off-by: Jamey Sharp <jamey at minilop.net>
Signed-off-by: Josh Triplett <josh at joshtriplett.org>
---
v2: The patch I posted originally was built on top of an experimental
    patch I don't want to push right now. This one should apply to
    master.

 Xext/shm.c                             |    5 +--
 composite/compalloc.c                  |    4 +-
 dbe/midbe.c                            |   18 ++++-----
 dix/dispatch.c                         |    6 +---
 dix/gc.c                               |    7 +---
 dix/glyphcurs.c                        |    4 +--
 dix/pixmap.c                           |   47 ++++++++++++++----------
 dix/window.c                           |    3 +-
 doc/xml/Xserver-spec.xml               |   31 +++++-----------
 exa/exa_classic.c                      |   24 +++++++------
 exa/exa_driver.c                       |   26 +++++++------
 exa/exa_glyphs.c                       |   12 ++-----
 exa/exa_mixed.c                        |   22 ++++++-----
 exa/exa_offscreen.c                    |    2 +-
 exa/exa_priv.h                         |   15 +++-----
 exa/exa_render.c                       |    3 +-
 fb/fb.h                                |   10 ++---
 fb/fb24_32.c                           |    2 +-
 fb/fboverlay.c                         |    2 +-
 fb/fbpixmap.c                          |   62 ++++++++-----------------------
 glx/glxcmds.c                          |    3 +-
 hw/dmx/dmxpixmap.c                     |   31 +++-------------
 hw/dmx/dmxpixmap.h                     |    4 +--
 hw/xfree86/common/xf86DGA.c            |    2 +-
 hw/xfree86/common/xf86VGAarbiter.c     |   11 +++---
 hw/xfree86/common/xf86VGAarbiterPriv.h |    3 +-
 hw/xfree86/xaa/xaaInit.c               |   35 +++++++++---------
 hw/xnest/Pixmap.c                      |   34 ++++-------------
 hw/xnest/XNPixmap.h                    |    3 +-
 hw/xwin/win.h                          |    5 +--
 hw/xwin/winpixmap.c                    |   51 +++++++-------------------
 include/pixmap.h                       |    7 +++-
 include/scrnintstr.h                   |    8 +---
 mi/miarc.c                             |    5 +--
 mi/mibitblt.c                          |    8 ++---
 mi/midispcur.c                         |   12 +++---
 mi/miglblt.c                           |    4 +--
 mi/miscrinit.c                         |    2 +-
 miext/rootless/rootlessScreen.c        |    2 +-
 miext/shadow/shadow.c                  |    2 +-
 render/glyph.c                         |    4 +--
 render/mirect.c                        |    3 +-
 render/mitrap.c                        |    3 +-
 render/render.c                        |    7 +---
 44 files changed, 210 insertions(+), 344 deletions(-)

diff --git a/Xext/shm.c b/Xext/shm.c
index 6de98e8..302e4e8 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -556,8 +556,7 @@ doShmPutImage(DrawablePtr dst, GCPtr pGC,
 	if (!putGC)
 	    return;
 
-	pPixmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth,
-						CREATE_PIXMAP_USAGE_SCRATCH);
+	pPixmap = CreatePixmap(dst->pScreen, sw, sh, depth, CREATE_PIXMAP_USAGE_SCRATCH);
 	if (!pPixmap) {
 	    FreeScratchGC(putGC);
 	    return;
@@ -1067,7 +1066,7 @@ fbShmCreatePixmap (ScreenPtr pScreen,
 {
     PixmapPtr pPixmap;
 
-    pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
+    pPixmap = CreatePixmap(pScreen, 0, 0, pScreen->rootDepth, 0);
     if (!pPixmap)
 	return NullPixmap;
 
diff --git a/composite/compalloc.c b/composite/compalloc.c
index 78f43e3..4ce9173 100644
--- a/composite/compalloc.c
+++ b/composite/compalloc.c
@@ -479,8 +479,8 @@ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h)
     WindowPtr	    pParent = pWin->parent;
     PixmapPtr	    pPixmap;
 
-    pPixmap = (*pScreen->CreatePixmap) (pScreen, w, h, pWin->drawable.depth,
-					CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
+    pPixmap = CreatePixmap(pScreen, w, h, pWin->drawable.depth,
+			   CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
 
     if (!pPixmap)
 	return 0;
diff --git a/dbe/midbe.c b/dbe/midbe.c
index 5cbf376..8bd555e 100644
--- a/dbe/midbe.c
+++ b/dbe/midbe.c
@@ -171,18 +171,18 @@ miDbeAllocBackBufferName(WindowPtr pWin, XID bufId, int swapAction)
 
         /* Get a front pixmap. */
         if (!(pDbeWindowPrivPriv->pFrontBuffer =
-            (*pScreen->CreatePixmap)(pScreen, pDbeWindowPriv->width,
-                                     pDbeWindowPriv->height,
-                                     pWin->drawable.depth, 0)))
+            CreatePixmap(pScreen, pDbeWindowPriv->width,
+                         pDbeWindowPriv->height,
+                         pWin->drawable.depth, 0)))
         {
             return BadAlloc;
         }
 
         /* Get a back pixmap. */
         if (!(pDbeWindowPrivPriv->pBackBuffer =
-            (*pScreen->CreatePixmap)(pScreen, pDbeWindowPriv->width,
-                                     pDbeWindowPriv->height,
-                                     pWin->drawable.depth, 0)))
+            CreatePixmap(pScreen, pDbeWindowPriv->width,
+                         pDbeWindowPriv->height,
+                         pWin->drawable.depth, 0)))
         {
             FreePixmap(pDbeWindowPrivPriv->pFrontBuffer);
             return BadAlloc;
@@ -635,11 +635,9 @@ miDbePositionWindow(WindowPtr pWin, int x, int y)
     }
 
     /* Create DBE buffer pixmaps equal to size of resized window. */
-    pFrontBuffer = (*pScreen->CreatePixmap)(pScreen, width, height,
-					    pWin->drawable.depth, 0);
+    pFrontBuffer = CreatePixmap(pScreen, width, height, pWin->drawable.depth, 0);
 
-    pBackBuffer = (*pScreen->CreatePixmap)(pScreen, width, height,
-					   pWin->drawable.depth, 0);
+    pBackBuffer = CreatePixmap(pScreen, width, height, pWin->drawable.depth, 0);
 
     if (!pFrontBuffer || !pBackBuffer)
     {
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 079ce83..fadd91e 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -1412,12 +1412,9 @@ ProcCreatePixmap(ClientPtr client)
         return BadValue;
     }
 CreatePmap:
-    pMap = (PixmapPtr)(*pDraw->pScreen->CreatePixmap)
-		(pDraw->pScreen, stuff->width,
-		 stuff->height, stuff->depth, 0);
+    pMap = CreatePixmap(pDraw->pScreen, stuff->width, stuff->height, stuff->depth, 0);
     if (pMap)
     {
-	pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
 	pMap->drawable.id = stuff->pid;
 	/* security creation/labeling check */
 	rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
@@ -3867,7 +3864,6 @@ AddScreen(
 	return -1;
     }
     pScreen->myNum = i;
-    pScreen->totalPixmapSize = 0;	/* computed in CreateScratchPixmapForScreen */
     pScreen->ClipNotify = 0;	/* for R4 ddx compatibility */
     pScreen->CreateScreenResources = 0;
 
diff --git a/dix/gc.c b/dix/gc.c
index 9a39f57..75a4aa4 100644
--- a/dix/gc.c
+++ b/dix/gc.c
@@ -575,9 +575,7 @@ CreateDefaultTile (GCPtr pGC)
     w = 1;
     h = 1;
     (*pGC->pScreen->QueryBestSize)(TileShape, &w, &h, pGC->pScreen);
-    pTile = (PixmapPtr)
-	    (*pGC->pScreen->CreatePixmap)(pGC->pScreen,
-					  w, h, pGC->depth, 0);
+    pTile = CreatePixmap(pGC->pScreen, w, h, pGC->depth, 0);
     pgcScratch = GetScratchGC(pGC->depth, pGC->pScreen);
     if (!pTile || !pgcScratch)
     {
@@ -915,8 +913,7 @@ CreateDefaultStipple(int screenNum)
     w = 16;
     h = 16;
     (* pScreen->QueryBestSize)(StippleShape, &w, &h, pScreen);
-    if (!(pScreen->PixmapPerDepth[0] =
-			(*pScreen->CreatePixmap)(pScreen, w, h, 1, 0)))
+    if (!(pScreen->PixmapPerDepth[0] = CreatePixmap(pScreen, w, h, 1, 0)))
 	return FALSE;
     /* fill stipple with 1 */
     tmpval[0].val = GXcopy;
diff --git a/dix/glyphcurs.c b/dix/glyphcurs.c
index 1d7de27..27c4986 100644
--- a/dix/glyphcurs.c
+++ b/dix/glyphcurs.c
@@ -95,9 +95,7 @@ ServerBitsFromGlyph(FontPtr pfont, unsigned ch, CursorMetricPtr cm, unsigned cha
     if (!pbits)
 	return BadAlloc;
 
-    ppix = (PixmapPtr)(*pScreen->CreatePixmap)(pScreen, cm->width,
-					       cm->height, 1,
-					       CREATE_PIXMAP_USAGE_SCRATCH);
+    ppix = CreatePixmap(pScreen, cm->width, cm->height, 1, CREATE_PIXMAP_USAGE_SCRATCH);
     pGC = GetScratchGC(1, pScreen);
     if (!ppix || !pGC)
     {
diff --git a/dix/pixmap.c b/dix/pixmap.c
index a0f7a39..232188c 100644
--- a/dix/pixmap.c
+++ b/dix/pixmap.c
@@ -59,7 +59,7 @@ GetScratchPixmapHeader(ScreenPtr pScreen, int width, int height, int depth,
 	pScreen->pScratchPixmap = NULL;
     else
 	/* width and height of 0 means don't allocate any pixmap data */
-	pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, 0);
+	pPixmap = CreatePixmap(pScreen, 0, 0, depth, 0);
 
     if (pPixmap) {
 	if ((*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth,
@@ -91,11 +91,6 @@ FreeScratchPixmapHeader(PixmapPtr pPixmap)
 Bool
 CreateScratchPixmapsForScreen(int scrnum)
 {
-    unsigned int	pixmap_size;
-
-    pixmap_size = sizeof(PixmapRec) + dixPrivatesSize(PRIVATE_PIXMAP);
-    screenInfo.screens[scrnum]->totalPixmapSize = BitmapBytePad(pixmap_size * 8);
-
     /* let it be created on first use */
     screenInfo.screens[scrnum]->pScratchPixmap = NULL;
     return TRUE;
@@ -111,21 +106,34 @@ FreeScratchPixmapsForScreen(int scrnum)
 
 /* callable by ddx */
 PixmapPtr
-AllocatePixmap(ScreenPtr pScreen, int pixDataSize)
+CreatePixmap(ScreenPtr pScreen, int width, int height, int depth, unsigned usage_hint)
 {
-    PixmapPtr pPixmap;
-
-    assert(pScreen->totalPixmapSize > 0);
-
-    if (pScreen->totalPixmapSize > ((size_t)-1) - pixDataSize)
-	return NullPixmap;
-    
-    pPixmap = malloc(pScreen->totalPixmapSize + pixDataSize);
+    PixmapPtr pPixmap = dixAllocateObjectWithPrivates(PixmapRec, PRIVATE_PIXMAP);
     if (!pPixmap)
-	return NullPixmap;
+        return NullPixmap;
+    pPixmap->drawable.type = DRAWABLE_PIXMAP;
+    pPixmap->drawable.class = 0;
+    pPixmap->drawable.pScreen = pScreen;
+    pPixmap->drawable.depth = depth;
+    pPixmap->drawable.id = 0;
+    pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+    pPixmap->drawable.x = 0;
+    pPixmap->drawable.y = 0;
+    pPixmap->drawable.width = width;
+    pPixmap->drawable.height = height;
+    pPixmap->refcnt = 1;
+    pPixmap->usage_hint = usage_hint;
+
+#ifdef COMPOSITE
+    pPixmap->screen_x = 0;
+    pPixmap->screen_y = 0;
+#endif
+
+    if ((*pScreen->CreatePixmap) (pPixmap))
+        return pPixmap;
 
-    dixInitPrivates(pPixmap, pPixmap + 1, PRIVATE_PIXMAP);
-    return pPixmap;
+    dixFreeObjectWithPrivates(pPixmap, PRIVATE_PIXMAP);
+    return NullPixmap;
 }
 
 /* callable by ddx */
@@ -135,6 +143,5 @@ FreePixmap(PixmapPtr pPixmap)
     if(--pPixmap->refcnt)
 	return;
     (*pPixmap->drawable.pScreen->DestroyPixmap) (pPixmap);
-    dixFiniPrivates(pPixmap, PRIVATE_PIXMAP);
-    free(pPixmap);
+    dixFreeObjectWithPrivates(pPixmap, PRIVATE_PIXMAP);
 }
diff --git a/dix/window.c b/dix/window.c
index c8607f1..3687c88 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -308,8 +308,7 @@ MakeRootTile(WindowPtr pWin)
     unsigned char *from, *to;
     int i, j;
 
-    pWin->background.pixmap = (*pScreen->CreatePixmap)(pScreen, 4, 4,
-						    pScreen->rootDepth, 0);
+    pWin->background.pixmap = CreatePixmap(pScreen, 4, 4, pScreen->rootDepth, 0);
 
     pWin->backgroundState = BackgroundPixmap;
     pGC = GetScratchGC(pScreen->rootDepth, pScreen);
diff --git a/doc/xml/Xserver-spec.xml b/doc/xml/Xserver-spec.xml
index b3940f4..38dffb9 100644
--- a/doc/xml/Xserver-spec.xml
+++ b/doc/xml/Xserver-spec.xml
@@ -326,13 +326,6 @@ These procedures are set either directly or indirectly by DDX procedures.
 Most of
 the procedures described in the remainder of this
 document are accessed through one of these structs.
-For example, the procedure to create a pixmap
-is attached to a ScreenRec and might be called by using the expression
-</para>
-<para>
-<blockquote>
-<programlisting>(* pScreen->CreatePixmap)(pScreen, width, height, depth).</programlisting>
-</blockquote>
 </para>
 <para>
 All procedure pointers must be set to some routine unless noted otherwise;
@@ -3169,20 +3162,16 @@ A bitmap is a pixmap that is one bit deep.</para>
 <para>
 <blockquote><programlisting>
 
-	PixmapPtr pScreen->CreatePixmap(pScreen, width, height, depth)
-		ScreenPtr pScreen;
-		int width, height, depth;
-
-</programlisting></blockquote>
-This ScreenRec procedure must create a pixmap of the size
-requested.
-It must allocate a PixmapRec and fill in all of the fields.
-The reference count field must be set to 1.
-If width or height are zero, no space should be allocated
-for the pixmap data, and if the implementation is using the
-devPrivate field as a pointer to the pixmap data, it should be
-set to NULL.
-If successful, it returns a pointer to the new pixmap; if not, it returns NULL.
+	Bool pScreen->CreatePixmap(pPixmap)
+		PixmapPtr pPixmap;
+
+</programlisting></blockquote>
+This ScreenRec procedure must initialize a pixmap.
+It must initialize the bitsPerPixel field based on the depth field.
+If either width or height is zero, no space should be allocated for the pixmap
+data; in this case, if the implementation is using the devPrivate field as a
+pointer to the pixmap data, it should leave that pointer NULL.
+If successful, it returns TRUE; if not, it returns FALSE.
 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 028b617..9a09d18 100644
--- a/exa/exa_classic.c
+++ b/exa/exa_classic.c
@@ -52,25 +52,27 @@ ExaGetPixmapAddress(PixmapPtr p)
  * ModifyPixmapHeader() would break migration.  These types of pixmaps are used
  * for scratch pixmaps, or to represent the visible screen.
  */
-PixmapPtr
-exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
-		unsigned usage_hint)
+Bool
+exaCreatePixmap_classic(PixmapPtr pPixmap)
 {
-    PixmapPtr pPixmap;
     ExaPixmapPrivPtr	pExaPixmap;
     BoxRec box;
     int bpp;
+    int w = pPixmap->drawable.width;
+    int h = pPixmap->drawable.height;
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
+    Bool ret;
     ExaScreenPriv(pScreen);
 
     if (w > 32767 || h > 32767)
-	return NullPixmap;
+	return FALSE;
 
     swap(pExaScr, pScreen, CreatePixmap);
-    pPixmap = pScreen->CreatePixmap (pScreen, w, h, depth, usage_hint);
+    ret = pScreen->CreatePixmap (pPixmap);
     swap(pExaScr, pScreen, CreatePixmap);
 
-    if (!pPixmap)
-        return NULL;
+    if (!ret)
+        return FALSE;
 
     pExaPixmap = ExaGetPixmapPriv(pPixmap);
     pExaPixmap->driverPriv = NULL;
@@ -100,7 +102,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
 	swap(pExaScr, pScreen, DestroyPixmap);
 	FreePixmap(pPixmap);
 	swap(pExaScr, pScreen, DestroyPixmap);
-	return NULL;
+	return FALSE;
     }
 
     /* Set up damage tracking */
@@ -112,7 +114,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
 	swap(pExaScr, pScreen, DestroyPixmap);
 	FreePixmap(pPixmap);
 	swap(pExaScr, pScreen, DestroyPixmap);
-	return NULL;
+	return FALSE;
     }
 
     DamageRegister (&pPixmap->drawable, pExaPixmap->pDamage);
@@ -141,7 +143,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
     if (pExaScr->fallback_counter)
 	exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
 
-    return pPixmap;
+    return TRUE;
 }
 
 Bool
diff --git a/exa/exa_driver.c b/exa/exa_driver.c
index 92b9a53..2983a87 100644
--- a/exa/exa_driver.c
+++ b/exa/exa_driver.c
@@ -46,25 +46,27 @@ ExaGetPixmapAddress(PixmapPtr p)
  *
  * Pixmaps are always marked as pinned, because exa has no control over them.
  */
-PixmapPtr
-exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
-		unsigned usage_hint)
+Bool
+exaCreatePixmap_driver(PixmapPtr pPixmap)
 {
-    PixmapPtr pPixmap;
     ExaPixmapPrivPtr	pExaPixmap;
     int bpp;
+    int w = pPixmap->drawable.width;
+    int h = pPixmap->drawable.height;
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
+    Bool ret;
     size_t paddedWidth, datasize;
     ExaScreenPriv(pScreen);
 
     if (w > 32767 || h > 32767)
-	return NullPixmap;
+	return FALSE;
 
     swap(pExaScr, pScreen, CreatePixmap);
-    pPixmap = pScreen->CreatePixmap(pScreen, 0, 0, depth, usage_hint);
+    ret = pScreen->CreatePixmap(pPixmap);
     swap(pExaScr, pScreen, CreatePixmap);
 
-    if (!pPixmap)
-        return NULL;
+    if (!ret)
+        return FALSE;
 
     pExaPixmap = ExaGetPixmapPriv(pPixmap);
     pExaPixmap->driverPriv = NULL;
@@ -78,13 +80,13 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
 
     if (pExaScr->info->CreatePixmap2) {
 	int new_pitch = 0;
-	pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, depth, usage_hint, bpp, &new_pitch);
+	pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, pPixmap->drawable.depth, pPixmap->usage_hint, bpp, &new_pitch);
 	paddedWidth = pExaPixmap->fb_pitch = new_pitch;
     }
     else {
 	paddedWidth = ((w * bpp + FB_MASK) >> FB_SHIFT) * sizeof(FbBits);
 	if (paddedWidth / 4 > 32767 || h > 32767)
-	    return NullPixmap;
+	    return FALSE;
 
 	exaSetFbPitch(pExaScr, pExaPixmap, w, h, bpp);
 
@@ -98,7 +100,7 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
 	swap(pExaScr, pScreen, DestroyPixmap);
 	FreePixmap(pPixmap);
 	swap(pExaScr, pScreen, DestroyPixmap);
-	return NULL;
+	return FALSE;
     }
 
     /* Allow ModifyPixmapHeader to set sys_ptr appropriately. */
@@ -119,7 +121,7 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
     if (pExaScr->fallback_counter)
 	exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
 
-    return pPixmap;
+    return TRUE;
 }
 
 Bool
diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c
index a4d3dcc..c0917ea 100644
--- a/exa/exa_glyphs.c
+++ b/exa/exa_glyphs.c
@@ -183,9 +183,7 @@ exaRealizeGlyphCaches(ScreenPtr    pScreen,
     }
 
     /* Now allocate the pixmap and picture */
-    pPixmap = (*pScreen->CreatePixmap) (pScreen,
-					CACHE_PICTURE_WIDTH,
-					height, depth, 0);
+    pPixmap = CreatePixmap(pScreen, CACHE_PICTURE_WIDTH, height, depth, 0);
     if (!pPixmap)
 	return FALSE;
 
@@ -734,9 +732,7 @@ exaGlyphs (CARD8 	 op,
 		maskFormat = a8Format;
 	}
 
-	pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
-						maskFormat->depth,
-						CREATE_PIXMAP_USAGE_SCRATCH);
+	pMaskPixmap = CreatePixmap(pScreen, width, height, maskFormat->depth, CREATE_PIXMAP_USAGE_SCRATCH);
 	if (!pMaskPixmap)
 	    return;
 	component_alpha = NeedsComponent(maskFormat->format);
@@ -763,9 +759,7 @@ exaGlyphs (CARD8 	 op,
 	    if (argbFormat)
 		maskFormat = argbFormat;
 	    
-	    pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
-						    maskFormat->depth,
-						    CREATE_PIXMAP_USAGE_SCRATCH);
+	    pMaskPixmap = CreatePixmap(pScreen, width, height, maskFormat->depth, CREATE_PIXMAP_USAGE_SCRATCH);
 	    if (!pMaskPixmap)
 		return;
 
diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
index 874fe3f..0f122cc 100644
--- a/exa/exa_mixed.c
+++ b/exa/exa_mixed.c
@@ -45,25 +45,27 @@ ExaGetPixmapAddress(PixmapPtr p)
 /**
  * exaCreatePixmap() creates a new pixmap.
  */
-PixmapPtr
-exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
-		unsigned usage_hint)
+Bool
+exaCreatePixmap_mixed(PixmapPtr pPixmap)
 {
-    PixmapPtr pPixmap;
     ExaPixmapPrivPtr	pExaPixmap;
     int bpp;
+    int w = pPixmap->drawable.width;
+    int h = pPixmap->drawable.height;
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
+    Bool ret;
     size_t paddedWidth;
     ExaScreenPriv(pScreen);
 
     if (w > 32767 || h > 32767)
-	return NullPixmap;
+	return FALSE;
 
     swap(pExaScr, pScreen, CreatePixmap);
-    pPixmap = pScreen->CreatePixmap(pScreen, 0, 0, depth, usage_hint);
+    ret = pScreen->CreatePixmap(pPixmap);
     swap(pExaScr, pScreen, CreatePixmap);
 
-    if (!pPixmap)
-        return NULL;
+    if (!ret)
+        return FALSE;
 
     pExaPixmap = ExaGetPixmapPriv(pPixmap);
     pExaPixmap->driverPriv = NULL;
@@ -72,7 +74,7 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
 
     paddedWidth = ((w * bpp + FB_MASK) >> FB_SHIFT) * sizeof(FbBits);
     if (paddedWidth / 4 > 32767 || h > 32767)
-        return NullPixmap;
+        return FALSE;
 
     /* We will allocate the system pixmap later if needed. */
     pPixmap->devPrivate.ptr = NULL;
@@ -117,7 +119,7 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
     if (pExaScr->fallback_counter)
 	exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
 
-    return pPixmap;
+    return TRUE;
 }
 
 Bool
diff --git a/exa/exa_offscreen.c b/exa/exa_offscreen.c
index a65eca1..52763bb 100644
--- a/exa/exa_offscreen.c
+++ b/exa/exa_offscreen.c
@@ -493,7 +493,7 @@ ExaOffscreenDefragment (ScreenPtr pScreen)
     PixmapPtr pDstPix;
     ExaPixmapPrivPtr pExaDstPix;
 
-    pDstPix = (*pScreen->CreatePixmap) (pScreen, 0, 0, 0, 0);
+    pDstPix = CreatePixmap(pScreen, 0, 0, 0, 0);
 
     if (!pDstPix)
 	return NULL;
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 1f372b9..e6b73e2 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -586,9 +586,8 @@ exaPixmapIsPinned (PixmapPtr pPix);
 extern const GCFuncs exaGCFuncs;
 
 /* exa_classic.c */
-PixmapPtr
-exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
-		unsigned usage_hint);
+Bool
+exaCreatePixmap_classic(PixmapPtr pPixmap);
 
 Bool
 exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int depth,
@@ -601,9 +600,8 @@ Bool
 exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap);
 
 /* exa_driver.c */
-PixmapPtr
-exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
-		unsigned usage_hint);
+Bool
+exaCreatePixmap_driver(PixmapPtr pPixmap);
 
 Bool
 exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int depth,
@@ -616,9 +614,8 @@ Bool
 exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap);
 
 /* exa_mixed.c */
-PixmapPtr
-exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
-		unsigned usage_hint);
+Bool
+exaCreatePixmap_mixed(PixmapPtr pPixmap);
 
 Bool
 exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
diff --git a/exa/exa_render.c b/exa/exa_render.c
index 6251362..4964901 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -1105,8 +1105,7 @@ exaCreateAlphaPicture (ScreenPtr     pScreen,
 	    return 0;
     }
 
-    pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
-					pPictFormat->depth, 0);
+    pPixmap = CreatePixmap(pScreen, width, height, pPictFormat->depth, 0);
     if (!pPixmap)
 	return 0;
     pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
diff --git a/fb/fb.h b/fb/fb.h
index bba998b..fa46ffb 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -1623,13 +1623,11 @@ fbPictureInit (ScreenPtr pScreen,
  * fbpixmap.c
  */
 
-extern _X_EXPORT PixmapPtr
-fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp,
-		   unsigned usage_hint);
+extern _X_EXPORT Bool
+fbCreatePixmapBpp (PixmapPtr pPixmap, int bpp);
 
-extern _X_EXPORT PixmapPtr
-fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
-		unsigned usage_hint);
+extern _X_EXPORT Bool
+fbCreatePixmap (PixmapPtr pPixmap);
 
 extern _X_EXPORT void
 fbDestroyPixmap (PixmapPtr pPixmap);
diff --git a/fb/fb24_32.c b/fb/fb24_32.c
index 2e600ed..4b5ad5b 100644
--- a/fb/fb24_32.c
+++ b/fb/fb24_32.c
@@ -543,7 +543,7 @@ fb24_32ReformatTile(PixmapPtr pOldTile, int bitsPerPixel)
     int		oldXoff, oldYoff;
     int		newXoff, newYoff;
 
-    pNewTile = pScreen->CreatePixmap(pScreen, pOldTile->drawable.width,
+    pNewTile = CreatePixmap(pScreen, pOldTile->drawable.width,
 				     pOldTile->drawable.height,
 				     pOldTile->drawable.depth,
 				     pOldTile->usage_hint);
diff --git a/fb/fboverlay.c b/fb/fboverlay.c
index 309a2d2..83a9bb8 100644
--- a/fb/fboverlay.c
+++ b/fb/fboverlay.c
@@ -136,7 +136,7 @@ fbOverlayCreateScreenResources(ScreenPtr pScreen)
 	pbits = pScrPriv->layer[i].u.init.pbits;
 	width = pScrPriv->layer[i].u.init.width;
 	depth = pScrPriv->layer[i].u.init.depth;
-	pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, 0);
+	pPixmap = CreatePixmap(pScreen, 0, 0, depth, 0);
 	if (!pPixmap)
 	    return FALSE;
 	if (!(*pScreen->ModifyPixmapHeader)(pPixmap, pScreen->width,
diff --git a/fb/fbpixmap.c b/fb/fbpixmap.c
index 0a3b76a..7f9d028 100644
--- a/fb/fbpixmap.c
+++ b/fb/fbpixmap.c
@@ -28,72 +28,42 @@
 
 #include "fb.h"
 
-PixmapPtr
-fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp,
-		   unsigned usage_hint)
+Bool
+fbCreatePixmapBpp (PixmapPtr pPixmap, int bpp)
 {
-    PixmapPtr	pPixmap;
     size_t	datasize;
     size_t	paddedWidth;
-    int		adjust;
-    int		base;
 
-    paddedWidth = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits);
-    if (paddedWidth / 4 > 32767 || height > 32767)
-	return NullPixmap;
-    datasize = height * paddedWidth;
-    base = pScreen->totalPixmapSize;
-    adjust = 0;
-    if (base & 7)
-	adjust = 8 - (base & 7);
-    datasize += adjust;
+    paddedWidth = ((pPixmap->drawable.width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits);
+    if (paddedWidth / 4 > 32767 || pPixmap->drawable.height > 32767)
+	return FALSE;
+    datasize = pPixmap->drawable.height * paddedWidth;
 #ifdef FB_DEBUG
     datasize += 2 * paddedWidth;
 #endif
-    pPixmap = AllocatePixmap(pScreen, datasize);
-    if (!pPixmap)
-	return NullPixmap;
-    pPixmap->drawable.type = DRAWABLE_PIXMAP;
-    pPixmap->drawable.class = 0;
-    pPixmap->drawable.pScreen = pScreen;
-    pPixmap->drawable.depth = depth;
     pPixmap->drawable.bitsPerPixel = bpp;
-    pPixmap->drawable.id = 0;
-    pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-    pPixmap->drawable.x = 0;
-    pPixmap->drawable.y = 0;
-    pPixmap->drawable.width = width;
-    pPixmap->drawable.height = height;
     pPixmap->devKind = paddedWidth;
-    pPixmap->refcnt = 1;
-    pPixmap->devPrivate.ptr = (pointer) ((char *)pPixmap + base + adjust);
+    pPixmap->devPrivate.ptr = malloc(datasize);
+    if (!pPixmap->devPrivate.ptr)
+        return FALSE;
 
 #ifdef FB_DEBUG
     pPixmap->devPrivate.ptr = (void *) ((char *) pPixmap->devPrivate.ptr + paddedWidth);
     fbInitializeDrawable (&pPixmap->drawable);
 #endif
 
-#ifdef COMPOSITE
-    pPixmap->screen_x = 0;
-    pPixmap->screen_y = 0;
-#endif
-
-    pPixmap->usage_hint = usage_hint;
-
-    return pPixmap;
+    return TRUE;
 }
 
-PixmapPtr
-fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
-		unsigned usage_hint)
+Bool
+fbCreatePixmap (PixmapPtr pPixmap)
 {
-    int	bpp;
-    bpp = BitsPerPixel (depth);
+    int bpp = BitsPerPixel (pPixmap->drawable.depth);
 #ifdef FB_SCREEN_PRIVATE
-    if (bpp == 32 && depth <= 24)
-	bpp = fbGetScreenPrivate(pScreen)->pix32bpp;
+    if (bpp == 32 && pPixmap->drawable.depth <= 24)
+	bpp = fbGetScreenPrivate(pPixmap->drawable.pScreen)->pix32bpp;
 #endif
-    return fbCreatePixmapBpp (pScreen, width, height, depth, bpp, usage_hint);
+    return fbCreatePixmapBpp (pPixmap, bpp);
 }
 
 void
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 8d13c15..a844e57 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1314,8 +1314,7 @@ DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId,
 	return err;
 
     __glXenterServer(GL_FALSE);
-    pPixmap = (*pGlxScreen->pScreen->CreatePixmap) (pGlxScreen->pScreen,
-						    width, height, config->rgbBits, 0);
+    pPixmap = CreatePixmap(pGlxScreen->pScreen, width, height, config->rgbBits, 0);
     __glXleaveServer(GL_FALSE);
 
     /* Assign the pixmap the same id as the pbuffer and add it as a
diff --git a/hw/dmx/dmxpixmap.c b/hw/dmx/dmxpixmap.c
index 19f3ac7..b585365 100644
--- a/hw/dmx/dmxpixmap.c
+++ b/hw/dmx/dmxpixmap.c
@@ -79,13 +79,10 @@ void dmxBECreatePixmap(PixmapPtr pPixmap)
     }
 }
 
-/** Create a pixmap for \a pScreen with the specified \a width, \a
- *  height, and \a depth. */
-PixmapPtr dmxCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
-			  unsigned usage_hint)
+Bool dmxCreatePixmap(PixmapPtr pPixmap)
 {
+    ScreenPtr      pScreen = pPixmap->drawable.pScreen;
     DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
-    PixmapPtr      pPixmap;
     int            bpp;
     dmxPixPrivPtr  pPixPriv;
 
@@ -96,27 +93,11 @@ PixmapPtr dmxCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
 #endif
 
     /* Create pixmap on back-end server */
-    if (depth == 24) bpp = 32;
-    else             bpp = depth;
-
-    pPixmap = AllocatePixmap(pScreen, 0);
-    if (!pPixmap)
-	return NullPixmap;
+    bpp = pPixmap->drawable.depth;
+    if (bpp == 24) bpp = 32;
 
-    pPixmap->drawable.type = DRAWABLE_PIXMAP;
-    pPixmap->drawable.class = 0;
-    pPixmap->drawable.pScreen = pScreen;
-    pPixmap->drawable.depth = depth;
     pPixmap->drawable.bitsPerPixel = bpp;
-    pPixmap->drawable.id = 0;
-    pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-    pPixmap->drawable.x = 0;
-    pPixmap->drawable.y = 0;
-    pPixmap->drawable.width = width;
-    pPixmap->drawable.height = height;
-    pPixmap->devKind = PixmapBytePad(width, bpp);
-    pPixmap->refcnt = 1;
-    pPixmap->usage_hint = usage_hint;
+    pPixmap->devKind = PixmapBytePad(pPixmap->drawable.width, bpp);
 
     pPixPriv = DMX_GET_PIXMAP_PRIV(pPixmap);
     pPixPriv->pixmap = (Pixmap)0;
@@ -131,7 +112,7 @@ PixmapPtr dmxCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
     DMX_WRAP(CreatePixmap, dmxCreatePixmap, dmxScreen, pScreen);
 #endif
 
-    return pPixmap;
+    return TRUE;
 }
 
 /** Destroy the pixmap on the back-end server. */
diff --git a/hw/dmx/dmxpixmap.h b/hw/dmx/dmxpixmap.h
index 0bb19c3..b1e883f 100644
--- a/hw/dmx/dmxpixmap.h
+++ b/hw/dmx/dmxpixmap.h
@@ -48,9 +48,7 @@ typedef struct _dmxPixPriv {
 
 extern Bool      dmxInitPixmap(ScreenPtr pScreen);
 
-extern PixmapPtr dmxCreatePixmap(ScreenPtr pScreen,
-				 int width, int height, int depth,
-				 unsigned usage_hint);
+extern Bool      dmxCreatePixmap(PixmapPtr pPixmap);
 extern void      dmxDestroyPixmap(PixmapPtr pPixmap);
 extern RegionPtr dmxBitmapToRegion(PixmapPtr pPixmap);
 
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index bc80366..306cd5e 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -430,7 +430,7 @@ xf86SetDGAMode(
    } 
 
    if(pMode->flags & DGA_PIXMAP_AVAILABLE) {
-	if((pPix = (*pScreen->CreatePixmap)(pScreen, 0, 0, pMode->depth, 0))) {
+	if((pPix = CreatePixmap(pScreen, 0, 0, pMode->depth, 0))) {
 	    (*pScreen->ModifyPixmapHeader)(pPix, 
 			pMode->pixmapWidth, pMode->pixmapHeight,
 			pMode->depth, pMode->bitsPerPixel, 
diff --git a/hw/xfree86/common/xf86VGAarbiter.c b/hw/xfree86/common/xf86VGAarbiter.c
index 5e1d5ab..dfaab95 100644
--- a/hw/xfree86/common/xf86VGAarbiter.c
+++ b/hw/xfree86/common/xf86VGAarbiter.c
@@ -366,18 +366,19 @@ VGAarbiterClearToBackground (
     SCREEN_EPILOG (ClearToBackground, VGAarbiterClearToBackground);
 }
 
-static PixmapPtr
-VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned usage_hint)
+static Bool
+VGAarbiterCreatePixmap(PixmapPtr pPixmap)
 {
-    PixmapPtr pPix;
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
+    Bool ret;
 
     SCREEN_PROLOG ( CreatePixmap);
     VGAGet(pScreen);
-    pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint);
+    ret = (*pScreen->CreatePixmap) (pPixmap);
     VGAPut();
     SCREEN_EPILOG (CreatePixmap, VGAarbiterCreatePixmap);
 
-    return pPix;
+    return ret;
 }
 
 static Bool
diff --git a/hw/xfree86/common/xf86VGAarbiterPriv.h b/hw/xfree86/common/xf86VGAarbiterPriv.h
index bba5d03..2657226 100644
--- a/hw/xfree86/common/xf86VGAarbiterPriv.h
+++ b/hw/xfree86/common/xf86VGAarbiterPriv.h
@@ -154,8 +154,7 @@ static void VGAarbiterCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg,
     RegionPtr prgnSrc);
 static void VGAarbiterClearToBackground (WindowPtr pWin, int x, int y, int w,
     int h, Bool generateExposures);
-static PixmapPtr VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h,
-    int depth, unsigned int usage_hint);
+static Bool VGAarbiterCreatePixmap(PixmapPtr pPixmap);
 static Bool  VGAarbiterCreateGC(GCPtr pGC);
 static Bool VGAarbiterSaveScreen(ScreenPtr pScreen, Bool unblank);
 static void VGAarbiterStoreColors (ColormapPtr pmap, int ndef, xColorItem
diff --git a/hw/xfree86/xaa/xaaInit.c b/hw/xfree86/xaa/xaaInit.c
index e889468..5770a81 100644
--- a/hw/xfree86/xaa/xaaInit.c
+++ b/hw/xfree86/xaa/xaaInit.c
@@ -33,8 +33,7 @@ static void XAAGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h,
 			char *pdstLine);
 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 XAACreatePixmap(PixmapPtr pPixmap);
 static void XAADestroyPixmap(PixmapPtr pPixmap);
 static Bool XAAEnterVT (int index, int flags);
 static void XAALeaveVT (int index, int flags);
@@ -299,8 +298,7 @@ XAAPixmapBPP (ScreenPtr pScreen, int depth)
     DestroyPixmapProcPtr    destroyPixmap;
     
     XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
-    pPix = (*pScreen->CreatePixmap) (pScreen, 1, 1, depth,
-				     CREATE_PIXMAP_USAGE_SCRATCH);
+    pPix = CreatePixmap(pScreen, 1, 1, depth, CREATE_PIXMAP_USAGE_SCRATCH);
     XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
     if (!pPix)
 	return 0;
@@ -330,24 +328,27 @@ XAAInitializeOffscreenDepths (ScreenPtr pScreen)
     }
 }
 
-static PixmapPtr 
-XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned usage_hint)
+static Bool
+XAACreatePixmap(PixmapPtr pPix)
 {
+    ScreenPtr pScreen = pPix->drawable.pScreen;
     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
     XAAPixmapPtr pPriv;
-    PixmapPtr pPix = NULL;
+    Bool ret;
+    int w = pPix->drawable.width;
+    int h = pPix->drawable.height;
     int size = w * h;
 
     if (w > 32767 || h > 32767)
-	return NullPixmap;
+	return FALSE;
     
     if (!infoRec->offscreenDepthsInitialized)
 	XAAInitializeOffscreenDepths (pScreen);
 
     if(pScrn->vtSema &&
-	(usage_hint != CREATE_PIXMAP_USAGE_GLYPH_PICTURE) &&
-	(infoRec->offscreenDepths & (1 << (depth - 1))) &&
+	(pPix->usage_hint != CREATE_PIXMAP_USAGE_GLYPH_PICTURE) &&
+	(infoRec->offscreenDepths & (1 << (pPix->drawable.depth - 1))) &&
 	(size >= MIN_OFFPIX_SIZE) && !SwitchedOut &&
 	(!infoRec->maxOffPixWidth || (w <= infoRec->maxOffPixWidth)) &&
 	(!infoRec->maxOffPixHeight || (h <= infoRec->maxOffPixHeight)) )
@@ -379,10 +380,10 @@ XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned usage_hint)
 	}
 
 	XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
-	pPix = (*pScreen->CreatePixmap) (pScreen, 0, 0, depth, usage_hint);
+	ret = (*pScreen->CreatePixmap) (pPix);
 	XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
 
-	if (!pPix) {
+	if (!ret) {
 	    free(pLink);
             xf86FreeOffscreenArea(area);
 	    goto BAILOUT;
@@ -393,8 +394,6 @@ XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned usage_hint)
 	pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
 	pPix->drawable.x = area->box.x1;
 	pPix->drawable.y = area->box.y1;
-	pPix->drawable.width = w;
-	pPix->drawable.height = h;
 	pPix->drawable.bitsPerPixel = pScrn->bitsPerPixel;
 	pPix->devKind = pScreenPix->devKind;
 	pPix->devPrivate.ptr = pScreenPix->devPrivate.ptr;
@@ -407,14 +406,14 @@ XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned usage_hint)
 	pLink->next = infoRec->OffscreenPixmaps;
 	pLink->pPix = pPix;
 	infoRec->OffscreenPixmaps = pLink;
-	return pPix;
+	return TRUE;
     }
 BAILOUT:
     XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
-    pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint);
+    ret = (*pScreen->CreatePixmap) (pPix);
     XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
 
-    if(pPix) {
+    if(ret) {
        pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
        pPriv->flags = 0;
        pPriv->offscreenArea = NULL;
@@ -423,7 +422,7 @@ BAILOUT:
 	    pPriv->flags |= SHARED_PIXMAP;
     }
 
-    return pPix;
+    return ret;
 }
 
 static void
diff --git a/hw/xnest/Pixmap.c b/hw/xnest/Pixmap.c
index b99e97d..7c02400 100644
--- a/hw/xnest/Pixmap.c
+++ b/hw/xnest/Pixmap.c
@@ -35,38 +35,20 @@ is" without express or implied warranty.
 
 DevPrivateKeyRec xnestPixmapPrivateKeyRec;
 
-PixmapPtr
-xnestCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
-		  unsigned usage_hint)
+Bool
+xnestCreatePixmap(PixmapPtr pPixmap)
 {
-  PixmapPtr pPixmap;
-
-  pPixmap = AllocatePixmap(pScreen, 0);
-  if (!pPixmap)
-    return NullPixmap;
-  pPixmap->drawable.type = DRAWABLE_PIXMAP;
-  pPixmap->drawable.class = 0;
-  pPixmap->drawable.depth = depth;
-  pPixmap->drawable.bitsPerPixel = depth;
-  pPixmap->drawable.id = 0;
-  pPixmap->drawable.x = 0;
-  pPixmap->drawable.y = 0;
-  pPixmap->drawable.width = width;
-  pPixmap->drawable.height = height;
-  pPixmap->drawable.pScreen = pScreen;
-  pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-  pPixmap->refcnt = 1;
-  pPixmap->devKind = PixmapBytePad(width, depth);
-  pPixmap->usage_hint = usage_hint;
-  if (width && height)
+  pPixmap->drawable.bitsPerPixel = pPixmap->drawable.depth;
+  pPixmap->devKind = PixmapBytePad(pPixmap->drawable.width, pPixmap->drawable.depth);
+  if (pPixmap->drawable.width && pPixmap->drawable.height)
       xnestPixmapPriv(pPixmap)->pixmap = 
 	  XCreatePixmap(xnestDisplay, 
-			xnestDefaultWindows[pScreen->myNum],
-			width, height, depth);
+			xnestDefaultWindows[pPixmap->drawable.pScreen->myNum],
+			pPixmap->drawable.width, pPixmap->drawable.height, pPixmap->drawable.depth);
   else
       xnestPixmapPriv(pPixmap)->pixmap = 0;
   
-  return pPixmap;
+  return TRUE;
 }
 
 void
diff --git a/hw/xnest/XNPixmap.h b/hw/xnest/XNPixmap.h
index 5816cef..189ce28 100644
--- a/hw/xnest/XNPixmap.h
+++ b/hw/xnest/XNPixmap.h
@@ -29,8 +29,7 @@ typedef struct {
 
 #define xnestSharePixmap(pPixmap) ((pPixmap)->refcnt++)
 
-PixmapPtr xnestCreatePixmap(ScreenPtr pScreen, int width, int height,
-			    int depth, unsigned usage_hint);
+Bool xnestCreatePixmap(PixmapPtr pPixmap);
 void xnestDestroyPixmap(PixmapPtr pPixmap);
 RegionPtr xnestPixmapToRegion(PixmapPtr pPixmap);
 
diff --git a/hw/xwin/win.h b/hw/xwin/win.h
index 1b1358c..e95a186 100644
--- a/hw/xwin/win.h
+++ b/hw/xwin/win.h
@@ -1048,9 +1048,8 @@ winSetEngineFunctionsPrimaryDD (ScreenPtr pScreen);
  * winpixmap.c
  */
 
-PixmapPtr
-winCreatePixmapNativeGDI (ScreenPtr pScreen, int width, int height, int depth,
-			  unsigned usage_hint);
+Bool
+winCreatePixmapNativeGDI (PixmapPtr pPixmap);
 
 Bool
 winDestroyPixmapNativeGDI (PixmapPtr pPixmap);
diff --git a/hw/xwin/winpixmap.c b/hw/xwin/winpixmap.c
index 050c71a..c3ee309 100644
--- a/hw/xwin/winpixmap.c
+++ b/hw/xwin/winpixmap.c
@@ -54,73 +54,48 @@ winCopyRotatePixmapNativeGDI (PixmapPtr psrcPix, PixmapPtr *ppdstPix,
 
 /* See Porting Layer Definition - p. 34 */
 /* See mfb/mfbpixmap.c - mfbCreatePixmap() */
-PixmapPtr
-winCreatePixmapNativeGDI (ScreenPtr pScreen,
-			  int iWidth, int iHeight,
-			  int iDepth, unsigned usage_hint)
+Bool
+winCreatePixmapNativeGDI (PixmapPtr pPixmap)
 {
   winPrivPixmapPtr	pPixmapPriv = NULL;
-  PixmapPtr		pPixmap = NULL;
-
-  /* Allocate pixmap memory */
-  pPixmap = AllocatePixmap (pScreen, 0);
-  if (!pPixmap)
-    {
-      ErrorF ("winCreatePixmapNativeGDI () - Couldn't allocate a pixmap\n");
-      return NullPixmap;
-    }
 
 #if CYGDEBUG
   winDebug ("winCreatePixmap () - w %d h %d d %d uh %d bw %d\n",
-	  iWidth, iHeight, iDepth, usage_hint,
-	  PixmapBytePad (iWidth, iDepth));
+	  pPixmap->drawable.width, pPixmap->drawable.height, pPixmap->drawable.depth, pPixmap->drawable.usage_hint,
+	  PixmapBytePad (pPixmap->drawable.width, pPixmap->drawable.depth));
 #endif
 
   /* Setup pixmap values */
-  pPixmap->drawable.type = DRAWABLE_PIXMAP;
-  pPixmap->drawable.class = 0;
-  pPixmap->drawable.pScreen = pScreen;
-  pPixmap->drawable.depth = iDepth;
-  pPixmap->drawable.bitsPerPixel = BitsPerPixel (iDepth);
-  pPixmap->drawable.id = 0;
-  pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-  pPixmap->drawable.x = 0;
-  pPixmap->drawable.y = 0;
-  pPixmap->drawable.width = iWidth;
-  pPixmap->drawable.height = iHeight;
-  pPixmap->devKind = 0;
-  pPixmap->refcnt = 1;
-  pPixmap->devPrivate.ptr = NULL;
-  pPixmap->usage_hint = usage_hint;
-
-  /* Pixmap privates are allocated by AllocatePixmap */
+  pPixmap->drawable.bitsPerPixel = BitsPerPixel (pPixmap->drawable.depth);
+
+  /* Pixmap privates are already allocated */
   pPixmapPriv = winGetPixmapPriv (pPixmap);
 
   /* Initialize pixmap privates */
   pPixmapPriv->hBitmap = NULL;
   pPixmapPriv->hdcSelected = NULL;
   pPixmapPriv->pbBits = NULL;
-  pPixmapPriv->dwScanlineBytes = PixmapBytePad (iWidth, iDepth);
+  pPixmapPriv->dwScanlineBytes = PixmapBytePad (pPixmap->drawable.width, pPixmap->drawable.depth);
 
   /* Check for zero width or height pixmaps */
-  if (iWidth == 0 || iHeight == 0)
+  if (pPixmap->drawable.width == 0 || pPixmap->drawable.height == 0)
     {
       /* Don't allocate a real pixmap, just set fields and return */
-      return pPixmap;
+      return TRUE;
     }
 
   /* Create a DIB for the pixmap */
-  pPixmapPriv->hBitmap = winCreateDIBNativeGDI (iWidth, iHeight, iDepth,
+  pPixmapPriv->hBitmap = winCreateDIBNativeGDI (pPixmap->drawable.width, pPixmap->drawable.height, pPixmap->drawable.depth,
 						&pPixmapPriv->pbBits,
 						(BITMAPINFO **) &pPixmapPriv->pbmih);
 
 #if CYGDEBUG
   winDebug ("winCreatePixmap () - Created a pixmap %08x, %dx%dx%d, for " \
 	  "screen: %08x\n",
-	  pPixmapPriv->hBitmap, iWidth, iHeight, iDepth, pScreen);
+	  pPixmapPriv->hBitmap, pPixmap->drawable.width, pPixmap->drawable.height, pPixmap->drawable.depth, pPixmap->drawable.pScreen);
 #endif
 
-  return pPixmap;
+  return TRUE;
 }
 
 
diff --git a/include/pixmap.h b/include/pixmap.h
index 5cf42d1..baa0c28 100644
--- a/include/pixmap.h
+++ b/include/pixmap.h
@@ -111,9 +111,12 @@ extern _X_EXPORT Bool CreateScratchPixmapsForScreen(
 extern _X_EXPORT void FreeScratchPixmapsForScreen(
     int /*scrnum*/);
 
-extern _X_EXPORT PixmapPtr AllocatePixmap(
+extern _X_EXPORT PixmapPtr CreatePixmap(
     ScreenPtr /*pScreen*/,
-    int /*pixDataSize*/);
+    int /*width*/,
+    int /*height*/,
+    int /*depth*/,
+    unsigned /*usage_hint*/);
 
 extern _X_EXPORT void FreePixmap(
     PixmapPtr /*pPixmap*/);
diff --git a/include/scrnintstr.h b/include/scrnintstr.h
index 313ea0e..ef01d10 100644
--- a/include/scrnintstr.h
+++ b/include/scrnintstr.h
@@ -203,12 +203,8 @@ typedef    void (* ClipNotifyProcPtr)(
 /* pixmap will contain a glyph */
 #define CREATE_PIXMAP_USAGE_GLYPH_PICTURE               3
 
-typedef    PixmapPtr (* CreatePixmapProcPtr)(
-	ScreenPtr /*pScreen*/,
-	int /*width*/,
-	int /*height*/,
-	int /*depth*/,
-	unsigned /*usage_hint*/);
+typedef    Bool (* CreatePixmapProcPtr)(
+	PixmapPtr /*pPixmap*/);
 
 typedef    void (* DestroyPixmapProcPtr)(
 	PixmapPtr /*pPixmap*/);
diff --git a/mi/miarc.c b/mi/miarc.c
index c53d429..9bf92bd 100644
--- a/mi/miarc.c
+++ b/mi/miarc.c
@@ -1050,9 +1050,8 @@ miPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc *parcs)
     
 	    /* allocate a 1 bit deep pixmap of the appropriate size, and
 	     * validate it */
-	    pDrawTo = (DrawablePtr)(*pDraw->pScreen->CreatePixmap)
-				(pDraw->pScreen, pixmapWidth, pixmapHeight, 1,
-				 CREATE_PIXMAP_USAGE_SCRATCH);
+	    pDrawTo = &CreatePixmap(pDraw->pScreen, pixmapWidth, pixmapHeight, 1,
+				    CREATE_PIXMAP_USAGE_SCRATCH)->drawable;
 	    if (!pDrawTo)
 	    {
 		FreeScratchGC(pGCTo);
diff --git a/mi/mibitblt.c b/mi/mibitblt.c
index 0944da1..459aaea 100644
--- a/mi/mibitblt.c
+++ b/mi/mibitblt.c
@@ -408,8 +408,7 @@ miOpqStipDrawable(DrawablePtr pDraw, GCPtr pGC, RegionPtr prgnSrc,
     xRectangle rect;
     RegionPtr	prgnSrcClip;
 
-    pPixmap = (*pDraw->pScreen->CreatePixmap)
-			   (pDraw->pScreen, w + srcx, h, 1,
+    pPixmap = CreatePixmap (pDraw->pScreen, w + srcx, h, 1,
 			    CREATE_PIXMAP_USAGE_SCRATCH);
     if (!pPixmap)
 	return;
@@ -654,9 +653,8 @@ miGetImage( DrawablePtr pDraw, int sx, int sy, int w, int h,
 	    pGC = GetScratchGC(depth, pDraw->pScreen);
 	    if (!pGC)
 		return;
-            pPixmap = (*pDraw->pScreen->CreatePixmap)
-			       (pDraw->pScreen, w, 1, depth,
-			        CREATE_PIXMAP_USAGE_SCRATCH);
+            pPixmap = CreatePixmap(pDraw->pScreen, w, 1, depth,
+				   CREATE_PIXMAP_USAGE_SCRATCH);
 	    if (!pPixmap)
 	    {
 		FreeScratchGC(pGC);
diff --git a/mi/midispcur.c b/mi/midispcur.c
index 012f4cd..2c6dcc7 100644
--- a/mi/midispcur.c
+++ b/mi/midispcur.c
@@ -214,9 +214,9 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
 	
 	pPriv->sourceBits = 0;
 	pPriv->maskBits = 0;
-	pPixmap = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width,
-					    pCursor->bits->height, 32,
-					    CREATE_PIXMAP_USAGE_SCRATCH);
+	pPixmap = CreatePixmap(pScreen, pCursor->bits->width,
+					pCursor->bits->height, 32,
+					CREATE_PIXMAP_USAGE_SCRATCH);
 	if (!pPixmap)
 	{
 	    free((pointer) pPriv);
@@ -248,13 +248,13 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
     }
     pPriv->pPicture = 0;
 #endif
-    pPriv->sourceBits = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
+    pPriv->sourceBits = CreatePixmap(pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
     if (!pPriv->sourceBits)
     {
 	free((pointer) pPriv);
 	return NULL;
     }
-    pPriv->maskBits =  (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
+    pPriv->maskBits = CreatePixmap(pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
     if (!pPriv->maskBits)
     {
 	FreePixmap(pPriv->sourceBits);
@@ -465,7 +465,7 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
 	if (pSave)
 	    FreePixmap(pSave);
 	pBuffer->pSave = pSave =
-		(*pScreen->CreatePixmap) (pScreen, w, h, pScreen->rootDepth, 0);
+		CreatePixmap(pScreen, w, h, pScreen->rootDepth, 0);
 	if (!pSave)
 	    return FALSE;
     }
diff --git a/mi/miglblt.c b/mi/miglblt.c
index dcf08da..41c5355 100644
--- a/mi/miglblt.c
+++ b/mi/miglblt.c
@@ -121,9 +121,7 @@ miPolyGlyphBlt(
     height = FONTMAXBOUNDS(pfont,ascent) +
 	     FONTMAXBOUNDS(pfont,descent);
 
-    pPixmap = (*pDrawable->pScreen->CreatePixmap)(pDrawable->pScreen,
-						  width, height, 1,
-						  CREATE_PIXMAP_USAGE_SCRATCH);
+    pPixmap = CreatePixmap(pDrawable->pScreen, width, height, 1, CREATE_PIXMAP_USAGE_SCRATCH);
     if (!pPixmap)
 	return;
 
diff --git a/mi/miscrinit.c b/mi/miscrinit.c
index a2392b7..847c221 100644
--- a/mi/miscrinit.c
+++ b/mi/miscrinit.c
@@ -151,7 +151,7 @@ miCreateScreenResources(ScreenPtr pScreen)
 	/* create a pixmap with no data, then redirect it to point to
 	 * the screen
 	 */
-	pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
+	pPixmap = CreatePixmap(pScreen, 0, 0, pScreen->rootDepth, 0);
 	if (!pPixmap)
 	    return FALSE;
 
diff --git a/miext/rootless/rootlessScreen.c b/miext/rootless/rootlessScreen.c
index 43b9cbb..ec808c3 100644
--- a/miext/rootless/rootlessScreen.c
+++ b/miext/rootless/rootlessScreen.c
@@ -85,7 +85,7 @@ RootlessUpdateScreenPixmap(ScreenPtr pScreen)
 
     pPix = (*pScreen->GetScreenPixmap)(pScreen);
     if (pPix == NULL) {
-        pPix = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
+        pPix = CreatePixmap(pScreen, 0, 0, pScreen->rootDepth, 0);
         (*pScreen->SetScreenPixmap)(pPix);
     }
 
diff --git a/miext/shadow/shadow.c b/miext/shadow/shadow.c
index 9303f97..d93bc0d 100644
--- a/miext/shadow/shadow.c
+++ b/miext/shadow/shadow.c
@@ -236,7 +236,7 @@ shadowInit(ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window)
 {
     PixmapPtr pPixmap;
     
-    pPixmap = pScreen->CreatePixmap(pScreen, pScreen->width, pScreen->height,
+    pPixmap = CreatePixmap(pScreen, pScreen->width, pScreen->height,
 				    pScreen->rootDepth, 0);
     if (!pPixmap)
 	return FALSE;
diff --git a/render/glyph.c b/render/glyph.c
index aae93d4..e9a85d1 100644
--- a/render/glyph.c
+++ b/render/glyph.c
@@ -652,9 +652,7 @@ miGlyphs (CARD8		op,
 	    return;
 	width = extents.x2 - extents.x1;
 	height = extents.y2 - extents.y1;
-	pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
-						maskFormat->depth,
-						CREATE_PIXMAP_USAGE_SCRATCH);
+	pMaskPixmap = CreatePixmap(pScreen, width, height, maskFormat->depth, CREATE_PIXMAP_USAGE_SCRATCH);
 	if (!pMaskPixmap)
 	    return;
 	component_alpha = NeedsComponent(maskFormat->format);
diff --git a/render/mirect.c b/render/mirect.c
index 0ccc8e4..d2fa21a 100644
--- a/render/mirect.c
+++ b/render/mirect.c
@@ -135,8 +135,7 @@ miCompositeRects (CARD8		op,
 	if (!rgbaFormat)
 	    goto bail1;
 	
-	pPixmap = (*pScreen->CreatePixmap) (pScreen, 1, 1, rgbaFormat->depth,
-					    CREATE_PIXMAP_USAGE_SCRATCH);
+	pPixmap = CreatePixmap(pScreen, 1, 1, rgbaFormat->depth, CREATE_PIXMAP_USAGE_SCRATCH);
 	if (!pPixmap)
 	    goto bail2;
 	
diff --git a/render/mitrap.c b/render/mitrap.c
index fc501cd..e37f544 100644
--- a/render/mitrap.c
+++ b/render/mitrap.c
@@ -60,8 +60,7 @@ miCreateAlphaPicture (ScreenPtr	    pScreen,
 	    return 0;
     }
 
-    pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 
-					pPictFormat->depth, 0);
+    pPixmap = CreatePixmap(pScreen, width, height, pPictFormat->depth, 0);
     if (!pPixmap)
 	return 0;
     pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
diff --git a/render/render.c b/render/render.c
index 67854b0..1ab3f1c 100644
--- a/render/render.c
+++ b/render/render.c
@@ -1155,9 +1155,7 @@ ProcRenderAddGlyphs (ClientPtr client)
 		    goto bail;
 		}
 
-		pDstPix = (pScreen->CreatePixmap) (pScreen,
-						   width, height, depth,
-						   CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
+		pDstPix = CreatePixmap(pScreen, width, height, depth, CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
 
 		if (!pDstPix)
 		{
@@ -1580,8 +1578,7 @@ ProcRenderCreateCursor (ClientPtr client)
 	    free(mskbits);
 	    return BadImplementation;
 	}
-	pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
-					    CREATE_PIXMAP_USAGE_SCRATCH);
+	pPixmap = CreatePixmap(pScreen, width, height, 32, CREATE_PIXMAP_USAGE_SCRATCH);
 	if (!pPixmap)
 	{
 	    free(argbbits);
-- 
1.7.0



More information about the xorg-devel mailing list