[arch-commits] Commit in xorg-server/trunk (4 files)

Jan de Groot jgc at archlinux.org
Thu Nov 8 19:23:59 UTC 2012


    Date: Thursday, November 8, 2012 @ 14:23:59
  Author: jgc
Revision: 170560

upgpkg: xorg-server 1.13.0-4

Update to current git snapshot from server-1.13 branch, backport patch from git master to utilize the new pixman glyph cache

Added:
  xorg-server/trunk/git-fixes.patch
  xorg-server/trunk/use-pixman-glyph-cache.patch
Modified:
  xorg-server/trunk/PKGBUILD
Deleted:
  xorg-server/trunk/0001-dix-fix-zaphod-screen-scrossing-54654.patch

--------------------------------------------------+
 0001-dix-fix-zaphod-screen-scrossing-54654.patch |   42 -
 PKGBUILD                                         |   29 
 git-fixes.patch                                  |  643 +++++++++++++++++++++
 use-pixman-glyph-cache.patch                     |  270 ++++++++
 4 files changed, 931 insertions(+), 53 deletions(-)

Deleted: 0001-dix-fix-zaphod-screen-scrossing-54654.patch
===================================================================
--- 0001-dix-fix-zaphod-screen-scrossing-54654.patch	2012-11-08 17:27:29 UTC (rev 170559)
+++ 0001-dix-fix-zaphod-screen-scrossing-54654.patch	2012-11-08 19:23:59 UTC (rev 170560)
@@ -1,42 +0,0 @@
-From 29d84d5a7ca4cc12cce47de9313adeb8554fb894 Mon Sep 17 00:00:00 2001
-From: Peter Hutterer <peter.hutterer at who-t.net>
-Date: Thu, 18 Oct 2012 15:11:31 +1000
-Subject: [PATCH] dix: fix zaphod screen scrossing (#54654)
-
-POINTER_SCREEN coordinates are screen-relative. For a Zaphod setup, the
-coordinates after a screen crossing are already relative to the new screen's
-origin. Add that offset to the coordinates before re-setting.
-
-regression introduced by
-commit bafbd99080be49a17be97d2cc758fbe623369945
-Author: Peter Hutterer <peter.hutterer at who-t.net>
-Date:   Wed Aug 8 11:34:32 2012 +1000
-
-    dix: work around scaling issues during WarpPointer (#53037)
-
-X.Org Bug 54654 <http://bugs.freedesktop.org/show_bug.cgi?id=54654>
-
-Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
----
- dix/getevents.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/dix/getevents.c b/dix/getevents.c
-index 71d83c4..8b4379d 100644
---- a/dix/getevents.c
-+++ b/dix/getevents.c
-@@ -1400,8 +1400,9 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
-        coordinates were.
-      */
-     if (flags & POINTER_SCREEN) {
--        screenx = sx;
--        screeny = sy;
-+        scr = miPointerGetScreen(pDev);
-+        screenx = sx + scr->x;
-+        screeny = sy + scr->y;
-     }
- 
-     scr = positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
--- 
-1.7.11.7
-

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-11-08 17:27:29 UTC (rev 170559)
+++ PKGBUILD	2012-11-08 19:23:59 UTC (rev 170560)
@@ -4,7 +4,7 @@
 pkgbase=xorg-server
 pkgname=('xorg-server' 'xorg-server-xephyr' 'xorg-server-xdmx' 'xorg-server-xvfb' 'xorg-server-xnest' 'xorg-server-common' 'xorg-server-devel')
 pkgver=1.13.0
-pkgrel=3
+pkgrel=4
 arch=('i686' 'x86_64')
 license=('custom')
 url="http://xorg.freedesktop.org"
@@ -19,27 +19,32 @@
         xvfb-run
         xvfb-run.1
         10-quirks.conf
-        0001-dix-fix-zaphod-screen-scrossing-54654.patch)
+        git-fixes.patch
+        use-pixman-glyph-cache.patch)
 sha256sums=('548b91cb01087ad4f892428e7ac4955251cf12393e86c70420436b33848ef28a'
             '66e25f76a7496c429e0aff4b0670f168719bb0ceaeb88c6f2272f2bf3ed21162'
             'd027776fac1f7675b0a9ee817502290b1c45f9c09b0f0a6bb058c35f92361e84'
             'ff0156309470fc1d378fd2e104338020a884295e285972cc88e250e031cc35b9'
             '2460adccd3362fefd4cdc5f1c70f332d7b578091fb9167bf88b5f91265bbd776'
             '94612f5c0d34a3b7152915c2e285c7b462e9d8e38d3539bd551a339498eac166'
-            '23861814b4283ca3fe43aae6e88ee82bcbae5713bf88eabeaef7beb94efe9707')
+            'd49e534b77ead809eb873a1a86cd47c791a8ddd10557bfa635197bba6bc00b71'
+            '7c1dacd30c46b01424c7c75974285cd348dafd0327eb3f211cbe446ad90dd308')
 
 build() {
   cd "${srcdir}/${pkgbase}-${pkgver}"
 
+  # Apply upstream fixes from server-1.13 branch
+  patch -Np1 -i "${srcdir}/git-fixes.patch"
+
+  # Use pixman 0.28.0 glyph cache - backported from git master
+  patch -Np1 -i "${srcdir}/use-pixman-glyph-cache.patch"
+
   # Use nouveau/nv/nvidia drivers for nvidia devices
   patch -Np1 -i "${srcdir}/autoconfig-nvidia.patch"
 
   # Use unofficial imedia SiS driver for supported SiS devices
   patch -Np0 -i "${srcdir}/autoconfig-sis.patch"
 
-  # https://bugs.archlinux.org/task/31959 / https://bugs.freedesktop.org/show_bug.cgi?id=54654
-  patch -Np1 -i ${srcdir}/0001-dix-fix-zaphod-screen-scrossing-54654.patch
-
   autoreconf -fi
   ./configure --prefix=/usr \
       --enable-ipv6 \
@@ -97,7 +102,7 @@
 
 package_xorg-server() {
   pkgdesc="Xorg X server"
-  depends=(libxdmcp libxfont libpciaccess libdrm pixman libgcrypt libxau xorg-server-common xf86-input-evdev)
+  depends=(libxdmcp libxfont libpciaccess libdrm 'pixman>=0.28.0' libgcrypt libxau xorg-server-common xf86-input-evdev)
   backup=('etc/X11/xorg.conf.d/10-evdev.conf' 'etc/X11/xorg.conf.d/10-quirks.conf')
   # see xorg-server-1.13.0/hw/xfree86/common/xf86Module.h for ABI versions - we provide major numbers that drivers can depend on
   provides=('X-ABI-VIDEODRV_VERSION=13' 'X-ABI-XINPUT_VERSION=18' 'X-ABI-EXTENSION_VERSION=7.0' 'x-server')
@@ -132,7 +137,7 @@
 
 package_xorg-server-xephyr() {
   pkgdesc="A nested X server that runs as an X application"
-  depends=(libxfont libgl libgcrypt libxv pixman xorg-server-common)
+  depends=(libxfont libgl libgcrypt libxv 'pixman>=0.28.0' xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/kdrive"
   make DESTDIR="${pkgdir}" install
@@ -143,7 +148,7 @@
 
 package_xorg-server-xvfb() {
   pkgdesc="Virtual framebuffer X server"
-  depends=(libxfont libxdmcp libxau libgcrypt pixman xorg-server-common)
+  depends=(libxfont libxdmcp libxau libgcrypt 'pixman>=0.28.0' xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/vfb"
   make DESTDIR="${pkgdir}" install
@@ -157,7 +162,7 @@
 
 package_xorg-server-xnest() {
   pkgdesc="A nested X server that runs as an X application"
-  depends=(libxfont libxext libgcrypt pixman xorg-server-common)
+  depends=(libxfont libxext libgcrypt 'pixman>=0.28.0' xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/xnest"
   make DESTDIR="${pkgdir}" install
@@ -168,7 +173,7 @@
 
 package_xorg-server-xdmx() {
   pkgdesc="Distributed Multihead X Server and utilities"
-  depends=(libxfont libxi libgcrypt libxaw libxrender libdmx libxfixes pixman xorg-server-common)
+  depends=(libxfont libxi libgcrypt libxaw libxrender libdmx libxfixes 'pixman>=0.28.0' xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/dmx"
   make DESTDIR="${pkgdir}" install
@@ -183,6 +188,8 @@
            xproto randrproto renderproto xextproto inputproto kbproto 
            fontsproto pixman videoproto xf86driproto glproto 
            mesa dri2proto xineramaproto libpciaccess
+           # see FS#32146
+           resourceproto scrnsaverproto
            # not technically required but almost every Xorg pkg needs it to build
            xorg-util-macros)
 

Added: git-fixes.patch
===================================================================
--- git-fixes.patch	                        (rev 0)
+++ git-fixes.patch	2012-11-08 19:23:59 UTC (rev 170560)
@@ -0,0 +1,643 @@
+diff --git a/Xi/exevents.c b/Xi/exevents.c
+index 494d07e..106da3a 100644
+--- a/Xi/exevents.c
++++ b/Xi/exevents.c
+@@ -949,8 +949,6 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent *event)
+ 
+         if (!(event->flags & TOUCH_POINTER_EMULATED))
+             return DONT_PROCESS;
+-        if (!(event->flags & TOUCH_END))
+-            return DONT_PROCESS;
+ 
+         DecreaseButtonCount(device, key, &t->buttonsDown, &t->motionMask,
+                             &t->state);
+@@ -1561,6 +1559,7 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
+     uint32_t touchid;
+     int type = ev->any.type;
+     int emulate_pointer = ! !(ev->device_event.flags & TOUCH_POINTER_EMULATED);
++    DeviceIntPtr kbd;
+ 
+     if (!t)
+         return;
+@@ -1570,9 +1569,6 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
+     else
+         touchid = ev->device_event.touchid;
+ 
+-    if (emulate_pointer)
+-        UpdateDeviceState(dev, &ev->device_event);
+-
+     if (type == ET_TouchBegin) {
+         ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
+                              emulate_pointer);
+@@ -1619,9 +1615,14 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
+      * events which _only_ emulate motion just work normally */
+     if (emulate_pointer && ev->any.type != ET_TouchUpdate)
+         DeliverEmulatedMotionEvent(dev, ti, ev);
++
+     if (emulate_pointer && IsMaster(dev))
+         CheckMotion(&ev->device_event, dev);
+ 
++    kbd = GetMaster(dev, KEYBOARD_OR_FLOAT);
++    event_set_state(NULL, kbd, &ev->device_event);
++    ev->device_event.corestate = event_get_corestate(NULL, kbd);
++
+     /* Make sure we have a valid window trace for event delivery; must be
+      * called after event type mutation. Touch end events are always processed
+      * in order to end touch records. */
+@@ -1643,6 +1644,9 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
+         if (ev->any.type == ET_TouchEnd)
+             TouchEndTouch(dev, ti);
+     }
++
++    if (emulate_pointer)
++        UpdateDeviceState(dev, &ev->device_event);
+ }
+ 
+ /**
+@@ -1864,6 +1868,11 @@ DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
+         goto out;
+     }
+ 
++    if (listener->state == LISTENER_AWAITING_BEGIN) {
++        listener->state = LISTENER_HAS_END;
++        goto out;
++    }
++
+     /* Event in response to reject */
+     if (ev->device_event.flags & TOUCH_REJECT) {
+         if (listener->state != LISTENER_HAS_END)
+diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
+index 0e45cb8..ab1b624 100644
+--- a/Xi/xiselectev.c
++++ b/Xi/xiselectev.c
+@@ -180,8 +180,13 @@ ProcXISelectEvents(ClientPtr client)
+                     if (CLIENT_ID(iclient->resource) == client->index)
+                         continue;
+ 
+-                    dixLookupDevice(&tmp, evmask->deviceid, serverClient,
+-                                    DixReadAccess);
++                    if (evmask->deviceid == XIAllDevices)
++                        tmp = inputInfo.all_devices;
++                    else if (evmask->deviceid == XIAllMasterDevices)
++                        tmp = inputInfo.all_master_devices;
++                    else
++                        dixLookupDevice(&tmp, evmask->deviceid, serverClient,
++                                        DixReadAccess);
+                     if (!tmp)
+                         return BadImplementation;       /* this shouldn't happen */
+ 
+diff --git a/config/udev.c b/config/udev.c
+index c2d00bb..454838f 100644
+--- a/config/udev.c
++++ b/config/udev.c
+@@ -300,9 +300,15 @@ wakeup_handler(pointer data, int err, pointer read_mask)
+             return;
+         action = udev_device_get_action(udev_device);
+         if (action) {
+-            if (!strcmp(action, "add") || !strcmp(action, "change")) {
++            if (!strcmp(action, "add")) {
+                 device_removed(udev_device);
+                 device_added(udev_device);
++            } else if (!strcmp(action, "change")) {
++                /* ignore change for the drm devices */
++                if (strcmp(udev_device_get_subsystem(udev_device), "drm")) {
++                    device_removed(udev_device);
++                    device_added(udev_device);
++                }
+             }
+             else if (!strcmp(action, "remove"))
+                 device_removed(udev_device);
+diff --git a/dix/devices.c b/dix/devices.c
+index 9cf04ed..fd4916a 100644
+--- a/dix/devices.c
++++ b/dix/devices.c
+@@ -306,6 +306,9 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
+     /* unity matrix */
+     memset(transform, 0, sizeof(transform));
+     transform[0] = transform[4] = transform[8] = 1.0f;
++    dev->transform.m[0][0] = 1.0;
++    dev->transform.m[1][1] = 1.0;
++    dev->transform.m[2][2] = 1.0;
+ 
+     XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
+                            XIGetKnownProperty(XATOM_FLOAT), 32,
+@@ -440,6 +443,7 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
+     if (*prev != dev)
+         return FALSE;
+ 
++    TouchEndPhysicallyActiveTouches(dev);
+     ReleaseButtonsAndKeys(dev);
+     SyncRemoveDeviceIdleTime(dev->idle_counter);
+     dev->idle_counter = NULL;
+diff --git a/dix/events.c b/dix/events.c
+index 3b40446..ddb5b34 100644
+--- a/dix/events.c
++++ b/dix/events.c
+@@ -1555,11 +1555,13 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time,
+     WindowPtr oldWin;
+ 
+     /* slave devices need to float for the duration of the grab. */
+-    if (grab->grabtype == XI2 &&
++    if (grab->grabtype == XI2 && keybd->enabled &&
+         !(passive & ImplicitGrabMask) && !IsMaster(keybd))
+         DetachFromMaster(keybd);
+ 
+-    if (grabinfo->grab)
++    if (!keybd->enabled)
++        oldWin = NULL;
++    else if (grabinfo->grab)
+         oldWin = grabinfo->grab->window;
+     else if (keybd->focus)
+         oldWin = keybd->focus->win;
+@@ -1569,7 +1571,8 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time,
+         oldWin = keybd->focus->win;
+     if (keybd->valuator)
+         keybd->valuator->motionHintWindow = NullWindow;
+-    DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
++    if (oldWin)
++        DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
+     if (syncEvents.playingEvents)
+         grabinfo->grabTime = syncEvents.time;
+     else
+@@ -1590,13 +1593,10 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
+ {
+     GrabPtr grab = keybd->deviceGrab.grab;
+     DeviceIntPtr dev;
+-    WindowPtr focusWin = keybd->focus ? keybd->focus->win
+-        : keybd->spriteInfo->sprite->win;
++    WindowPtr focusWin;
+     Bool wasImplicit = (keybd->deviceGrab.fromPassiveGrab &&
+                         keybd->deviceGrab.implicitGrab);
+ 
+-    if (focusWin == FollowKeyboardWin)
+-        focusWin = inputInfo.keyboard->focus->win;
+     if (keybd->valuator)
+         keybd->valuator->motionHintWindow = NullWindow;
+     keybd->deviceGrab.grab = NullGrab;
+@@ -1607,6 +1607,17 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
+         if (dev->deviceGrab.sync.other == grab)
+             dev->deviceGrab.sync.other = NullGrab;
+     }
++
++    if (keybd->focus)
++        focusWin = keybd->focus->win;
++    else if (keybd->spriteInfo->sprite)
++        focusWin = keybd->spriteInfo->sprite->win;
++    else
++        focusWin = NullWindow;
++
++    if (focusWin == FollowKeyboardWin)
++        focusWin = inputInfo.keyboard->focus->win;
++
+     DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);
+ 
+     if (!wasImplicit && grab->grabtype == XI2)
+diff --git a/dix/getevents.c b/dix/getevents.c
+index 4e62507..8b4379d 100644
+--- a/dix/getevents.c
++++ b/dix/getevents.c
+@@ -896,9 +896,9 @@ scale_to_desktop(DeviceIntPtr dev, ValuatorMask *mask,
+ 
+     /* scale x&y to desktop coordinates */
+     *screenx = rescaleValuatorAxis(x, dev->valuator->axes + 0, NULL,
+-                                   screenInfo.x, screenInfo.width);
++                                   screenInfo.x, screenInfo.width - 1);
+     *screeny = rescaleValuatorAxis(y, dev->valuator->axes + 1, NULL,
+-                                   screenInfo.y, screenInfo.height);
++                                   screenInfo.y, screenInfo.height - 1);
+ 
+     *devx = x;
+     *devy = y;
+@@ -1400,8 +1400,9 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
+        coordinates were.
+      */
+     if (flags & POINTER_SCREEN) {
+-        screenx = sx;
+-        screeny = sy;
++        scr = miPointerGetScreen(pDev);
++        screenx = sx + scr->x;
++        screeny = sy + scr->y;
+     }
+ 
+     scr = positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
+diff --git a/dix/touch.c b/dix/touch.c
+index 497ad7d..5f77be5 100644
+--- a/dix/touch.c
++++ b/dix/touch.c
+@@ -572,8 +572,8 @@ TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
+         return FALSE;
+ 
+     /* Mark which grabs/event selections we're delivering to: max one grab per
+-     * window plus the bottom-most event selection. */
+-    ti->listeners = calloc(sprite->spriteTraceGood + 1, sizeof(*ti->listeners));
++     * window plus the bottom-most event selection, plus any active grab. */
++    ti->listeners = calloc(sprite->spriteTraceGood + 2, sizeof(*ti->listeners));
+     if (!ti->listeners) {
+         sprite->spriteTraceGood = 0;
+         return FALSE;
+@@ -1029,3 +1029,31 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
+ 
+     return TouchListenerAcceptReject(dev, ti, i, mode);
+ }
++
++/**
++ * End physically active touches for a device.
++ */
++void
++TouchEndPhysicallyActiveTouches(DeviceIntPtr dev)
++{
++    InternalEvent *eventlist = InitEventList(GetMaximumEventsNum());
++    int i;
++
++    OsBlockSignals();
++    mieqProcessInputEvents();
++    for (i = 0; i < dev->last.num_touches; i++) {
++        DDXTouchPointInfoPtr ddxti = dev->last.touches + i;
++
++        if (ddxti->active) {
++            int j;
++            int nevents = GetTouchEvents(eventlist, dev, ddxti->ddx_id,
++                                         XI_TouchEnd, 0, NULL);
++
++            for (j = 0; j < nevents; j++)
++                mieqProcessDeviceEvent(dev, eventlist + j, NULL);
++        }
++    }
++    OsReleaseSignals();
++
++    FreeEventList(eventlist, GetMaximumEventsNum());
++}
+diff --git a/exa/exa_priv.h b/exa/exa_priv.h
+index ea7e7fa..2e4759d 100644
+--- a/exa/exa_priv.h
++++ b/exa/exa_priv.h
+@@ -209,6 +209,7 @@ typedef struct {
+     RegionRec srcReg;
+     RegionRec maskReg;
+     PixmapPtr srcPix;
++    PixmapPtr maskPix;
+ 
+     DevPrivateKeyRec pixmapPrivateKeyRec;
+     DevPrivateKeyRec gcPrivateKeyRec;
+diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c
+index 5716138..b0a0011 100644
+--- a/exa/exa_unaccel.c
++++ b/exa/exa_unaccel.c
+@@ -442,6 +442,13 @@ ExaSrcValidate(DrawablePtr pDrawable,
+     RegionPtr dst;
+     int xoff, yoff;
+ 
++    if (pExaScr->srcPix == pPix)
++        dst = &pExaScr->srcReg;
++    else if (pExaScr->maskPix == pPix)
++        dst = &pExaScr->maskReg;
++    else
++        return;
++
+     exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff);
+ 
+     box.x1 = x + xoff;
+@@ -449,8 +456,6 @@ ExaSrcValidate(DrawablePtr pDrawable,
+     box.x2 = box.x1 + width;
+     box.y2 = box.y1 + height;
+ 
+-    dst = (pExaScr->srcPix == pPix) ? &pExaScr->srcReg : &pExaScr->maskReg;
+-
+     RegionInit(&reg, &box, 1);
+     RegionUnion(dst, dst, &reg);
+     RegionUninit(&reg);
+@@ -495,16 +500,19 @@ ExaPrepareCompositeReg(ScreenPtr pScreen,
+         if (pSrc != pDst)
+             RegionTranslate(pSrc->pCompositeClip,
+                             -pSrc->pDrawable->x, -pSrc->pDrawable->y);
+-    }
++    } else
++        pExaScr->srcPix = NULL;
+ 
+     if (pMask && pMask->pDrawable) {
+         pMaskPix = exaGetDrawablePixmap(pMask->pDrawable);
+         RegionNull(&pExaScr->maskReg);
+         maskReg = &pExaScr->maskReg;
++        pExaScr->maskPix = pMaskPix;
+         if (pMask != pDst && pMask != pSrc)
+             RegionTranslate(pMask->pCompositeClip,
+                             -pMask->pDrawable->x, -pMask->pDrawable->y);
+-    }
++    } else
++        pExaScr->maskPix = NULL;
+ 
+     RegionTranslate(pDst->pCompositeClip,
+                     -pDst->pDrawable->x, -pDst->pDrawable->y);
+diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
+index f8fcde9..532d87b 100644
+--- a/hw/xfree86/common/Makefile.am
++++ b/hw/xfree86/common/Makefile.am
+@@ -15,6 +15,7 @@ XVSDKINCS = xf86xv.h xf86xvmc.h xf86xvpriv.h
+ endif
+ 
+ if XF86VIDMODE
++XF86VMODESOURCES = xf86vmode.c
+ XF86VMODE_SDK = vidmodeproc.h
+ endif
+ 
+@@ -47,7 +48,7 @@ libcommon_la_SOURCES = xf86Configure.c xf86Bus.c xf86Config.c \
+                       xf86VidMode.c xf86fbman.c xf86cmap.c \
+                       xf86Helper.c xf86PM.c xf86Xinput.c xisb.c \
+                       xf86Mode.c xorgHelper.c xf86Extensions.h \
+-		      xf86Extensions.c xf86vmode.c \
++		      xf86Extensions.c $(XF86VMODESOURCES) \
+                       $(XVSOURCES) $(BUSSOURCES) $(RANDRSOURCES)
+ nodist_libcommon_la_SOURCES = xf86DefModeSet.c xf86Build.h
+ libcommon_la_LIBADD = $(top_builddir)/config/libconfig.la
+diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
+index bb2903d..74da438 100644
+--- a/hw/xfree86/common/xf86.h
++++ b/hw/xfree86/common/xf86.h
+@@ -468,4 +468,8 @@ extern _X_EXPORT ScreenPtr xf86ScrnToScreen(ScrnInfoPtr pScrn);
+ /* flags passed to xf86 allocate screen */
+ #define XF86_ALLOCATE_GPU_SCREEN 1
+ 
++/* Update the internal total dimensions of all ScreenRecs together */
++extern _X_EXPORT void
++xf86UpdateDesktopDimensions(void);
++
+ #endif                          /* _XF86_H */
+diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
+index 6de8409..4ffbf7e 100644
+--- a/hw/xfree86/common/xf86Bus.c
++++ b/hw/xfree86/common/xf86Bus.c
+@@ -81,6 +81,8 @@ xf86CallDriverProbe(DriverPtr drv, Bool detect_only)
+     if (drv->platformProbe != NULL) {
+         foundScreen = xf86platformProbeDev(drv);
+     }
++    if (ServerIsNotSeat0())
++        return foundScreen;
+ #endif
+ 
+ #ifdef XSERVER_LIBPCIACCESS
+@@ -214,6 +216,8 @@ xf86BusProbe(void)
+ {
+ #ifdef XSERVER_PLATFORM_BUS
+     xf86platformProbe();
++    if (ServerIsNotSeat0())
++        return;
+ #endif
+ #ifdef XSERVER_LIBPCIACCESS
+     xf86PciProbe();
+diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
+index f681a85..721159d 100644
+--- a/hw/xfree86/common/xf86Helper.c
++++ b/hw/xfree86/common/xf86Helper.c
+@@ -1898,3 +1898,9 @@ xf86ScrnToScreen(ScrnInfoPtr pScrn)
+         return screenInfo.screens[pScrn->scrnIndex];
+     }
+ }
++
++void
++xf86UpdateDesktopDimensions(void)
++{
++    update_desktop_dimensions();
++}
+diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
+index 83f9790..f58b87e 100644
+--- a/hw/xfree86/common/xf86Module.h
++++ b/hw/xfree86/common/xf86Module.h
+@@ -80,7 +80,7 @@ typedef enum {
+  * mask is 0xFFFF0000.
+  */
+ #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
+-#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(13, 0)
++#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(13, 1)
+ #define ABI_XINPUT_VERSION	SET_ABI_VERSION(18, 0)
+ #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(7, 0)
+ #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
+diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
+index 24b9473..0525e39 100644
+--- a/hw/xfree86/common/xf86platformBus.c
++++ b/hw/xfree86/common/xf86platformBus.c
+@@ -213,11 +213,12 @@ xf86platformProbe(void)
+     int i;
+     Bool pci = TRUE;
+ 
++    config_odev_probe(xf86PlatformDeviceProbe);
++
+     if (!xf86scanpci()) {
+         pci = FALSE;
+     }
+ 
+-    config_odev_probe(&xf86PlatformDeviceProbe);
+     for (i = 0; i < xf86_num_platform_devices; i++) {
+         char *busid = xf86_get_platform_attrib(i, ODEV_ATTRIB_BUSID);
+ 
+@@ -358,6 +359,9 @@ xf86platformProbeDev(DriverPtr drvp)
+                     break;
+             }
+             else {
++                /* for non-seat0 servers assume first device is the master */
++                if (ServerIsNotSeat0())
++                    break;
+                 if (xf86_platform_devices[j].pdev) {
+                     if (xf86IsPrimaryPlatform(&xf86_platform_devices[j]))
+                         break;
+diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
+index 23f589c..40963c3 100644
+--- a/hw/xfree86/dri2/dri2.c
++++ b/hw/xfree86/dri2/dri2.c
+@@ -766,6 +766,44 @@ static inline PixmapPtr GetDrawablePixmap(DrawablePtr drawable)
+     }
+ }
+ 
++/*
++ * A TraverseTree callback to invalidate all windows using the same
++ * pixmap
++ */
++static int
++DRI2InvalidateWalk(WindowPtr pWin, pointer data)
++{
++    if (pWin->drawable.pScreen->GetWindowPixmap(pWin) != data)
++        return WT_DONTWALKCHILDREN;
++    DRI2InvalidateDrawable(&pWin->drawable);
++    return WT_WALKCHILDREN;
++}
++
++static void
++DRI2InvalidateDrawableAll(DrawablePtr pDraw)
++{
++    if (pDraw->type == DRAWABLE_WINDOW) {
++        WindowPtr pWin = (WindowPtr) pDraw;
++        PixmapPtr pPixmap = pDraw->pScreen->GetWindowPixmap(pWin);
++
++        /*
++         * Find the top-most window using this pixmap
++         */
++        while (pWin->parent &&
++               pDraw->pScreen->GetWindowPixmap(pWin->parent) == pPixmap)
++            pWin = pWin->parent;
++
++        /*
++         * Walk the sub-tree to invalidate all of the
++         * windows using the same pixmap
++         */
++        TraverseTree(pWin, DRI2InvalidateWalk, pPixmap);
++        DRI2InvalidateDrawable(&pPixmap->drawable);
++    }
++    else
++        DRI2InvalidateDrawable(pDraw);
++}
++
+ DrawablePtr DRI2UpdatePrime(DrawablePtr pDraw, DRI2BufferPtr pDest)
+ {
+     DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
+@@ -831,6 +869,8 @@ DrawablePtr DRI2UpdatePrime(DrawablePtr pDraw, DRI2BufferPtr pDest)
+     spix->screen_x = mpix->screen_x;
+     spix->screen_y = mpix->screen_y;
+ #endif
++
++    DRI2InvalidateDrawableAll(pDraw);
+     return &spix->drawable;
+ }
+ 
+@@ -1048,18 +1088,7 @@ DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
+     return FALSE;
+ }
+ 
+-/*
+- * A TraverseTree callback to invalidate all windows using the same
+- * pixmap
+- */
+-static int
+-DRI2InvalidateWalk(WindowPtr pWin, pointer data)
+-{
+-    if (pWin->drawable.pScreen->GetWindowPixmap(pWin) != data)
+-        return WT_DONTWALKCHILDREN;
+-    DRI2InvalidateDrawable(&pWin->drawable);
+-    return WT_WALKCHILDREN;
+-}
++
+ 
+ int
+ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
+@@ -1162,26 +1191,7 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
+      */
+     *swap_target = pPriv->swap_count + pPriv->swapsPending;
+ 
+-    if (pDraw->type == DRAWABLE_WINDOW) {
+-        WindowPtr pWin = (WindowPtr) pDraw;
+-        PixmapPtr pPixmap = pScreen->GetWindowPixmap(pWin);
+-
+-        /*
+-         * Find the top-most window using this pixmap
+-         */
+-        while (pWin->parent &&
+-               pScreen->GetWindowPixmap(pWin->parent) == pPixmap)
+-            pWin = pWin->parent;
+-
+-        /*
+-         * Walk the sub-tree to invalidate all of the
+-         * windows using the same pixmap
+-         */
+-        TraverseTree(pWin, DRI2InvalidateWalk, pPixmap);
+-        DRI2InvalidateDrawable(&pPixmap->drawable);
+-    }
+-    else
+-        DRI2InvalidateDrawable(pDraw);
++    DRI2InvalidateDrawableAll(pDraw);
+ 
+     return Success;
+ }
+diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
+index 37cd8b3..1cf0f02 100644
+--- a/hw/xwin/InitOutput.c
++++ b/hw/xwin/InitOutput.c
+@@ -164,7 +164,7 @@ void XwinExtensionInit(void)
+     int i;
+ 
+ #ifdef XWIN_GLX_WINDOWS
+-    if ((g_fNativeGl) && (serverGeneration == 1)) {
++    if (g_fNativeGl) {
+         /* install the native GL provider */
+         glxWinPushNativeProvider();
+     }
+@@ -901,7 +901,8 @@ InitOutput(ScreenInfo * screenInfo, int argc, char *argv[])
+ {
+     int i;
+ 
+-    XwinExtensionInit();
++    if (serverGeneration == 1)
++        XwinExtensionInit();
+ 
+     /* Log the command line */
+     winLogCommandLine(argc, argv);
+diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
+index 4c2f04e..33729a9 100644
+--- a/hw/xwin/Makefile.am
++++ b/hw/xwin/Makefile.am
+@@ -109,13 +109,16 @@ SRCS =	InitInput.c \
+ 	winclipboard.h \
+ 	winconfig.h \
+ 	win.h \
++	winglobals.h \
+ 	winkeybd.h \
+ 	winkeynames.h \
+ 	winlayouts.h \
+ 	winmessages.h \
++	winmonitors.h \
+ 	winmsg.h \
+ 	winms.h \
+ 	winmultiwindowclass.h \
++	winmultiwindowicons.h \
+ 	winprefs.h \
+ 	winresource.h \
+ 	winwindow.h \
+diff --git a/hw/xwin/glx/Makefile.am b/hw/xwin/glx/Makefile.am
+index 7222a9f..59f6879 100644
+--- a/hw/xwin/glx/Makefile.am
++++ b/hw/xwin/glx/Makefile.am
+@@ -6,7 +6,8 @@ libXwinGLX_la_SOURCES = \
+ 	glwindows.h \
+ 	glwrap.c \
+ 	indirect.c \
+-	wgl_ext_api.c
++	wgl_ext_api.c \
++	wgl_ext_api.h
+ 
+ if XWIN_MULTIWINDOW
+ DEFS_MULTIWINDOW = -DXWIN_MULTIWINDOW
+diff --git a/include/input.h b/include/input.h
+index 5747f3c..f8459b8 100644
+--- a/include/input.h
++++ b/include/input.h
+@@ -579,6 +579,7 @@ extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti,
+                                      int listener, int mode);
+ extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
+                              uint32_t touchid, Window grab_window, XID *error);
++extern void TouchEndPhysicallyActiveTouches(DeviceIntPtr dev);
+ 
+ /* misc event helpers */
+ extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients);
+diff --git a/man/Xserver.man b/man/Xserver.man
+index 8d243d6..b103551 100644
+--- a/man/Xserver.man
++++ b/man/Xserver.man
+@@ -130,7 +130,7 @@ causes the server to generate a core dump on fatal errors.
+ .B \-displayfd \fIfd\fP
+ specifies a file descriptor in the launching process.  Rather than specify
+ a display number, the X server will attempt to listen on successively higher
+-display numbers, and upon finding a free one, will write the port number back
++display numbers, and upon finding a free one, will write the display number back
+ on this file descriptor as a newline-terminated string.  The \-pn option is
+ ignored when using \-displayfd.
+ .TP 8
+diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
+index 082c0db..c1af32e 100644
+--- a/xkb/xkbAccessX.c
++++ b/xkb/xkbAccessX.c
+@@ -709,7 +709,7 @@ ProcessPointerEvent(InternalEvent *ev, DeviceIntPtr mouse)
+     xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(mouse);
+     DeviceEvent *event = &ev->device_event;
+ 
+-    dev = IsFloating(mouse) ? mouse : GetMaster(mouse, MASTER_KEYBOARD);
++    dev = (IsMaster(mouse) || IsFloating(mouse)) ? mouse : GetMaster(mouse, MASTER_KEYBOARD);
+ 
+     if (dev && dev->key) {
+         xkbi = dev->key->xkbInfo;

Added: use-pixman-glyph-cache.patch
===================================================================
--- use-pixman-glyph-cache.patch	                        (rev 0)
+++ use-pixman-glyph-cache.patch	2012-11-08 19:23:59 UTC (rev 170560)
@@ -0,0 +1,270 @@
+From 9cbcb5bd6a5360a128d15b77a02d8d3351f74366 Mon Sep 17 00:00:00 2001
+From: Søren Sandmann Pedersen <ssp at redhat.com>
+Date: Wed, 30 May 2012 09:19:08 +0000
+Subject: 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);
+--
+cgit v0.9.0.2-2-gbebe




More information about the arch-commits mailing list