[packages/xorg-xserver-server] - rel 3; use pixman glyph

arekm arekm at pld-linux.org
Wed Nov 7 20:32:48 CET 2012


commit a76226527244fb186a0d8b0b4eeb5d8d78df9265
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Wed Nov 7 20:27:28 2012 +0100

    - rel 3; use pixman glyph

 pixman-cache.patch       | 269 +++++++++++++++++++++++++++++++++++++++++++++++
 xorg-xserver-server.spec |   8 +-
 2 files changed, 273 insertions(+), 4 deletions(-)
---
diff --git a/xorg-xserver-server.spec b/xorg-xserver-server.spec
index 69a211d..240d732 100644
--- a/xorg-xserver-server.spec
+++ b/xorg-xserver-server.spec
@@ -18,13 +18,13 @@
 %define	xorg_xserver_server_videodrv_abi	13.0
 %define	xorg_xserver_server_xinput_abi		18.0
 #
-%define	pixman_ver	0.26.0
+%define	pixman_ver	0.28.0
 
 Summary:	X.org server
 Summary(pl.UTF-8):	Serwer X.org
 Name:		xorg-xserver-server
 Version:	1.13.0
-Release:	2
+Release:	3
 License:	MIT
 Group:		X11/Servers
 Source0:	http://xorg.freedesktop.org/releases/individual/xserver/xorg-server-%{version}.tar.bz2
@@ -35,7 +35,7 @@ Source10:	%{name}-Xvfb.init
 Source11:	%{name}-Xvfb.sysconfig
 Patch0:		%{name}-xwrapper.patch
 Patch1:		%{name}-pic-libxf86config.patch
-
+Patch2:		pixman-cache.patch
 Patch3:		%{name}-less-acpi-brokenness.patch
 Patch4:		%{name}-builtin-SHA1.patch
 Patch5:		%{name}-export-GetMaster.patch
@@ -358,7 +358,7 @@ Biblioteka rozszerzenia GLX dla serwera X.org.
 %setup -q -n xorg-server-%{version}
 %patch0 -p0
 %patch1 -p1
-
+%patch2 -p1
 %patch3 -p1
 %patch4 -p1
 %patch5 -p1
