xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Thu Aug 28 10:29:39 PDT 2008


 Xext/shm.c      |   86 ++++++++++++++----------------------------------------
 Xext/shmint.h   |    3 -
 exa/exa.c       |    7 ----
 exa/exa_accel.c |   88 --------------------------------------------------------
 exa/exa_priv.h  |    9 -----
 5 files changed, 23 insertions(+), 170 deletions(-)

New commits:
commit ee7c684f21d220d5e046bab31ae617a7d64d60f6
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Aug 27 16:05:47 2008 -0400

    Reimplement ShmPutImage.
    
    There's no reason to not just dispatch this straight into the GC.  As a
    bonus, if you do so, damage wraps correctly, and thus swcursor works.
    The side effect is it's no longer possible to override ShmPutImage with
    ShmRegisterFuncs().
    
    Also remove the (broken) damage tracking for same from EXA, since it didn't
    work right, and is now superfluous.

diff --git a/Xext/shm.c b/Xext/shm.c
index 6465edb..ba75263 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -101,7 +101,6 @@ typedef struct _ShmDesc {
     unsigned long size;
 } ShmDescRec, *ShmDescPtr;
 
-static void miShmPutImage(XSHM_PUT_IMAGE_ARGS);
 static PixmapPtr fbShmCreatePixmap(XSHM_CREATE_PIXMAP_ARGS);
 static int ShmDetachSegment(
     pointer		/* value */,
@@ -143,8 +142,8 @@ static int shmPixFormat[MAXSCREENS];
 static ShmFuncsPtr shmFuncs[MAXSCREENS];
 static DestroyPixmapProcPtr destroyPixmap[MAXSCREENS];
 static DevPrivateKey shmPixmapPrivate = &shmPixmapPrivate;
-static ShmFuncs miFuncs = {NULL, miShmPutImage};
-static ShmFuncs fbFuncs = {fbShmCreatePixmap, fbShmPutImage};
+static ShmFuncs miFuncs = {NULL, NULL};
+static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL};
 
 #define VERIFY_SHMSEG(shmseg,shmdesc,client) \
 { \
@@ -506,66 +505,28 @@ ProcShmDetach(ClientPtr client)
     return(client->noClientException);
 }
 
-static void
-miShmPutImage(DrawablePtr dst, GCPtr pGC,
+/*
+ * If the given request doesn't exactly match PutImage's constraints,
+ * wrap the image in a scratch pixmap header and let CopyArea sort it out.
+ */
+static oid
+doShmPutImage(DrawablePtr dst, GCPtr pGC,
 	      int depth, unsigned int format,
 	      int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
 	      char *data)
 {
-    PixmapPtr pmap;
-    GCPtr putGC;
-
-    putGC = GetScratchGC(depth, dst->pScreen);
-    if (!putGC)
-	return;
-    pmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth,
-					 CREATE_PIXMAP_USAGE_SCRATCH);
-    if (!pmap)
-    {
-	FreeScratchGC(putGC);
+    PixmapPtr pPixmap;
+  
+    pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth,
+				     BitsPerPixel(depth),
+				     PixmapBytePad(w, depth),
+				     data);
+    if (!pPixmap)
 	return;
-    }
-    ValidateGC((DrawablePtr)pmap, putGC);
-    (*putGC->ops->PutImage)((DrawablePtr)pmap, putGC, depth, -sx, -sy, w, h, 0,
-			    (format == XYPixmap) ? XYPixmap : ZPixmap, data);
-    FreeScratchGC(putGC);
-    if (format == XYBitmap)
-	(void)(*pGC->ops->CopyPlane)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh,
-				     dx, dy, 1L);
-    else
-	(void)(*pGC->ops->CopyArea)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh,
-				    dx, dy);
-    (*pmap->drawable.pScreen->DestroyPixmap)(pmap);
-}
-
-_X_EXPORT void
-fbShmPutImage(DrawablePtr dst, GCPtr pGC,
-	      int depth, unsigned int format,
-	      int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
-	      char *data)
-{
-    if ((format == ZPixmap) || (depth == 1))
-    {
-	PixmapPtr pPixmap;
-
-	pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth,
-		BitsPerPixel(depth), PixmapBytePad(w, depth), (pointer)data);
-	if (!pPixmap)
-	    return;
-	if (format == XYBitmap)
-	    (void)(*pGC->ops->CopyPlane)((DrawablePtr)pPixmap, dst, pGC,
-					 sx, sy, sw, sh, dx, dy, 1L);
-	else
-	    (void)(*pGC->ops->CopyArea)((DrawablePtr)pPixmap, dst, pGC,
-					sx, sy, sw, sh, dx, dy);
-	FreeScratchPixmapHeader(pPixmap);
-    }
-    else
-	miShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy,
-		      data);
+    pGC->ops->CopyArea((DrawablePtr)pPixmap, dst, pGC, sx, sy, sw, sh, dx, dy);
+    FreeScratchPixmapHeader(pPixmap);
 }
 
-
 #ifdef PANORAMIX
 static int 
 ProcPanoramiXShmPutImage(ClientPtr client)
@@ -918,13 +879,12 @@ ProcShmPutImage(ClientPtr client)
 			       shmdesc->addr + stuff->offset +
 			       (stuff->srcY * length));
     else
