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 <[email protected]> -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 <[email protected]> -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 <[email protected]> ---- - 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(®, &box, 1); + RegionUnion(dst, dst, ®); + RegionUninit(®); +@@ -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 <[email protected]> +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@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 <[email protected]> +Reviewed-by: Keith Packard <[email protected]> +Signed-off-by: Soren Sandmann <[email protected]> +--- +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