diff --git a/pixman-cache.patch b/pixman-cache.patch
new file mode 100644
index 0000000..2ec672b
--- /dev/null
+++ b/pixman-cache.patch
@@ -0,0 +1,269 @@
+commit 9cbcb5bd6a5360a128d15b77a02d8d3351f74366
+Author: Søren Sandmann Pedersen <ssp at redhat.com>
+Date:   Wed May 30 05:19:08 2012 -0400
+
+    Use new pixman_glyph_cache_t API that will be in pixman 0.28.0
+    
+    This new API allows glyphs to be cached in a data structure in pixman,
+    and entire glyph strings to be composited in one go.
+    
+    Also bump pixman dependency to 0.27.2.
+    
+    Results from the cairo peformance test suite running against Xvfb with
+    a screen size of 1680x1050 at 32bpp:
+    
+    Speedups
+    ========
+     xlib          firefox-talos-gfx  12416.63 -> 3603.93   3.45x speedup
+    ██▌
+     xlib          xfce4-terminal-a1   1727.57 -> 1048.85:  1.65x speedup
+    ▋
+     xlib                  evolution   1370.49 -> 869.34:   1.58x speedup
+    ▋
+     xlib         gnome-terminal-vim   1832.83 -> 1251.94:  1.46x speedup
+    ▌
+     xlib                    poppler   1519.70 -> 1204.05:  1.26x speedup
+    ▎
+     xlib       firefox-planet-gnome   6982.55 -> 5598.16:  1.25x speedup
+    ▎
+     xlib                  ocitysmap   1142.77 -> 1071.53:  1.07x speedup
+    ▏
+    
+    No slowdowns were reported.
+    
+    Results of x11perf -aa10text:
+    
+    Before:
+    
+          8000000 reps @   0.0007 msec (1450000.0/sec)
+          8000000 reps @   0.0007 msec (1460000.0/sec)
+          8000000 reps @   0.0007 msec (1460000.0/sec)
+          8000000 reps @   0.0007 msec (1470000.0/sec)
+          8000000 reps @   0.0007 msec (1480000.0/sec)
+         40000000 trep @   0.0007 msec (1460000.0/sec)
+    
+    After:
+    
+         32000000 reps @   0.0002 msec (4910000.0/sec)
+         32000000 reps @   0.0002 msec (4830000.0/sec)
+         32000000 reps @   0.0002 msec (4890000.0/sec)
+         32000000 reps @   0.0002 msec (4830000.0/sec)
+         32000000 reps @   0.0002 msec (4900000.0/sec)
+        160000000 trep @   0.0002 msec (4870000.0/sec)
+    
+    Version 2: Destroy the glyph cache at server regen time
+    
+    Acked-by: Aaron Plattner <aplattner at nvidia.com>
+    Reviewed-by: Keith Packard <keithp at keithp.com>
+    Signed-off-by: Soren Sandmann <ssp at redhat.com>
+
+diff --git a/configure.ac b/configure.ac
+index e686614..b6ed92c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -811,7 +811,7 @@ LIBPCIACCESS="pciaccess >= 0.12.901"
+ LIBUDEV="libudev >= 143"
+ LIBSELINUX="libselinux >= 2.0.86"
+ LIBDBUS="dbus-1 >= 1.0"
+-LIBPIXMAN="pixman-1 >= 0.21.8"
++LIBPIXMAN="pixman-1 >= 0.27.2"
+ 
+ dnl Pixman is always required, but we separate it out so we can link
+ dnl specific modules against it
+diff --git a/fb/fb.h b/fb/fb.h
+index 75596c5..b869d12 100644
+--- a/fb/fb.h
++++ b/fb/fb.h
+@@ -1344,6 +1344,9 @@ extern _X_EXPORT void
+ extern _X_EXPORT Bool
+  fbPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats);
+ 
++extern _X_EXPORT void
++fbDestroyGlyphCache(void);
++
+ /*
+  * fbpixmap.c
+  */
+diff --git a/fb/fbpict.c b/fb/fbpict.c
+index 097a1a6..2804ff4 100644
+--- a/fb/fbpict.c
++++ b/fb/fbpict.c
+@@ -70,6 +70,156 @@ fbComposite(CARD8 op,
+     free_pixman_pict(pDst, dest);
+ }
+ 
++static pixman_glyph_cache_t *glyphCache;
++
++void
++fbDestroyGlyphCache(void)
++{
++    if (glyphCache)
++    {
++	pixman_glyph_cache_destroy (glyphCache);
++	glyphCache = NULL;
++    }
++}
++
++static void
++fbUnrealizeGlyph(ScreenPtr pScreen,
++		 GlyphPtr pGlyph)
++{
++    if (glyphCache)
++	pixman_glyph_cache_remove (glyphCache, pGlyph, NULL);
++}
++
++static void
++fbGlyphs(CARD8 op,
++	 PicturePtr pSrc,
++	 PicturePtr pDst,
++	 PictFormatPtr maskFormat,
++	 INT16 xSrc,
++	 INT16 ySrc, int nlist,
++	 GlyphListPtr list,
++	 GlyphPtr *glyphs)
++{
++#define N_STACK_GLYPHS 512
++    ScreenPtr pScreen = pDst->pDrawable->pScreen;
++    pixman_glyph_t stack_glyphs[N_STACK_GLYPHS];
++    pixman_glyph_t *pglyphs = stack_glyphs;
++    pixman_image_t *srcImage, *dstImage;
++    int srcXoff, srcYoff, dstXoff, dstYoff;
++    GlyphPtr glyph;
++    int n_glyphs;
++    int x, y;
++    int i, n;
++    int xDst = list->xOff, yDst = list->yOff;
++
++    miCompositeSourceValidate(pSrc);
++    
++    n_glyphs = 0;
++    for (i = 0; i < nlist; ++i)
++	n_glyphs += list[i].len;
++
++    if (!glyphCache)
++	glyphCache = pixman_glyph_cache_create();
++
++    pixman_glyph_cache_freeze (glyphCache);
++    
++    if (n_glyphs > N_STACK_GLYPHS) {
++	if (!(pglyphs = malloc (n_glyphs * sizeof (pixman_glyph_t))))
++	    goto out;
++    }
++    
++    i = 0;
++    x = y = 0;
++    while (nlist--) {
++        x += list->xOff;
++        y += list->yOff;
++        n = list->len;
++        while (n--) {
++	    const void *g;
++
++            glyph = *glyphs++;
++
++	    if (!(g = pixman_glyph_cache_lookup (glyphCache, glyph, NULL))) {
++		pixman_image_t *glyphImage;
++		PicturePtr pPicture;
++		int xoff, yoff;
++
++		pPicture = GetGlyphPicture(glyph, pScreen);
++		if (!pPicture) {
++		    n_glyphs--;
++		    goto next;
++		}
++
++		if (!(glyphImage = image_from_pict(pPicture, FALSE, &xoff, &yoff)))
++		    goto out;
++
++		g = pixman_glyph_cache_insert(glyphCache, glyph, NULL,
++					      glyph->info.x,
++					      glyph->info.y,
++					      glyphImage);
++
++		free_pixman_pict(pPicture, glyphImage);
++
++		if (!g)
++		    goto out;
++	    }
++
++	    pglyphs[i].x = x;
++	    pglyphs[i].y = y;
++	    pglyphs[i].glyph = g;
++	    i++;
++
++	next:
++            x += glyph->info.xOff;
++            y += glyph->info.yOff;
++	}
++	list++;
++    }
++
++    if (!(srcImage = image_from_pict(pSrc, FALSE, &srcXoff, &srcYoff)))
++	goto out;
++
++    if (!(dstImage = image_from_pict(pDst, TRUE, &dstXoff, &dstYoff)))
++	goto out_free_src;
++
++    if (maskFormat) {
++	pixman_format_code_t format;
++	pixman_box32_t extents;
++	int x, y;
++
++	format = maskFormat->format | (maskFormat->depth << 24);
++
++	pixman_glyph_get_extents(glyphCache, n_glyphs, pglyphs, &extents);
++
++	x = extents.x1;
++	y = extents.y1;
++
++	pixman_composite_glyphs(op, srcImage, dstImage, format,
++				xSrc + srcXoff + xDst, ySrc + srcYoff + yDst,
++				x, y,
++				x + dstXoff, y + dstYoff,
++				extents.x2 - extents.x1,
++				extents.y2 - extents.y1,
++				glyphCache, n_glyphs, pglyphs);
++    }
++    else {
++	pixman_composite_glyphs_no_mask(op, srcImage, dstImage,
++					xSrc + srcXoff - xDst, ySrc + srcYoff - yDst,
++					dstXoff, dstYoff,
++					glyphCache, n_glyphs, pglyphs);
++    }
++
++    free_pixman_pict(pDst, dstImage);
++
++out_free_src:
++    free_pixman_pict(pSrc, srcImage);
++
++out:
++    pixman_glyph_cache_thaw(glyphCache);
++    if (pglyphs != stack_glyphs)
++	free(pglyphs);
++}
++
+ static pixman_image_t *
+ create_solid_fill_image(PicturePtr pict)
+ {
+@@ -357,7 +507,8 @@ fbPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats)
+         return FALSE;
+     ps = GetPictureScreen(pScreen);
+     ps->Composite = fbComposite;
+-    ps->Glyphs = miGlyphs;
++    ps->Glyphs = fbGlyphs;
++    ps->UnrealizeGlyph = fbUnrealizeGlyph;
+     ps->CompositeRects = miCompositeRects;
+     ps->RasterizeTrapezoid = fbRasterizeTrapezoid;
+     ps->Trapezoids = fbTrapezoids;
+diff --git a/fb/fbscreen.c b/fb/fbscreen.c
+index 7c7d656..f9080a4 100644
+--- a/fb/fbscreen.c
++++ b/fb/fbscreen.c
+@@ -32,6 +32,7 @@ fbCloseScreen(ScreenPtr pScreen)
+     int d;
+     DepthPtr depths = pScreen->allowedDepths;
+ 
++    fbDestroyGlyphCache();
+     for (d = 0; d < pScreen->numDepths; d++)
+         free(depths[d].vids);
+     free(depths);
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/xorg-xserver-server.git/commitdiff/a76226527244fb186a0d8b0b4eeb5d8d78df9265



More information about the pld-cvs-commit mailing list