xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Thu Oct 23 06:57:04 PDT 2008


 exa/exa.c                |    4 +++
 exa/exa_priv.h           |    8 +++++++
 exa/exa_unaccel.c        |   14 ++++++++++++
 miext/damage/damage.c    |   53 +++++++++++++++++++++++++++++++++++++++++++++++
 miext/damage/damagestr.h |    1 
 5 files changed, 80 insertions(+)

New commits:
commit 8767fc8d47276c7489ae50dd556a446a462776ea
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Apr 4 12:11:14 2008 -0700

    Wrap AddTraps in exa and damage.
    
    This fine (and unused) function wasn't ever wrapped which made it not work
    under exa.
    
    (cherry picked from commit 06e7e1d0486e8c516a9b3219a2c86026f88825fc)

diff --git a/exa/exa.c b/exa/exa.c
index d240126..6dfde4c 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -757,6 +757,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
 	ps->Glyphs = pExaScr->SavedGlyphs;
 	ps->Trapezoids = pExaScr->SavedTrapezoids;
 	ps->Triangles = pExaScr->SavedTriangles;
+	ps->AddTraps = pExaScr->SavedAddTraps;
     }
 #endif
 
@@ -928,6 +929,9 @@ exaDriverInit (ScreenPtr		pScreen,
 
 	pExaScr->SavedTrapezoids = ps->Trapezoids;
 	ps->Trapezoids = exaTrapezoids;
+
+	pExaScr->SavedAddTraps = ps->AddTraps;
+	ps->AddTraps = ExaCheckAddTraps;
     }
 #endif
 
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 078dc37..00a3c9a 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -147,6 +147,7 @@ typedef struct {
     TrianglesProcPtr		 SavedTriangles;
     GlyphsProcPtr                SavedGlyphs;
     TrapezoidsProcPtr            SavedTrapezoids;
+    AddTrapsProcPtr		 SavedAddTraps;
 #endif
   
     Bool			 swappedOut;
@@ -331,6 +332,13 @@ ExaCheckGetSpans (DrawablePtr pDrawable,
 		 int nspans,
 		 char *pdstStart);
 
+void
+ExaCheckAddTraps (PicturePtr	pPicture,
+		  INT16		x_off,
+		  INT16		y_off,
+		  int		ntrap,
+		  xTrap		*traps);
+
 /* exa_accel.c */
 
 static _X_INLINE Bool
diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c
index d5d6a30..64c06c7 100644
--- a/exa/exa_unaccel.c
+++ b/exa/exa_unaccel.c
@@ -353,6 +353,20 @@ ExaCheckComposite (CARD8      op,
     REGION_UNINIT(pScreen, &region);
 }
 
+void
+ExaCheckAddTraps (PicturePtr	pPicture,
+		  INT16		x_off,
+		  INT16		y_off,
+		  int		ntrap,
+		  xTrap		*traps)
+{
+    EXA_FALLBACK(("to pict %p (%c)\n",
+		  exaDrawableLocation(pPicture->pDrawable)));
+    exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
+    fbAddTraps (pPicture, x_off, y_off, ntrap, traps);
+    exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
+}
+
 /**
  * Gets the 0,0 pixel of a pixmap.  Used for doing solid fills of tiled pixmaps
  * that happen to be 1x1.  Pixmap must be at least 8bpp.
diff --git a/miext/damage/damage.c b/miext/damage/damage.c
index d7a2967..471fcc5 100644
--- a/miext/damage/damage.c
+++ b/miext/damage/damage.c
@@ -722,6 +722,58 @@ damageGlyphs (CARD8		op,
     damageRegionProcessPending (pDst->pDrawable);
     wrap (pScrPriv, ps, Glyphs, damageGlyphs);
 }
+
+static void
+damageAddTraps (PicturePtr  pPicture,
+		INT16	    x_off,
+		INT16	    y_off,
+		int	    ntrap,
+		xTrap	    *traps)
+{
+    ScreenPtr		pScreen = pPicture->pDrawable->pScreen;
+    PictureScreenPtr	ps = GetPictureScreen(pScreen);
+    damageScrPriv(pScreen);
+
+    if (checkPictureDamage (pPicture))
+    {
+	BoxRec	box;
+	int	i;
+	int	x, y;
+	xTrap	*t = traps;
+
+	box.x1 = 32767;
+	box.y1 = 32767;
+	box.x2 = -32767;
+	box.y2 = -32767;
+	x = pPicture->pDrawable->x + x_off;
+	y = pPicture->pDrawable->y + y_off;
+	for (i = 0; i < ntrap; i++)
+	{
+	    pixman_fixed_t   l = min (t->top.l, t->bot.l);
+	    pixman_fixed_t   r = max (t->top.r, t->bot.r);
+	    int	    x1 = x + pixman_fixed_to_int (l);
+	    int	    x2 = x + pixman_fixed_to_int (pixman_fixed_ceil (r));
+	    int	    y1 = y + pixman_fixed_to_int (t->top.y);
+	    int	    y2 = y + pixman_fixed_to_int (pixman_fixed_ceil (t->bot.y));
+	    
+	    if (x1 < box.x1)
+		box.x1 = x1;
+	    if (x2 > box.x2)
+		box.x2 = x2;
+	    if (y1 < box.y1)
+		box.y1 = y1;
+	    if (y2 > box.y2)
+		box.y2 = y2;
+	}
+	TRIM_PICTURE_BOX (box, pPicture);
+	if (BOX_NOT_EMPTY(box))
+	    damageDamageBox (pPicture->pDrawable, &box, pPicture->subWindowMode);
+    }
+    unwrap (pScrPriv, ps, AddTraps);
+    (*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps);
+    damageReportPostOp (pPicture->pDrawable);
+    wrap (pScrPriv, ps, AddTraps, damageAddTraps);
+}
 #endif
 
 /**********************************************************/
@@ -1838,6 +1890,7 @@ DamageSetup (ScreenPtr pScreen)
     if (ps) {
 	wrap (pScrPriv, ps, Glyphs, damageGlyphs);
 	wrap (pScrPriv, ps, Composite, damageComposite);
+	wrap (pScrPriv, ps, AddTraps, damageAddTraps);
     }
 #endif
 
diff --git a/miext/damage/damagestr.h b/miext/damage/damagestr.h
index f5e0ab9..559a136 100644
--- a/miext/damage/damagestr.h
+++ b/miext/damage/damagestr.h
@@ -73,6 +73,7 @@ typedef struct _damageScrPriv {
 #ifdef RENDER
     CompositeProcPtr		Composite;
     GlyphsProcPtr		Glyphs;
+    AddTrapsProcPtr		AddTraps;
 #endif
 } DamageScrPrivRec, *DamageScrPrivPtr;
 


More information about the xorg-commit mailing list