-	(*shmFuncs[pDraw->pScreen->myNum]->PutImage)(
-			       pDraw, pGC, stuff->depth, stuff->format,
-			       stuff->totalWidth, stuff->totalHeight,
-			       stuff->srcX, stuff->srcY,
-			       stuff->srcWidth, stuff->srcHeight,
-			       stuff->dstX, stuff->dstY,
-                               shmdesc->addr + stuff->offset);
+	doShmPutImage(pDraw, pGC, stuff->depth, stuff->format,
+		      stuff->totalWidth, stuff->totalHeight,
+		      stuff->srcX, stuff->srcY,
+		      stuff->srcWidth, stuff->srcHeight,
+		      stuff->dstX, stuff->dstY,
+                      shmdesc->addr + stuff->offset);
 
     if (stuff->sendEvent)
     {
diff --git a/Xext/shmint.h b/Xext/shmint.h
index 33ab6a4..fc056bc 100644
--- a/Xext/shmint.h
+++ b/Xext/shmint.h
@@ -37,9 +37,6 @@ void
 ShmSetPixmapFormat(ScreenPtr pScreen, int format);
 
 void
-fbShmPutImage(XSHM_PUT_IMAGE_ARGS);
-
-void
 ShmRegisterFbFuncs(ScreenPtr pScreen);
 
 #endif /* _SHMINT_H_ */
diff --git a/exa/exa.c b/exa/exa.c
index ab7aab3..12c1549 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -936,13 +936,6 @@ exaDriverInit (ScreenPtr		pScreen,
     }
 #endif
 
-#ifdef MITSHM
-    /* Re-register with the MI funcs, which don't allow shared pixmaps.
-     * Shared pixmaps are almost always a performance loss for us, but this
-     * still allows for SHM PutImage.
-     */
-    ShmRegisterFuncs(pScreen, &exaShmFuncs);
-#endif
     /*
      * Hookup offscreen pixmaps
      */
diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index c3cf365..1c07a0b 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -249,100 +249,12 @@ exaDoPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
     return TRUE;
 }
 
-#ifdef MITSHM
-
-static Bool
-exaDoShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth,
-		 unsigned int format, int w, int h, int sx, int sy, int sw,
-		 int sh, int dx, int dy, char *data)
-{
-    int src_stride = PixmapBytePad(w, depth);
-
-    if (exaDoPutImage(pDrawable, pGC, depth, dx, dy, sw, sh, format, data +
-		      sy * src_stride + sx * BitsPerPixel(depth) / 8,
-		      src_stride))
-	return TRUE;
-
-    if (format == ZPixmap)
-    {
-	PixmapPtr pPixmap =
-	    GetScratchPixmapHeader(pDrawable->pScreen, w, h, depth,
-				   BitsPerPixel(depth), PixmapBytePad(w, depth),
-				   (pointer)data);
-
-	if (!pPixmap)
-	    return FALSE;
-
-	pGC->ops->CopyArea(&pPixmap->drawable, pDrawable, pGC, sx, sy, sw, sh,
-			   dx, dy);
-
-	FreeScratchPixmapHeader(pPixmap);
-
-	return TRUE;
-    }
-
-    return FALSE;
-}
-
-/* The actual ShmPutImage isn't wrapped by the damage layer, so we need to
- * inform any interested parties of the damage incurred to the drawable.
- *
- * We also need to set the pending damage to ensure correct migration in all
- * cases.
- */
-void
-exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format,
-	       int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
-	       char *data)
-{
-    PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
-    ExaPixmapPriv(pPixmap);
-    BoxRec box = { .x1 = pDrawable->x + dx, .y1 = pDrawable->y + dy,
-		   .x2 = pDrawable->x + dx + sw, .y2 = pDrawable->y + dy + sh };
-    RegionRec region;
-    RegionPtr pending_damage = NULL;
-
-    if (pExaPixmap->pDamage)
-	pending_damage = DamagePendingRegion(pExaPixmap->pDamage);
-
-    if (pending_damage) {
-	REGION_INIT(pScreen, &region, &box, 1);
-	exaDamageDestForMigration(pDrawable, pPixmap, &region);
-    }
-
-    if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh,
-			  dx, dy, data)) {
-	if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle,
-				  pGC->alu))
-	    exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
-	else
-	    exaPrepareAccessReg (pDrawable, EXA_PREPARE_DEST, &region);
-	fbShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy,
-		      data);
-	exaFinishAccess(pDrawable, EXA_PREPARE_DEST);
-    }
-
-    if (pending_damage) {
-	DamageDamageRegion(pDrawable, &region);
-	REGION_UNINIT(pScreen, &region);
-    }
-}
-
-ShmFuncs exaShmFuncs = { NULL, exaShmPutImage };
-
-#endif
-
 static void
 exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 	     int w, int h, int leftPad, int format, char *bits)
 {
-#ifdef MITSHM
-    if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, 0, 0, w, h, x, y,
-			  bits))
-#else
     if (!exaDoPutImage(pDrawable, pGC, depth, x, y, w, h, format, bits,
 		       PixmapBytePad(w, pDrawable->depth)))
-#endif
 	ExaCheckPutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format,
 			 bits);
 }
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index ca7122b..0ebe07b 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -351,20 +351,11 @@ exaFillRegionTiled (DrawablePtr	pDrawable, RegionPtr pRegion, PixmapPtr pTile,
 		    DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu);
 
 void
-exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format,
-	       int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
-	       char *data);
-
-void
 exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
 	     unsigned int format, unsigned long planeMask, char *d);
 
 extern const GCOps exaOps;
 
-#ifdef MITSHM
-extern ShmFuncs exaShmFuncs;
-#endif
-
 #ifdef RENDER
 void
 ExaCheckComposite (CARD8      op,


More information about the xorg-commit mailing list