[Xquartz-changes] xserver: Branch 'master' - 102 commits

Jeremy Huddleston jeremyhu at freedesktop.org
Thu Feb 24 19:18:53 PST 2011


 Xext/xf86bigfont.c                   |   89 ++---
 Xext/xselinux_ext.c                  |    6 
 Xi/xiproperty.c                      |    2 
 Xi/xiquerypointer.c                  |    2 
 configure.ac                         |   17 -
 dix/eventconvert.c                   |   16 
 exa/exa.c                            |    3 
 exa/exa_driver.c                     |    2 
 fb/Makefile.am                       |    4 
 glx/glxcmds.c                        |   31 +
 glx/glxcmdsswap.c                    |   20 -
 hw/dmx/glxProxy/glxcmds.c            |   80 ++--
 hw/dmx/glxProxy/glxsingle.c          |    7 
 hw/dmx/glxProxy/glxvendor.c          |    6 
 hw/dmx/glxProxy/render2swap.c        |   54 ---
 hw/xfree86/common/xf86DGA.c          |   51 +--
 hw/xfree86/common/xf86Helper.c       |    6 
 hw/xfree86/common/xf86Init.c         |    2 
 hw/xfree86/common/xf86Module.h       |    2 
 hw/xfree86/common/xf86VidMode.c      |    2 
 hw/xfree86/common/xf86Xinput.c       |   29 +
 hw/xfree86/common/xf86sbusBus.c      |    2 
 hw/xfree86/common/xf86xv.c           |  210 +++++++------
 hw/xfree86/common/xf86xv.h           |    3 
 hw/xfree86/common/xf86xvpriv.h       |    6 
 hw/xfree86/dixmods/extmod/dgaproc.h  |    1 
 hw/xfree86/dri2/dri2.c               |    2 
 hw/xfree86/fbdevhw/fbdevhw.c         |   56 ---
 hw/xfree86/int10/helper_exec.c       |    2 
 hw/xfree86/modes/xf86Crtc.c          |  152 +++------
 hw/xfree86/modes/xf86Crtc.h          |  119 -------
 hw/xfree86/modes/xf86Cursors.c       |    4 
 hw/xfree86/modes/xf86RandR12.c       |  387 ++++--------------------
 hw/xfree86/modes/xf86Rotate.c        |   44 --
 hw/xfree86/os-support/bsd/bsd_init.c |    6 
 hw/xfree86/os-support/xf86_OSlib.h   |    8 
 hw/xfree86/parser/Makefile.am        |    7 
 hw/xquartz/bundle/Info.plist.cpp     |    2 
 hw/xwin/winclipboardxevents.c        |    3 
 hw/xwin/winconfig.c                  |   77 ++--
 hw/xwin/winkeybd.c                   |    8 
 hw/xwin/winkeybd.h                   |   16 
 hw/xwin/winkeyhook.c                 |    4 
 hw/xwin/winkeynames.h                |   13 
 hw/xwin/winlayouts.h                 |    8 
 include/colormapst.h                 |    4 
 include/eventstr.h                   |    2 
 include/exevents.h                   |    2 
 include/protocol-versions.h          |    2 
 include/scrnintstr.h                 |    2 
 include/xorg-server.h.in             |    7 
 m4/ax_tls.m4                         |   74 ++++
 miext/damage/Makefile.am             |    2 
 miext/rootless/Makefile.am           |    1 
 miext/shadow/Makefile.am             |    2 
 randr/Makefile.am                    |    6 
 randr/mirrcrtc.c                     |  174 ----------
 randr/randr.c                        |   15 
 randr/randrstr.h                     |  207 +-----------
 randr/rrcrtc.c                       |  562 +++--------------------------------
 randr/rrdispatch.c                   |    8 
 randr/rrinfo.c                       |    2 
 randr/rrmode.c                       |    2 
 randr/rrpixmap.c                     |  154 ---------
 randr/rrscreen.c                     |   32 -
 randr/rrsdispatch.c                  |  132 --------
 randr/rrsprite.c                     |  104 ------
 randr/rrtransform.c                  |   64 ---
 randr/rrtransform.h                  |   15 
 record/record.c                      |    6 
 test/input.c                         |  139 ++++++++
 xfixes/cursor.c                      |    2 
 xkb/ddxLoad.c                        |   76 +++-
 xkb/xkb.c                            |   23 -
 74 files changed, 962 insertions(+), 2430 deletions(-)

New commits:
commit 59850630fefe5e4f0430d7e2e106937fdf1e7ffb
Author: Jeremy Huddleston <jeremyhu at apple.com>
Date:   Thu Feb 24 19:18:35 2011 -0800

    XQuartz: Add LSApplicationCategoryType key to Info.plist
    
    Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>

diff --git a/hw/xquartz/bundle/Info.plist.cpp b/hw/xquartz/bundle/Info.plist.cpp
index 2e568ff..0e98218 100644
--- a/hw/xquartz/bundle/Info.plist.cpp
+++ b/hw/xquartz/bundle/Info.plist.cpp
@@ -34,6 +34,8 @@
         <key>SUFeedURL</key>
                 <string>http://xquartz.macosforge.org/downloads/sparkle/release.xml</string>
 #endif
+	<key>LSApplicationCategoryType</key>
+		<string>public.app-category.utilities</string>
 	<key>NSHumanReadableCopyright</key>
 		<string>© 2003-2011 Apple Inc.
 © 2003 XFree86 Project, Inc.
commit 83861595782aaa05907f9cf7b236d50261d404d9
Merge: a1cc0e5... 4102a00...
Author: Keith Packard <keithp at keithp.com>
Date:   Thu Feb 24 18:59:07 2011 -0800

    Merge remote branch 'kibi/master'

commit a1cc0e52b0e8ca40bc1218de553424b2bcb760ef
Author: Alexandr Shadchin <alexandr.shadchin at gmail.com>
Date:   Tue Nov 30 21:17:19 2010 +0500

    Removing unused code
    
    In OpenBSD removed support PCCONS in 2002 year
    http://marc.info/?l=openbsd-cvs&m=102435816424294&w=2
    
    Signed-off-by: Alexandr Shadchin <Alexandr.Shadchin at gmail.com>
    Reviewed-by: Matthieu Herrb <matthieu.herrb at laas.fr>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/os-support/bsd/bsd_init.c b/hw/xfree86/os-support/bsd/bsd_init.c
index 13c6ec3..123eb17 100644
--- a/hw/xfree86/os-support/bsd/bsd_init.c
+++ b/hw/xfree86/os-support/bsd/bsd_init.c
@@ -50,11 +50,7 @@ static Bool ShareVTs = FALSE;
 
 #ifdef PCCONS_SUPPORT
 /* Stock 0.1 386bsd pccons console driver interface */
-#ifndef __OpenBSD__
-#  define PCCONS_CONSOLE_DEV1 "/dev/ttyv0"
-#else
-#  define PCCONS_CONSOLE_DEV1 "/dev/ttyC0"
-#endif
+#define PCCONS_CONSOLE_DEV1 "/dev/ttyv0"
 #define PCCONS_CONSOLE_DEV2 "/dev/vga"
 #define PCCONS_CONSOLE_MODE O_RDWR|O_NDELAY
 #endif
diff --git a/hw/xfree86/os-support/xf86_OSlib.h b/hw/xfree86/os-support/xf86_OSlib.h
index 3b646da..147a201 100644
--- a/hw/xfree86/os-support/xf86_OSlib.h
+++ b/hw/xfree86/os-support/xf86_OSlib.h
@@ -264,14 +264,6 @@
 #   define CONSOLE_X_MODE_OFF PCCONIOCCOOK
 #   define CONSOLE_X_BELL PCCONIOCBEEP
 #  else /* __bsdi__ */
-#   if defined(__OpenBSD__)
-#     ifdef PCCONS_SUPPORT
-#       include <machine/pccons.h>
-#       undef CONSOLE_X_MODE_ON
-#       undef CONSOLE_X_MODE_OFF
-#       undef CONSOLE_X_BELL
-#     endif
-#   endif
 #   ifdef SYSCONS_SUPPORT
 #    define COMPAT_SYSCONS
 #    if defined(__NetBSD__) || defined(__OpenBSD__)
commit 365ad68fb9f7029550505b7c276a808050cada9c
Merge: 0801afb... 720c895...
Author: Keith Packard <keithp at keithp.com>
Date:   Thu Feb 24 18:49:40 2011 -0800

    Merge remote branch 'ajax/for-keithp'

commit 0801afbd7c2c644c672b37f8463f1a0cbadebd2e
Author: Erkki Seppälä <erkki.seppala at vincit.fi>
Date:   Thu Feb 10 15:35:14 2011 +0200

    record: avoid crash when calling RecordFlushReplyBuffer recursively
    
    RecordFlushReplyBuffer can call itself recursively through
    WriteClient->CallCallbacks->_CallCallbacks->RecordFlushAllContexts
    when the recording client's buffer cannot be completely emptied in one
    WriteClient. When a such a recursion occurs, it will not be broken out
    of which results in segmentation fault when the stack is exhausted.
    
    This patch adds a counter (a flag, really) that guards against this
    situation, to break out of the recursion.
    
    One alternative to this change would be to change _CallCallbacks to
    check the corresponding counter before the callback loop, but that
    might affect existing behavior, which may be relied upon.
    
    Reviewed-by: Rami Ylimäki <rami.ylimaki at vincit.fi>
    Signed-off-by: Erkki Seppälä <erkki.seppala at vincit.fi>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/record/record.c b/record/record.c
index 6a93d7a..facaebb 100644
--- a/record/record.c
+++ b/record/record.c
@@ -77,6 +77,7 @@ typedef struct {
     char	bufCategory;	   /* category of protocol in replyBuffer */
     int		numBufBytes;	   /* number of bytes in replyBuffer */
     char	replyBuffer[REPLY_BUF_SIZE]; /* buffered recorded protocol */
+    int		inFlush;           /*  are we inside RecordFlushReplyBuffer */
 } RecordContextRec, *RecordContextPtr;
 
 /*  RecordMinorOpRec - to hold minor opcode selections for extension requests
@@ -245,8 +246,9 @@ RecordFlushReplyBuffer(
     int len2
 )
 {
-    if (!pContext->pRecordingClient || pContext->pRecordingClient->clientGone) 
+    if (!pContext->pRecordingClient || pContext->pRecordingClient->clientGone || pContext->inFlush)
 	return;
+    ++pContext->inFlush;
     if (pContext->numBufBytes)
 	WriteToClient(pContext->pRecordingClient, pContext->numBufBytes,
 		      (char *)pContext->replyBuffer);
@@ -255,6 +257,7 @@ RecordFlushReplyBuffer(
 	WriteToClient(pContext->pRecordingClient, len1, (char *)data1);
     if (len2)
 	WriteToClient(pContext->pRecordingClient, len2, (char *)data2);
+    --pContext->inFlush;
 } /* RecordFlushReplyBuffer */
 
 
@@ -1938,6 +1941,7 @@ ProcRecordCreateContext(ClientPtr client)
     pContext->numBufBytes = 0;
     pContext->pBufClient = NULL;
     pContext->continuedReply = 0;
+    pContext->inFlush = 0;
 
     err = RecordRegisterClients(pContext, client,
 				(xRecordRegisterClientsReq *)stuff);
commit b833f9b924ddc043244c0a026547c438f1c4d4df
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:18:35 2011 -0800

    Revert "Replace huge argument list in xf86CrtcSetModeTransform with struct"
    
    This reverts commit 8b35118c03590a7ad3786d3284bafb3f40fcb8cc.

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 54b8f4d..a49668f 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -247,14 +247,15 @@ xf86CrtcSetScreenSubpixelOrder (ScreenPtr pScreen)
  * Sets the given video mode on the given crtc
  */
 Bool
-xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
+xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
+			  RRTransformPtr transform, int x, int y)
 {
     ScrnInfoPtr		scrn = crtc->scrn;
     xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
     int			i;
     Bool		ret = FALSE;
     Bool		didLock = FALSE;
-    DisplayModePtr	adjusted_mode = NULL;
+    DisplayModePtr	adjusted_mode;
     DisplayModeRec	saved_mode;
     int			saved_x, saved_y;
     Rotation		saved_rotation;
@@ -271,9 +272,8 @@ xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
 	return TRUE;
     }
 
-    /* See if nothing has changed */
-    if (!set->flags)
-	return TRUE;
+    adjusted_mode = xf86DuplicateMode(mode);
+
 
     saved_mode = crtc->mode;
     saved_x = crtc->x;
@@ -288,44 +288,21 @@ xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
     /* Update crtc values up front so the driver can rely on them for mode
      * setting.
      */
-    if (set->flags & XF86CrtcSetMode)
-	crtc->mode = *set->mode;
-    if (set->flags & XF86CrtcSetOrigin) {
-	crtc->x = set->x;
-	crtc->y = set->y;
-    }
-    if (set->flags & XF86CrtcSetRotation)
-	crtc->rotation = set->rotation;
-
-    if (set->flags & XF86CrtcSetTransform) {
-	if (set->transform) {
-	    RRTransformCopy (&crtc->transform, set->transform);
-	    crtc->transformPresent = TRUE;
-	} else
-	    crtc->transformPresent = FALSE;
-    }
-
-    if (crtc->funcs->set) {
-	ret = crtc->funcs->set(crtc, set->flags);
-	goto done;
-    }
-
-    if (set->flags == XF86CrtcSetOrigin && crtc->funcs->set_origin) {
-	ret = xf86CrtcRotate(crtc);
-	if (ret)
-	    crtc->funcs->set_origin(crtc, crtc->x, crtc->y);
-	goto done;
-    }
+    crtc->mode = *mode;
+    crtc->x = x;
+    crtc->y = y;
+    crtc->rotation = rotation;
+    if (transform) {
+	RRTransformCopy (&crtc->transform, transform);
+	crtc->transformPresent = TRUE;
+    } else
+	crtc->transformPresent = FALSE;
 
     if (crtc->funcs->set_mode_major) {
-	ret = crtc->funcs->set_mode_major(crtc, &crtc->mode,
-					  crtc->rotation,
-					  crtc->x, crtc->y);
+	ret = crtc->funcs->set_mode_major(crtc, mode, rotation, x, y);
 	goto done;
     }
 
-    adjusted_mode = xf86DuplicateMode(&crtc->mode);
-
     didLock = crtc->funcs->lock (crtc);
     /* Pass our mode to the outputs and the CRTC to give them a chance to
      * adjust it according to limitations or output properties, and also
@@ -337,12 +314,12 @@ xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
 	if (output->crtc != crtc)
 	    continue;
 
-	if (!output->funcs->mode_fixup(output, &crtc->mode, adjusted_mode)) {
+	if (!output->funcs->mode_fixup(output, mode, adjusted_mode)) {
 	    goto done;
 	}
     }
 
-    if (!crtc->funcs->mode_fixup(crtc, &crtc->mode, adjusted_mode)) {
+    if (!crtc->funcs->mode_fixup(crtc, mode, adjusted_mode)) {
 	goto done;
     }
 
@@ -365,12 +342,12 @@ xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
     /* Set up the DPLL and any output state that needs to adjust or depend
      * on the DPLL.
      */
-    crtc->funcs->mode_set(crtc, &crtc->mode, adjusted_mode, crtc->x, crtc->y);
+    crtc->funcs->mode_set(crtc, mode, adjusted_mode, crtc->x, crtc->y);
     for (i = 0; i < xf86_config->num_output; i++) 
     {
 	xf86OutputPtr output = xf86_config->output[i];
 	if (output->crtc == crtc)
-	    output->funcs->mode_set(output, &crtc->mode, adjusted_mode);
+	    output->funcs->mode_set(output, mode, adjusted_mode);
     }
 
     /* Only upload when needed, to avoid unneeded delays. */
@@ -406,10 +383,8 @@ done:
 	crtc->transformPresent = saved_transform_present;
     }
 
-    if (adjusted_mode) {
-	free(adjusted_mode->name);
-	free(adjusted_mode);
-    }
+    free(adjusted_mode->name);
+    free(adjusted_mode);
 
     if (didLock)
 	crtc->funcs->unlock (crtc);
@@ -418,19 +393,35 @@ done:
 }
 
 /**
+ * Sets the given video mode on the given crtc, but without providing
+ * a transform
+ */
+Bool
+xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
+		 int x, int y)
+{
+    return xf86CrtcSetModeTransform (crtc, mode, rotation, NULL, x, y);
+}
+
+/**
  * Pans the screen, does not change the mode
  */
 void
 xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y)
 {
-    xf86CrtcSetRec	set;
+    ScrnInfoPtr scrn = crtc->scrn;
 
-    if (x != crtc->x || y != crtc->y) {
-	set.x = x;
-	set.y = y;
-	set.flags = XF86CrtcSetOrigin;
-	(void) xf86CrtcSet(crtc, &set);
+    crtc->x = x;
+    crtc->y = y;
+    if (crtc->funcs->set_origin) {
+	if (!xf86CrtcRotate (crtc))
+	    return;
+	crtc->funcs->set_origin (crtc, x, y);
+	if (scrn->ModeSet)
+	    scrn->ModeSet(scrn);
     }
+    else
+	xf86CrtcSetMode (crtc, &crtc->mode, crtc->rotation, x, y);
 }
 
 /*
@@ -2621,7 +2612,6 @@ xf86SetDesiredModes (ScrnInfoPtr scrn)
     for (c = 0; c < config->num_crtc; c++)
     {
 	xf86OutputPtr	output = NULL;
-	xf86CrtcSetRec	set;
 	int		o;
 	RRTransformPtr	transform;
 
@@ -2665,15 +2655,8 @@ xf86SetDesiredModes (ScrnInfoPtr scrn)
 	    transform = &crtc->desiredTransform;
 	else
 	    transform = NULL;
-	set.mode = &crtc->desiredMode;
-	set.rotation = crtc->desiredRotation;
-	set.transform = transform;
-	set.x = crtc->desiredX;
-	set.y = crtc->desiredY;
-	set.flags = (XF86CrtcSetMode | XF86CrtcSetOutput |
-		     XF86CrtcSetOrigin | XF86CrtcSetTransform |
-		     XF86CrtcSetRotation);
-	if (!xf86CrtcSet(crtc, &set))
+	if (!xf86CrtcSetModeTransform (crtc, &crtc->desiredMode, crtc->desiredRotation,
+				       transform, crtc->desiredX, crtc->desiredY))
 	    return FALSE;
     }
 
@@ -2777,7 +2760,6 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
 	xf86CrtcPtr	crtc = config->crtc[c];
 	DisplayModePtr	crtc_mode = NULL;
 	int		o;
-	xf86CrtcSetRec	set;
 
 	if (!crtc->enabled)
 	    continue;
@@ -2805,15 +2787,7 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
 	    crtc->enabled = FALSE;
 	    continue;
 	}
-	set.mode = crtc_mode;
-	set.rotation = rotation;
-	set.transform = NULL;
-	set.x = 0;
-	set.y = 0;
-	set.flags = (XF86CrtcSetMode | XF86CrtcSetOutput |
-		     XF86CrtcSetOrigin | XF86CrtcSetTransform |
-		     XF86CrtcSetRotation);
-	if (!xf86CrtcSet (crtc, &set))
+	if (!xf86CrtcSetModeTransform (crtc, crtc_mode, rotation, NULL, 0, 0))
 	    ok = FALSE;
 	else
 	{
diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index f43e0a7..68a968c 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -72,23 +72,6 @@ typedef enum _xf86OutputStatus {
    XF86OutputStatusUnknown
 } xf86OutputStatus;
 
-typedef enum _xf86CrtcSetFlags {
-    XF86CrtcSetMode = 1,		/* mode */
-    XF86CrtcSetOutput = 2,		/* outputs */
-    XF86CrtcSetOrigin = 4,		/* x/y */
-    XF86CrtcSetTransform = 8,		/* transform */
-    XF86CrtcSetRotation = 16,		/* rotation */
-    XF86CrtcSetProperty = 32,		/* output property */
-} xf86CrtcSetFlags;
-
-typedef struct _xf86CrtcSet {
-    xf86CrtcSetFlags	flags;
-    DisplayModePtr	mode;
-    Rotation		rotation;
-    RRTransformPtr	transform;
-    int			x, y;
-} xf86CrtcSetRec;
-
 typedef struct _xf86CrtcFuncs {
    /**
     * Turns the crtc on/off, or sets intermediate power levels if available.
@@ -238,12 +221,6 @@ typedef struct _xf86CrtcFuncs {
     void
     (*set_origin)(xf86CrtcPtr crtc, int x, int y);
 
-    /**
-     * General mode setting entry point that does everything
-     */
-    Bool
-    (*set)(xf86CrtcPtr crtc, xf86CrtcSetFlags flags);
-
 } xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
 
 #define XF86_CRTC_VERSION 3
@@ -761,12 +738,18 @@ xf86CrtcCreate (ScrnInfoPtr		scrn,
 extern _X_EXPORT void
 xf86CrtcDestroy (xf86CrtcPtr		crtc);
 
+
 /**
- * Change a crtc configuration (modes, outputs, etc)
+ * Sets the given video mode on the given crtc
  */
 
 extern _X_EXPORT Bool
-xf86CrtcSet (xf86CrtcPtr crtc, xf86CrtcSetRec *set);
+xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
+			  RRTransformPtr transform, int x, int y);
+
+extern _X_EXPORT Bool
+xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
+		 int x, int y);
 
 extern _X_EXPORT void
 xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y);
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index d60ee3c..2fe0c47 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1133,7 +1133,7 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
     xf86CrtcConfigPtr   config = XF86_CRTC_CONFIG_PTR(pScrn);
     xf86CrtcPtr		crtc = randr_crtc->devPrivate;
     RRTransformPtr	transform;
-    xf86CrtcSetFlags	flags = 0;
+    Bool		changed = FALSE;
     int			o, ro;
     xf86CrtcPtr		*save_crtcs;
     Bool		save_enabled = crtc->enabled;
@@ -1143,22 +1143,22 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 
     save_crtcs = malloc(config->num_output * sizeof (xf86CrtcPtr));
     if ((randr_mode != NULL) != crtc->enabled)
-	flags |= XF86CrtcSetMode;
+	changed = TRUE;
     else if (randr_mode && !xf86RandRModeMatches (randr_mode, &crtc->mode))
-	flags |= XF86CrtcSetMode;
+	changed = TRUE;
     
     if (rotation != crtc->rotation)
-	flags |= XF86CrtcSetRotation;
+	changed = TRUE;
 
     transform = RRCrtcGetTransform (randr_crtc);
     if ((transform != NULL) != crtc->transformPresent)
-	flags |= XF86CrtcSetTransform;
+	changed = TRUE;
     else if (transform && memcmp (&transform->transform, &crtc->transform.transform,
 				  sizeof (transform->transform)) != 0)
-	flags |= XF86CrtcSetTransform;
+	changed = TRUE;
 
     if (x != crtc->x || y != crtc->y)
-	flags |= XF86CrtcSetOrigin;
+	changed = TRUE;
     for (o = 0; o < config->num_output; o++) 
     {
 	xf86OutputPtr  output = config->output[o];
@@ -1178,16 +1178,16 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 	    }
 	if (new_crtc != output->crtc)
 	{
-	    flags |= XF86CrtcSetOutput;
+	    changed = TRUE;
 	    output->crtc = new_crtc;
 	}
     }
     for (ro = 0; ro < num_randr_outputs; ro++) 
         if (randr_outputs[ro]->pendingProperties)
-	    flags |= XF86CrtcSetProperty;
+	    changed = TRUE;
 
     /* XXX need device-independent mode setting code through an API */
-    if (flags)
+    if (changed)
     {
 	crtc->enabled = randr_mode != NULL;
 
@@ -1195,16 +1195,9 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 	{
 	    DisplayModeRec  mode;
 	    RRTransformPtr  transform = RRCrtcGetTransform (randr_crtc);
-	    xf86CrtcSetRec  set;
 
 	    xf86RandRModeConvert (pScrn, randr_mode, &mode);
-	    set.mode = &mode;
-	    set.rotation = rotation;
-	    set.transform = transform;
-	    set.x = x;
-	    set.y = y;
-	    set.flags = flags;
-	    if (!xf86CrtcSet(crtc, &set))
+	    if (!xf86CrtcSetModeTransform (crtc, &mode, rotation, transform, x, y))
 	    {
 		crtc->enabled = save_enabled;
 		for (o = 0; o < config->num_output; o++)
commit 7030c82648930cea7ef8a2ea49d8138078920d4d
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:18:16 2011 -0800

    Revert "Require RandR protocol version 1.4 or newer"
    
    This reverts commit c8bc25fd7629df10f2825b7cc713b031ae78f223.

diff --git a/configure.ac b/configure.ac
index ac4bf8c..8858e86 100644
--- a/configure.ac
+++ b/configure.ac
@@ -788,7 +788,7 @@ WINDOWSWMPROTO="windowswmproto"
 APPLEWMPROTO="applewmproto >= 1.4"
 
 dnl Core modules for most extensions, et al.
-SDK_REQUIRED_MODULES="[xproto >= 7.0.17] [randrproto >= 1.4] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 1.9.99.902] [kbproto >= 1.0.3] fontsproto"
+SDK_REQUIRED_MODULES="[xproto >= 7.0.17] [randrproto >= 1.2.99.3] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 1.9.99.902] [kbproto >= 1.0.3] fontsproto"
 # Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
 AC_SUBST(SDK_REQUIRED_MODULES)
 
commit a91d33917befd6719bb7f01007bc253a2aefb0bb
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:18:12 2011 -0800

    Revert "randr: Add sprite position transforms"
    
    This reverts commit 66294afcab7b7a82f7dd897767e46c48a94b8ee8.

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index ecde199..54b8f4d 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -106,17 +106,12 @@ xf86CrtcCreate (ScrnInfoPtr		scrn,
     pixman_transform_init_identity (&crtc->crtc_to_framebuffer);
     pixman_f_transform_init_identity (&crtc->f_crtc_to_framebuffer);
     pixman_f_transform_init_identity (&crtc->f_framebuffer_to_crtc);
-    pixman_f_transform_init_identity (&crtc->f_screen_to_crtc);
-    pixman_f_transform_init_identity (&crtc->user_sprite_position_transform);
-    pixman_f_transform_init_identity (&crtc->f_crtc_to_cursor);
-    pixman_f_transform_init_identity (&crtc->user_sprite_image_transform);
     crtc->filter = NULL;
     crtc->params = NULL;
     crtc->nparams = 0;
     crtc->filter_width = 0;
     crtc->filter_height = 0;
     crtc->transform_in_use = FALSE;
-    crtc->sprite_transform_in_use = FALSE;
     crtc->transformPresent = FALSE;
     crtc->desiredTransformPresent = FALSE;
     memset (&crtc->bounds, '\0', sizeof (crtc->bounds));
diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index 8b42efc..f43e0a7 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -345,7 +345,6 @@ struct _xf86Crtc {
     int		    filter_width; /* ABI 2 */
     int		    filter_height; /* ABI 2 */
     Bool	    transform_in_use;
-    Bool	    sprite_transform_in_use;
     RRTransformRec  transform; /* ABI 2 */
     Bool	    transformPresent; /* ABI 2 */
     RRTransformRec  desiredTransform; /* ABI 2 */
@@ -385,22 +384,6 @@ struct _xf86Crtc {
      * Clear the shadow
      */
     Bool	    shadowClear;
-
-    /**
-     * Sprite position transforms
-     */
-
-    /* Transform a screen coordinate to a crtc coordinate */
-    struct pixman_f_transform f_screen_to_crtc;
-
-    /* The user-specified portion of the screen to crtc conversion */
-    struct pixman_f_transform user_sprite_position_transform;
-
-    /* Transform a hardware cursor coordinate to a cursor coordinate */
-    struct pixman_f_transform f_crtc_to_cursor;
-
-    /* The user-specified portion of the cursor to hardware transform */
-    struct pixman_f_transform user_sprite_image_transform;
 };
 
 typedef struct _xf86OutputFuncs {
@@ -794,14 +777,6 @@ xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y);
 extern _X_EXPORT Bool
 xf86CrtcRotate (xf86CrtcPtr crtc);
 
-
-/*
- * Update cursor transform matrices after user changes
- * This is just the cursor subset of xf86CrtcRotate
- */
-extern _X_EXPORT void
-xf86CrtcRotateCursor (xf86CrtcPtr crtc);
-
 /*
  * Clean up any rotation data, used when a crtc is turned off
  * as well as when rotation is disabled.
diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c
index 7b43bcb..0667447 100644
--- a/hw/xfree86/modes/xf86Cursors.c
+++ b/hw/xfree86/modes/xf86Cursors.c
@@ -338,7 +338,7 @@ xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
     /*
      * Transform position of cursor on screen
      */
-    if (crtc->sprite_transform_in_use)
+    if (crtc->transform_in_use)
     {
 	ScreenPtr	screen = scrn->pScreen;
 	xf86CursorScreenPtr ScreenPriv =
@@ -349,7 +349,7 @@ xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
 	v.v[0] = (x + ScreenPriv->HotX) + 0.5;
 	v.v[1] = (y + ScreenPriv->HotY) + 0.5;
 	v.v[2] = 1;
-	pixman_f_transform_point (&crtc->f_screen_to_crtc, &v);
+	pixman_f_transform_point (&crtc->f_framebuffer_to_crtc, &v);
 	/* cursor will have 0.5 added to it already so floor is sufficent */
 	x = floor (v.v[0]);
 	y = floor (v.v[1]);
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index bbf28cd..d60ee3c 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -180,14 +180,14 @@ xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeigh
  */
 
 static void
-xf86ComputeCrtcPan (Bool sprite_transform_in_use,
+xf86ComputeCrtcPan (Bool transform_in_use,
 		    struct pixman_f_transform *m,
 		    double screen_x, double screen_y,
 		    double crtc_x, double crtc_y,
 		    int old_pan_x, int old_pan_y,
 		    int *new_pan_x, int *new_pan_y)
 {
-    if (sprite_transform_in_use) {
+    if (transform_in_use) {
 	/*
 	 * Given the current transform, M, the current position
 	 * on the Screen, S, and the desired position on the CRTC,
@@ -374,8 +374,8 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
 	c.v[0] = x;
 	c.v[1] = y;
 	c.v[2] = 1.0;
-	if (crtc->sprite_transform_in_use) {
-	    pixman_f_transform_point(&crtc->f_screen_to_crtc, &c);
+	if (crtc->transform_in_use) {
+	    pixman_f_transform_point(&crtc->f_framebuffer_to_crtc, &c);
 	} else {
 	    c.v[0] -= crtc->x;
 	    c.v[1] -= crtc->y;
@@ -402,8 +402,8 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
 	    }
 	}
 	if (panned)
-	    xf86ComputeCrtcPan (crtc->sprite_transform_in_use,
-				&crtc->f_screen_to_crtc,
+	    xf86ComputeCrtcPan (crtc->transform_in_use,
+				&crtc->f_framebuffer_to_crtc,
 				x, y, c.v[0], c.v[1],
 				newX, newY, &newX, &newY);
     }
@@ -414,7 +414,7 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
      * XXX This computation only works when we do not have a transform
      * in use.
      */
-    if (!crtc->sprite_transform_in_use)
+    if (!crtc->transform_in_use)
     {
 	/* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */
 	if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
@@ -1732,20 +1732,6 @@ xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
     return Success;
 }
 
-static void
-xf86RandR14SetCrtcSpriteTransform(ScreenPtr		pScreen,
-				  RRCrtcPtr		randr_crtc,
-				  struct pixman_f_transform *f_position_transform,
-				  struct pixman_f_transform *f_image_transform)
-{
-    xf86CrtcPtr		crtc = randr_crtc->devPrivate;
-
-    crtc->user_sprite_position_transform = *f_position_transform;
-    crtc->user_sprite_image_transform = *f_image_transform;
-    xf86CrtcRotateCursor(crtc);
-    xf86_reload_cursors(pScreen);
-}
-
 static Bool
 xf86RandR12EnterVT (int screen_index, int flags)
 {
@@ -1754,7 +1740,6 @@ xf86RandR12EnterVT (int screen_index, int flags)
     XF86RandRInfoPtr randrp  = XF86RANDRINFO(pScreen);
     rrScrPrivPtr     rp = rrGetScrPriv(pScreen);
     Bool	     ret;
-    int i;
 
     if (randrp->orig_EnterVT) {
 	pScrn->EnterVT = randrp->orig_EnterVT;
@@ -1766,6 +1751,7 @@ xf86RandR12EnterVT (int screen_index, int flags)
     }
 
     /* reload gamma */
+    int i;
     for (i = 0; i < rp->numCrtcs; i++)
 	xf86RandR12CrtcSetGamma(pScreen, rp->crtcs[i]);
 
@@ -1796,7 +1782,6 @@ xf86RandR12Init12 (ScreenPtr pScreen)
     rp->rrSetConfig = NULL;
     pScrn->PointerMoved = xf86RandR12PointerMoved;
     pScrn->ChangeGamma = xf86RandR12ChangeGamma;
-    rp->rrSetCrtcSpriteTransform = xf86RandR14SetCrtcSpriteTransform;
 
     randrp->orig_EnterVT = pScrn->EnterVT;
     pScrn->EnterVT = xf86RandR12EnterVT;
diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c
index ddc6d4c..57c3499 100644
--- a/hw/xfree86/modes/xf86Rotate.c
+++ b/hw/xfree86/modes/xf86Rotate.c
@@ -369,39 +369,6 @@ xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb)
 	    0 <= b.y1 && b.y2 <= pScrn->virtualY);
 }
 
-/*
- * A subset of xf86CrtcRotate that just deals with
- * cursor image/position transforms. Used when changing
- * the cursor transform
- */
-void
-xf86CrtcRotateCursor (xf86CrtcPtr crtc)
-{
-    /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
-    RRTransformPtr	transform = NULL;
-    PictTransform	crtc_to_fb;
-    struct pict_f_transform f_crtc_to_fb, f_fb_to_crtc, f_screen_to_crtc, f_crtc_to_cursor;
-
-    if (crtc->transformPresent)
-	transform = &crtc->transform;
-
-    (void) RRTransformCompute (crtc->x, crtc->y,
-			       crtc->mode.HDisplay, crtc->mode.VDisplay,
-			       crtc->rotation,
-			       transform,
-			       &crtc->user_sprite_position_transform,
-			       &crtc->user_sprite_image_transform,
-
-			       &crtc_to_fb,
-			       &f_crtc_to_fb,
-			       &f_fb_to_crtc,
-			       &f_screen_to_crtc,
-			       &f_crtc_to_cursor,
-			       &crtc->sprite_transform_in_use);
-    crtc->f_screen_to_crtc = f_screen_to_crtc;
-    crtc->f_crtc_to_cursor = f_crtc_to_cursor;
-}
-
 Bool
 xf86CrtcRotate (xf86CrtcPtr crtc)
 {
@@ -410,7 +377,7 @@ xf86CrtcRotate (xf86CrtcPtr crtc)
     /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
     ScreenPtr		pScreen = screenInfo.screens[pScrn->scrnIndex];
     PictTransform	crtc_to_fb;
-    struct pict_f_transform f_crtc_to_fb, f_fb_to_crtc, f_screen_to_crtc, f_crtc_to_cursor;
+    struct pict_f_transform f_crtc_to_fb, f_fb_to_crtc;
     xFixed		*new_params = NULL;
     int			new_nparams = 0;
     PictFilterPtr	new_filter = NULL;
@@ -426,15 +393,10 @@ xf86CrtcRotate (xf86CrtcPtr crtc)
 			     crtc->mode.HDisplay, crtc->mode.VDisplay,
 			     crtc->rotation,
 			     transform,
-			     &crtc->user_sprite_position_transform,
-			     &crtc->user_sprite_image_transform,
 
 			     &crtc_to_fb,
 			     &f_crtc_to_fb,
-			     &f_fb_to_crtc,
-			     &f_screen_to_crtc,
-			     &f_crtc_to_cursor,
-			     &crtc->sprite_transform_in_use) &&
+			     &f_fb_to_crtc) &&
 	xf86CrtcFitsScreen (crtc, &f_crtc_to_fb))
     {
 	/*
@@ -543,8 +505,6 @@ xf86CrtcRotate (xf86CrtcPtr crtc)
     crtc->crtc_to_framebuffer = crtc_to_fb;
     crtc->f_crtc_to_framebuffer = f_crtc_to_fb;
     crtc->f_framebuffer_to_crtc = f_fb_to_crtc;
-    crtc->f_screen_to_crtc = f_screen_to_crtc;
-    crtc->f_crtc_to_cursor = f_crtc_to_cursor;
     free(crtc->params);
     crtc->params = new_params;
     crtc->nparams = new_nparams;
diff --git a/randr/Makefile.am b/randr/Makefile.am
index 4b38e52..de338b9 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -20,7 +20,6 @@ librandr_la_SOURCES =	\
 	rrproperty.c	\
 	rrscreen.c	\
 	rrsdispatch.c	\
-	rrsprite.c	\
 	rrtransform.h	\
 	rrtransform.c
 
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 5e2a351..7ea6080 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -55,10 +55,9 @@
 #define RANDR_10_INTERFACE 1
 #define RANDR_12_INTERFACE 1
 #define RANDR_13_INTERFACE 1 /* requires RANDR_12_INTERFACE */
-#define RANDR_14_INTERFACE 1 /* requires RANDR_13_INTERFACE */
 #define RANDR_GET_CRTC_INTERFACE 1
 
-#define RANDR_INTERFACE_VERSION 0x0104
+#define RANDR_INTERFACE_VERSION 0x0103
 
 typedef XID	RRMode;
 typedef XID	RROutput;
@@ -123,16 +122,9 @@ struct _rrCrtc {
     Bool	    transforms;
     RRTransformRec  client_pending_transform;
     RRTransformRec  client_current_transform;
-    PictTransform   client_sprite_position_transform;
-    PictTransform   client_sprite_image_transform;
-    struct pict_f_transform	client_sprite_f_position_transform;
-    struct pict_f_transform	client_sprite_f_image_transform;
-
     PictTransform   transform;
     struct pict_f_transform f_transform;
     struct pict_f_transform f_inverse;
-    struct pict_f_transform f_sprite_position;		/* crtc from screen */
-    struct pict_f_transform f_sprite_image_inverse;	/* image from crtc */
 };
 
 struct _rrOutput {
@@ -241,16 +233,6 @@ typedef Bool (*RRSetConfigProcPtr) (ScreenPtr		pScreen,
 #endif
 	
 
-typedef void (*RRSetCrtcSpriteTransformPtr) (ScreenPtr pScreen,
-					     RRCrtcPtr randr_crtc,
-					     struct pict_f_transform *position_transform,
-					     struct pict_f_transform *image_transform);
-
-typedef void (*RRGetCrtcSpriteTransformPtr) (ScreenPtr pScreen,
-					     RRCrtcPtr randr_crtc,
-					     struct pict_f_transform *position_transform,
-					     struct pict_f_transform *image_transform);
-
 typedef struct _rrScrPriv {
     /*
      * 'public' part of the structure; DDXen fill this in
@@ -274,9 +256,7 @@ typedef struct _rrScrPriv {
     RRGetPanningProcPtr	rrGetPanning;
     RRSetPanningProcPtr	rrSetPanning;
 #endif
-    RRSetCrtcSpriteTransformPtr	rrSetCrtcSpriteTransform;
-    RRGetCrtcSpriteTransformPtr	rrGetCrtcSpriteTransform;
-
+    
     /*
      * Private part of the structure; not considered part of the ABI
      */
@@ -626,6 +606,25 @@ extern _X_EXPORT void
 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
 
 /*
+ * Compute the complete transformation matrix including
+ * client-specified transform, rotation/reflection values and the crtc 
+ * offset.
+ *
+ * Return TRUE if the resulting transform is not a simple translation.
+ */
+extern _X_EXPORT Bool
+RRTransformCompute (int			    x,
+		    int			    y,
+		    int			    width,
+		    int			    height,
+		    Rotation		    rotation,
+		    RRTransformPtr	    rr_transform,
+
+		    PictTransformPtr	    transform,
+		    struct pict_f_transform *f_transform,
+		    struct pict_f_transform *f_inverse);
+
+/*
  * Return crtc transform
  */
 extern _X_EXPORT RRTransformPtr
@@ -701,19 +700,6 @@ ProcRRGetPanning (ClientPtr client);
 int
 ProcRRSetPanning (ClientPtr client);
 
-void
-RRCrtcSpriteTransformSet(RRCrtcPtr crtc,
-			 PictTransform *position_transform,
-			 PictTransform *image_transform,
-			 struct pict_f_transform *f_position_transform,
-			 struct pict_f_transform *f_image_transform);
-
-int
-ProcRRSetCrtcSpriteTransform (ClientPtr client);
-
-int
-ProcRRGetCrtcSpriteTransform (ClientPtr client);
-
 /* rrdispatch.c */
 extern _X_EXPORT Bool
 RRClientKnowsRates (ClientPtr	pClient);
@@ -903,13 +889,6 @@ ProcRRConfigureOutputProperty (ClientPtr client);
 extern _X_EXPORT int
 ProcRRDeleteOutputProperty (ClientPtr client);
 
-/* rrsprite.c */
-extern _X_EXPORT int
-ProcRRSetCrtcSpriteTransform (ClientPtr client);
-
-extern _X_EXPORT int
-ProcRRGetCrtcSpriteTransform (ClientPtr client);
-
 /* rrxinerama.c */
 #ifdef XINERAMA
 extern _X_EXPORT void
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index c2f6963..98206a2 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -93,8 +93,6 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate)
     pixman_transform_init_identity (&crtc->transform);
     pixman_f_transform_init_identity (&crtc->f_transform);
     pixman_f_transform_init_identity (&crtc->f_inverse);
-    pixman_f_transform_init_identity (&crtc->f_sprite_position);
-    pixman_f_transform_init_identity (&crtc->f_sprite_image_inverse);
 
     if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
 	return NULL;
@@ -233,21 +231,15 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	RRTransformCopy (&crtc->client_current_transform, transform);
 	RRCrtcChanged (crtc, TRUE);
     }
-
     if (crtc->changed && mode)
     {
 	RRTransformCompute (x, y,
 			    mode->mode.width, mode->mode.height,
 			    rotation,
 			    &crtc->client_current_transform,
-			    &crtc->client_sprite_f_position_transform,
-			    &crtc->client_sprite_f_image_transform,
 			    &crtc->transform, &crtc->f_transform,
-			    &crtc->f_inverse, &crtc->f_sprite_position,
-			    &crtc->f_sprite_image_inverse,
-			    NULL);
+			    &crtc->f_inverse);
     }
-
     return TRUE;
 }
 
@@ -519,7 +511,7 @@ RRCrtcGammaNotify (RRCrtcPtr	crtc)
 }
 
 static void
-RRModeGetScanoutSize (RRModePtr mode, struct pixman_f_transform *transform,
+RRModeGetScanoutSize (RRModePtr mode, PictTransformPtr transform,
 		      int *width, int *height)
 {
     BoxRec  box;
@@ -535,7 +527,7 @@ RRModeGetScanoutSize (RRModePtr mode, struct pixman_f_transform *transform,
     box.x2 = mode->mode.width;
     box.y2 = mode->mode.height;
 
-    pixman_f_transform_bounds (transform, &box);
+    pixman_transform_bounds (transform, &box);
     *width = box.x2 - box.x1;
     *height = box.y2 - box.y1;
 }
@@ -546,7 +538,7 @@ RRModeGetScanoutSize (RRModePtr mode, struct pixman_f_transform *transform,
 void
 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height)
 {
-    RRModeGetScanoutSize (crtc->mode, &crtc->f_transform, width, height);
+    return RRModeGetScanoutSize (crtc->mode, &crtc->transform, width, height);
 }
 
 /*
@@ -932,12 +924,9 @@ ProcRRSetCrtcConfig (ClientPtr client)
 				mode->mode.width, mode->mode.height,
 				rotation,
 				&crtc->client_pending_transform,
-				&crtc->client_sprite_f_position_transform,
-				&crtc->client_sprite_f_image_transform,
-				&transform, &f_transform, &f_inverse, NULL, NULL, NULL);
+				&transform, &f_transform, &f_inverse);
 
-	    RRModeGetScanoutSize (mode, &f_transform,
-				  &source_width, &source_height);
+	    RRModeGetScanoutSize (mode, &transform, &source_width, &source_height);
 	    if (stuff->x + source_width > pScreen->width)
 	    {
 		client->errorValue = stuff->x;
diff --git a/randr/rrsprite.c b/randr/rrsprite.c
deleted file mode 100644
index 5bf312c..0000000
--- a/randr/rrsprite.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright © 2010 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-#include "swaprep.h"
-
-void
-RRCrtcSpriteTransformSet(RRCrtcPtr crtc,
-			 PictTransform *position_transform,
-			 PictTransform *image_transform,
-			 struct pict_f_transform *f_position_transform,
-			 struct pict_f_transform *f_image_transform)
-{
-    ScreenPtr			pScreen;
-    rrScrPrivPtr		pScrPriv;
-
-    pScreen = crtc->pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    crtc->client_sprite_position_transform = *position_transform;
-    crtc->client_sprite_image_transform = *image_transform;
-    crtc->client_sprite_f_position_transform = *f_position_transform;
-    crtc->client_sprite_f_image_transform = *f_image_transform;
-    if (pScrPriv->rrSetCrtcSpriteTransform)
-	(*pScrPriv->rrSetCrtcSpriteTransform) (pScreen, crtc,
-					       &crtc->client_sprite_f_position_transform,
-					       &crtc->client_sprite_f_image_transform);
-}
-
-int
-ProcRRSetCrtcSpriteTransform (ClientPtr client)
-{
-    REQUEST(xRRSetCrtcSpriteTransformReq);
-    RRCrtcPtr		    crtc;
-    PictTransform	    position_transform, image_transform;
-    struct pixman_f_transform f_position_transform, f_image_transform;
-
-    REQUEST_AT_LEAST_SIZE(xRRSetCrtcSpriteTransformReq);
-    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
-
-    PictTransform_from_xRenderTransform (&position_transform, &stuff->positionTransform);
-    PictTransform_from_xRenderTransform (&image_transform, &stuff->imageTransform);
-    pixman_f_transform_from_pixman_transform (&f_position_transform, &position_transform);
-    pixman_f_transform_from_pixman_transform (&f_image_transform, &image_transform);
-
-    RRCrtcSpriteTransformSet (crtc, &position_transform, &image_transform,
-			      &f_position_transform, &f_image_transform);
-    return Success;
-}
-
-#define CrtcSpriteTransformExtra	(SIZEOF(xRRGetCrtcSpriteTransformReply) - 32)
-
-int
-ProcRRGetCrtcSpriteTransform (ClientPtr client)
-{
-    REQUEST(xRRGetCrtcSpriteTransformReq);
-    xRRGetCrtcSpriteTransformReply	*reply;
-    RRCrtcPtr			crtc;
-    int				n;
-    char			*extra;
-
-    REQUEST_SIZE_MATCH (xRRGetCrtcSpriteTransformReq);
-    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
-
-    reply = malloc(sizeof (xRRGetCrtcSpriteTransformReply));
-    if (!reply)
-	return BadAlloc;
-
-    extra = (char *) (reply + 1);
-    reply->type = X_Reply;
-    reply->sequenceNumber = client->sequence;
-    reply->length = bytes_to_int32(CrtcSpriteTransformExtra);
-
-    xRenderTransform_from_PictTransform(&reply->positionTransform, &crtc->client_sprite_position_transform);
-    xRenderTransform_from_PictTransform(&reply->imageTransform, &crtc->client_sprite_image_transform);
-
-    if (client->swapped) {
-	swaps (&reply->sequenceNumber, n);
-	swapl (&reply->length, n);
-	SwapLongs((CARD32 *) &reply->positionTransform, bytes_to_int32(sizeof(xRenderTransform)));
-	SwapLongs((CARD32 *) &reply->imageTransform, bytes_to_int32(sizeof(xRenderTransform)));
-    }
-    WriteToClient (client, sizeof (xRRGetCrtcSpriteTransformReply), (char *) reply);
-    free(reply);
-    return Success;
-}
diff --git a/randr/rrtransform.c b/randr/rrtransform.c
index 3eda5f3..e162049 100644
--- a/randr/rrtransform.c
+++ b/randr/rrtransform.c
@@ -134,24 +134,6 @@ RRTransformRescale(struct pixman_f_transform *f_transform, double limit)
 	    f_transform->m[j][i] *= scale;
 }
 
-#define EPSILON (1e-20)
-#define IS_F_SAME(a,b)	(fabs((a)-(b)) < EPSILON)
-#define IS_F_ZERO(a)	(fabs(a) < EPSILON)
-
-static Bool
-pict_f_transform_is_identity (const struct pixman_f_transform *t)
-{
-    return (IS_F_SAME (t->m[0][0], t->m[1][1]) &&
-	    IS_F_SAME (t->m[0][0], t->m[2][2]) &&
-	    !IS_F_ZERO (t->m[0][0]) &&
-	    IS_F_ZERO (t->m[0][1]) &&
-	    IS_F_ZERO (t->m[0][2]) &&
-	    IS_F_ZERO (t->m[1][0]) &&
-	    IS_F_ZERO (t->m[1][2]) &&
-	    IS_F_ZERO (t->m[2][0]) &&
-	    IS_F_ZERO (t->m[2][1]));
-}
-
 /*
  * Compute the complete transformation matrix including
  * client-specified transform, rotation/reflection values and the crtc 
@@ -166,39 +148,23 @@ RRTransformCompute (int			    x,
 		    int			    height,
 		    Rotation		    rotation,
 		    RRTransformPtr	    rr_transform,
-		    struct pixman_f_transform *sprite_position_transform,
-		    struct pixman_f_transform *sprite_image_transform,
 
 		    PictTransformPtr	    transform,
 		    struct pixman_f_transform *f_transform,
-		    struct pixman_f_transform *f_inverse,
-		    struct pixman_f_transform *f_fb_to_sprite,
-		    struct pixman_f_transform *f_sprite_to_image,
-		    Bool		      *sprite_transform_in_use)
+		    struct pixman_f_transform *f_inverse)
 {
     PictTransform	    t_transform, inverse;
     struct pixman_f_transform tf_transform, tf_inverse;
-    struct pixman_f_transform sf_position_transform, sf_image_transform;
-    struct pixman_f_transform f_image_to_sprite;
     Bool		    overflow = FALSE;
-    Bool		    ret = TRUE;
 
     if (!transform) transform = &t_transform;
     if (!f_transform) f_transform = &tf_transform;
     if (!f_inverse) f_inverse = &tf_inverse;
-    if (!f_fb_to_sprite) f_fb_to_sprite = &sf_position_transform;
-    if (!f_sprite_to_image) f_sprite_to_image = &sf_image_transform;
-
-    /* invert the sprite image transform to have it go from dest to source */
-    if (!pixman_f_transform_invert (&f_image_to_sprite, f_sprite_to_image))
-	pixman_f_transform_init_identity(&f_image_to_sprite);
 
     pixman_transform_init_identity (transform);
     pixman_transform_init_identity (&inverse);
     pixman_f_transform_init_identity (f_transform);
     pixman_f_transform_init_identity (f_inverse);
-    pixman_f_transform_init_identity (f_fb_to_sprite);
-    pixman_f_transform_init_identity (f_sprite_to_image);
     if (rotation != RR_Rotate_0)
     {
 	double	f_rot_cos, f_rot_sin, f_rot_dx, f_rot_dy;
@@ -280,14 +246,7 @@ RRTransformCompute (int			    x,
 	pixman_f_transform_translate (f_transform, f_inverse, f_scale_dx, f_scale_dy);
     }
     
-    /*
-     * Sprite position is affected by the transform matrix,
-     * but the image is not
-     */
-    pixman_f_transform_multiply(f_sprite_to_image,
-				f_transform,
-				&f_image_to_sprite);
-
+#ifdef RANDR_12_INTERFACE
     if (rr_transform)
     {
         if (!pixman_transform_multiply (transform, &rr_transform->transform, transform))
@@ -295,7 +254,7 @@ RRTransformCompute (int			    x,
 	pixman_f_transform_multiply (f_transform, &rr_transform->f_transform, f_transform);
 	pixman_f_transform_multiply (f_inverse, f_inverse, &rr_transform->f_inverse);
     }
-
+#endif
     /*
      * Compute the class of the resulting transform
      */
@@ -305,7 +264,7 @@ RRTransformCompute (int			    x,
 
 	pixman_f_transform_init_translate (f_transform,  x,  y);
 	pixman_f_transform_init_translate (f_inverse,   -x, -y);
-	ret = FALSE;
+	return FALSE;
     }
     else
     {
@@ -319,19 +278,6 @@ RRTransformCompute (int			    x,
 	    RRTransformRescale(&f_scaled, 16384.0);
 	    pixman_transform_from_pixman_f_transform(transform, &f_scaled);
 	}
-	ret = TRUE;
+	return TRUE;
     }
-
-    /*
-     * Sprite position is affected by the transform matrix,
-     * but the image is not
-     */
-    pixman_f_transform_multiply(f_fb_to_sprite,
-				f_inverse,
-				sprite_position_transform);
-    if (sprite_transform_in_use)
-	*sprite_transform_in_use = ret || !pict_f_transform_is_identity(f_fb_to_sprite);
-    return ret;
 }
-
-
diff --git a/randr/rrtransform.h b/randr/rrtransform.h
index 5cfcf8d..561762d 100644
--- a/randr/rrtransform.h
+++ b/randr/rrtransform.h
@@ -59,13 +59,6 @@ RRTransformSetFilter (RRTransformPtr	dst,
 extern _X_EXPORT Bool
 RRTransformCopy (RRTransformPtr dst, RRTransformPtr src);
 
-/*
- * Compute the complete transformation matrix including
- * client-specified transform, rotation/reflection values and the crtc
- * offset.
- *
- * Return TRUE if the resulting transform is not a simple translation.
- */
 extern _X_EXPORT Bool
 RRTransformCompute (int			    x,
 		    int			    y,
@@ -73,14 +66,10 @@ RRTransformCompute (int			    x,
 		    int			    height,
 		    Rotation		    rotation,
 		    RRTransformPtr	    rr_transform,
-		    struct pict_f_transform *sprite_position_transform,
-		    struct pict_f_transform *sprite_image_transform,
 
 		    PictTransformPtr	    transform,
 		    struct pict_f_transform *f_transform,
-		    struct pict_f_transform *f_inverse,
-		    struct pict_f_transform *f_fb_to_sprite,
-		    struct pict_f_transform *f_sprite_to_image,
-		    Bool		    *sprite_transform_in_use);
+		    struct pict_f_transform *f_inverse);
+
 
 #endif /* _RRTRANSFORM_H_ */
commit 3d4ee25a1e2e0ed2463ceaabea8f5a284a6ddd60
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:18:08 2011 -0800

    Revert "randr: Implement RRSetCrtcConfigs"
    
    This reverts commit d94a035ea9eb3167fc4f35b2d9f0d53f8807014c.

diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index ac58135..bbf28cd 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1797,7 +1797,6 @@ xf86RandR12Init12 (ScreenPtr pScreen)
     pScrn->PointerMoved = xf86RandR12PointerMoved;
     pScrn->ChangeGamma = xf86RandR12ChangeGamma;
     rp->rrSetCrtcSpriteTransform = xf86RandR14SetCrtcSpriteTransform;
-    rp->rrSetCrtcConfigs = miRRSetCrtcConfigs;
 
     randrp->orig_EnterVT = pScrn->EnterVT;
     pScrn->EnterVT = xf86RandR12EnterVT;
diff --git a/randr/Makefile.am b/randr/Makefile.am
index a1c88dc..4b38e52 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -22,9 +22,7 @@ librandr_la_SOURCES =	\
 	rrsdispatch.c	\
 	rrsprite.c	\
 	rrtransform.h	\
-	rrtransform.c	\
-	mirrcrtc.c
-
+	rrtransform.c
 
 if XINERAMA
 librandr_la_SOURCES += ${XINERAMA_SRCS}
diff --git a/randr/mirrcrtc.c b/randr/mirrcrtc.c
deleted file mode 100644
index b1e2c9f..0000000
--- a/randr/mirrcrtc.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright © 2010 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-
-Bool
-miRRSetScreenConfig(ScreenPtr screen,
-		    RRScreenConfigPtr screen_config)
-{
-    RRScreenConfigRec	old_screen_config;
-
-    /* XXX deal with separate pixmap/screen sizes */
-    if (screen_config->screen_pixmap_width != screen_config->screen_width ||
-	screen_config->screen_pixmap_height != screen_config->screen_height)
-	return FALSE;
-
-    RRScreenCurrentConfig(screen, &old_screen_config);
-
-    /* Check and see if nothing has changed */
-    if (old_screen_config.screen_width == screen_config->screen_width &&
-	old_screen_config.screen_height == screen_config->screen_height &&
-	old_screen_config.screen_pixmap_width == screen_config->screen_pixmap_width &&
-	old_screen_config.screen_pixmap_height == screen_config->screen_pixmap_height &&
-	old_screen_config.mm_width == screen_config->mm_width &&
-	old_screen_config.mm_height == screen_config->mm_height)
-	return TRUE;
-
-    return RRScreenSizeSet(screen,
-			   screen_config->screen_width,
-			   screen_config->screen_height,
-			   screen_config->mm_width,
-			   screen_config->mm_height);
-}
-
-Bool
-miRRSetCrtcConfig(RRCrtcConfigPtr crtc_config)
-{
-    int	x = crtc_config->x, y = crtc_config->y;
-
-    if (crtc_config->pixmap) {
-	x = crtc_config->pixmap_x;
-	y = crtc_config->pixmap_y;
-    }
-    return RRCrtcSet(crtc_config->crtc,
-		     crtc_config->mode,
-		     x,
-		     y,
-		     crtc_config->rotation,
-		     crtc_config->numOutputs,
-		     crtc_config->outputs);
-}
-
-Bool
-miRRDisableCrtc(RRCrtcPtr crtc)
-{
-    RRCrtcConfigRec	off_config;
-
-    memset(&off_config, '\0', sizeof (RRCrtcConfigRec));
-    off_config.crtc = crtc;
-    return miRRSetCrtcConfig(&off_config);
-}
-
-/*
- * If the current crtc configuration doesn't fit
- * with the new screen config, disable it
- */
-Bool
-miRRCheckDisableCrtc(RRScreenConfigPtr new_screen_config,
-		     RRCrtcConfigPtr old_crtc_config)
-{
-    RRCrtcPtr crtc = old_crtc_config->crtc;
-
-    /* If it's already disabled, we're done */
-    if (!old_crtc_config->mode)
-	return TRUE;
-
-    /* If the crtc isn't scanning from the screen pixmap,
-     * we're done
-     */
-    if (old_crtc_config->pixmap)
-	return TRUE;
-
-    /* If the new screen configuration covers the existing CRTC space,
-     * we're done
-     */
-    if (RRScreenCoversCrtc(new_screen_config, old_crtc_config,
-			   &crtc->client_current_transform, NULL))
-	return TRUE;
-
-    /* Disable the crtc and let it get re-enabled */
-    return miRRDisableCrtc(crtc);
-}
-
-Bool
-miRRSetCrtcConfigs(ScreenPtr screen,
-		   RRScreenConfigPtr screen_config,
-		   RRCrtcConfigPtr crtc_configs,
-		   int num_configs)
-{
-    RRScreenConfigRec	old_screen_config;
-    RRCrtcConfigPtr	old_crtc_configs;
-    int			i;
-
-    /*
-     * Save existing state
-     */
-
-    RRScreenCurrentConfig(screen, &old_screen_config);
-    old_crtc_configs = calloc(num_configs, sizeof (RRCrtcConfigRec));
-    if (!old_crtc_configs)
-	return FALSE;
-
-    for (i = 0; i < num_configs; i++)
-	if (!RRCrtcCurrentConfig(crtc_configs[i].crtc, &old_crtc_configs[i]))
-	    goto fail_save;
-    /*
-     * Set the new configuration. If anything goes wrong,
-     * bail and restore the old configuration
-     */
-    for (i = 0; i < num_configs; i++)
-	if (!miRRCheckDisableCrtc(screen_config, &old_crtc_configs[i]))
-	    goto fail_disable;
-
-    if (!miRRSetScreenConfig(screen, screen_config))
-	goto fail_set_screen;
-
-    for (i = 0; i < num_configs; i++)
-	if (!miRRSetCrtcConfig(&crtc_configs[i]))
-	    goto fail_set_crtc;
-
-    RRFreeCrtcConfigs(old_crtc_configs, num_configs);
-    return TRUE;
-
-fail_set_crtc:
-    /*
-     * Restore the previous configuration. Ignore any errors
-     * as we just need to hope that the driver can manage to
-     * get back to the previous state without trouble.
-     */
-    for (i = 0; i < num_configs; i++)
-	(void) miRRDisableCrtc(old_crtc_configs[i].crtc);
-    (void) miRRSetScreenConfig(screen, &old_screen_config);
-fail_set_screen:
-fail_disable:
-    for (i = 0; i < num_configs; i++)
-	(void) miRRSetCrtcConfig(&old_crtc_configs[i]);
-fail_save:
-    RRFreeCrtcConfigs(old_crtc_configs, num_configs);
-    return FALSE;
-}
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 2fe9602..5e2a351 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -78,8 +78,6 @@ typedef struct _rrMode		RRModeRec, *RRModePtr;
 typedef struct _rrPropertyValue	RRPropertyValueRec, *RRPropertyValuePtr;
 typedef struct _rrProperty	RRPropertyRec, *RRPropertyPtr;
 typedef struct _rrCrtc		RRCrtcRec, *RRCrtcPtr;
-typedef struct _rrScreenConfig	RRScreenConfigRec, *RRScreenConfigPtr;
-typedef struct _rrCrtcConfig	RRCrtcConfigRec, *RRCrtcConfigPtr;
 typedef struct _rrOutput	RROutputRec, *RROutputPtr;
 
 struct _rrMode {
@@ -137,28 +135,6 @@ struct _rrCrtc {
     struct pict_f_transform f_sprite_image_inverse;	/* image from crtc */
 };
 
-struct _rrScreenConfig {
-    CARD16			screen_pixmap_width;
-    CARD16			screen_pixmap_height;
-    CARD16			screen_width;
-    CARD16			screen_height;
-    CARD32			mm_width;
-    CARD32			mm_height;
-};
-
-struct _rrCrtcConfig {
-    RRCrtcPtr			crtc;
-    int				x, y;
-    RRModePtr			mode;
-    Rotation			rotation;
-    int				numOutputs;
-    RROutputPtr			*outputs;
-    struct pict_f_transform	sprite_position_transform;
-    struct pict_f_transform	sprite_image_transform;
-    PixmapPtr			pixmap;
-    int				pixmap_x, pixmap_y;
-};
-
 struct _rrOutput {
     RROutput	    id;
     ScreenPtr	    pScreen;
@@ -275,11 +251,6 @@ typedef void (*RRGetCrtcSpriteTransformPtr) (ScreenPtr pScreen,
 					     struct pict_f_transform *position_transform,
 					     struct pict_f_transform *image_transform);
 
-typedef Bool (*RRSetCrtcConfigsPtr) (ScreenPtr screen,
-				     RRScreenConfigPtr screen_config,
-				     RRCrtcConfigPtr crtc_configs,
-				     int num_configs);
-
 typedef struct _rrScrPriv {
     /*
      * 'public' part of the structure; DDXen fill this in
@@ -305,7 +276,6 @@ typedef struct _rrScrPriv {
 #endif
     RRSetCrtcSpriteTransformPtr	rrSetCrtcSpriteTransform;
     RRGetCrtcSpriteTransformPtr	rrGetCrtcSpriteTransform;
-    RRSetCrtcConfigsPtr rrSetCrtcConfigs;
 
     /*
      * Private part of the structure; not considered part of the ABI
@@ -458,10 +428,6 @@ RRScreenSizeSet (ScreenPtr  pScreen,
 		 CARD32	    mmWidth,
 		 CARD32	    mmHeight);
 
-extern _X_EXPORT void
-RRScreenCurrentConfig(ScreenPtr screen,
-		      RRScreenConfigPtr screen_config);
-
 /*
  * Send ConfigureNotify event to root window when 'something' happens
  */
@@ -705,38 +671,6 @@ extern _X_EXPORT void
 RRCrtcInitErrorValue (void);
 
 /*
- * Free a set of crtc configs and their attached output arrays
- */
-void
-RRFreeCrtcConfigs(RRCrtcConfigPtr configs, int num_configs);
-
-/*
- * Convert the current crtc configuration into an RRCrtcConfig
- */
-extern _X_EXPORT Bool
-RRCrtcCurrentConfig(RRCrtcPtr crtc,
-		    RRCrtcConfigPtr crtc_config);
-
-/*
- * Figure out whether the specific crtc_config can fit
- * within the screen_config
- */
-Bool
-RRScreenCoversCrtc(RRScreenConfigPtr screen_config,
-		   RRCrtcConfigPtr crtc_config,
-		   RRTransformPtr client_transform,
-		   XID *errorValue);
-
-/*
- * Set a screen and set of crtc configurations in one operation
- */
-Bool
-RRSetCrtcConfigs(ScreenPtr screen,
-		 RRScreenConfigPtr screen_config,
-		 RRCrtcConfigPtr crtc_configs,
-		 int num_configs);
-
-/*
  * Crtc dispatch
  */
 
@@ -761,9 +695,6 @@ ProcRRSetCrtcTransform (ClientPtr client);
 extern _X_EXPORT int
 ProcRRGetCrtcTransform (ClientPtr client);
 
-extern _X_EXPORT int
-ProcRRSetCrtcConfigs (ClientPtr client);
-
 int
 ProcRRGetPanning (ClientPtr client);
 
@@ -985,27 +916,6 @@ extern _X_EXPORT void
 RRXineramaExtensionInit(void);
 #endif
 
-/* mirrcrtc.c */
-Bool
-miRRSetScreenConfig(ScreenPtr screen,
-		    RRScreenConfigPtr screen_config);
-
-Bool
-miRRSetCrtcConfig(RRCrtcConfigPtr crtc_config);
-
-Bool
-miRRDisableCrtc(RRCrtcPtr crtc);
-
-Bool
-miRRCheckDisableCrtc(RRScreenConfigPtr new_screen_config,
-		     RRCrtcConfigPtr old_crtc_config);
-
-Bool
-miRRSetCrtcConfigs(ScreenPtr screen,
-		   RRScreenConfigPtr screen_config,
-		   RRCrtcConfigPtr crtc_configs,
-		   int num_configs);
-
 #endif /* _RANDRSTR_H_ */
 
 /*
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 1f8f2e6..c2f6963 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -37,7 +37,7 @@ RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged)
     if (pScreen)
     {
 	rrScrPriv(pScreen);
-
+    
 	pScrPriv->changed = TRUE;
 	/*
 	 * Send ConfigureNotify on any layout change
@@ -59,19 +59,19 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate)
 
     if (!RRInit())
 	return NULL;
-
+    
     pScrPriv = rrGetScrPriv(pScreen);
 
     /* make space for the crtc pointer */
     if (pScrPriv->numCrtcs)
-	crtcs = realloc(pScrPriv->crtcs,
+	crtcs = realloc(pScrPriv->crtcs, 
 			  (pScrPriv->numCrtcs + 1) * sizeof (RRCrtcPtr));
     else
 	crtcs = malloc(sizeof (RRCrtcPtr));
     if (!crtcs)
 	return FALSE;
     pScrPriv->crtcs = crtcs;
-
+    
     crtc = calloc(1, sizeof (RRCrtcRec));
     if (!crtc)
 	return NULL;
@@ -90,8 +90,6 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate)
     crtc->devPrivate = devPrivate;
     RRTransformInit (&crtc->client_pending_transform);
     RRTransformInit (&crtc->client_current_transform);
-    pixman_transform_init_identity (&crtc->client_sprite_position_transform);
-    pixman_transform_init_identity (&crtc->client_sprite_image_transform);
     pixman_transform_init_identity (&crtc->transform);
     pixman_f_transform_init_identity (&crtc->f_transform);
     pixman_f_transform_init_identity (&crtc->f_inverse);
@@ -104,7 +102,7 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate)
     /* attach the screen and crtc together */
     crtc->pScreen = pScreen;
     pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
-
+    
     return crtc;
 }
 
@@ -141,7 +139,7 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	      RROutputPtr   *outputs)
 {
     int	    i, j;
-
+    
     /*
      * Check to see if any of the new outputs were
      * not in the old list and mark them as changed
@@ -181,7 +179,7 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
     if (numOutputs != crtc->numOutputs)
     {
 	RROutputPtr *newoutputs;
-
+	
 	if (numOutputs)
 	{
 	    if (crtc->numOutputs)
@@ -260,7 +258,7 @@ RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
     rrScrPriv (pScreen);
     xRRCrtcChangeNotifyEvent	ce;
     RRModePtr	mode = crtc->mode;
-
+    
     ce.type = RRNotify + RREventBase;
     ce.subCode = RRNotify_CrtcChange;
     ce.timestamp = pScrPriv->lastSetTime.milliseconds;
@@ -335,7 +333,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 #if RANDR_12_INTERFACE
 	if (pScrPriv->rrCrtcSet)
 	{
-	    ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y,
+	    ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y, 
 					  rotation, numOutputs, outputs);
 	}
 	else
@@ -394,59 +392,6 @@ RRCrtcSet (RRCrtcPtr    crtc,
     return ret;
 }
 
-void
-RRFreeCrtcConfigs(RRCrtcConfigPtr configs, int num_configs)
-{
-    int	i;
-
-    for (i = 0; i < num_configs; i++)
-	free(configs[i].outputs);
-    free(configs);
-}
-
-Bool
-RRCrtcCurrentConfig(RRCrtcPtr crtc,
-		    RRCrtcConfigPtr crtc_config)
-{
-    crtc_config->crtc = crtc;
-    crtc_config->x = crtc->x;
-    crtc_config->y = crtc->y;
-    crtc_config->mode = crtc->mode;
-    crtc_config->rotation = crtc->rotation;
-    crtc_config->numOutputs = crtc->numOutputs;
-    crtc_config->outputs = calloc(crtc->numOutputs, sizeof (RROutputPtr));
-    if (!crtc_config->outputs)
-	return FALSE;
-    memcpy(crtc_config->outputs, crtc->outputs, crtc->numOutputs * sizeof (RROutputPtr));
-    crtc_config->sprite_position_transform = crtc->client_sprite_f_position_transform;
-    crtc_config->sprite_image_transform = crtc->client_sprite_f_image_transform;
-
-    /* XXX add pixmap stuff */
-    crtc_config->pixmap = NULL;
-    crtc_config->pixmap_x = 0;
-    crtc_config->pixmap_y = 0;
-    return TRUE;
-}
-
-
-/*
- * Request that a set of crtcs be configured at the same
- * time on a single screen
- */
-
-Bool
-RRSetCrtcConfigs(ScreenPtr screen,
-		 RRScreenConfigPtr screen_config,
-		 RRCrtcConfigPtr crtc_configs,
-		 int num_configs)
-{
-    rrScrPrivPtr	scr_priv = rrGetScrPriv(screen);
-
-    if (!scr_priv)
-	return FALSE;
-    return (*scr_priv->rrSetCrtcConfigs)(screen, screen_config, crtc_configs, num_configs);
-}
-
 /*
  * Return crtc transform
  */
@@ -490,7 +435,7 @@ RRCrtcDestroyResource (pointer value, XID pid)
     {
 	rrScrPriv(pScreen);
 	int		i;
-
+    
 	for (i = 0; i < pScrPriv->numCrtcs; i++)
 	{
 	    if (pScrPriv->crtcs[i] == crtc)
@@ -523,7 +468,7 @@ RRCrtcGammaSet (RRCrtcPtr   crtc,
 #if RANDR_12_INTERFACE
     ScreenPtr	pScreen = crtc->pScreen;
 #endif
-
+    
     memcpy (crtc->gammaRed, red, crtc->gammaSize * sizeof (CARD16));
     memcpy (crtc->gammaGreen, green, crtc->gammaSize * sizeof (CARD16));
     memcpy (crtc->gammaBlue, blue, crtc->gammaSize * sizeof (CARD16));
@@ -686,44 +631,6 @@ RRCrtcTransformSet (RRCrtcPtr		crtc,
 }
 
 /*
- * Figure out whether the specific crtc_config can fit
- * within the screen_config
- */
-Bool
-RRScreenCoversCrtc(RRScreenConfigPtr screen_config,
-		   RRCrtcConfigPtr crtc_config,
-		   RRTransformPtr client_transform,
-		   XID *errorValue)
-{
-    int source_width;
-    int	source_height;
-    struct pixman_f_transform f_transform;
-
-    RRTransformCompute (crtc_config->x, crtc_config->y,
-			crtc_config->mode->mode.width, crtc_config->mode->mode.height,
-			crtc_config->rotation,
-			client_transform,
-			&crtc_config->sprite_position_transform,
-			&crtc_config->sprite_image_transform,
-			NULL, &f_transform, NULL, NULL, NULL, NULL);
-
-    RRModeGetScanoutSize (crtc_config->mode, &f_transform,
-			  &source_width, &source_height);
-    if (crtc_config->x + source_width > screen_config->screen_pixmap_width) {
-	if (errorValue)
-	    *errorValue = crtc_config->x;
-	return FALSE;
-    }
-
-    if (crtc_config->y + source_height > screen_config->screen_pixmap_height) {
-	if (errorValue)
-	    *errorValue = crtc_config->y;
-	return FALSE;
-    }
-    return TRUE;
-}
-
-/*
  * Initialize crtc type
  */
 Bool
@@ -732,7 +639,7 @@ RRCrtcInit (void)
     RRCrtcType = CreateNewResourceType (RRCrtcDestroyResource, "CRTC");
     if (!RRCrtcType)
 	return FALSE;
-
+    
     return TRUE;
 }
 
@@ -761,7 +668,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
     int				i, j, k, n;
     int				width, height;
     BoxRec			panned_area;
-
+    
     REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
@@ -772,7 +679,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
     pScrPriv = rrGetScrPriv(pScreen);
 
     mode = crtc->mode;
-
+    
     rep.type = X_Reply;
     rep.status = RRSetConfigSuccess;
     rep.sequenceNumber = client->sequence;
@@ -805,7 +712,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
 	    if (pScrPriv->outputs[i]->crtcs[j] == crtc)
 		k++;
     rep.nPossibleOutput = k;
-
+    
     rep.length = rep.nOutput + rep.nPossibleOutput;
 
     extraLen = rep.length << 2;
@@ -820,7 +727,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
 
     outputs = (RROutput *) extra;
     possible = (RROutput *) (outputs + rep.nOutput);
-
+    
     for (i = 0; i < crtc->numOutputs; i++)
     {
 	outputs[i] = crtc->outputs[i]->id;
@@ -837,7 +744,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
 		    swapl (&possible[k], n);
 		k++;
 	    }
-
+    
     if (client->swapped) {
 	swaps(&rep.sequenceNumber, n);
 	swapl(&rep.length, n);
@@ -858,7 +765,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
 	WriteToClient (client, extraLen, (char *) extra);
 	free(extra);
     }
-
+    
     return Success;
 }
 
@@ -878,10 +785,10 @@ ProcRRSetCrtcConfig (ClientPtr client)
     TimeStamp		    time;
     Rotation		    rotation;
     int			    rc, i, j;
-
+    
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
     numOutputs = (stuff->length - bytes_to_int32(SIZEOF (xRRSetCrtcConfigReq)));
-
+    
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixSetAttrAccess);
 
     if (stuff->mode == None)
@@ -904,7 +811,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
     }
     else
 	outputs = NULL;
-
+    
     outputIds = (RROutput *) (stuff + 1);
     for (i = 0; i < numOutputs; i++)
     {
@@ -927,7 +834,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	/* validate mode for this output */
 	for (j = 0; j < outputs[i]->numModes + outputs[i]->numUserModes; j++)
 	{
-	    RRModePtr	m = (j < outputs[i]->numModes ?
+	    RRModePtr	m = (j < outputs[i]->numModes ? 
 			     outputs[i]->modes[j] :
 			     outputs[i]->userModes[j - outputs[i]->numModes]);
 	    if (m == mode)
@@ -962,17 +869,17 @@ ProcRRSetCrtcConfig (ClientPtr client)
 
     pScreen = crtc->pScreen;
     pScrPriv = rrGetScrPriv(pScreen);
-
+    
     time = ClientTimeToServerTime(stuff->timestamp);
     configTime = ClientTimeToServerTime(stuff->configTimestamp);
-
+    
     if (!pScrPriv)
     {
 	time = currentTime;
 	rep.status = RRSetConfigFailed;
 	goto sendReply;
     }
-
+    
     /*
      * Validate requested rotation
      */
@@ -1005,7 +912,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	    free(outputs);
 	    return BadMatch;
 	}
-
+    
 #ifdef RANDR_12_INTERFACE
 	/*
 	 * Check screen size bounds if the DDX provides a 1.2 interface
@@ -1037,7 +944,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 		free(outputs);
 		return BadValue;
 	    }
-
+	    
 	    if (stuff->y + source_height > pScreen->height)
 	    {
 		client->errorValue = stuff->y;
@@ -1047,7 +954,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	}
 #endif
     }
-
+    
     if (!RRCrtcSet (crtc, mode, stuff->x, stuff->y,
 		   rotation, numOutputs, outputs))
     {
@@ -1056,17 +963,17 @@ ProcRRSetCrtcConfig (ClientPtr client)
     }
     rep.status = RRSetConfigSuccess;
     pScrPriv->lastSetTime = time;
-
+    
 sendReply:
     free(outputs);
-
+    
     rep.type = X_Reply;
     /* rep.status has already been filled in */
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
     rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
 
-    if (client->swapped)
+    if (client->swapped) 
     {
 	int n;
     	swaps(&rep.sequenceNumber, n);
@@ -1074,7 +981,7 @@ sendReply:
 	swapl(&rep.newTimestamp, n);
     }
     WriteToClient(client, sizeof(xRRSetCrtcConfigReply), (char *)&rep);
-
+    
     return Success;
 }
 
@@ -1090,7 +997,7 @@ ProcRRGetPanning (ClientPtr client)
     BoxRec		tracking;
     INT16		border[4];
     int			n;
-
+    
     REQUEST_SIZE_MATCH(xRRGetPanningReq);
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
@@ -1160,7 +1067,7 @@ ProcRRSetPanning (ClientPtr client)
     BoxRec		tracking;
     INT16		border[4];
     int			n;
-
+    
     REQUEST_SIZE_MATCH(xRRSetPanningReq);
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
@@ -1175,9 +1082,9 @@ ProcRRSetPanning (ClientPtr client)
 	rep.status = RRSetConfigFailed;
 	goto sendReply;
     }
-
+    
     time = ClientTimeToServerTime(stuff->timestamp);
-
+    
     if (!pScrPriv->rrGetPanning)
 	return RRErrorBase + BadRRCrtc;
 
@@ -1253,7 +1160,7 @@ ProcRRGetCrtcGamma (ClientPtr client)
     int				n;
     unsigned long		len;
     char			*extra = NULL;
-
+    
     REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
@@ -1262,7 +1169,7 @@ ProcRRGetCrtcGamma (ClientPtr client)
         return RRErrorBase + BadRRCrtc;
 
     len = crtc->gammaSize * 3 * 2;
-
+    
     if (crtc->gammaSize) {
 	extra = malloc(len);
 	if (!extra)
@@ -1296,21 +1203,21 @@ ProcRRSetCrtcGamma (ClientPtr client)
     RRCrtcPtr			crtc;
     unsigned long		len;
     CARD16			*red, *green, *blue;
-
+    
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
-
+    
     len = client->req_len - bytes_to_int32(sizeof (xRRSetCrtcGammaReq));
     if (len < (stuff->size * 3 + 1) >> 1)
 	return BadLength;
 
     if (stuff->size != crtc->gammaSize)
 	return BadMatch;
-
+    
     red = (CARD16 *) (stuff + 1);
     green = red + crtc->gammaSize;
     blue = green + crtc->gammaSize;
-
+    
     RRCrtcGammaSet (crtc, red, green, blue);
 
     return Success;
@@ -1351,7 +1258,7 @@ ProcRRSetCrtcTransform (ClientPtr client)
 
 
 #define CrtcTransformExtra	(SIZEOF(xRRGetCrtcTransformReply) - 32)
-
+				
 static int
 transform_filter_length (RRTransformPtr transform)
 {
@@ -1453,336 +1360,3 @@ ProcRRGetCrtcTransform (ClientPtr client)
     free(reply);
     return Success;
 }
-
-static void
-pixman_f_transform_from_xRenderTransform(struct pixman_f_transform *f_transform,
-					 xRenderTransform *x_transform)
-{
-    struct pixman_transform	transform;
-    PictTransform_from_xRenderTransform(&transform, x_transform);
-    pixman_f_transform_from_pixman_transform(f_transform, &transform);
-}
-
-static int
-RRConvertCrtcConfig(ClientPtr client, ScreenPtr screen,
-		    RRScreenConfigPtr screen_config,
-		    RRCrtcConfigPtr config, xRRCrtcConfig *x,
-		    RROutput *outputIds)
-{
-    RRCrtcPtr		crtc;
-    RROutputPtr		*outputs;
-    rrScrPrivPtr	scr_priv;
-    RRModePtr		mode;
-    PixmapPtr		pixmap;
-    int			rc, i, j;
-    Rotation		rotation;
-
-    VERIFY_RR_CRTC(x->crtc, crtc, DixSetAttrAccess);
-
-    if (x->mode == None)
-    {
-	mode = NULL;
-	if (x->nOutput > 0)
-	    return BadMatch;
-    }
-    else
-    {
-	VERIFY_RR_MODE(x->mode, mode, DixSetAttrAccess);
-	if (x->nOutput == 0)
-	    return BadMatch;
-    }
-    if (x->nOutput)
-    {
-	outputs = malloc(x->nOutput * sizeof (RROutputPtr));
-	if (!outputs)
-	    return BadAlloc;
-    }
-    else
-	outputs = NULL;
-
-    if (x->pixmap == None)
-	pixmap = NULL;
-    else
-    {
-	rc = dixLookupResourceByType((pointer *) &pixmap, x->pixmap,
-				     RT_PIXMAP, client, DixWriteAccess);
-	if (rc != Success) {
-	    free(outputs);
-	    return rc;
-	}
-	/* XXX check to make sure this is a scanout pixmap */
-    }
-
-    for (i = 0; i < x->nOutput; i++)
-    {
-	rc = dixLookupResourceByType((pointer *)(outputs + i), outputIds[i],
-				     RROutputType, client, DixSetAttrAccess);
-	if (rc != Success)
-	{
-	    free(outputs);
-	    return rc;
-	}
-	/* validate crtc for this output */
-	for (j = 0; j < outputs[i]->numCrtcs; j++)
-	    if (outputs[i]->crtcs[j] == crtc)
-		break;
-	if (j == outputs[i]->numCrtcs)
-	{
-	    free(outputs);
-	    return BadMatch;
-	}
-	/* validate mode for this output */
-	for (j = 0; j < outputs[i]->numModes + outputs[i]->numUserModes; j++)
-	{
-	    RRModePtr	m = (j < outputs[i]->numModes ?
-			     outputs[i]->modes[j] :
-			     outputs[i]->userModes[j - outputs[i]->numModes]);
-	    if (m == mode)
-		break;
-	}
-	if (j == outputs[i]->numModes + outputs[i]->numUserModes)
-	{
-	    free(outputs);
-	    return BadMatch;
-	}
-    }
-    /* validate clones */
-    for (i = 0; i < x->nOutput; i++)
-    {
-	for (j = 0; j < x->nOutput; j++)
-	{
-	    int k;
-	    if (i == j)
-		continue;
-	    for (k = 0; k < outputs[i]->numClones; k++)
-	    {
-		if (outputs[i]->clones[k] == outputs[j])
-		    break;
-	    }
-	    if (k == outputs[i]->numClones)
-	    {
-		free(outputs);
-		return BadMatch;
-	    }
-	}
-    }
-
-    if (crtc->pScreen != screen)
-	return BadMatch;
-
-    scr_priv = rrGetScrPriv(screen);
-
-    config->crtc = crtc;
-    config->x = x->x;
-    config->y = x->y;
-    config->mode = mode;
-    config->rotation = x->rotation;
-    config->numOutputs = x->nOutput;
-    config->outputs = outputs;
-    pixman_f_transform_from_xRenderTransform(&config->sprite_position_transform,
-					     &x->spritePositionTransform);
-    pixman_f_transform_from_xRenderTransform(&config->sprite_image_transform,
-					     &x->spriteImageTransform);
-    config->pixmap = pixmap;
-    config->pixmap_x = x->xPixmap;
-    config->pixmap_y = x->yPixmap;
-
-    /*
-     * Validate requested rotation
-     */
-    rotation = (Rotation) x->rotation;
-
-    /* test the rotation bits only! */
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-    case RR_Rotate_90:
-    case RR_Rotate_180:
-    case RR_Rotate_270:
-	break;
-    default:
-	/*
-	 * Invalid rotation
-	 */
-	client->errorValue = x->rotation;
-	free(outputs);
-	return BadValue;
-    }
-
-    if (mode)
-    {
-	if ((~crtc->rotations) & rotation)
-	{
-	    /*
-	     * requested rotation or reflection not supported by screen
-	     */
-	    client->errorValue = x->rotation;
-	    free(outputs);
-	    return BadMatch;
-	}
-
-	/*
-	 * If scanning out from another pixmap, make sure the mode
-	 * fits
-	 */
-	if (pixmap)
-	{
-	    if (x->xPixmap + mode->mode.width > pixmap->drawable.width) {
-		client->errorValue = x->xPixmap;
-		free(outputs);
-		return BadValue;
-	    }
-	    if (x->yPixmap + mode->mode.height > pixmap->drawable.height) {
-		client->errorValue = x->yPixmap;
-		free(outputs);
-		return BadValue;
-	    }
-	}
-	/*
-	 * Check screen size bounds if the DDX provides a 1.2 interface
-	 * for setting screen size. Else, assume the CrtcSet sets
-	 * the size along with the mode. If the driver supports transforms,
-	 * then it must allow crtcs to display a subset of the screen, so
-	 * only do this check for drivers without transform support.
-	 */
-	else if (scr_priv->rrScreenSetSize && !crtc->transforms)
-	{
-	    if (!RRScreenCoversCrtc(screen_config, config,
-				    &crtc->client_pending_transform,
-				    &client->errorValue))
-	    {
-		free(outputs);
-		return BadValue;
-	    }
-	}
-    }
-
-    return Success;
-}
-
-int
-ProcRRSetCrtcConfigs (ClientPtr client)
-{
-    REQUEST(xRRSetCrtcConfigsReq);
-    xRRSetCrtcConfigsReply  rep;
-    DrawablePtr		    drawable;
-    ScreenPtr		    screen;
-    rrScrPrivPtr	    scr_priv;
-    xRRCrtcConfig	    *x_configs;
-    RRScreenConfigRec	    screen_config;
-    RRCrtcConfigPtr	    configs;
-    RROutput		    *output_ids;
-    int			    num_configs;
-    int			    rc, i;
-    int			    extra_len;
-    int			    num_output_ids;
-
-    REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigsReq);
-
-    extra_len = client->req_len - bytes_to_int32(sizeof(xRRSetCrtcConfigsReq));
-
-    num_configs = stuff->nConfigs;
-
-    /* Check request length against number of configs specified */
-    if (num_configs * (sizeof (xRRCrtcConfig) >> 2) > extra_len)
-	return BadLength;
-
-    extra_len -= num_configs * (sizeof (xRRCrtcConfig) >> 2);
-    x_configs = (xRRCrtcConfig *) (stuff + 1);
-
-    /* Check remaining request length against number of outputs */
-    num_output_ids = 0;
-    for (i = 0; i < num_configs; i++)
-	num_output_ids += x_configs[i].nOutput;
-
-    if (extra_len != num_output_ids)
-	return BadLength;
-
-    rc = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixGetAttrAccess);
-    if (rc != Success)
-	return rc;
-
-    screen = drawable->pScreen;
-
-    scr_priv = rrGetScrPriv(screen);
-
-    if (!scr_priv)
-    {
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-
-    if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
-    {
-	client->errorValue = 0;
-	return BadValue;
-    }
-
-    if (stuff->screenPixmapWidth < scr_priv->minWidth ||
-	scr_priv->maxWidth < stuff->screenPixmapWidth)
-    {
-	client->errorValue = stuff->screenPixmapWidth;
-	return BadValue;
-    }
-    if (stuff->screenPixmapHeight < scr_priv->minHeight ||
-	scr_priv->maxHeight < stuff->screenPixmapHeight)
-    {
-	client->errorValue = stuff->screenPixmapHeight;
-	return BadValue;
-    }
-
-    screen_config.screen_pixmap_width = stuff->screenPixmapWidth;
-    screen_config.screen_pixmap_height = stuff->screenPixmapHeight;
-    screen_config.screen_width = stuff->screenWidth;
-    screen_config.screen_height = stuff->screenHeight;
-    screen_config.mm_width = stuff->widthInMillimeters;
-    screen_config.mm_height = stuff->heightInMillimeters;
-
-    if (num_configs == 0)
-	return Success;
-
-    output_ids = (RROutput *) (x_configs + num_configs);
-
-    /*
-     * Convert protocol crtc configurations into
-     * server crtc configurations
-     */
-    configs = calloc(num_configs, sizeof (RRCrtcConfigRec));
-    if (!configs)
-	return BadAlloc;
-    for (i = 0; i < num_configs; i++) {
-	rc = RRConvertCrtcConfig(client, screen, &screen_config,
-				 &configs[i],
-				 &x_configs[i], output_ids);
-	if (rc != Success) {
-	    rep.status = RRSetConfigFailed;
-	    goto sendReply;
-	}
-	output_ids += x_configs[i].nOutput;
-    }
-
-    if (!RRSetCrtcConfigs (screen, &screen_config, configs, num_configs))
-    {
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    rep.status = RRSetConfigSuccess;
-    scr_priv->lastSetTime = currentTime;
-
-sendReply:
-    RRFreeCrtcConfigs(configs, num_configs);
-
-    rep.type = X_Reply;
-    /* rep.status has already been filled in */
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-
-    if (client->swapped)
-    {
-	int n;
-	swaps(&rep.sequenceNumber, n);
-	swapl(&rep.length, n);
-    }
-    WriteToClient(client, sizeof(xRRSetCrtcConfigsReply), (char *)&rep);
-
-    return Success;
-}
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index af09f68..1bc1a9e 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -191,24 +191,6 @@ RRScreenSizeSet (ScreenPtr  pScreen,
 }
 
 /*
- * Compute an RRScreenConfig from the current screen information
- */
-void
-RRScreenCurrentConfig(ScreenPtr screen,
-		      RRScreenConfigPtr screen_config)
-{
-    PixmapPtr		screen_pixmap = screen->GetScreenPixmap(screen);
-    WindowPtr		root = screen->root;
-
-    screen_config->screen_pixmap_width = screen_pixmap->drawable.width;
-    screen_config->screen_pixmap_height = screen_pixmap->drawable.height;
-    screen_config->screen_width = root->drawable.width;
-    screen_config->screen_height = root->drawable.height;
-    screen_config->mm_width = screen->mmWidth;
-    screen_config->mm_height = screen->mmHeight;
-}
-
-/*
  * Retrieve valid screen size range
  */
 int
commit 8b0e651f7d09a7f35c87a4d0a6e2053cae93b516
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:18:05 2011 -0800

    Revert "hw/xfree86/modes: Add optional driver API for RRSetCrtcConfigs"
    
    This reverts commit 86c489c319c705f710bee3897fe27600ce15008e.

diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index c2e8131..8b42efc 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -647,29 +647,6 @@ struct _xf86Output {
     INT16           initialBorder[4];
 };
 
-typedef enum _xf86SetConfigResponse {
-    xf86SetConfigFailed,		/* set_config failed */
-    xf86SetConfigChecked,		/* set_config validated the configuration */
-    xf86SetConfigDone,			/* set_config finished the work */
-} xf86SetConfigResponse;
-
-typedef struct _xf86CrtcSetConfig {
-    xf86CrtcPtr			crtc;
-    int				x, y;
-    DisplayModeRec		mode;
-    Rotation			rotation;
-    int				numOutputs;
-    xf86OutputPtr		*outputs;
-    struct pict_f_transform	sprite_position_transform;
-    struct pict_f_transform	sprite_image_transform;
-
-    /* Probably want some internal structure for the pixmap so that
-     * this can be set before the server is running
-     */
-    PixmapPtr			pixmap;
-    int				pixmap_x, pixmap_y;
-} xf86CrtcSetConfigRec, *xf86CrtcSetConfigPtr;
-
 typedef struct _xf86CrtcConfigFuncs {
     /**
      * Requests that the driver resize the screen.
@@ -687,12 +664,6 @@ typedef struct _xf86CrtcConfigFuncs {
     (*resize)(ScrnInfoPtr	scrn,
 	      int		width,
 	      int		height);
-
-    xf86SetConfigResponse
-    (*set_config) (ScrnInfoPtr		scrn,
-		   RRScreenConfigPtr	screen_config,
-		   xf86CrtcSetConfigPtr	crtc_configs,
-		   int			num_configs);
 } xf86CrtcConfigFuncsRec, *xf86CrtcConfigFuncsPtr;
 
 typedef void (*xf86_crtc_notify_proc_ptr) (ScreenPtr pScreen);
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index e3330f4..ac58135 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -758,7 +758,7 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
 	xf86CrtcPtr crtc = config->crtc[c];
 	int	    crtc_width = crtc->x + xf86ModeWidth (&crtc->mode, crtc->rotation);
 	int	    crtc_height = crtc->y + xf86ModeHeight (&crtc->mode, crtc->rotation);
-
+	
 	if (crtc->enabled) {
 	    if (crtc_width > width)
 		width = crtc_width;
@@ -770,13 +770,13 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
 		height = crtc->panningTotalArea.y2;
 	}
     }
-
+    
     if (width && height)
     {
 	/*
 	 * Compute physical size of screen
 	 */
-	if (monitorResolution)
+	if (monitorResolution) 
 	{
 	    mmWidth = width * 25.4 / monitorResolution;
 	    mmHeight = height * 25.4 / monitorResolution;
@@ -1007,7 +1007,7 @@ xf86RandRModeMatches (RRModePtr		randr_mode,
 	if (memcmp (randr_mode->name, mode->name, len) != 0)	return FALSE;
     }
 #endif
-
+    
     /* check for same timings */
     if (randr_mode->mode.dotClock / 1000 != mode->Clock)    return FALSE;
     if (randr_mode->mode.width        != mode->HDisplay)    return FALSE;
@@ -1019,11 +1019,11 @@ xf86RandRModeMatches (RRModePtr		randr_mode,
     if (randr_mode->mode.vSyncStart   != mode->VSyncStart)  return FALSE;
     if (randr_mode->mode.vSyncEnd     != mode->VSyncEnd)    return FALSE;
     if (randr_mode->mode.vTotal       != mode->VTotal)	    return FALSE;
-
+    
     /* check for same flags (using only the XF86 valid flag bits) */
     if ((randr_mode->mode.modeFlags & FLAG_BITS) != (mode->Flags & FLAG_BITS))
 	return FALSE;
-
+    
     /* everything matches */
     return TRUE;
 }
@@ -1063,7 +1063,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr	randr_crtc)
 	    randr_output = output->randr_output;
 	    randr_outputs[numOutputs++] = randr_output;
 	    /*
-	     * We make copies of modes, so pointer equality
+	     * We make copies of modes, so pointer equality 
 	     * isn't sufficient
 	     */
 	    for (j = 0; j < randr_output->numModes + randr_output->numUserModes; j++)
@@ -1071,7 +1071,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr	randr_crtc)
 		RRModePtr   m = (j < randr_output->numModes ?
 				 randr_output->modes[j] :
 				 randr_output->userModes[j-randr_output->numModes]);
-
+					 
 		if (xf86RandRModeMatches (m, mode))
 		{
 		    randr_mode = m;
@@ -1081,7 +1081,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr	randr_crtc)
 	}
     }
     ret = RRCrtcNotify (randr_crtc, randr_mode, x, y,
-			rotation,
+			rotation, 
 			crtc->transformPresent ? &crtc->transform : NULL,
 			numOutputs, randr_outputs);
     free(randr_outputs);
@@ -1100,13 +1100,13 @@ xf86RandRModeConvert (ScrnInfoPtr	scrn,
     mode->status = MODE_OK;
 
     mode->Clock = randr_mode->mode.dotClock / 1000;
-
+    
     mode->HDisplay = randr_mode->mode.width;
     mode->HSyncStart = randr_mode->mode.hSyncStart;
     mode->HSyncEnd = randr_mode->mode.hSyncEnd;
     mode->HTotal = randr_mode->mode.hTotal;
     mode->HSkew = randr_mode->mode.hSkew;
-
+    
     mode->VDisplay = randr_mode->mode.height;
     mode->VSyncStart = randr_mode->mode.vSyncStart;
     mode->VSyncEnd = randr_mode->mode.vSyncEnd;
@@ -1146,7 +1146,7 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 	flags |= XF86CrtcSetMode;
     else if (randr_mode && !xf86RandRModeMatches (randr_mode, &crtc->mode))
 	flags |= XF86CrtcSetMode;
-
+    
     if (rotation != crtc->rotation)
 	flags |= XF86CrtcSetRotation;
 
@@ -1159,18 +1159,18 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 
     if (x != crtc->x || y != crtc->y)
 	flags |= XF86CrtcSetOrigin;
-    for (o = 0; o < config->num_output; o++)
+    for (o = 0; o < config->num_output; o++) 
     {
 	xf86OutputPtr  output = config->output[o];
 	xf86CrtcPtr    new_crtc;
 
 	save_crtcs[o] = output->crtc;
-
+	
 	if (output->crtc == crtc)
 	    new_crtc = NULL;
 	else
 	    new_crtc = output->crtc;
-	for (ro = 0; ro < num_randr_outputs; ro++)
+	for (ro = 0; ro < num_randr_outputs; ro++) 
 	    if (output->randr_output == randr_outputs[ro])
 	    {
 		new_crtc = crtc;
@@ -1182,7 +1182,7 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 	    output->crtc = new_crtc;
 	}
     }
-    for (ro = 0; ro < num_randr_outputs; ro++)
+    for (ro = 0; ro < num_randr_outputs; ro++) 
         if (randr_outputs[ro]->pendingProperties)
 	    flags |= XF86CrtcSetProperty;
 
@@ -1385,7 +1385,7 @@ xf86RROutputSetModes (RROutputPtr randr_output, DisplayModePtr modes)
 
     if (nmode) {
 	rrmodes = malloc(nmode * sizeof (RRModePtr));
-
+	
 	if (!rrmodes)
 	    return FALSE;
 	nmode = 0;
@@ -1395,7 +1395,7 @@ xf86RROutputSetModes (RROutputPtr randr_output, DisplayModePtr modes)
 		if ((pref != 0) == ((mode->type & M_T_PREFERRED) != 0)) {
 		    xRRModeInfo		modeInfo;
 		    RRModePtr		rrmode;
-
+		    
 		    modeInfo.nameLength = strlen (mode->name);
 		    modeInfo.width = mode->HDisplay;
 		    modeInfo.dotClock = mode->Clock * 1000;
@@ -1419,7 +1419,7 @@ xf86RROutputSetModes (RROutputPtr randr_output, DisplayModePtr modes)
 	    }
 	}
     }
-
+    
     ret = RROutputSetModes (randr_output, rrmodes, nmode, npreferred);
     free(rrmodes);
     return ret;
@@ -1439,13 +1439,13 @@ xf86RandR12SetInfo12 (ScreenPtr pScreen)
     int			o, c, l;
     RRCrtcPtr		randr_crtc;
     int			nclone;
-
+    
     clones = malloc(config->num_output * sizeof (RROutputPtr));
     crtcs = malloc(config->num_crtc * sizeof (RRCrtcPtr));
     for (o = 0; o < config->num_output; o++)
     {
 	xf86OutputPtr	output = config->output[o];
-
+	
 	ncrtc = 0;
 	for (c = 0; c < config->num_crtc; c++)
 	    if (output->possible_crtcs & (1 << c))
@@ -1463,7 +1463,7 @@ xf86RandR12SetInfo12 (ScreenPtr pScreen)
 	    return FALSE;
 	}
 
-	RROutputSetPhysicalSize(output->randr_output,
+	RROutputSetPhysicalSize(output->randr_output, 
 				output->mm_width,
 				output->mm_height);
 	xf86RROutputSetModes (output->randr_output, output->probed_modes);
@@ -1489,7 +1489,7 @@ xf86RandR12SetInfo12 (ScreenPtr pScreen)
 	for (l = 0; l < config->num_output; l++)
 	{
 	    xf86OutputPtr	    clone = config->output[l];
-
+	    
 	    if (l != o && (output->possible_clones & (1 << l)))
 		clones[nclone++] = clone->randr_output;
 	}
@@ -1530,7 +1530,7 @@ xf86RandR12CreateObjects12 (ScreenPtr pScreen)
     xf86CrtcConfigPtr   config = XF86_CRTC_CONFIG_PTR(pScrn);
     int			c;
     int			o;
-
+    
     if (!RRInit ())
 	return FALSE;
 
@@ -1540,7 +1540,7 @@ xf86RandR12CreateObjects12 (ScreenPtr pScreen)
     for (c = 0; c < config->num_crtc; c++)
     {
 	xf86CrtcPtr    crtc = config->crtc[c];
-
+	
 	crtc->randr_crtc = RRCrtcCreate (pScreen, crtc);
 	RRCrtcGammaSetSize (crtc->randr_crtc, 256);
     }
@@ -1551,7 +1551,7 @@ xf86RandR12CreateObjects12 (ScreenPtr pScreen)
     {
 	xf86OutputPtr	output = config->output[o];
 
-	output->randr_output = RROutputCreate (pScreen, output->name,
+	output->randr_output = RROutputCreate (pScreen, output->name, 
 					       strlen (output->name),
 					       output);
 
@@ -1574,7 +1574,7 @@ xf86RandR12CreateScreenResources12 (ScreenPtr pScreen)
 
     for (c = 0; c < config->num_crtc; c++)
         xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc);
-
+    
     RRScreenSetSizeRange (pScreen, config->minWidth, config->minHeight,
 			  config->maxWidth, config->maxHeight);
     return TRUE;
@@ -1747,112 +1747,6 @@ xf86RandR14SetCrtcSpriteTransform(ScreenPtr		pScreen,
 }
 
 static Bool
-xf86RRConvertCrtcConfig(xf86CrtcSetConfigPtr	xf86_config,
-			RRCrtcConfigPtr		rr_config)
-{
-    RRCrtcPtr		rr_crtc = rr_config->crtc;
-    xf86CrtcPtr		crtc = rr_crtc->devPrivate;
-    ScrnInfoPtr		scrn = xf86Screens[rr_crtc->pScreen->myNum];
-    int			o;
-
-    xf86_config->crtc = crtc;
-    xf86_config->x = rr_config->x;
-    xf86_config->y = rr_config->y;
-    xf86RandRModeConvert(scrn, rr_config->mode, &xf86_config->mode);
-    xf86_config->rotation = rr_config->rotation;
-    xf86_config->numOutputs = rr_config->numOutputs;
-    xf86_config->outputs = calloc(rr_config->numOutputs, sizeof (xf86OutputPtr));
-    if (!xf86_config->outputs)
-	return FALSE;
-    for (o = 0; o < rr_config->numOutputs; o++)
-	xf86_config->outputs[o] = rr_config->outputs[o]->devPrivate;
-    xf86_config->sprite_position_transform = rr_config->sprite_position_transform;
-    xf86_config->sprite_image_transform = rr_config->sprite_image_transform;
-    xf86_config->pixmap = rr_config->pixmap;
-    xf86_config->pixmap_x = rr_config->pixmap_x;
-    xf86_config->pixmap_y = rr_config->pixmap_y;
-    return TRUE;
-}
-
-static void
-xf86FreeCrtcSetConfigs(xf86CrtcSetConfigPtr xf86_crtc_configs, int num_configs)
-{
-    int	i;
-
-    for (i = 0; i < num_configs; i++)
-	free(xf86_crtc_configs[i].outputs);
-    free(xf86_crtc_configs);
-}
-
-static Bool
-xf86RRSetCrtcConfigs(ScreenPtr screen,
-		     RRScreenConfigPtr screen_config,
-		     RRCrtcConfigPtr crtc_configs,
-		     int num_configs)
-{
-    ScrnInfoPtr	     		scrn = xf86Screens[screen->myNum];
-    xf86CrtcConfigPtr		config = XF86_CRTC_CONFIG_PTR(scrn);
-
-    if (config->funcs->set_config) {
-	xf86CrtcSetConfigPtr	xf86_crtc_configs;
-	int			i;
-	xf86SetConfigResponse	response;
-
-	/*
-	 * Convert RRCrtcConfigRecs to xf86CrtcSetConfigs
-	 */
-	xf86_crtc_configs = calloc(num_configs, sizeof (xf86CrtcSetConfigRec));
-	if (!xf86_crtc_configs)
-	    return FALSE;
-	for (i = 0; i < num_configs; i++)
-	    if (!xf86RRConvertCrtcConfig(&xf86_crtc_configs[i], &crtc_configs[i])) {
-		xf86FreeCrtcSetConfigs(xf86_crtc_configs, num_configs);
-		return FALSE;
-	    }
-
-	/*
-	 * Ask the driver to set the configuration
-	 */
-	response = (*config->funcs->set_config)(scrn,
-						screen_config,
-						xf86_crtc_configs,
-						num_configs);
-	xf86FreeCrtcSetConfigs(xf86_crtc_configs, num_configs);
-
-	/*
-	 * The driver is allowed to answer with one of three
-	 * responses:
-	 */
-	switch (response) {
-	case xf86SetConfigFailed:
-
-	    /* The configuration isn't usable, or some error
-	     * occurred while setting it. Everything has been
-	     * cleaned up and we're ready to return an error
-	     * back to the client
-	     */
-	    return FALSE;
-	case xf86SetConfigDone:
-
-	    /* The configuration was acceptable, and the whole
-	     * mode setting experience is over. Nothing more to do
-	     * here.
-	     */
-	    return TRUE;
-	case xf86SetConfigChecked:
-
-	    /* The configuration was acceptable, but the driver
-	     * didn't actually do anything. Go ask the DIX code
-	     * to do the mode setting operation using the simpler
-	     * interfaces
-	     */
-	    break;
-	}
-    }
-    return miRRSetCrtcConfigs(screen, screen_config, crtc_configs, num_configs);
-}
-
-static Bool
 xf86RandR12EnterVT (int screen_index, int flags)
 {
     ScreenPtr        pScreen = screenInfo.screens[screen_index];
@@ -1903,7 +1797,7 @@ xf86RandR12Init12 (ScreenPtr pScreen)
     pScrn->PointerMoved = xf86RandR12PointerMoved;
     pScrn->ChangeGamma = xf86RandR12ChangeGamma;
     rp->rrSetCrtcSpriteTransform = xf86RandR14SetCrtcSpriteTransform;
-    rp->rrSetCrtcConfigs = xf86RRSetCrtcConfigs;
+    rp->rrSetCrtcConfigs = miRRSetCrtcConfigs;
 
     randrp->orig_EnterVT = pScrn->EnterVT;
     pScrn->EnterVT = xf86RandR12EnterVT;
commit 9e8c20b0d49783d6b9334d4c11c4e6e3ba273524
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:17:42 2011 -0800

    Revert "randr: Add per-crtc pixmaps"
    
    This reverts commit 82612045e11f2b882ae132e184a9629f43f1c424.

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 94f2c50..ecde199 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -82,17 +82,6 @@ xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
     config->maxHeight = maxHeight;
 }
 
-void
-xf86CrtcSetScanoutFormats(ScrnInfoPtr		scrn,
-			  int			num_formats,
-			  xf86CrtcScanoutFormat	*formats)
-{
-    xf86CrtcConfigPtr	config = XF86_CRTC_CONFIG_PTR(scrn);
-
-    config->num_scanout_formats = num_formats;
-    config->scanout_formats = formats;
-}
-
 /*
  * Crtc functions
  */
@@ -276,7 +265,6 @@ xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
     Rotation		saved_rotation;
     RRTransformRec	saved_transform;
     Bool		saved_transform_present;
-    PixmapPtr		saved_scanout_pixmap;
 
     crtc->enabled = xf86CrtcInUse (crtc);
 
@@ -296,7 +284,6 @@ xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
     saved_x = crtc->x;
     saved_y = crtc->y;
     saved_rotation = crtc->rotation;
-    saved_scanout_pixmap = crtc->scanoutPixmap;
     if (crtc->transformPresent) {
 	RRTransformInit (&saved_transform);
 	RRTransformCopy (&saved_transform, &crtc->transform);
@@ -314,8 +301,6 @@ xf86CrtcSet(xf86CrtcPtr crtc, xf86CrtcSetRec *set)
     }
     if (set->flags & XF86CrtcSetRotation)
 	crtc->rotation = set->rotation;
-    if (set->flags & XF86CrtcSetScanoutPixmap)
-	crtc->scanoutPixmap = set->scanout_pixmap;
 
     if (set->flags & XF86CrtcSetTransform) {
 	if (set->transform) {
@@ -414,10 +399,6 @@ done:
 	crtc->active = TRUE;
 	if (scrn->pScreen)
 	    xf86CrtcSetScreenSubpixelOrder (scrn->pScreen);
-	if (crtc->scanoutPixmap)
-	    ++crtc->scanoutPixmap->refcnt;
-	if (saved_scanout_pixmap)
-	    (*scrn->pScreen->DestroyPixmap)(saved_scanout_pixmap);
 	if (scrn->ModeSet)
 	    scrn->ModeSet(scrn);
     } else {
@@ -428,7 +409,6 @@ done:
 	if (saved_transform_present)
 	    RRTransformCopy (&crtc->transform, &saved_transform);
 	crtc->transformPresent = saved_transform_present;
-	crtc->scanoutPixmap = saved_scanout_pixmap;
     }
 
     if (adjusted_mode) {
diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index 9a520fc..c2e8131 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -79,7 +79,6 @@ typedef enum _xf86CrtcSetFlags {
     XF86CrtcSetTransform = 8,		/* transform */
     XF86CrtcSetRotation = 16,		/* rotation */
     XF86CrtcSetProperty = 32,		/* output property */
-    XF86CrtcSetScanoutPixmap = 64,	/* scanout pixmap */
 } xf86CrtcSetFlags;
 
 typedef struct _xf86CrtcSet {
@@ -88,7 +87,6 @@ typedef struct _xf86CrtcSet {
     Rotation		rotation;
     RRTransformPtr	transform;
     int			x, y;
-    PixmapPtr		scanout_pixmap;
 } xf86CrtcSetRec;
 
 typedef struct _xf86CrtcFuncs {
@@ -279,7 +277,6 @@ struct _xf86Crtc {
     Rotation	    rotation;
     PixmapPtr	    rotatedPixmap;
     void	    *rotatedData;
-    PixmapPtr	    scanoutPixmap;
     
     /**
      * Position on screen
@@ -673,14 +670,6 @@ typedef struct _xf86CrtcSetConfig {
     int				pixmap_x, pixmap_y;
 } xf86CrtcSetConfigRec, *xf86CrtcSetConfigPtr;
 
-typedef struct _xf86CrtcScanoutFormat {
-    int		    depth;
-    int		    bitsPerPixel;
-    int		    maxWidth, maxHeight;
-    Rotation	    rotations;
-    PictFormatShort format;
-} xf86CrtcScanoutFormat;
-
 typedef struct _xf86CrtcConfigFuncs {
     /**
      * Requests that the driver resize the screen.
@@ -704,17 +693,6 @@ typedef struct _xf86CrtcConfigFuncs {
 		   RRScreenConfigPtr	screen_config,
 		   xf86CrtcSetConfigPtr	crtc_configs,
 		   int			num_configs);
-
-    /**
-     * Create a scanout pixmap
-     */
-    PixmapPtr
-    (*create_scanout_pixmap)(ScrnInfoPtr		scrn,
-			     int			width,
-			     int			height,
-			     Rotation			rotations,
-			     xf86CrtcScanoutFormat	*format);
-
 } xf86CrtcConfigFuncsRec, *xf86CrtcConfigFuncsPtr;
 
 typedef void (*xf86_crtc_notify_proc_ptr) (ScreenPtr pScreen);
@@ -774,11 +752,6 @@ typedef struct _xf86CrtcConfig {
     /* callback when crtc configuration changes */
     xf86_crtc_notify_proc_ptr  xf86_crtc_notify;
 
-    /*
-     * Supported scanout pixmap formats
-     */
-    int			num_scanout_formats;
-    xf86CrtcScanoutFormat	*scanout_formats;
 } xf86CrtcConfigRec, *xf86CrtcConfigPtr;
 
 extern _X_EXPORT int xf86CrtcConfigPrivateIndex;
@@ -824,11 +797,6 @@ xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
 		      int minWidth, int minHeight,
 		      int maxWidth, int maxHeight);
 
-extern _X_EXPORT void
-xf86CrtcSetScanoutFormats (ScrnInfoPtr			scrn,
-			   int				num_formats,
-			   xf86CrtcScanoutFormat	*formats);
-
 /*
  * Crtc functions
  */
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index b0eabdd..e3330f4 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1083,7 +1083,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr	randr_crtc)
     ret = RRCrtcNotify (randr_crtc, randr_mode, x, y,
 			rotation,
 			crtc->transformPresent ? &crtc->transform : NULL,
-			numOutputs, randr_outputs, crtc->scanoutPixmap);
+			numOutputs, randr_outputs);
     free(randr_outputs);
     return ret;
 }
@@ -1126,8 +1126,7 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 		    int		    y,
 		    Rotation	    rotation,
 		    int		    num_randr_outputs,
-		    RROutputPtr	    *randr_outputs,
-		    PixmapPtr	    scanout_pixmap)
+		    RROutputPtr	    *randr_outputs)
 {
     XF86RandRInfoPtr	randrp = XF86RANDRINFO(pScreen);
     ScrnInfoPtr		pScrn = xf86Screens[pScreen->myNum];
@@ -1158,9 +1157,6 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 				  sizeof (transform->transform)) != 0)
 	flags |= XF86CrtcSetTransform;
 
-    if (scanout_pixmap != crtc->scanoutPixmap)
-	flags |= XF86CrtcSetScanoutPixmap;
-
     if (x != crtc->x || y != crtc->y)
 	flags |= XF86CrtcSetOrigin;
     for (o = 0; o < config->num_output; o++)
@@ -1207,7 +1203,6 @@ xf86RandR12CrtcSet (ScreenPtr	    pScreen,
 	    set.transform = transform;
 	    set.x = x;
 	    set.y = y;
-	    set.scanout_pixmap = scanout_pixmap;
 	    set.flags = flags;
 	    if (!xf86CrtcSet(crtc, &set))
 	    {
@@ -1737,54 +1732,6 @@ xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
     return Success;
 }
 
-static RRScanoutPixmapInfo *
-xf86RRQueryScanoutPixmaps(ScreenPtr screen, int *n_info)
-{
-    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
-    xf86CrtcConfigPtr	config = XF86_CRTC_CONFIG_PTR(scrn);
-    RRScanoutPixmapInfo	*info;
-    int			f;
-
-    info = calloc(config->num_scanout_formats, sizeof (RRScanoutPixmapInfo));
-    if (config->num_scanout_formats && !info) {
-	*n_info = 0;
-	return NULL;
-    }
-    for (f = 0; f < config->num_scanout_formats; f++) {
-	info[f].maxWidth = config->scanout_formats[f].maxWidth;
-	info[f].maxHeight = config->scanout_formats[f].maxHeight;
-	info[f].depth = config->scanout_formats[f].depth;
-	info[f].rotations = config->scanout_formats[f].rotations;
-	info[f].format = PictureMatchFormat (screen, info[f].depth,
-					     config->scanout_formats[f].format);
-    }
-    *n_info = config->num_scanout_formats;
-    return info;
-}
-
-static PixmapPtr
-xf86RRCreateScanoutPixmap(ScreenPtr screen,
-			  int width, int height, int depth,
-			  Rotation rotations,
-			  PictFormatPtr format)
-{
-    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
-    xf86CrtcConfigPtr	config = XF86_CRTC_CONFIG_PTR(scrn);
-    int			f;
-
-    if (!config->funcs->create_scanout_pixmap)
-	return NullPixmap;
-
-    for (f = 0; f < config->num_scanout_formats; f++)
-	if (config->scanout_formats[f].depth == depth &&
-	    (config->scanout_formats[f].format & 0xffffff) == format->format) {
-	    return (*config->funcs->create_scanout_pixmap) (scrn, width, height,
-							    rotations,
-							    &config->scanout_formats[f]);
-	}
-    return NullPixmap;
-}
-
 static void
 xf86RandR14SetCrtcSpriteTransform(ScreenPtr		pScreen,
 				  RRCrtcPtr		randr_crtc,
@@ -1946,17 +1893,17 @@ xf86RandR12Init12 (ScreenPtr pScreen)
     rp->rrCrtcGetGamma = xf86RandR12CrtcGetGamma;
     rp->rrOutputSetProperty = xf86RandR12OutputSetProperty;
     rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
+#if RANDR_13_INTERFACE
     rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
     rp->rrGetPanning = xf86RandR13GetPanning;
     rp->rrSetPanning = xf86RandR13SetPanning;
+#endif
     rp->rrModeDestroy = xf86RandR12ModeDestroy;
     rp->rrSetConfig = NULL;
     pScrn->PointerMoved = xf86RandR12PointerMoved;
     pScrn->ChangeGamma = xf86RandR12ChangeGamma;
     rp->rrSetCrtcSpriteTransform = xf86RandR14SetCrtcSpriteTransform;
     rp->rrSetCrtcConfigs = xf86RRSetCrtcConfigs;
-    rp->rrQueryScanoutPixmaps = xf86RRQueryScanoutPixmaps;
-    rp->rrCreateScanoutPixmap = xf86RRCreateScanoutPixmap;
 
     randrp->orig_EnterVT = pScrn->EnterVT;
     pScrn->EnterVT = xf86RandR12EnterVT;
diff --git a/randr/Makefile.am b/randr/Makefile.am
index b7664c6..a1c88dc 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -16,7 +16,6 @@ librandr_la_SOURCES =	\
 	rrinfo.c	\
 	rrmode.c	\
 	rroutput.c	\
-	rrpixmap.c	\
 	rrpointer.c	\
 	rrproperty.c	\
 	rrscreen.c	\
diff --git a/randr/mirrcrtc.c b/randr/mirrcrtc.c
index cc76797..b1e2c9f 100644
--- a/randr/mirrcrtc.c
+++ b/randr/mirrcrtc.c
@@ -66,8 +66,7 @@ miRRSetCrtcConfig(RRCrtcConfigPtr crtc_config)
 		     y,
 		     crtc_config->rotation,
 		     crtc_config->numOutputs,
-		     crtc_config->outputs,
-		     crtc_config->pixmap);
+		     crtc_config->outputs);
 }
 
 Bool
diff --git a/randr/randr.c b/randr/randr.c
index c22657e..6077705 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -98,7 +98,6 @@ RRCloseScreen (int i, ScreenPtr pScreen)
     
     free(pScrPriv->crtcs);
     free(pScrPriv->outputs);
-    free(pScrPriv->scanout_info);
     free(pScrPriv);
     RRNScreens -= 1;	/* ok, one fewer screen with RandR running */
     return (*pScreen->CloseScreen) (i, pScreen);    
@@ -249,8 +248,6 @@ Bool RRScreenInit(ScreenPtr pScreen)
     pScrPriv->rrCrtcSet = NULL;
     pScrPriv->rrCrtcSetGamma = NULL;
 #endif
-    pScrPriv->scanout_info = NULL;
-    pScrPriv->n_scanout_info = 0;
 #if RANDR_10_INTERFACE    
     pScrPriv->rrSetConfig = 0;
     pScrPriv->rotations = RR_Rotate_0;
@@ -485,18 +482,6 @@ RRVerticalRefresh (xRRModeInfo *mode)
     return (CARD16) refresh;
 }
 
-RRScanoutPixmapInfo *
-RRQueryScanoutPixmapInfo(ScreenPtr screen, int *n_info)
-{
-    rrScrPriv(screen);
-
-    if (!pScrPriv->scanout_info && pScrPriv->rrQueryScanoutPixmaps)
-	pScrPriv->scanout_info = pScrPriv->rrQueryScanoutPixmaps(screen,
-								 &pScrPriv->n_scanout_info);
-    *n_info = pScrPriv->n_scanout_info;
-    return pScrPriv->scanout_info;
-}
-
 static int
 ProcRRDispatch (ClientPtr client)
 {
diff --git a/randr/randrstr.h b/randr/randrstr.h
index c231972..2fe9602 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -123,7 +123,6 @@ struct _rrCrtc {
     CARD16	    *gammaGreen;
     void	    *devPrivate;
     Bool	    transforms;
-    PixmapPtr	    scanoutPixmap;
     RRTransformRec  client_pending_transform;
     RRTransformRec  client_current_transform;
     PictTransform   client_sprite_position_transform;
@@ -199,8 +198,7 @@ typedef Bool (*RRCrtcSetProcPtr) (ScreenPtr		pScreen,
 				  int			y,
 				  Rotation		rotation,
 				  int			numOutputs,
-				  RROutputPtr		*outputs,
-				  PixmapPtr		scanout_pixmap);
+				  RROutputPtr		*outputs);
 
 typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr	pScreen,
 				       RRCrtcPtr	crtc);
@@ -266,20 +264,6 @@ typedef Bool (*RRSetConfigProcPtr) (ScreenPtr		pScreen,
 
 #endif
 	
-typedef struct {
-    PictFormatPtr	format;
-    int			maxWidth, maxHeight;
-    int			depth;
-    Rotation		rotations;
-} RRScanoutPixmapInfo;
-
-typedef RRScanoutPixmapInfo *(*RRQueryScanoutPixmapsPtr) (ScreenPtr pScreen,
-							  int *num_info);
-
-typedef PixmapPtr (*RRCreateScanoutPixmapPtr) (ScreenPtr pScreen,
-					       int width, int height, int depth,
-					       Rotation rotations,
-					       PictFormatPtr format);
 
 typedef void (*RRSetCrtcSpriteTransformPtr) (ScreenPtr pScreen,
 					     RRCrtcPtr randr_crtc,
@@ -319,8 +303,6 @@ typedef struct _rrScrPriv {
     RRGetPanningProcPtr	rrGetPanning;
     RRSetPanningProcPtr	rrSetPanning;
 #endif
-    RRQueryScanoutPixmapsPtr	rrQueryScanoutPixmaps;
-    RRCreateScanoutPixmapPtr	rrCreateScanoutPixmap;
     RRSetCrtcSpriteTransformPtr	rrSetCrtcSpriteTransform;
     RRGetCrtcSpriteTransformPtr	rrGetCrtcSpriteTransform;
     RRSetCrtcConfigsPtr rrSetCrtcConfigs;
@@ -351,8 +333,6 @@ typedef struct _rrScrPriv {
     /* Last known pointer position */
     RRCrtcPtr		    pointerCrtc;
 
-    RRScanoutPixmapInfo	    *scanout_info;
-    int			    n_scanout_info;
 #ifdef RANDR_10_INTERFACE
     /*
      * Configuration information
@@ -367,7 +347,6 @@ typedef struct _rrScrPriv {
     int			    rate;
     int			    size;
 #endif
-
 } rrScrPrivRec, *rrScrPrivPtr;
 
 extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec;
@@ -542,9 +521,6 @@ RRGetRotation (ScreenPtr pScreen);
 extern _X_EXPORT CARD16
 RRVerticalRefresh (xRRModeInfo *mode);
 
-extern _X_EXPORT RRScanoutPixmapInfo *
-RRQueryScanoutPixmapInfo(ScreenPtr screen, int *n_info);
-
 #ifdef RANDR_10_INTERFACE					
 /*
  * This is the old interface, deprecated but left
@@ -623,8 +599,7 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	      Rotation	    rotation,
 	      RRTransformPtr transform,
 	      int	    numOutputs,
-	      RROutputPtr   *outputs,
-	      PixmapPtr	    scanoutPixmap);
+	      RROutputPtr   *outputs);
 
 extern _X_EXPORT void
 RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc);
@@ -639,8 +614,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   int		y,
 	   Rotation	rotation,
 	   int		numOutput,
-	   RROutputPtr  *outputs,
-	   PixmapPtr	scanout_pixmap);
+	   RROutputPtr  *outputs);
 
 /*
  * Request that the Crtc gamma be changed
@@ -669,10 +643,6 @@ RRCrtcGammaGet(RRCrtcPtr crtc);
 extern _X_EXPORT Bool
 RRCrtcGammaNotify (RRCrtcPtr	crtc);
 
-void
-RRModeGetScanoutSize (RRModePtr mode, struct pixman_f_transform *transform,
-		      int *width, int *height);
-
 /*
  * Set the size of the gamma table at server startup time
  */
@@ -808,23 +778,11 @@ RRCrtcSpriteTransformSet(RRCrtcPtr crtc,
 			 struct pict_f_transform *f_image_transform);
 
 int
-ProcRRQueryScanoutPixmaps (ClientPtr client);
-
-int
-ProcRRCreateScanoutPixmap (ClientPtr client);
-
-int
-ProcRRSetCrtcPixmapConfig (ClientPtr client);
-
-int
 ProcRRSetCrtcSpriteTransform (ClientPtr client);
 
 int
 ProcRRGetCrtcSpriteTransform (ClientPtr client);
 
-int
-ProcRRSetCrtcConfigs (ClientPtr client);
-
 /* rrdispatch.c */
 extern _X_EXPORT Bool
 RRClientKnowsRates (ClientPtr	pClient);
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 12982a8..1f8f2e6 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -138,8 +138,7 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	      Rotation	    rotation,
 	      RRTransformPtr transform,
 	      int	    numOutputs,
-	      RROutputPtr   *outputs,
-	      PixmapPtr	    scanoutPixmap)
+	      RROutputPtr   *outputs)
 {
     int	    i, j;
 
@@ -237,15 +236,6 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	RRCrtcChanged (crtc, TRUE);
     }
 
-    if (scanoutPixmap != crtc->scanoutPixmap)
-    {
-	if (scanoutPixmap)
-	    ++scanoutPixmap->refcnt;
-	if (crtc->scanoutPixmap)
-	    (*crtc->scanoutPixmap->drawable.pScreen->DestroyPixmap) (crtc->scanoutPixmap);
-	crtc->scanoutPixmap = scanoutPixmap;
-    }
-
     if (crtc->changed && mode)
     {
 	RRTransformCompute (x, y,
@@ -322,8 +312,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   int		y,
 	   Rotation	rotation,
 	   int		numOutputs,
-	   RROutputPtr  *outputs,
-	   PixmapPtr	scanout_pixmap)
+	   RROutputPtr  *outputs)
 {
     ScreenPtr	pScreen = crtc->pScreen;
     Bool	ret = FALSE;
@@ -337,8 +326,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	crtc->numOutputs == numOutputs &&
 	!memcmp (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr)) &&
 	!RRCrtcPendingProperties (crtc) &&
-	!RRCrtcPendingTransform (crtc) &&
-	crtc->scanoutPixmap == scanout_pixmap)
+	!RRCrtcPendingTransform (crtc))
     {
 	ret = TRUE;
     }
@@ -348,7 +336,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	if (pScrPriv->rrCrtcSet)
 	{
 	    ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y,
-					  rotation, numOutputs, outputs, scanout_pixmap);
+					  rotation, numOutputs, outputs);
 	}
 	else
 #endif
@@ -361,7 +349,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 
 		if (!mode)
 		{
-		    RRCrtcNotify (crtc, NULL, x, y, rotation, NULL, 0, NULL, scanout_pixmap);
+		    RRCrtcNotify (crtc, NULL, x, y, rotation, NULL, 0, NULL);
 		    ret = TRUE;
 		}
 		else
@@ -387,7 +375,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 		     */
 		    if (ret)
 		    {
-			RRCrtcNotify (crtc, mode, x, y, rotation, NULL, 1, outputs, scanout_pixmap);
+			RRCrtcNotify (crtc, mode, x, y, rotation, NULL, 1, outputs);
 			RRScreenSizeNotify (pScreen);
 		    }
 		}
@@ -585,10 +573,7 @@ RRCrtcGammaNotify (RRCrtcPtr	crtc)
     return TRUE;    /* not much going on here */
 }
 
-/*
- * Compute overall scanout buffer requirements for the specified mode
- */
-void
+static void
 RRModeGetScanoutSize (RRModePtr mode, struct pixman_f_transform *transform,
 		      int *width, int *height)
 {
@@ -1064,7 +1049,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
     }
 
     if (!RRCrtcSet (crtc, mode, stuff->x, stuff->y,
-		    rotation, numOutputs, outputs, NULL))
+		   rotation, numOutputs, outputs))
     {
 	rep.status = RRSetConfigFailed;
 	goto sendReply;
diff --git a/randr/rrinfo.c b/randr/rrinfo.c
index 549ebcc..fdf3726 100644
--- a/randr/rrinfo.c
+++ b/randr/rrinfo.c
@@ -168,7 +168,7 @@ RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
     /* notice current mode */
     if (newMode)
 	RRCrtcNotify (crtc, newMode, 0, 0, pScrPriv->rotation,
-		      NULL, 1, &output, NULL);
+		      NULL, 1, &output);
 }
 #endif
 
diff --git a/randr/rrpixmap.c b/randr/rrpixmap.c
deleted file mode 100644
index 7d4543c..0000000
--- a/randr/rrpixmap.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright © 2010 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-#include "xace.h"
-
-int
-ProcRRQueryScanoutPixmaps (ClientPtr client)
-{
-    REQUEST(xRRQueryScanoutPixmapsReq);
-    xRRQueryScanoutPixmapsReply	rep;
-    RRScanoutPixmapInfo		*info;
-    xRRScanoutPixmapInfo	*x_info;
-    int				n_info;
-    int				rc;
-    DrawablePtr			drawable;
-    ScreenPtr			screen;
-    rrScrPrivPtr		screen_priv;
-    int 			n, s;
-
-    REQUEST_SIZE_MATCH(xRRQueryScanoutPixmapsReq);
-    rc = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixGetAttrAccess);
-    if (rc != Success) {
-	client->errorValue = stuff->drawable;
-	return rc;
-    }
-
-    screen = drawable->pScreen;
-    screen_priv = rrGetScrPriv(screen);
-
-    rep.type = X_Reply;
-    /* rep.status has already been filled in */
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-
-    info = RRQueryScanoutPixmapInfo(screen, &n_info);
-    x_info = calloc(n_info, sizeof (xRRScanoutPixmapInfo));
-    if (n_info && !x_info)
-	return BadAlloc;
-    rep.length += (n_info * sizeof (xRRScanoutPixmapInfo)) >> 2;
-    if (client->swapped) {
-	swaps(&rep.sequenceNumber, n);
-	swapl(&rep.length, n);
-    }
-
-    for (s = 0; s < n_info; s++) {
-	x_info[s].format = info[s].format->id;
-	x_info[s].maxWidth = info[s].maxWidth;
-	x_info[s].maxHeight = info[s].maxHeight;
-	x_info[s].rotations = info[s].rotations;
-	if (client->swapped) {
-	    swapl(&x_info[s].format, n);
-	    swaps(&x_info[s].maxWidth, n);
-	    swaps(&x_info[s].maxHeight, n);
-	    swaps(&x_info[s].rotations, n);
-	}
-    }
-
-    WriteToClient(client, sizeof(rep), (char *)&rep);
-    if (n_info)
-	WriteToClient(client, n_info * sizeof (xRRScanoutPixmapInfo),
-		      (char *) x_info);
-    return Success;
-}
-
-int
-ProcRRCreateScanoutPixmap (ClientPtr client)
-{
-    REQUEST(xRRCreateScanoutPixmapReq);
-    int 		rc;
-    DrawablePtr		drawable;
-    ScreenPtr		screen;
-    rrScrPrivPtr	screen_priv;
-    PixmapPtr		pixmap;
-    int			n_info;
-    RRScanoutPixmapInfo	*info;
-    int			s;
-
-    REQUEST_SIZE_MATCH(xRRCreateScanoutPixmapReq);
-    client->errorValue = stuff->pid;
-    LEGAL_NEW_RESOURCE(stuff->pid, client);
-
-    rc = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixGetAttrAccess);
-    if (rc != Success) {
-	client->errorValue = stuff->drawable;
-	return rc;
-    }
-    screen = drawable->pScreen;
-    screen_priv = rrGetScrPriv(screen);
-    if (!screen_priv)
-	return BadValue;
-
-    info = RRQueryScanoutPixmapInfo(screen, &n_info);
-    for (s = 0; s < n_info; s++) {
-	if (info[s].format->id == stuff->format)
-	    break;
-    }
-    if (s == n_info || !screen_priv->rrCreateScanoutPixmap) {
-	client->errorValue = stuff->format;
-	return BadValue;
-    }
-    info = &info[s];
-    if (!stuff->width || stuff->width > info->maxWidth) {
-	client->errorValue = stuff->width;
-	return BadValue;
-    }
-    if (!stuff->height || stuff->height > info->maxHeight) {
-	client->errorValue = stuff->height;
-	return BadValue;
-    }
-    if ((stuff->rotations & info->rotations) != stuff->rotations) {
-	client->errorValue = stuff->rotations;
-	return BadValue;
-    }
-
-    pixmap = screen_priv->rrCreateScanoutPixmap (screen,
-						 stuff->width, stuff->height,
-						 info->depth,
-						 stuff->rotations,
-						 info->format);
-    if (!pixmap)
-	return BadAlloc;
-
-    pixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-    pixmap->drawable.id = stuff->pid;
-    rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
-		  pixmap, RT_NONE, NULL, DixCreateAccess);
-    if (rc != Success) {
-	screen->DestroyPixmap(pixmap);
-	return rc;
-    }
-    if (!AddResource(stuff->pid, RT_PIXMAP, pixmap))
-	return BadAlloc;
-    return Success;
-}
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index c738726..af09f68 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -794,10 +794,8 @@ ProcRRSetScreenConfig (ClientPtr client)
     }
     
     rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
-    if (rc != Success) {
-	client->errorValue = stuff->drawable;
+    if (rc != Success)
 	return rc;
-    }
 
     pScreen = pDraw->pScreen;
 
@@ -954,7 +952,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	for (c = 0; c < pScrPriv->numCrtcs; c++)
 	{
 	    if (!RRCrtcSet (pScrPriv->crtcs[c], NULL, 0, 0, RR_Rotate_0,
-			    0, NULL, NULL))
+			    0, NULL))
 	    {
 		rep.status = RRSetConfigFailed;
 		/* XXX recover from failure */
@@ -970,7 +968,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	}
     }
 
-    if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output, NULL))
+    if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output))
 	rep.status = RRSetConfigFailed;
     else {
 	pScrPriv->lastSetTime = time;
commit 9f47780ecdc7693f756587a758ec0141e75cb1eb
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:17:36 2011 -0800

    Revert "randr: Hook up the new RandR 1.4 functionality"
    
    This reverts commit afb6ebf1d5829346c40fe1053c9f50afe926e6c6.

diff --git a/include/protocol-versions.h b/include/protocol-versions.h
index c8c7f5f..1d33bdd 100644
--- a/include/protocol-versions.h
+++ b/include/protocol-versions.h
@@ -65,7 +65,7 @@
 
 /* RandR */
 #define SERVER_RANDR_MAJOR_VERSION		1
-#define SERVER_RANDR_MINOR_VERSION		4
+#define SERVER_RANDR_MINOR_VERSION		3
 
 /* Record */
 #define SERVER_RECORD_MAJOR_VERSION		1
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index b0b451c..ac4d2ac 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -224,11 +224,5 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
     ProcRRSetPanning,		/* 29 */
     ProcRRSetOutputPrimary,	/* 30 */
     ProcRRGetOutputPrimary,	/* 31 */
-/* V1.4 additions */
-    ProcRRQueryScanoutPixmaps,	/* 32 */
-    ProcRRCreateScanoutPixmap,	/* 33 */
-    ProcRRSetCrtcSpriteTransform,/* 34 */
-    ProcRRGetCrtcSpriteTransform,/* 35 */
-    ProcRRSetCrtcConfigs,	 /* 36 */
 };
 
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index c848f91..e16090a 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -461,132 +461,6 @@ SProcRRGetOutputPrimary (ClientPtr client)
     return ProcRandrVector[stuff->randrReqType](client);
 }
 
-static int
-SProcRRQueryScanoutPixmaps (ClientPtr client)
-{
-    int n;
-    REQUEST(xRRQueryScanoutPixmapsReq);
-
-    REQUEST_SIZE_MATCH(xRRQueryScanoutPixmapsReq);
-    swaps(&stuff->length, n);
-    swapl(&stuff->drawable, n);
-    return ProcRandrVector[stuff->randrReqType](client);
-}
-
-static int
-SProcRRCreateScanoutPixmap (ClientPtr client)
-{
-    int n;
-    REQUEST(xRRCreateScanoutPixmapReq);
-
-    REQUEST_SIZE_MATCH(xRRCreateScanoutPixmapReq);
-    swaps(&stuff->length, n);
-    swapl(&stuff->pid, n);
-    swapl(&stuff->drawable, n);
-    swaps(&stuff->width, n);
-    swaps(&stuff->height, n);
-    swapl(&stuff->format, n);
-    swaps(&stuff->rotations, n);
-    return ProcRandrVector[stuff->randrReqType](client);
-}
-
-static void
-swap_transform(xRenderTransform *t)
-{
-    int n;
-    swapl(&t->matrix11, n);
-    swapl(&t->matrix12, n);
-    swapl(&t->matrix13, n);
-    swapl(&t->matrix21, n);
-    swapl(&t->matrix22, n);
-    swapl(&t->matrix23, n);
-    swapl(&t->matrix31, n);
-    swapl(&t->matrix32, n);
-    swapl(&t->matrix33, n);
-}
-
-static int
-SProcRRSetCrtcSpriteTransform (ClientPtr client)
-{
-    int n;
-    REQUEST(xRRSetCrtcSpriteTransformReq);
-
-    REQUEST_SIZE_MATCH(xRRSetCrtcSpriteTransformReq);
-    swaps(&stuff->length, n);
-    swapl(&stuff->crtc, n);
-    swap_transform(&stuff->positionTransform);
-    swap_transform(&stuff->imageTransform);
-    return ProcRandrVector[stuff->randrReqType](client);
-}
-
-static int
-SProcRRGetCrtcSpriteTransform (ClientPtr client)
-{
-    int n;
-    REQUEST(xRRGetCrtcSpriteTransformReq);
-
-    REQUEST_SIZE_MATCH(xRRGetCrtcSpriteTransformReq);
-    swaps(&stuff->length, n);
-    swapl(&stuff->crtc, n);
-    return ProcRandrVector[stuff->randrReqType](client);
-}
-
-static int
-SProcRRSetCrtcConfigs (ClientPtr client)
-{
-    int n;
-    REQUEST(xRRSetCrtcConfigsReq);
-    int c;
-    int extra_len;
-    int num_configs;
-    int num_output_ids;
-    xRRCrtcConfig *x_configs;
-
-    REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigsReq);
-    swaps(&stuff->length, n);
-    swapl(&stuff->drawable, n);
-    swaps(&stuff->screenPixmapWidth, n);
-    swaps(&stuff->screenPixmapHeight, n);
-    swaps(&stuff->screenWidth, n);
-    swaps(&stuff->screenHeight, n);
-    swapl(&stuff->widthInMillimeters, n);
-    swapl(&stuff->heightInMillimeters, n);
-    swaps(&stuff->nConfigs, n);
-
-    extra_len = client->req_len - bytes_to_int32(sizeof(xRRSetCrtcConfigsReq));
-
-    num_configs = stuff->nConfigs;
-
-    /* Check request length against number of configs specified */
-    if (num_configs * (sizeof (xRRCrtcConfig) >> 2) > extra_len)
-	return BadLength;
-
-    x_configs = (xRRCrtcConfig *) (stuff + 1);
-    for (c = 0; c < num_configs; c++) {
-	swapl(&x_configs->crtc, n);
-	swaps(&x_configs->x, n);
-	swaps(&x_configs->y, n);
-	swapl(&x_configs->mode, n);
-	swaps(&x_configs->rotation, n);
-	swaps(&x_configs->nOutput, n);
-	swap_transform(&x_configs->spritePositionTransform);
-	swap_transform(&x_configs->spriteImageTransform);
-	swapl(&x_configs->pixmap, n);
-	swaps(&x_configs->xPixmap, n);
-	swaps(&x_configs->yPixmap, n);
-	x_configs++;
-    }
-
-    /* Let the other dispatch function deal with verifying that
-     * the right number of output ids are present, just
-     * swap whatever is here
-     */
-    num_output_ids = extra_len - (num_configs * (sizeof (xRRCrtcConfig)) >> 2);
-    SwapLongs((CARD32 *) x_configs, num_output_ids);
-
-    return ProcRandrVector[stuff->randrReqType](client);
-}
-
 int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRQueryVersion,	/* 0 */
 /* we skip 1 to make old clients fail pretty immediately */
@@ -625,11 +499,5 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRSetPanning,		/* 29 */
     SProcRRSetOutputPrimary,	/* 30 */
     SProcRRGetOutputPrimary,	/* 31 */
-/* V1.4 additions */
-    SProcRRQueryScanoutPixmaps,	/* 32 */
-    SProcRRCreateScanoutPixmap,	/* 33 */
-    SProcRRSetCrtcSpriteTransform,/* 34 */
-    SProcRRGetCrtcSpriteTransform,/* 35 */
-    SProcRRSetCrtcConfigs,	/* 36 */
 };
 
commit 793a242c89fccdbf1a2557ba33da1da2cb4ff8c4
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:17:33 2011 -0800

    Revert "DIX is responsible for ref counting scanout pixmaps."
    
    This reverts commit 96b4d4787bf82edd9d06eb9a6e94bc45412c7df2.

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index b5e9dc2..94f2c50 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -414,6 +414,10 @@ done:
 	crtc->active = TRUE;
 	if (scrn->pScreen)
 	    xf86CrtcSetScreenSubpixelOrder (scrn->pScreen);
+	if (crtc->scanoutPixmap)
+	    ++crtc->scanoutPixmap->refcnt;
+	if (saved_scanout_pixmap)
+	    (*scrn->pScreen->DestroyPixmap)(saved_scanout_pixmap);
 	if (scrn->ModeSet)
 	    scrn->ModeSet(scrn);
     } else {
commit 7b7cd3f121b3904ad851155f853ce87a0e00d002
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:17:29 2011 -0800

    Revert "Set sprite transforms from RRSetCrtcConfigs"
    
    This reverts commit a88d70fb20a2bc3152b84adff4380857e6cfadf5.

diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index dfe2cc3..b0eabdd 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1819,8 +1819,8 @@ xf86RRConvertCrtcConfig(xf86CrtcSetConfigPtr	xf86_config,
 	return FALSE;
     for (o = 0; o < rr_config->numOutputs; o++)
 	xf86_config->outputs[o] = rr_config->outputs[o]->devPrivate;
-    xf86_config->sprite_position_transform = rr_config->sprite_position_f_transform;
-    xf86_config->sprite_image_transform = rr_config->sprite_image_f_transform;
+    xf86_config->sprite_position_transform = rr_config->sprite_position_transform;
+    xf86_config->sprite_image_transform = rr_config->sprite_image_transform;
     xf86_config->pixmap = rr_config->pixmap;
     xf86_config->pixmap_x = rr_config->pixmap_x;
     xf86_config->pixmap_y = rr_config->pixmap_y;
diff --git a/randr/mirrcrtc.c b/randr/mirrcrtc.c
index d493a0e..cc76797 100644
--- a/randr/mirrcrtc.c
+++ b/randr/mirrcrtc.c
@@ -60,21 +60,14 @@ miRRSetCrtcConfig(RRCrtcConfigPtr crtc_config)
 	x = crtc_config->pixmap_x;
 	y = crtc_config->pixmap_y;
     }
-    if (!RRCrtcSet(crtc_config->crtc,
-		   crtc_config->mode,
-		   x,
-		   y,
-		   crtc_config->rotation,
-		   crtc_config->numOutputs,
-		   crtc_config->outputs,
-		   crtc_config->pixmap))
-	return FALSE;
-    RRCrtcSpriteTransformSet(crtc_config->crtc,
-			     &crtc_config->sprite_position_transform,
-			     &crtc_config->sprite_image_transform,
-			     &crtc_config->sprite_position_f_transform,
-			     &crtc_config->sprite_image_f_transform);
-    return TRUE;
+    return RRCrtcSet(crtc_config->crtc,
+		     crtc_config->mode,
+		     x,
+		     y,
+		     crtc_config->rotation,
+		     crtc_config->numOutputs,
+		     crtc_config->outputs,
+		     crtc_config->pixmap);
 }
 
 Bool
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 8240824..c231972 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -154,10 +154,8 @@ struct _rrCrtcConfig {
     Rotation			rotation;
     int				numOutputs;
     RROutputPtr			*outputs;
-    PictTransform		sprite_position_transform;
-    PictTransform		sprite_image_transform;
-    struct pict_f_transform	sprite_position_f_transform;
-    struct pict_f_transform	sprite_image_f_transform;
+    struct pict_f_transform	sprite_position_transform;
+    struct pict_f_transform	sprite_image_transform;
     PixmapPtr			pixmap;
     int				pixmap_x, pixmap_y;
 };
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 0b2bc28..12982a8 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -430,10 +430,8 @@ RRCrtcCurrentConfig(RRCrtcPtr crtc,
     if (!crtc_config->outputs)
 	return FALSE;
     memcpy(crtc_config->outputs, crtc->outputs, crtc->numOutputs * sizeof (RROutputPtr));
-    crtc_config->sprite_position_transform = crtc->client_sprite_position_transform;
-    crtc_config->sprite_image_transform = crtc->client_sprite_image_transform;
-    crtc_config->sprite_position_f_transform = crtc->client_sprite_f_position_transform;
-    crtc_config->sprite_image_f_transform = crtc->client_sprite_f_image_transform;
+    crtc_config->sprite_position_transform = crtc->client_sprite_f_position_transform;
+    crtc_config->sprite_image_transform = crtc->client_sprite_f_image_transform;
 
     /* XXX add pixmap stuff */
     crtc_config->pixmap = NULL;
@@ -720,8 +718,8 @@ RRScreenCoversCrtc(RRScreenConfigPtr screen_config,
 			crtc_config->mode->mode.width, crtc_config->mode->mode.height,
 			crtc_config->rotation,
 			client_transform,
-			&crtc_config->sprite_position_f_transform,
-			&crtc_config->sprite_image_f_transform,
+			&crtc_config->sprite_position_transform,
+			&crtc_config->sprite_image_transform,
 			NULL, &f_transform, NULL, NULL, NULL, NULL);
 
     RRModeGetScanoutSize (crtc_config->mode, &f_transform,
@@ -1471,6 +1469,15 @@ ProcRRGetCrtcTransform (ClientPtr client)
     return Success;
 }
 
+static void
+pixman_f_transform_from_xRenderTransform(struct pixman_f_transform *f_transform,
+					 xRenderTransform *x_transform)
+{
+    struct pixman_transform	transform;
+    PictTransform_from_xRenderTransform(&transform, x_transform);
+    pixman_f_transform_from_pixman_transform(f_transform, &transform);
+}
+
 static int
 RRConvertCrtcConfig(ClientPtr client, ScreenPtr screen,
 		    RRScreenConfigPtr screen_config,
@@ -1587,14 +1594,10 @@ RRConvertCrtcConfig(ClientPtr client, ScreenPtr screen,
     config->rotation = x->rotation;
     config->numOutputs = x->nOutput;
     config->outputs = outputs;
-    PictTransform_from_xRenderTransform(&config->sprite_position_transform,
+    pixman_f_transform_from_xRenderTransform(&config->sprite_position_transform,
 					     &x->spritePositionTransform);
-    PictTransform_from_xRenderTransform(&config->sprite_image_transform,
+    pixman_f_transform_from_xRenderTransform(&config->sprite_image_transform,
 					     &x->spriteImageTransform);
-    pixman_f_transform_from_pixman_transform(&config->sprite_position_f_transform,
-					     &config->sprite_position_transform);
-    pixman_f_transform_from_pixman_transform(&config->sprite_image_f_transform,
-					     &config->sprite_image_transform);
     config->pixmap = pixmap;
     config->pixmap_x = x->xPixmap;
     config->pixmap_y = x->yPixmap;
commit fd9331f6eb39a28da7de4867b2e3a460f667d514
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:17:24 2011 -0800

    Revert "Separate out screen size and screen pixmap sizes in RRScreenSizeSet"
    
    This reverts commit 752c368421c1c824752cf467fba9318d75d2ca2c.

diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 9e2ffaa..1a5bf8a 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -1038,12 +1038,7 @@ xf86SetRootClip (ScreenPtr pScreen, Bool enable)
 	RegionInit(&pWin->winSize, &box, 1);
 	RegionInit(&pWin->borderSize, &box, 1);
 	if (WasViewable)
-	{
-	    PixmapPtr	pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
-	    box.x2 = pPixmap->drawable.width;
-	    box.y2 = pPixmap->drawable.height;
 	    RegionReset(&pWin->borderClip, &box);
-	}
 	pWin->drawable.width = pScreen->width;
 	pWin->drawable.height = pScreen->height;
         RegionBreak(&pWin->clipList);
@@ -1121,6 +1116,7 @@ xf86EnableDisableFBAccess(int scrnIndex, Bool enable)
 	 */
 	if (!xf86Resetting)
 	    xf86SetRootClip (pScreen, TRUE);
+
     }
     else
     {
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 407bf35..dfe2cc3 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -659,12 +659,10 @@ xf86RandR12SetConfig (ScreenPtr		pScreen,
 
 static Bool
 xf86RandR12ScreenSetSize (ScreenPtr	pScreen,
-			  CARD16	width,
-			  CARD16	height,
-			  CARD16	pixWidth,
-			  CARD16	pixHeight,
-			  CARD32	mmWidth,
-			  CARD32	mmHeight)
+			CARD16		width,
+			CARD16		height,
+			CARD32		mmWidth,
+			CARD32		mmHeight)
 {
     XF86RandRInfoPtr	randrp = XF86RANDRINFO(pScreen);
     ScrnInfoPtr		pScrn = XF86SCRNINFO(pScreen);
@@ -672,8 +670,6 @@ xf86RandR12ScreenSetSize (ScreenPtr	pScreen,
     WindowPtr		pRoot = pScreen->root;
     PixmapPtr		pScrnPix;
     Bool		ret = FALSE;
-    Bool		pixSizeChanged = FALSE;
-    Bool		winSizeChanged = FALSE;
     int                 c;
 
     if (xf86RandR12Key) {
@@ -681,85 +677,46 @@ xf86RandR12ScreenSetSize (ScreenPtr	pScreen,
         {
 	    randrp->virtualX = pScrn->virtualX;
 	    randrp->virtualY = pScrn->virtualY;
-	    pixSizeChanged = TRUE;
         }
     }
+    if (pRoot && pScrn->vtSema)
+	(*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
 
-    pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
-    if (pixWidth != pScrnPix->drawable.width ||
-	pixHeight != pScrnPix->drawable.height)
-	pixSizeChanged = TRUE;
-
-    if (width != pScreen->width || height != pScreen->height)
-	winSizeChanged = TRUE;
-
-    if (pixSizeChanged)
-    {
-	if (pRoot && pScrn->vtSema)
-	    (*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
-
-	/* Let the driver update virtualX and virtualY */
-	if (!(*config->funcs->resize)(pScrn, pixWidth, pixHeight))
-	    goto finish;
-    }
+    /* Let the driver update virtualX and virtualY */
+    if (!(*config->funcs->resize)(pScrn, width, height))
+	goto finish;
 
     ret = TRUE;
-
-    if (winSizeChanged)
-    {
-	/* Update panning information */
-	for (c = 0; c < config->num_crtc; c++) {
-	    xf86CrtcPtr crtc = config->crtc[c];
-	    if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 ||
-		crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
-		if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
-		    crtc->panningTotalArea.x2 += width  - pScreen->width;
-		if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
-		    crtc->panningTotalArea.y2 += height - pScreen->height;
-		if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1)
-		    crtc->panningTrackingArea.x2 += width  - pScreen->width;
-		if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1)
-		    crtc->panningTrackingArea.y2 += height - pScreen->height;
-		xf86RandR13VerifyPanningArea (crtc, width, height);
-		xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
-	    }
+    /* Update panning information */
+    for (c = 0; c < config->num_crtc; c++) {
+	xf86CrtcPtr crtc = config->crtc[c];
+	if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 ||
+	    crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
+	    if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
+		crtc->panningTotalArea.x2 += width  - pScreen->width;
+	    if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
+		crtc->panningTotalArea.y2 += height - pScreen->height;
+	    if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1)
+		crtc->panningTrackingArea.x2 += width  - pScreen->width;
+	    if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1)
+		crtc->panningTrackingArea.y2 += height - pScreen->height;
+	    xf86RandR13VerifyPanningArea (crtc, width, height);
+	    xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
 	}
     }
 
     pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
-    pScreen->width = width;
-    pScreen->height = height;
-    if (pRoot)
-    {
-	BoxRec	box;
-
-	pRoot->drawable.width = width;
-	pRoot->drawable.height = height;
-	box.x1 = 0;
-	box.y1 = 0;
-	box.x2 = width;
-	box.y2 = height;
-	RegionInit(&pRoot->winSize, &box, 1);
-	RegionInit(&pRoot->borderSize, &box, 1);
-    }
-    pScrnPix->drawable.width = pixWidth;
-    pScrnPix->drawable.height = pixHeight;
+    pScreen->width = pScrnPix->drawable.width = width;
+    pScreen->height = pScrnPix->drawable.height = height;
     randrp->mmWidth = pScreen->mmWidth = mmWidth;
     randrp->mmHeight = pScreen->mmHeight = mmHeight;
 
-    if (winSizeChanged)
-    {
-	xf86SetViewport (pScreen, pScreen->width-1, pScreen->height-1);
-	xf86SetViewport (pScreen, 0, 0);
-    }
+    xf86SetViewport (pScreen, pScreen->width-1, pScreen->height-1);
+    xf86SetViewport (pScreen, 0, 0);
 
 finish:
-    if (pixSizeChanged)
-    {
-	if (pRoot && pScrn->vtSema)
-	    (*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE);
-    }
-
+    if (pRoot && pScrn->vtSema)
+	(*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE);
 #if RANDR_12_INTERFACE
     if (xf86RandR12Key && pScreen->root && ret)
 	RRScreenSizeNotify (pScreen);
@@ -861,8 +818,6 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
 	xf86RandR12ScreenSetSize (pScreen,
 				  width,
 				  height,
-				  width,
-				  height,
 				  mmWidth,
 				  mmHeight);
     }
diff --git a/randr/mirrcrtc.c b/randr/mirrcrtc.c
index a9ee6b4..d493a0e 100644
--- a/randr/mirrcrtc.c
+++ b/randr/mirrcrtc.c
@@ -28,6 +28,11 @@ miRRSetScreenConfig(ScreenPtr screen,
 {
     RRScreenConfigRec	old_screen_config;
 
+    /* XXX deal with separate pixmap/screen sizes */
+    if (screen_config->screen_pixmap_width != screen_config->screen_width ||
+	screen_config->screen_pixmap_height != screen_config->screen_height)
+	return FALSE;
+
     RRScreenCurrentConfig(screen, &old_screen_config);
 
     /* Check and see if nothing has changed */
@@ -42,8 +47,6 @@ miRRSetScreenConfig(ScreenPtr screen,
     return RRScreenSizeSet(screen,
 			   screen_config->screen_width,
 			   screen_config->screen_height,
-			   screen_config->screen_pixmap_width,
-			   screen_config->screen_pixmap_height,
 			   screen_config->mm_width,
 			   screen_config->mm_height);
 }
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 7c553f2..8240824 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -191,8 +191,6 @@ struct _rrOutput {
 typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr	pScreen,
 					CARD16		width,
 					CARD16		height,
-					CARD16		pixWidth,
-					CARD16		pixHeight,
 					CARD32		mmWidth,
 					CARD32		mmHeight);
 					
@@ -480,8 +478,6 @@ extern _X_EXPORT Bool
 RRScreenSizeSet (ScreenPtr  pScreen,
 		 CARD16	    width,
 		 CARD16	    height,
-		 CARD16	    pixWidth,
-		 CARD16	    pixHeight,
 		 CARD32	    mmWidth,
 		 CARD32	    mmHeight);
 
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 97aa3d7..0b2bc28 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -435,9 +435,10 @@ RRCrtcCurrentConfig(RRCrtcPtr crtc,
     crtc_config->sprite_position_f_transform = crtc->client_sprite_f_position_transform;
     crtc_config->sprite_image_f_transform = crtc->client_sprite_f_image_transform;
 
-    crtc_config->pixmap = crtc->scanoutPixmap;
-    crtc_config->pixmap_x = crtc->x;
-    crtc_config->pixmap_y = crtc->y;
+    /* XXX add pixmap stuff */
+    crtc_config->pixmap = NULL;
+    crtc_config->pixmap_x = 0;
+    crtc_config->pixmap_y = 0;
     return TRUE;
 }
 
@@ -1509,8 +1510,6 @@ RRConvertCrtcConfig(ClientPtr client, ScreenPtr screen,
 
     if (x->pixmap == None)
 	pixmap = NULL;
-    else if (x->pixmap == RR_CurrentScanoutPixmap)
-	pixmap = crtc->scanoutPixmap;
     else
     {
 	rc = dixLookupResourceByType((pointer *) &pixmap, x->pixmap,
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 0efc62e..c738726 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -168,8 +168,6 @@ Bool
 RRScreenSizeSet (ScreenPtr  pScreen,
 		 CARD16	    width,
 		 CARD16	    height,
-		 CARD16	    pixWidth,
-		 CARD16	    pixHeight,
 		 CARD32	    mmWidth,
 		 CARD32	    mmHeight)
 {
@@ -180,7 +178,6 @@ RRScreenSizeSet (ScreenPtr  pScreen,
     {
 	return (*pScrPriv->rrScreenSetSize) (pScreen,
 					     width, height,
-					     pixWidth, pixHeight,
 					     mmWidth, mmHeight);
     }
 #endif
@@ -321,7 +318,6 @@ ProcRRSetScreenSize (ClientPtr client)
     }
     if (!RRScreenSizeSet (pScreen, 
 			  stuff->width, stuff->height,
-			  stuff->width, stuff->height,
 			  stuff->widthInMillimeters,
 			  stuff->heightInMillimeters))
     {
@@ -965,7 +961,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 		goto sendReply;
 	    }
 	}
-	if (!RRScreenSizeSet (pScreen, width, height, width, height,
+	if (!RRScreenSizeSet (pScreen, width, height,
 			      pScreen->mmWidth, pScreen->mmHeight))
 	{
 	    rep.status = RRSetConfigFailed;
commit 4d91e7a63161cdde9af53aedb3fe3e53dbe3049e
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:17:20 2011 -0800

    Revert "ProcRRSetCrtcConfigs uses 'configs' without being initialized"
    
    This reverts commit b0f4bd61f0caf80f3be9a176f1f7a707bc6628d8.

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 0fc8188..97aa3d7 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -1682,9 +1682,9 @@ ProcRRSetCrtcConfigs (ClientPtr client)
     rrScrPrivPtr	    scr_priv;
     xRRCrtcConfig	    *x_configs;
     RRScreenConfigRec	    screen_config;
-    RRCrtcConfigPtr	    configs = NULL;
+    RRCrtcConfigPtr	    configs;
     RROutput		    *output_ids;
-    int			    num_configs = 0;
+    int			    num_configs;
     int			    rc, i;
     int			    extra_len;
     int			    num_output_ids;
commit 00d0b235cfbfb162ddd58c088d2ed03e55a9c5cb
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 23 11:16:48 2011 -0800

    Revert "randr: handle RRSetCrtcConfigs request with zero configs"
    
    This reverts commit 0d01b66df9081ef48843b3bad81c56bb2cd1ae69.

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 5fe6900..0fc8188 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -1750,6 +1750,9 @@ ProcRRSetCrtcConfigs (ClientPtr client)
     screen_config.mm_width = stuff->widthInMillimeters;
     screen_config.mm_height = stuff->heightInMillimeters;
 
+    if (num_configs == 0)
+	return Success;
+
     output_ids = (RROutput *) (x_configs + num_configs);
 
     /*
@@ -1757,7 +1760,7 @@ ProcRRSetCrtcConfigs (ClientPtr client)
      * server crtc configurations
      */
     configs = calloc(num_configs, sizeof (RRCrtcConfigRec));
-    if (num_configs > 0 && configs == NULL)
+    if (!configs)
 	return BadAlloc;
     for (i = 0; i < num_configs; i++) {
 	rc = RRConvertCrtcConfig(client, screen, &screen_config,
@@ -1770,8 +1773,7 @@ ProcRRSetCrtcConfigs (ClientPtr client)
 	output_ids += x_configs[i].nOutput;
     }
 
-    if (num_configs &&
-	!RRSetCrtcConfigs (screen, &screen_config, configs, num_configs))
+    if (!RRSetCrtcConfigs (screen, &screen_config, configs, num_configs))
     {
 	rep.status = RRSetConfigFailed;
 	goto sendReply;
commit 720c895db9327bbdc32215a67236303d2ceafad4
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Feb 23 13:36:20 2011 -0500

    Add mode field to ConstrainCursorHarder
    
    For Pointer Barriers, the movement mode is important and must be passed
    through.
    
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/scrnintstr.h b/include/scrnintstr.h
index 9f4fbf3..a9357e8 100644
--- a/include/scrnintstr.h
+++ b/include/scrnintstr.h
@@ -404,7 +404,7 @@ typedef    void (* DeviceCursorCleanupProcPtr)(
         ScreenPtr    /* pScreen */);
 
 typedef void (*ConstrainCursorHarderProcPtr)(
-       DeviceIntPtr, ScreenPtr, int *, int *);
+       DeviceIntPtr, ScreenPtr, int, int *, int *);
 
 typedef struct _Screen {
     int			myNum;	/* index of this instance in Screens[] */
commit a16e282200f84233041e5a565c6363a5a78be525
Author: Adam Jackson <ajax at redhat.com>
Date:   Mon Feb 8 15:40:22 2010 -0500

    xfree86: Fix the sdk headers to be multilib-safe
    
    Use _LP64 (verified on gcc and sun compilers) instead of _XSERVER64 in
    internal header usage, and always define _XSERVER64 for modules if _LP64
    is defined.  Prevents differing xorg-server.h between 32 and 64 bit
    packages.
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/include/colormapst.h b/include/colormapst.h
index 0ba5bd0..b597e2c 100644
--- a/include/colormapst.h
+++ b/include/colormapst.h
@@ -103,12 +103,12 @@ typedef struct _ColormapRec
 {
     VisualPtr	pVisual;
     short	class;		/* PseudoColor or DirectColor */
-#if defined(_XSERVER64)
+#if defined(_LP64)
     short	pad0;
     XID		pad1;
 #endif
     XID		mid;		/* client's name for colormap */
-#if defined(_XSERVER64) && (X_BYTE_ORDER == X_LITTLE_ENDIAN)
+#if defined(_LP64) && (X_BYTE_ORDER == X_LITTLE_ENDIAN)
     XID		pad2;
 #endif
     ScreenPtr	pScreen;	/* screen map is associated with */
diff --git a/include/xorg-server.h.in b/include/xorg-server.h.in
index 76cab16..b10b994 100644
--- a/include/xorg-server.h.in
+++ b/include/xorg-server.h.in
@@ -157,9 +157,6 @@
 /* Name of X server */
 #undef __XSERVERNAME__
 
-/* Define to 1 if unsigned long is 64 bits. */
-#undef _XSERVER64
-
 /* Building vgahw module */
 #undef WITH_VGAHW
 
@@ -187,4 +184,8 @@
 /* X Access Control Extension */
 #undef XACE
 
+#ifdef _LP64
+#define _XSERVER64 1
+#endif
+
 #endif /* _XORG_SERVER_H_ */
commit dc498b433f36af5d2de3065e7c64cdb575385d81
Author: Adam Jackson <ajax at redhat.com>
Date:   Mon Feb 8 15:23:04 2010 -0500

    xfree86: If the driver found modes on an output, don't add more
    
    Inferring modes from sync ranges is only valid if the monitor says it's
    valid.  If the monitor says it's valid, then we'll have already added
    those modes during EDID block parse.  If it doesn't, then we should
    believe it.
    
    If there's no EDID for an output, but sync ranges from the config, we'll
    still add default modes as normal.
    
    Reviewed-by: Alex Deucher <alexdeucher at gmail.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index b5e9dc2..0ae63ba 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -1595,7 +1595,7 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
 	int		    min_clock = 0;
 	int		    max_clock = 0;
 	double		    clock;
-	Bool		    add_default_modes = xf86ReturnOptValBool(output->options, OPTION_DEFAULT_MODES, TRUE);
+	Bool		    add_default_modes;
 	Bool		    debug_modes = config->debug_modes ||
 					  xf86Initialising;
 	enum det_monrec_source sync_source = sync_default;
@@ -1641,6 +1641,14 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
 	}
 	
 	output_modes = (*output->funcs->get_modes) (output);
+
+	/*
+	 * If the user has a preference, respect it.
+	 * Otherwise, don't second-guess the driver.
+	 */
+	if (!xf86GetOptValBool(output->options, OPTION_DEFAULT_MODES,
+			       &add_default_modes))
+	    add_default_modes = (output_modes == NULL);
 	
 	edid_monitor = output->MonInfo;
 	
commit 303977fbcf9c641b7e19dfde192cef585f5b455c
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:52:49 2011 -0500

    glxproxy: warning fix
    
    glxvendor.c: In function ‘__glXVForwardPipe0WithReply’:
    glxvendor.c:205:10: warning: ‘be_buf’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxvendor.c b/hw/dmx/glxProxy/glxvendor.c
index 1d7b199..0b6ba41 100644
--- a/hw/dmx/glxProxy/glxvendor.c
+++ b/hw/dmx/glxProxy/glxvendor.c
@@ -202,7 +202,7 @@ int __glXVForwardPipe0WithReply( __GLXclientState *cl, GLbyte *pc )
    xGLXVendorPrivReply be_reply;
     __GLXcontext *glxc;
    int buf_size;
-   char *be_buf;
+   char *be_buf = NULL;
    int   be_buf_size;
    DMXScreenInfo *dmxScreen;
    Display *dpy;
commit 405ad0610d6e2f4606768294b655ac52aee9ae58
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:51:47 2011 -0500

    glxproxy: warning fix
    
    glxvendor.c: In function ‘__glXVForwardAllWithReply’:
    glxvendor.c:284:10: warning: ‘be_buf’ may be used uninitialized in this function
    glxvendor.c:285:10: warning: ‘be_buf_size’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxvendor.c b/hw/dmx/glxProxy/glxvendor.c
index 7ba727d..1d7b199 100644
--- a/hw/dmx/glxProxy/glxvendor.c
+++ b/hw/dmx/glxProxy/glxvendor.c
@@ -281,8 +281,8 @@ int __glXVForwardAllWithReply( __GLXclientState *cl, GLbyte *pc )
    xGLXVendorPrivReply be_reply;
     __GLXcontext *glxc;
    int buf_size;
-   char *be_buf;
-   int   be_buf_size;
+   char *be_buf = NULL;
+   int   be_buf_size = 0;
    int from_screen = 0;
    int to_screen = 0;
    int s;
commit a4cd2e0da6415ec1b3b182579bebbe2a41f29d30
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:47:05 2011 -0500

    glxproxy: warning fix
    
    glxsingle.c: In function ‘__glXForwardPipe0WithReply’:
    glxsingle.c:218:10: warning: ‘be_buf’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxsingle.c b/hw/dmx/glxProxy/glxsingle.c
index cc7b408..33cc612 100644
--- a/hw/dmx/glxProxy/glxsingle.c
+++ b/hw/dmx/glxProxy/glxsingle.c
@@ -215,7 +215,7 @@ int __glXForwardPipe0WithReply( __GLXclientState *cl, GLbyte *pc )
    xGLXSingleReply be_reply;
     __GLXcontext *glxc;
    int buf_size;
-   char *be_buf;
+   char *be_buf = NULL;
    int   be_buf_size;
    DMXScreenInfo *dmxScreen;
    Display *dpy;
commit f928caca6e60215bc9ab423acae5542dfabc9bec
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:45:31 2011 -0500

    glxproxy: warning fix
    
    glxsingle.c: In function ‘__glXForwardAllWithReply’:
    glxsingle.c:300:10: warning: ‘be_buf’ may be used uninitialized in this function
    glxsingle.c:301:10: warning: ‘be_buf_size’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxsingle.c b/hw/dmx/glxProxy/glxsingle.c
index ae8d65f..cc7b408 100644
--- a/hw/dmx/glxProxy/glxsingle.c
+++ b/hw/dmx/glxProxy/glxsingle.c
@@ -297,8 +297,8 @@ int __glXForwardAllWithReply( __GLXclientState *cl, GLbyte *pc )
    xGLXSingleReply be_reply;
     __GLXcontext *glxc;
    int buf_size;
-   char *be_buf;
-   int   be_buf_size;
+   char *be_buf = NULL;
+   int   be_buf_size = 0;
    int from_screen = 0;
    int to_screen = 0;
    int s;
commit dad2712c9328e113db4de768a12a8dafa6c177e9
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:44:03 2011 -0500

    glxproxy: warning fix
    
    glxsingle.c: In function ‘__glXDisp_ReadPixels’:
    glxsingle.c:760:11: warning: ‘buf’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxsingle.c b/hw/dmx/glxProxy/glxsingle.c
index 4c473ff..ae8d65f 100644
--- a/hw/dmx/glxProxy/glxsingle.c
+++ b/hw/dmx/glxProxy/glxsingle.c
@@ -811,6 +811,7 @@ int __glXDisp_ReadPixels(__GLXclientState *cl, GLbyte *pc)
     }
     else {
        buf_size = 0;
+       buf = NULL;
     }
 
     if (buf_size > 0) {
commit 4270157bac645550e2c0afe89479c0bfe9d53447
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:38:23 2011 -0500

    glxproxy: warning fix
    
    render2swap.c:264:13: warning: ‘swapArray’ defined but not used
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/render2swap.c b/hw/dmx/glxProxy/render2swap.c
index 5754ff4..81bb501 100644
--- a/hw/dmx/glxProxy/render2swap.c
+++ b/hw/dmx/glxProxy/render2swap.c
@@ -261,60 +261,6 @@ void __glXDispSwap_CallLists(GLbyte *pc)
 
 }
 
-static void swapArray(GLint numVals, GLenum datatype,
-                      GLint stride, GLint numVertexes, GLbyte *pc)
-{
-    int i,j;
-    __GLX_DECLARE_SWAP_VARIABLES;
-
-    switch (datatype) {
-      case GL_BYTE:
-      case GL_UNSIGNED_BYTE:
-	/* don't need to swap */
-	return;
-      case GL_SHORT:
-      case GL_UNSIGNED_SHORT:
-	for (i=0; i<numVertexes; i++) {
-	    GLshort *pVal = (GLshort *) pc;
-	    for (j=0; j<numVals; j++) {
-		__GLX_SWAP_SHORT(&pVal[j]);
-	    }
-	    pc += stride;
-	}
-	break;
-      case GL_INT:
-      case GL_UNSIGNED_INT:
-	for (i=0; i<numVertexes; i++) {
-	    GLint *pVal = (GLint *) pc;
-	    for (j=0; j<numVals; j++) {
-		__GLX_SWAP_INT(&pVal[j]);
-	    }
-	    pc += stride;
-	}
-	break;
-      case GL_FLOAT:
-	for (i=0; i<numVertexes; i++) {
-	    GLfloat *pVal = (GLfloat *) pc;
-	    for (j=0; j<numVals; j++) {
-		__GLX_SWAP_FLOAT(&pVal[j]);
-	    }
-	    pc += stride;
-	}
-	break;
-      case GL_DOUBLE:
-	for (i=0; i<numVertexes; i++) {
-	    GLdouble *pVal = (GLdouble *) pc;
-	    for (j=0; j<numVals; j++) {
-		__GLX_SWAP_DOUBLE(&pVal[j]);
-	    }
-	    pc += stride;
-	}
-	break;
-      default:
-	return;
-    }
-}
-
 void __glXDispSwap_DrawArrays(GLbyte *pc)
 {
     __GLXdispatchDrawArraysHeader *hdr = (__GLXdispatchDrawArraysHeader *)pc;
commit 5d0910b4fdf99e3239635a01eb2709c32d0e5bb9
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:32:54 2011 -0500

    glxproxy: warning fix
    
    glxcmds.c: In function ‘CreateGLXPixmap’:
    glxcmds.c:1663:20: warning: comparison between pointer and integer
    glxcmds.c:1663:38: warning: comparison between pointer and integer
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxcmds.c b/hw/dmx/glxProxy/glxcmds.c
index 6196540..f79264e 100644
--- a/hw/dmx/glxProxy/glxcmds.c
+++ b/hw/dmx/glxProxy/glxcmds.c
@@ -1660,7 +1660,7 @@ static int CreateGLXPixmap(__GLXclientState *cl,
 	return BadMatch;
     }
 
-    if (fbconfigId == NULL && visual == NULL) {
+    if (fbconfigId == 0 && visual == 0) {
 	  return BadValue;
     }
 
commit e1b5d3e5e7f157ab769c40ad2efdc1281c25a03a
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:18:53 2011 -0500

    glxproxy: warning fix
    
    glxcmds.c: In function ‘CreateGLXPixmap’:
    glxcmds.c:1641:22: warning: ‘pGlxScreen’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxcmds.c b/hw/dmx/glxProxy/glxcmds.c
index d38319a..6196540 100644
--- a/hw/dmx/glxProxy/glxcmds.c
+++ b/hw/dmx/glxProxy/glxcmds.c
@@ -1733,6 +1733,7 @@ static int CreateGLXPixmap(__GLXclientState *cl,
     else {
        pVisual = NULL;
        pGlxVisual = NULL;
+       pGlxScreen = &__glXActiveScreens[pDraw->pScreen->myNum];
     }
 
     pGlxPixmap = (__GLXpixmap *) malloc(sizeof(__GLXpixmap));
commit 3b9de273a94fb68de51238c20c3182396aa41b84
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:07:20 2011 -0500

    glxproxy: warning fix
    
    glxcmds.c: In function ‘CreateContext.clone.6’:
    glxcmds.c:105:19: warning: ‘be_fbconfigId’ may be used uninitialized in this function
    glxcmds.c:104:14: warning: ‘be_vid’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxcmds.c b/hw/dmx/glxProxy/glxcmds.c
index 72ecdea..d38319a 100644
--- a/hw/dmx/glxProxy/glxcmds.c
+++ b/hw/dmx/glxProxy/glxcmds.c
@@ -101,8 +101,8 @@ static int CreateContext(__GLXclientState *cl,
     int from_screen = screen;
     int to_screen = screen;
     DMXScreenInfo *dmxScreen;
-    VisualID be_vid;
-    GLXFBConfigID be_fbconfigId;
+    VisualID be_vid = 0;
+    GLXFBConfigID be_fbconfigId = 0;
     int num_be_screens;
     Display *dpy;
     
commit 767b93e783a981b4fc926299a85a1a18387e693a
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 14:02:37 2011 -0500

    glxproxy: warning fix
    
    glxcmds.c: In function ‘__glXGetDrawableAttributes’:
    glxcmds.c:3295:8: warning: ‘screen’ may be used uninitialized in this function
    glxcmds.c:3298:8: warning: ‘attribs_size’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxcmds.c b/hw/dmx/glxProxy/glxcmds.c
index cbefdfa..72ecdea 100644
--- a/hw/dmx/glxProxy/glxcmds.c
+++ b/hw/dmx/glxProxy/glxcmds.c
@@ -3295,27 +3295,23 @@ int __glXGetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
    int screen, rc;
    DMXScreenInfo *dmxScreen;
    CARD32 *attribs = NULL;
-   int attribs_size;
+   int attribs_size = 0;
 #ifdef PANORAMIX
     PanoramiXRes *pXinDraw = NULL;
 #endif
 
    if (drawId != None) {
       rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
-      if (rc == Success) {
-	 if (pDraw->type == DRAWABLE_WINDOW) {
-		WindowPtr pWin = (WindowPtr)pDraw;
-		be_drawable = 0;
-		screen = pWin->drawable.pScreen->myNum;
-
-	 }
-	 else {
-	    /*
-	     ** Drawable is not a Window , GLXWindow or a GLXPixmap.
-	     */
-	    client->errorValue = drawId;
-	    return __glXBadDrawable;
-	 }
+      if (rc == Success && pDraw->type == DRAWABLE_WINDOW) {
+	 WindowPtr pWin = (WindowPtr)pDraw;
+	 be_drawable = 0;
+	 screen = pWin->drawable.pScreen->myNum;
+      } else {
+	 /*
+	  ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+	  */
+	 client->errorValue = drawId;
+	 return __glXBadDrawable;
       }
 
       if (!pDraw) {
@@ -3353,17 +3349,15 @@ int __glXGetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
 	    be_drawable = pGlxPbuffer->be_xids[screen];
 	 }
       }
-
-
-      if (!pDraw) {
-	 /*
-	  ** Drawable is not a Window , GLXWindow or a GLXPixmap.
-	  */
-	 client->errorValue = drawId;
-	 return __glXBadDrawable;
-      }
     }
 
+    if (!pDraw) {
+	/*
+	 ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+	 */
+	client->errorValue = drawId;
+	return __glXBadDrawable;
+   }
 
    /* if the drawable is a window or GLXWindow - 
     * we need to find the base id on the back-end server
commit a391089186cd1063d807bf14a9651e6861b248de
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Feb 8 13:55:23 2011 -0500

    glxproxy: warning fix
    
    glxcmds.c: In function ‘__glXChangeDrawableAttributes’:
    glxcmds.c:3464:8: warning: ‘screen’ may be used uninitialized in this function
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/dmx/glxProxy/glxcmds.c b/hw/dmx/glxProxy/glxcmds.c
index a58eb35..cbefdfa 100644
--- a/hw/dmx/glxProxy/glxcmds.c
+++ b/hw/dmx/glxProxy/glxcmds.c
@@ -3466,20 +3466,15 @@ int __glXChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
 
    if (drawId != None) {
       rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixSetAttrAccess);
-      if (rc == Success) {
-	 if (pDraw->type == DRAWABLE_WINDOW) {
-		WindowPtr pWin = (WindowPtr)pDraw;
-		be_drawable = 0;
-		screen = pWin->drawable.pScreen->myNum;
-
-	 }
-	 else {
-	    /*
-	     ** Drawable is not a Window , GLXWindow or a GLXPixmap.
-	     */
-	    client->errorValue = drawId;
-	    return __glXBadDrawable;
-	 }
+      if (rc == Success && pDraw->type == DRAWABLE_WINDOW) {
+	  be_drawable = 0;
+	  screen = pDraw->pScreen->myNum;
+      } else {
+	 /*
+	  ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+	  */
+	 client->errorValue = drawId;
+	 return __glXBadDrawable;
       }
 
       if (!pDraw) {
@@ -3517,17 +3512,15 @@ int __glXChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
 	    be_drawable = pGlxPbuffer->be_xids[screen];
 	 }
       }
+   }
 
-
-      if (!pDraw) {
+   if (!pDraw) {
 	 /*
 	  ** Drawable is not a Window , GLXWindow or a GLXPixmap.
 	  */
 	 client->errorValue = drawId;
 	 return __glXBadDrawable;
-      }
-    }
-
+   }
 
    /* if the drawable is a window or GLXWindow - 
     * we need to find the base id on the back-end server
commit 4102a00962f568b1d34cf72ad524e1cc705b0b1c
Author: Cyril Brulebois <kibi at debian.org>
Date:   Wed Feb 23 14:44:23 2011 +0100

    xfree86: Fix undefined reference to `XNFsprintf' on sparc.
    
    Build failure on sparc:
    | copying selected object files to avoid basename conflicts...
    |   CCLD   Xorg
    | ./.libs/libxorg.a(xf86sbusBus.o): In function `xf86SbusConfigureNewDev':
    | […]/hw/xfree86/common/xf86sbusBus.c:712: undefined reference to `XNFsprintf'
    | collect2: ld returned 1 exit status
    
    Fix typo introduced in:
      3a9bb93dd178084f4ff1abcea331ca5a62f88ce6
    
    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Apologized-for-by: Alan Coopersmith <alan.coopersmith at oracle.com>
    Signed-off-by: Cyril Brulebois <kibi at debian.org>

diff --git a/hw/xfree86/common/xf86sbusBus.c b/hw/xfree86/common/xf86sbusBus.c
index 8cfac84..181c6ab 100644
--- a/hw/xfree86/common/xf86sbusBus.c
+++ b/hw/xfree86/common/xf86sbusBus.c
@@ -709,6 +709,6 @@ xf86SbusConfigureNewDev(void *busData, sbusDevicePtr sBus, GDevRec *GDev)
         XNFasprintf(&GDev->busID, "SBUS:%s", promPath);
         free(promPath);
     } else {
-        XNFsprintf(&GDev->busID, "SBUS:fb%d", sBus->fbNum);
+        XNFasprintf(&GDev->busID, "SBUS:fb%d", sBus->fbNum);
     }
 }
commit 93a73993708b1345c86ec3ec06b02ed236595673
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 21 15:40:40 2011 +1000

    test: write some event → XI1 conversion tests.
    
    Don't test everything, but hey, life is short and I'm trying to have one.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/test/input.c b/test/input.c
index 879e14f..e0e9e6a 100644
--- a/test/input.c
+++ b/test/input.c
@@ -36,6 +36,7 @@
 #include "inputstr.h"
 #include "eventconvert.h"
 #include "exevents.h"
+#include "exglobals.h"
 #include "dixgrabs.h"
 #include "eventstr.h"
 #include "inpututils.h"
@@ -285,6 +286,143 @@ static void dix_event_to_core_conversion(void)
     dix_event_to_core(ET_Motion);
 }
 
+static void
+_dix_test_xi_convert(DeviceEvent *ev, int expected_rc, int expected_count)
+{
+    xEvent *xi;
+    int count = 0;
+    int rc;
+
+    rc = EventToXI((InternalEvent*)ev, &xi, &count);
+    g_assert(rc == expected_rc);
+    g_assert(count >= expected_count);
+    if (count > 0){
+        deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer*)xi;
+        g_assert(kbp->type == IEventBase + ev->type);
+        g_assert(kbp->detail == ev->detail.key);
+        g_assert(kbp->time == ev->time);
+        g_assert((kbp->deviceid & ~MORE_EVENTS) == ev->deviceid);
+        g_assert(kbp->root_x == ev->root_x);
+        g_assert(kbp->root_y == ev->root_y);
+        g_assert(kbp->state == ev->corestate);
+        g_assert(kbp->event_x == 0);
+        g_assert(kbp->event_y == 0);
+        g_assert(kbp->root == ev->root);
+        g_assert(kbp->event == 0);
+        g_assert(kbp->child == 0);
+        g_assert(kbp->same_screen == FALSE);
+
+        while (--count > 0) {
+            deviceValuator *v = (deviceValuator*)&xi[count];
+            g_assert(v->type == DeviceValuator);
+            g_assert(v->num_valuators <= 6);
+        }
+
+
+        free(xi);
+    }
+}
+
+/**
+ * This tests for internal event → XI1 event conversion
+ * - all conversions should generate the right XI event type
+ * - right number of events generated
+ * - extra events are valuators
+ */
+static void dix_event_to_xi1_conversion(void)
+{
+    DeviceEvent ev = {0};
+    int time;
+    int x, y;
+    int state;
+    int detail;
+    const int ROOT_WINDOW_ID = 0x100;
+    int deviceid;
+
+    IEventBase = 80;
+    DeviceValuator      = IEventBase - 1;
+    DeviceKeyPress      = IEventBase + ET_KeyPress;
+    DeviceKeyRelease    = IEventBase + ET_KeyRelease;
+    DeviceButtonPress   = IEventBase + ET_ButtonPress;
+    DeviceButtonRelease = IEventBase + ET_ButtonRelease;
+    DeviceMotionNotify  = IEventBase + ET_Motion;
+    DeviceFocusIn       = IEventBase + ET_FocusIn;
+    DeviceFocusOut      = IEventBase + ET_FocusOut;
+    ProximityIn         = IEventBase + ET_ProximityIn;
+    ProximityOut        = IEventBase + ET_ProximityOut;
+
+    /* EventToXI callocs */
+    x = 0;
+    y = 0;
+    time = 12345;
+    state = 0;
+    detail = 0;
+    deviceid = 4;
+
+    ev.header   = 0xFF;
+
+    ev.header           = 0xFF;
+    ev.length           = sizeof(DeviceEvent);
+    ev.time             = time;
+    ev.root_y           = x;
+    ev.root_x           = y;
+    SetBit(ev.valuators.mask, 0);
+    SetBit(ev.valuators.mask, 1);
+    ev.root             = ROOT_WINDOW_ID;
+    ev.corestate        = state;
+    ev.detail.key       = detail;
+    ev.deviceid         = deviceid;
+
+    /* test all types for bad match */
+    ev.type = ET_KeyPress;         _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_KeyRelease;       _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_ButtonPress;      _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_ButtonRelease;    _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_Motion;           _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_ProximityIn;      _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_ProximityOut;     _dix_test_xi_convert(&ev, Success, 1);
+
+    /* No axes */
+    ClearBit(ev.valuators.mask, 0);
+    ClearBit(ev.valuators.mask, 1);
+    ev.type = ET_KeyPress;         _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_KeyRelease;       _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_ButtonPress;      _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_ButtonRelease;    _dix_test_xi_convert(&ev, Success, 1);
+    ev.type = ET_Motion;           _dix_test_xi_convert(&ev, BadMatch, 0);
+    ev.type = ET_ProximityIn;      _dix_test_xi_convert(&ev, BadMatch, 0);
+    ev.type = ET_ProximityOut;     _dix_test_xi_convert(&ev, BadMatch, 0);
+
+    /* more than 6 axes → 2 valuator events */
+    SetBit(ev.valuators.mask, 0);
+    SetBit(ev.valuators.mask, 1);
+    SetBit(ev.valuators.mask, 2);
+    SetBit(ev.valuators.mask, 3);
+    SetBit(ev.valuators.mask, 4);
+    SetBit(ev.valuators.mask, 5);
+    SetBit(ev.valuators.mask, 6);
+    ev.type = ET_KeyPress;         _dix_test_xi_convert(&ev, Success, 2);
+    ev.type = ET_KeyRelease;       _dix_test_xi_convert(&ev, Success, 2);
+    ev.type = ET_ButtonPress;      _dix_test_xi_convert(&ev, Success, 2);
+    ev.type = ET_ButtonRelease;    _dix_test_xi_convert(&ev, Success, 2);
+    ev.type = ET_Motion;           _dix_test_xi_convert(&ev, Success, 2);
+    ev.type = ET_ProximityIn;      _dix_test_xi_convert(&ev, Success, 2);
+    ev.type = ET_ProximityOut;     _dix_test_xi_convert(&ev, Success, 2);
+
+
+    /* keycode too high */
+    ev.type = ET_KeyPress;
+    ev.detail.key = 256;
+    _dix_test_xi_convert(&ev, Success, 0);
+
+    /* deviceid too high */
+    ev.type = ET_KeyPress;
+    ev.detail.key = 18;
+    ev.deviceid = 128;
+    _dix_test_xi_convert(&ev, Success, 0);
+}
+
+
 static void xi2_struct_sizes(void)
 {
 #define compare(req) \
@@ -1070,6 +1208,7 @@ int main(int argc, char** argv)
     g_test_add_func("/dix/input/attributes", dix_input_attributes);
     g_test_add_func("/dix/input/init-valuators", dix_init_valuators);
     g_test_add_func("/dix/input/event-core-conversion", dix_event_to_core_conversion);
+    g_test_add_func("/dix/input/event-xi1-conversion", dix_event_to_xi1_conversion);
     g_test_add_func("/dix/input/check-grab-values", dix_check_grab_values);
     g_test_add_func("/dix/input/xi2-struct-sizes", xi2_struct_sizes);
     g_test_add_func("/dix/input/grab_matching", dix_grab_matching);
commit 4cdf1013771bc86fe2f6d9223bc4a46753bc918f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 21 15:32:57 2011 +1000

    dix: a valuator number of 0 is valid (#34510)
    
    For all but motion and proximity events, having no valuators is ok.
    Regression from 1.9, keyboard events are not converted to protocol events.
    
    X.Org Bug 34510 <http://bugs.freedesktop.org/show_bug.cgi?id=34510>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>
    Tested-by: Timo Aaltonen <timo.aaltonen at canonical.com>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 7b894f0..dd1ca46 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -263,8 +263,20 @@ eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count)
     num_events = (countValuators(ev, &first) + 5)/6; /* valuator ev */
     if (num_events <= 0)
     {
-        *count = 0;
-        return BadMatch;
+        switch (ev->type)
+        {
+            case ET_KeyPress:
+            case ET_KeyRelease:
+            case ET_ButtonPress:
+            case ET_ButtonRelease:
+                /* no axes is ok */
+                break;
+            case ET_Motion:
+            case ET_ProximityIn:
+            case ET_ProximityOut:
+                *count = 0;
+                return BadMatch;
+        }
     }
 
     num_events++; /* the actual event event */
commit b4ef34d4664e0eaac7211f7a22a2025958aa1527
Author: Maarten Maathuis <madman2003 at gmail.com>
Date:   Sun Feb 20 11:59:41 2011 +0100

    Revert "exa/mixed: Exclude frontbuffer from deferred pixmap handling."
    
    This reverts commit 541b25038a5de74411a094570b407c5ae018c2ba.
    
    - It turns out that the high latency was a driver problem.
    - catting a large amount of text turns out to look prettier when the
      throughput is lower, but it's not worth the loss for a minor
      improvement that may not even exist on someone else's computer.
    
    Reviewed-by: Michel Dänzer <michel at daenzer.net>
    Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
index 4f49905..fb47151 100644
--- a/exa/exa_migration_mixed.c
+++ b/exa/exa_migration_mixed.c
@@ -138,7 +138,6 @@ void
 exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure)
 {
     PixmapPtr pPixmap = closure;
-    ScreenPtr pScreen = pPixmap->drawable.pScreen;
     ExaPixmapPriv(pPixmap);
 
     /* Move back results of software rendering on system memory copy of mixed driver
@@ -150,18 +149,10 @@ exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure)
     if (!pExaPixmap->use_gpu_copy && exaPixmapHasGpuCopy(pPixmap)) {
 	ExaScreenPriv(pPixmap->drawable.pScreen);
 
-	/* Front buffer: Don't wait for the block handler to copy back the data.
-	 * This avoids annoying latency if you encounter a lot of software rendering.
-	 */
-	if (pPixmap == pScreen->GetScreenPixmap(pScreen))
-		exaMoveInPixmap_mixed(pPixmap);
-	else {
-		if (pExaScr->deferred_mixed_pixmap &&
-		    pExaScr->deferred_mixed_pixmap != pPixmap)
-		    exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
-
-		pExaScr->deferred_mixed_pixmap = pPixmap;
-	}
+	if (pExaScr->deferred_mixed_pixmap &&
+	    pExaScr->deferred_mixed_pixmap != pPixmap)
+	    exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
+	pExaScr->deferred_mixed_pixmap = pPixmap;
     }
 }
 
commit 443d75446bcbe7d97a23860a1e2d46c0b7e7cb26
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Feb 18 14:46:33 2011 -0800

    Version bumped to 1.9.99.902 (1.10 RC2)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index 9b3e2be..ac4bf8c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,8 +26,8 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.57)
-AC_INIT([xorg-server], 1.9.99.901, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
-RELEASE_DATE="2010-12-06"
+AC_INIT([xorg-server], 1.9.99.902, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+RELEASE_DATE="2011-2-18"
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
 AM_MAINTAINER_MODE
commit 2c77aeb39f59f1a94cc603a2e6256a62ce785c36
Merge: 816d67d... 402b329...
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Feb 18 14:29:32 2011 -0800

    Merge remote branch 'jcristau/for-keith'

commit 816d67de2ba9bdfe652da32cb6447a3056342b98
Merge: a73c28f... 3bbb70a...
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Feb 18 12:20:26 2011 -0800

    Merge remote branch 'whot/for-keith'

commit a73c28f0bdafb1c5cb8129179188a99c0ca052e2
Author: Justin Dou <Justin.Dou at intel.com>
Date:   Thu Feb 10 16:27:29 2011 -0500

    Replace malloc with calloc to initialize the buffers[] as NULL in do_get_buffers function
    
    The calling for allocate_or_reuse_buffer may fail due to some reason, e.g. out of memory.
    If the buffers[] were not initialized to be NULL, the following err_out may try to access an illegal memory, which will cause X crash afterward.
    
    Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>
    Signed-off-by: Justin Dou <Justin.Dou at intel.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 39996f9..9ca378f 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -403,7 +403,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 	&& (pDraw->height == pPriv->height)
 	&& (pPriv->serialNumber == DRI2DrawableSerial(pDraw));
 
-    buffers = malloc((count + 1) * sizeof(buffers[0]));
+    buffers = calloc((count + 1), sizeof(buffers[0]));
 
     for (i = 0; i < count; i++) {
 	const unsigned attachment = *(attachments++);
commit 0bc9b15a622377c57e617411ccd26c4b5bf8cba4
Merge: d1123b6... 93cd4b1...
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Feb 18 12:04:41 2011 -0800

    Merge remote branch 'ajax/for-keithp'

commit d1123b66ebbcf96dd816236f54befc568a5f7c68
Merge: 5d020c3... f6e4ace...
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Feb 18 11:59:25 2011 -0800

    Merge remote branch 'jturney/master'

commit 3bbb70a1a7b24d3d1375b20a13db7011cf961c86
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Feb 16 07:56:58 2011 +1000

    xfree86: fix up an out-of-date comment.
    
    InitInput simply initialises all input devices now.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index a1fda54..e664ce4 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -808,7 +808,7 @@ InitInput(int argc, char **argv)
 
     GetEventList(&xf86Events);
 
-    /* Call the PreInit function for each input device instance. */
+    /* Initialize all configured input devices */
     for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
         /* Replace obsolete keyboard driver with kbd */
         if (!xf86NameCmp((*pDev)->driver, "keyboard")) {
commit 402b329c3aa8ddbebaa1f593306a02d4cd6fed26
Author: Julien Cristau <jcristau at debian.org>
Date:   Sun Jan 23 13:35:54 2011 +0100

    glx: Work around wrong request lengths sent by mesa
    
    mesa used to send too long requests for GLXDestroyPixmap,
    GLXDestroyWindow, GLXChangeDrawableAttributes, GLXGetDrawableAttributes
    and GLXGetFBConfigsSGIX.
    
    Fixes a regression introduced in ec9c97c6bf70b523bc500bd3adf62176f1bb33a4
    X.Org bug#33324 <https://bugs.freedesktop.org/show_bug.cgi?id=33324>
    
    Reported-by: xunx.fang at intel.com
    Signed-off-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 5d633df..9b4bc9e 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1132,7 +1132,8 @@ int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
 {
     ClientPtr client = cl->client;
     xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
-    REQUEST_SIZE_MATCH(xGLXGetFBConfigsSGIXReq);
+    /* work around mesa bug, don't use REQUEST_SIZE_MATCH */
+    REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
     return DoGetFBConfigs(cl, req->screen);
 }
 
@@ -1356,7 +1357,9 @@ int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
     ClientPtr client = cl->client;
     xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc;
 
-    REQUEST_SIZE_MATCH(xGLXDestroyPixmapReq);
+    /* should be REQUEST_SIZE_MATCH, but mesa's glXDestroyPixmap used to set
+     * length to 3 instead of 2 */
+    REQUEST_AT_LEAST_SIZE(xGLXDestroyPixmapReq);
 
     return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
 }
@@ -1498,7 +1501,13 @@ int __glXDisp_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
 	client->errorValue = req->numAttribs;
 	return BadValue;
     }
+#if 0
+    /* mesa sends an additional 8 bytes */
     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
+#else
+    if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len)
+	    return BadLength;
+#endif
 
     return DoChangeDrawableAttributes(cl->client, req->drawable,
 				      req->numAttribs, (CARD32 *) (req + 1));
@@ -1563,7 +1572,8 @@ int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
     ClientPtr client = cl->client;
     xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
 
-    REQUEST_SIZE_MATCH(xGLXDestroyWindowReq);
+    /* mesa's glXDestroyWindow used to set length to 3 instead of 2 */
+    REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
 
     return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW);
 }
@@ -1872,7 +1882,8 @@ int __glXDisp_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
     ClientPtr client = cl->client;
     xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
 
-    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesReq);
+    /* this should be REQUEST_SIZE_MATCH, but mesa sends an additional 4 bytes */
+    REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
 
     return DoGetDrawableAttributes(cl, req->drawable);
 }
diff --git a/glx/glxcmdsswap.c b/glx/glxcmdsswap.c
index d58de62..76e6fb6 100644
--- a/glx/glxcmdsswap.c
+++ b/glx/glxcmdsswap.c
@@ -279,7 +279,7 @@ int __glXDispSwap_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
     xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
     __GLX_DECLARE_SWAP_VARIABLES;
 
-    REQUEST_SIZE_MATCH(xGLXGetFBConfigsSGIXReq);
+    REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
 
     __GLX_SWAP_INT(&req->screen);
     return __glXDisp_GetFBConfigsSGIX(cl, pc);
@@ -368,7 +368,7 @@ int __glXDispSwap_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
     xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
     __GLX_DECLARE_SWAP_VARIABLES;
 
-    REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
+    REQUEST_AT_LEAST_SIZE(xGLXDestroyGLXPixmapReq);
 
     __GLX_SWAP_SHORT(&req->length);
     __GLX_SWAP_INT(&req->glxpixmap);
@@ -476,7 +476,9 @@ int __glXDispSwap_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
 	client->errorValue = req->numAttribs;
 	return BadValue;
     }
-    REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
+    if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len)
+	return BadLength;
+
     attribs = (CARD32*)(req + 1);
     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
 
@@ -542,7 +544,7 @@ int __glXDispSwap_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
     xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
     __GLX_DECLARE_SWAP_VARIABLES;
 
-    REQUEST_SIZE_MATCH(xGLXDestroyWindowReq);
+    REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
 
     __GLX_SWAP_INT(&req->glxwindow);
 
@@ -742,7 +744,7 @@ int __glXDispSwap_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
     xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
     __GLX_DECLARE_SWAP_VARIABLES;
 
-    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesReq);
+    REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
 
     __GLX_SWAP_SHORT(&req->length);
     __GLX_SWAP_INT(&req->drawable);
commit 1137c11be0f82049d28024eaf963c6f76e0d4334
Author: Julien Cristau <jcristau at debian.org>
Date:   Wed Jan 26 13:06:53 2011 +0100

    glx: fix BindTexImageEXT length check
    
    The request is followed by a list of attributes.
    
    X.Org bug#33449
    
    Reported-and-tested-by: meng <mengmeng.meng at intel.com>
    Signed-off-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 0b375c3..5d633df 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1697,13 +1697,21 @@ int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
     GLXDrawable		 drawId;
     int			 buffer;
     int			 error;
+    CARD32		 num_attribs;
 
-    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
+    if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
+	return BadLength;
 
     pc += __GLX_VENDPRIV_HDR_SIZE;
 
     drawId = *((CARD32 *) (pc));
     buffer = *((INT32 *)  (pc + 4));
+    num_attribs = *((CARD32 *) (pc + 8));
+    if (num_attribs > (UINT32_MAX >> 3)) {
+	client->errorValue = num_attribs;
+	return BadValue;
+    }
+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 12 + (num_attribs << 3));
 
     if (buffer != GLX_FRONT_LEFT_EXT)
 	return __glXError(GLXBadPixmap);
diff --git a/glx/glxcmdsswap.c b/glx/glxcmdsswap.c
index 9d96c9d..d58de62 100644
--- a/glx/glxcmdsswap.c
+++ b/glx/glxcmdsswap.c
@@ -648,19 +648,23 @@ int __glXDispSwap_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
     xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
     GLXDrawable		 *drawId;
     int			 *buffer;
+    CARD32		 *num_attribs;
     __GLX_DECLARE_SWAP_VARIABLES;
 
-    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
+    if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
+	return BadLength;
 
     pc += __GLX_VENDPRIV_HDR_SIZE;
 
     drawId = ((GLXDrawable *) (pc));
     buffer = ((int *)	      (pc + 4));
+    num_attribs = ((CARD32 *) (pc + 8));
     
     __GLX_SWAP_SHORT(&req->length);
     __GLX_SWAP_INT(&req->contextTag);
     __GLX_SWAP_INT(drawId);
     __GLX_SWAP_INT(buffer);
+    __GLX_SWAP_INT(num_attribs);
 
     return __glXDisp_BindTexImageEXT(cl, (GLbyte *)pc);
 }
commit a883cf1545abd89bb2cadfa659718884b56fd234
Author: Julien Cristau <jcristau at debian.org>
Date:   Sun Jan 23 17:05:26 2011 +0100

    glx: fix request length check for CreateGLXPbufferSGIX
    
    The request is followed by an attribute list.
    
    Signed-off-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 3ef567d..0b375c3 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1436,7 +1436,7 @@ int __glXDisp_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
     ClientPtr client = cl->client;
     xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
 
-    REQUEST_SIZE_MATCH(xGLXCreateGLXPbufferSGIXReq);
+    REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
 
     return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
 			   req->width, req->height, req->pbuffer);
diff --git a/glx/glxcmdsswap.c b/glx/glxcmdsswap.c
index 3bb4cad..9d96c9d 100644
--- a/glx/glxcmdsswap.c
+++ b/glx/glxcmdsswap.c
@@ -421,7 +421,7 @@ int __glXDispSwap_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
     xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;    
     __GLX_DECLARE_SWAP_VARIABLES;
 
-    REQUEST_SIZE_MATCH(xGLXCreateGLXPbufferSGIXReq);
+    REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
 
     __GLX_SWAP_INT(&req->screen);
     __GLX_SWAP_INT(&req->fbconfig);
commit c9f7b303a36ca501c6ecf1196c266ee8e8f49d2d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Feb 11 13:50:10 2011 +1000

    xfixes: calloc, not malloc the cursorScreenRec
    
    Debugging NULL pointers is significantly easier than random memory.
    Plus, if new fields (such as pointer barriers) are added they may just be
    properly initialised.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 54e5d75..fb608f6 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -1045,7 +1045,7 @@ XFixesCursorInit (void)
 	ScreenPtr	pScreen = screenInfo.screens[i];
 	CursorScreenPtr	cs;
 
-	cs = (CursorScreenPtr) malloc(sizeof (CursorScreenRec));
+	cs = (CursorScreenPtr) calloc(1, sizeof (CursorScreenRec));
 	if (!cs)
 	    return FALSE;
 	Wrap (cs, pScreen, CloseScreen, CursorCloseScreen);
commit d3499556d8d83396fa2585bd00371a81e086be36
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Feb 10 15:12:14 2011 +1000

    xkb: if the keymap failed to compile, load the default keymap instead.
    
    We really need symbols, compat, keynames, vmods and types for a sensible keymap.
    
    Try this in your xorg.conf.d snippets for all keyboards:
            Option "XkbLayout" "us"
            Option "XkbVariant" "nodeadkeys"
    
    us(nodeadkeys) doesn't exist so xkbcomp provides everything but the symbols
    map. We say we want everything but don't _need_ anything, the server happily
    gives us a keymap with every key mapped to NoSymbol. This in turn isn't what
    we want after all.
    
    So instead, require symbols, compat, keynames, vmods and types from the
    keymap and if that fails, load the default keymap instead. If that fails
    too, all bets are off.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>

diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index b968c43..ac587fc 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -470,13 +470,34 @@ XkbDescPtr
 XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
 {
     XkbDescPtr xkb;
+    unsigned int need;
 
     if (!dev || !rmlvo) {
         LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
         return NULL;
     }
 
-    xkb = XkbCompileKeymapForDevice(dev, rmlvo, 0);
+    /* These are the components we really really need */
+    need = XkmSymbolsMask | XkmCompatMapMask | XkmTypesMask |
+           XkmKeyNamesMask | XkmVirtualModsMask;
+
+
+    xkb = XkbCompileKeymapForDevice(dev, rmlvo, need);
+
+    if (!xkb) {
+        XkbRMLVOSet dflts;
+
+        /* we didn't get what we really needed. And that will likely leave
+         * us with a keyboard that doesn't work. Use the defaults instead */
+        LogMessage(X_ERROR, "XKB: Failed to load keymap. Loading default "
+                   "keymap instead.\n");
+
+        XkbGetRulesDflts(&dflts);
+
+        xkb = XkbCompileKeymapForDevice(dev, &dflts, 0);
+
+        XkbFreeRMLVOSet(&dflts, FALSE);
+    }
 
     return xkb;
 }
commit 47d1d2fed656c3a3b2600491078da90962c46934
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Feb 10 15:11:34 2011 +1000

    xkb: split out keymap compilation.
    
    Refactoring for simpler double-use in the next patch. No functional changes.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>

diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index 51b5777..b968c43 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -425,35 +425,58 @@ XkbRF_RulesPtr	rules;
     return complete;
 }
 
-XkbDescPtr
-XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+static Bool
+XkbRMLVOtoKcCGST(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbComponentNamesPtr kccgst)
 {
-    XkbComponentNamesRec kccgst;
     XkbRF_VarDefsRec mlvo;
-    XkbDescPtr xkb;
-    char name[PATH_MAX];
-
-    if (!dev || !rmlvo) {
-        LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
-        return NULL;
-    }
 
     mlvo.model = rmlvo->model;
     mlvo.layout = rmlvo->layout;
     mlvo.variant = rmlvo->variant;
     mlvo.options = rmlvo->options;
 
-    /* XDNFR already logs for us. */
-    if (!XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, &kccgst))
+    return XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, kccgst);
+}
+
+/**
+ * Compile the given RMLVO keymap and return it. Returns the XkbDescPtr on
+ * success or NULL on failure. If the components compiled are not a superset
+ * or equal to need, the compiliation is treated as failure.
+ */
+static XkbDescPtr
+XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need)
+{
+    XkbDescPtr xkb;
+    unsigned int provided;
+    XkbComponentNamesRec kccgst;
+    char name[PATH_MAX];
+
+    if (!XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst))
         return NULL;
 
-    /* XDLKBN too, but it might return 0 as well as allocating. */
-    if (!XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, 0, &xkb, name,
-                                 PATH_MAX)) {
-        if (xkb)
+    provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need,
+                                       &xkb, name, PATH_MAX);
+    if ((need & provided) != need) {
+        if (xkb) {
             XkbFreeKeyboard(xkb, 0, TRUE);
+            xkb = NULL;
+        }
+    }
+
+    return xkb;
+}
+
+XkbDescPtr
+XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+{
+    XkbDescPtr xkb;
+
+    if (!dev || !rmlvo) {
+        LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
         return NULL;
     }
 
+    xkb = XkbCompileKeymapForDevice(dev, rmlvo, 0);
+
     return xkb;
 }
commit 787ba25a8a3af52b38448a1a6f8c9704ea8b7905
Author: Carlos Garnacho <carlosg at gnome.org>
Date:   Mon Feb 7 18:21:31 2011 +0100

    Xi: make XIQueryPointer return the current modifiers/group as documented.
    
    The previous XKB info was being returned instead of the current
    one, producing inconsistent results between the latest events
    and the modifiers/group returned by this call.
    
    Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>`
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
index b521c48..8df958e 100644
--- a/Xi/xiquerypointer.c
+++ b/Xi/xiquerypointer.c
@@ -129,7 +129,7 @@ ProcXIQueryPointer(ClientPtr client)
 
     if (kbd)
     {
-        state = &kbd->key->xkbInfo->prev_state;
+        state = &kbd->key->xkbInfo->state;
         rep.mods.base_mods = state->base_mods;
         rep.mods.latched_mods = state->latched_mods;
         rep.mods.locked_mods = state->locked_mods;
commit 85f9017393c9bb19553e9afcf554673a44a09993
Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>
Date:   Tue Feb 8 11:10:10 2011 +0200

    ProcXkbGetXkbByName: fix use of uninitialised bytes valgrind error.
    
    ==9999== Syscall param writev(vector[...]) points to uninitialised byte(s)
    ==9999==    at 0x4AB5154: writev (writev.c:51)
    ==9999==    by 0x7C7C3: _XSERVTransWritev (Xtrans.c:912)
    ==9999==    by 0x61C8B: FlushClient (io.c:924)
    ==9999==    by 0x62423: WriteToClient (io.c:846)
    ==9999==    by 0xCE39B: XkbSendMap (xkb.c:1408)
    ==9999==    by 0xD247B: ProcXkbGetKbdByName (xkb.c:5814)
    ==9999==    by 0x4AB53: Dispatch (dispatch.c:432)
    ==9999==    by 0x205BF: main (main.c:291)
    ==9999==  Address 0x557eb68 is 40 bytes inside a block of size 4,096 alloc'd
    ==9999==    at 0x48334A4: calloc (vg_replace_malloc.c:467)
    ==9999==    by 0x62567: WriteToClient (io.c:1065)
    ==9999==    by 0x452EB: ProcEstablishConnection (dispatch.c:3685)
    ==9999==    by 0x4AB53: Dispatch (dispatch.c:432)
    ==9999==    by 0x205BF: main (main.c:291)
    ==9999==  Uninitialised value was created by a stack allocation
    ==9999==    at 0xD1910: ProcXkbGetKbdByName (xkb.c:5559)
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Oliver McFadden <oliver.mcfadden at nokia.com>
    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index a2cbbf3..a57139f 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5569,13 +5569,13 @@ ProcXkbGetKbdByName(ClientPtr client)
 {
     DeviceIntPtr 		dev;
     DeviceIntPtr                tmpd;
-    xkbGetKbdByNameReply 	rep;
-    xkbGetMapReply		mrep;
-    xkbGetCompatMapReply	crep;
-    xkbGetIndicatorMapReply	irep;
-    xkbGetNamesReply		nrep;
-    xkbGetGeometryReply		grep;
-    XkbComponentNamesRec	names;
+    xkbGetKbdByNameReply 	rep = {0};
+    xkbGetMapReply		mrep = {0};
+    xkbGetCompatMapReply	crep = {0};
+    xkbGetIndicatorMapReply	irep = {0};
+    xkbGetNamesReply		nrep = {0};
+    xkbGetGeometryReply		grep = {0};
+    XkbComponentNamesRec	names = {0};
     XkbDescPtr			xkb, new;
     unsigned char *		str;
     char 			mapFile[PATH_MAX];
commit 8a34d7a8532c7ca013e67307f3baf200167abb92
Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>
Date:   Tue Feb 8 11:10:11 2011 +0200

    XkbSendNames: fix use of uninitialised bytes valgrind error.
    
    ==537== Syscall param writev(vector[...]) points to uninitialised byte(s)
    ==537==    at 0x4AB7154: writev (writev.c:51)
    ==537==    by 0x8935B: _XSERVTransWritev (Xtrans.c:912)
    ==537==    by 0x6C55F: FlushClient (io.c:924)
    ==537==    by 0x6CCF3: WriteToClient (io.c:846)
    ==537==    by 0xD51D3: XkbSendNames (xkb.c:3765)
    ==537==    by 0xD8183: ProcXkbGetKbdByName (xkb.c:5825)
    ==537==    by 0x27B7B: Dispatch (dispatch.c:432)
    ==537==    by 0x205B7: main (main.c:291)
    ==537==  Address 0x55899f2 is 154 bytes inside a block of size 1,896 alloc'd
    ==537==    at 0x4834C48: malloc (vg_replace_malloc.c:236)
    ==537==    by 0xD47AF: XkbSendNames (xkb.c:3642)
    ==537==    by 0xD8183: ProcXkbGetKbdByName (xkb.c:5825)
    ==537==    by 0x27B7B: Dispatch (dispatch.c:432)
    ==537==    by 0x205B7: main (main.c:291)
    ==537==  Uninitialised value was created by a heap allocation
    ==537==    at 0x4834C48: malloc (vg_replace_malloc.c:236)
    ==537==    by 0xD47AF: XkbSendNames (xkb.c:3642)
    ==537==    by 0xD8183: ProcXkbGetKbdByName (xkb.c:5825)
    ==537==    by 0x27B7B: Dispatch (dispatch.c:432)
    ==537==    by 0x205B7: main (main.c:291)
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Oliver McFadden <oliver.mcfadden at nokia.com>
    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 6fd66c5..a2cbbf3 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -3644,7 +3644,7 @@ register int            n;
 	swapl(&rep->indicators,n);
     }
 
-    start = desc = malloc(length);
+    start = desc = calloc(1, length);
     if ( !start )
 	return BadAlloc;
     if (xkb->names) {
commit 87fbef9157a6f1e1318382e368d27942d7ad72ab
Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>
Date:   Tue Feb 8 11:10:09 2011 +0200

    ProcRRCreateMode: fix use of uninitialised bytes valgrind error.
    
    ==543== Syscall param writev(vector[...]) points to uninitialised byte(s)
    ==543==    at 0x4AB7154: writev (writev.c:51)
    ==543==    by 0x8935B: _XSERVTransWritev (Xtrans.c:912)
    ==543==    by 0x6C55F: FlushClient (io.c:924)
    ==543==    by 0x6D013: FlushAllOutput (io.c:668)
    ==543==    by 0x27A83: Dispatch (dispatch.c:453)
    ==543==    by 0x205B7: main (main.c:291)
    ==543==  Address 0x556dc8c is 12 bytes inside a block of size 4,096 alloc'd
    ==543==    at 0x48334A4: calloc (vg_replace_malloc.c:467)
    ==543==    by 0x6CE37: WriteToClient (io.c:1065)
    ==543==    by 0x223A7: ProcEstablishConnection (dispatch.c:3685)
    ==543==    by 0x27B7B: Dispatch (dispatch.c:432)
    ==543==    by 0x205B7: main (main.c:291)
    ==543==  Uninitialised value was created by a stack allocation
    ==543==    at 0xA3350: ProcRRCreateMode (rrmode.c:289)
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Oliver McFadden <oliver.mcfadden at nokia.com>
    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>

diff --git a/randr/rrmode.c b/randr/rrmode.c
index 5ffa400..d7560dc 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -288,7 +288,7 @@ int
 ProcRRCreateMode (ClientPtr client)
 {
     REQUEST(xRRCreateModeReq);
-    xRRCreateModeReply	rep;
+    xRRCreateModeReply	rep = {0};
     WindowPtr		pWin;
     ScreenPtr		pScreen;
     rrScrPrivPtr	pScrPriv;
commit 0ef5973860e17c5edc996c923610f7ad88b4dfbe
Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>
Date:   Tue Feb 8 11:10:08 2011 +0200

    ProcRRQueryVersion: fix use of uninitialised bytes valgrind error.
    
    ==9999== Syscall param writev(vector[...]) points to uninitialised byte(s)
    ==9999==    at 0x4AB5154: writev (writev.c:51)
    ==9999==    by 0x7C7C3: _XSERVTransWritev (Xtrans.c:912)
    ==9999==    by 0x61C8B: FlushClient (io.c:924)
    ==9999==    by 0x62743: FlushAllOutput (io.c:668)
    ==9999==    by 0x4AA5B: Dispatch (dispatch.c:453)
    ==9999==    by 0x205BF: main (main.c:291)
    ==9999==  Address 0x55711b9 is 1 bytes inside a block of size 4,096 alloc'd
    ==9999==    at 0x48334A4: calloc (vg_replace_malloc.c:467)
    ==9999==    by 0x62567: WriteToClient (io.c:1065)
    ==9999==    by 0x452EB: ProcEstablishConnection (dispatch.c:3685)
    ==9999==    by 0x4AB53: Dispatch (dispatch.c:432)
    ==9999==    by 0x205BF: main (main.c:291)
    ==9999==  Uninitialised value was created by a stack allocation
    ==9999==    at 0x160E78: ProcRRQueryVersion (rrdispatch.c:37)
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Oliver McFadden <oliver.mcfadden at nokia.com>
    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>

diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index aed746b..b0b451c 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -35,7 +35,7 @@ RRClientKnowsRates (ClientPtr	pClient)
 static int
 ProcRRQueryVersion (ClientPtr client)
 {
-    xRRQueryVersionReply rep;
+    xRRQueryVersionReply rep = {0};
     register int n;
     REQUEST(xRRQueryVersionReq);
     rrClientPriv(client);
commit 81daba8ce906bfbbe44cd71d0ff269ad34e2f6b5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jan 31 13:53:08 2011 +1000

    Xi: constify XIChangeDeviceProperty()
    
    We don't modify "value", make it official.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Chase Douglas <chase.douglas at canonical.com>
    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira at nokia.com>

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index b9f53f7..17835e2 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -701,7 +701,7 @@ XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
 int
 XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
                         int format, int mode, unsigned long len,
-                        pointer value, Bool sendevent)
+                        const pointer value, Bool sendevent)
 {
     XIPropertyPtr               prop;
     int                         size_in_bytes;
diff --git a/include/exevents.h b/include/exevents.h
index dc59430..2b22698 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -69,7 +69,7 @@ extern _X_EXPORT int XIChangeDeviceProperty(
         int                     /* format*/,
         int                     /* mode*/,
         unsigned long           /* len*/,
-        pointer                 /* value*/,
+        const pointer           /* value*/,
         Bool                    /* sendevent*/
         );
 
commit 93cd4b1034e3c8bed32c5acd391eadd7605e10f0
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:27:00 2011 -0500

    shadow: Remove hw/xfree86/ from includes
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/miext/shadow/Makefile.am b/miext/shadow/Makefile.am
index a73d0ec..30f7bda 100644
--- a/miext/shadow/Makefile.am
+++ b/miext/shadow/Makefile.am
@@ -2,8 +2,6 @@ noinst_LTLIBRARIES = libshadow.la
 
 AM_CFLAGS = $(DIX_CFLAGS)
 
-INCLUDES = -I$(top_srcdir)/hw/xfree86/os-support
-
 if XORG
 sdk_HEADERS = shadow.h
 endif
commit 0c230728f3af2c4250e93a070c0851a597069447
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:25:57 2011 -0500

    rootless: Remove hw/xfree86/ from includes
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/miext/rootless/Makefile.am b/miext/rootless/Makefile.am
index f09300d..c97bebe 100644
--- a/miext/rootless/Makefile.am
+++ b/miext/rootless/Makefile.am
@@ -1,5 +1,4 @@
 AM_CFLAGS = $(DIX_CFLAGS) $(XSERVER_CFLAGS)
-AM_CPPFLAGS = -I$(top_srcdir)/hw/xfree86/os-support
 
 noinst_LTLIBRARIES = librootless.la
 librootless_la_SOURCES = \
commit 505defd270e49cfbcbe6a04d1de817d305edb3c2
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:24:20 2011 -0500

    damage: Remove hw/xfree86/ from includes
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/miext/damage/Makefile.am b/miext/damage/Makefile.am
index 5958357..767a65a 100644
--- a/miext/damage/Makefile.am
+++ b/miext/damage/Makefile.am
@@ -2,7 +2,7 @@ noinst_LTLIBRARIES = libdamage.la
 
 AM_CFLAGS = $(DIX_CFLAGS)
 
-INCLUDES = -I$(srcdir)/../cw -I$(top_srcdir)/hw/xfree86/os-support
+INCLUDES = -I$(srcdir)/../cw
 
 if XORG
 sdk_HEADERS = damage.h damagestr.h
commit 59d8e3cbdba032c7354c28c86cbd155e9da6447a
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:23:07 2011 -0500

    fb: Remove hw/xfree86/ from includes
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/fb/Makefile.am b/fb/Makefile.am
index f9f34c4..89f3bab 100644
--- a/fb/Makefile.am
+++ b/fb/Makefile.am
@@ -1,9 +1,5 @@
 noinst_LTLIBRARIES = libfb.la libwfb.la
 
-INCLUDES = \
-	-I$(top_srcdir)/hw/xfree86/os-support \
-	-I$(top_srcdir)/hw/xfree86/os-support/bus \
-	-I$(top_srcdir)/hw/xfree86/common
 AM_CFLAGS = $(DIX_CFLAGS)
 
 if XORG
commit 994b7b3dc97f9afa713fe636af45a78002a4366f
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:17:52 2011 -0500

    xfree86: warning fix
    
    Did you know that anonymous enums with function scope will not only
    override the enum values from global scope, but will be treated as
    entirely different types?  C's type system just rules.
    
    xf86Crtc.c: In function 'handle_detailed_monrec':
    xf86Crtc.c:1555:33: warning: comparison between 'enum det_monrec_source' and 'enum <anonymous>'
    xf86Crtc.c:1562:33: warning: comparison between 'enum det_monrec_source' and 'enum <anonymous>'
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 47d3ad1..b5e9dc2 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -1542,7 +1542,6 @@ struct det_monrec_parameter {
 static void handle_detailed_monrec(struct detailed_monitor_section *det_mon,
                                    void *data)
 {
-    enum { sync_config, sync_edid, sync_default };
     struct det_monrec_parameter *p;
     p = (struct det_monrec_parameter *)data;
 
commit ae16c5796fdb22fb6b2f680fe5123bfd2c89a825
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:14:11 2011 -0500

    fbdevhw: Remove the non-sysfs hack for mapping from PCI to fbdev
    
    It's broken for devices with BARs above 4G, and the sysfs method should
    work everywhere anyway.  As a pleasant side effect, this fixes some
    warnings:
    
    fbdevhw.c: In function 'fbdev_open_pci':
    fbdevhw.c:333:4: warning: cast from pointer to integer of different size
    fbdevhw.c:334:4: warning: cast from pointer to integer of different size
    fbdevhw.c:336:4: warning: cast from pointer to integer of different size
    fbdevhw.c:337:4: warning: cast from pointer to integer of different size
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/fbdevhw/fbdevhw.c b/hw/xfree86/fbdevhw/fbdevhw.c
index a5b59e7..17fba36 100644
--- a/hw/xfree86/fbdevhw/fbdevhw.c
+++ b/hw/xfree86/fbdevhw/fbdevhw.c
@@ -264,14 +264,7 @@ fbdev_open_pci(struct pci_device * pPci, char **namep)
 {
     struct	fb_fix_screeninfo fix;
     char	filename[256];
-    int	fd,i,j;
-
-
-    /* There are two ways to that we can determine which fb device is
-     * associated with this PCI device.  The more modern way is to look in
-     * the sysfs directory for the PCI device for a file named
-     * "graphics/fb*"
-     */
+    int	fd, i;
 
     for (i = 0; i < 8; i++) {
 	sprintf(filename, 
@@ -304,55 +297,10 @@ fbdev_open_pci(struct pci_device * pPci, char **namep)
 	}
     }
 
-
-    /* The other way is to examine the resources associated with each fb
-     * device and see if there is a match with the PCI device.  This technique
-     * has some problems on certain mixed 64-bit / 32-bit architectures.
-     * There is a flaw in the fb_fix_screeninfo structure in that it only
-     * returns the low 32-bits of the address of the resources associated with
-     * a device.  However, on a mixed architecture the base addresses of PCI
-     * devices, even for 32-bit applications, may be higher than 0x0f0000000.
-     */
-
-    for (i = 0; i < 8; i++) {
-	sprintf(filename,"/dev/fb%d",i);
-	if (-1 == (fd = open(filename,O_RDWR,0))) {
-	    xf86DrvMsg(-1, X_WARNING,
-		       "open %s: %s\n", filename, strerror(errno));
-	    continue;
-	}
-	if (-1 == ioctl(fd,FBIOGET_FSCREENINFO,(void*)&fix)) {
-	    close(fd);
-	    continue;
-	}
-	for (j = 0; j < 6; j++) {
-	    const pciaddr_t res_start = pPci->regions[j].base_addr;
-	    const pciaddr_t res_end = res_start + pPci->regions[j].size;
-
-	    if ((0 != fix.smem_len &&
-		 (pciaddr_t) fix.smem_start >= res_start &&
-		 (pciaddr_t) fix.smem_start < res_end) ||
-		(0 != fix.mmio_len &&
-		 (pciaddr_t) fix.mmio_start >= res_start &&
-		 (pciaddr_t) fix.mmio_start < res_end))
-	      break;
-	}
-	if (j == 6) {
-	    close(fd);
-	    continue;
-	}
-	if (namep) {
-	    *namep = xnfalloc(16);
-	    strncpy(*namep,fix.id,16);
-	}
-	return fd;
-    }
-
     if (namep)
       *namep = NULL;
 
-    xf86DrvMsg(-1, X_ERROR,
-	       "Unable to find a valid framebuffer device\n");
+    xf86DrvMsg(-1, X_ERROR, "Unable to find a valid framebuffer device\n");
     return -1;
 }
 
commit f1b7c9cead94b520e6b96774d605d63d3f341b50
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:09:19 2011 -0500

    int10: warning fix
    
    helper_exec.c: In function 'pciCfg1in':
    helper_exec.c:507:4: warning: passing argument 2 of 'pci_device_cfg_read_u32' from incompatible pointer type
    /usr/include/pciaccess.h:153:5: note: expected 'uint32_t *' but argument is of type 'CARD32 *'
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/int10/helper_exec.c b/hw/xfree86/int10/helper_exec.c
index b9af473..ec84200 100644
--- a/hw/xfree86/int10/helper_exec.c
+++ b/hw/xfree86/int10/helper_exec.c
@@ -504,7 +504,7 @@ pciCfg1in(CARD16 addr, CARD32 *val)
     }
     if (addr == 0xCFC) {
 	pci_device_cfg_read_u32(pci_device_for_cfg_address(PciCfg1Addr),
-			val, PCI_OFFSET(PciCfg1Addr));
+			(uint32_t *)val, PCI_OFFSET(PciCfg1Addr));
 	if (PRINT_PORT && DEBUG_IO_TRACE())
 	    ErrorF(" cfg_inl(%#lx) = %8.8lx\n", PciCfg1Addr, *val);
 	return 1;
commit be186586e504197623c69637b8122fb814f59429
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 00:06:48 2011 -0500

    xf86vidmode: warning fix
    
    xf86VidMode.c: In function 'VidModeGetMonitorValue':
    xf86VidMode.c:637:19: warning: 'ret.i' may be used uninitialized in this function
    
    Reviewed-by: Matt Turner <mattst88 at gmail.com>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xfree86/common/xf86VidMode.c b/hw/xfree86/common/xf86VidMode.c
index 1788fa1..4dd454d 100644
--- a/hw/xfree86/common/xf86VidMode.c
+++ b/hw/xfree86/common/xf86VidMode.c
@@ -634,7 +634,7 @@ VidModeSetModeValue(pointer mode, int valtyp, int val)
 vidMonitorValue
 VidModeGetMonitorValue(pointer monitor, int valtyp, int indx)
 {
-  vidMonitorValue ret;
+  vidMonitorValue ret = { NULL, };
   
   switch (valtyp) {
     case VIDMODE_MON_VENDOR:
commit f6e4ace9eabea1bb2a06dd86b6ffb954917a74ce
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Sun Jul 18 13:24:48 2010 +0100

    Cygwin/X: Fix for Canadian Multilingual Standard keyboard layout handling
    
    Add a keycode mapping for VK_OEM_8 as RCtrl, which is issued by Canadian
    Multilingual Standard layout
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winkeybd.h b/hw/xwin/winkeybd.h
index 662392b..4e4c35c 100644
--- a/hw/xwin/winkeybd.h
+++ b/hw/xwin/winkeybd.h
@@ -266,7 +266,7 @@ g_iKeyMap [] = {
   /* 220 */	0,		0,		0,
   /* 221 */	0,		0,		0,
   /* 222 */	0,		0,		0,
-  /* 223 */	0,		0,		0,
+  /* 223 */	VK_OEM_8,	0,		KEY_RCtrl,  /* at least on Candian Multilingual Standard layout */
   /* 224 */	0,		0,		0,
   /* 225 */	0,		0,		0,
   /* 226 */	0,		0,		0,
commit b421f5e5122dbe125a5629969cc657bd966b4261
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Thu Apr 1 23:10:58 2010 +0100

    Cygwin/X: Ignore MappingNotify events sent to clipboard integration client
    
    Ignore MappingNotify events sent to clipboard integration client,
    xmodmap changes aren't of interest to it, but there is no mechanism
    to express that disinterest.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winclipboardxevents.c b/hw/xwin/winclipboardxevents.c
index 2f042fd..8b502b1 100644
--- a/hw/xwin/winclipboardxevents.c
+++ b/hw/xwin/winclipboardxevents.c
@@ -789,6 +789,9 @@ winClipboardFlushXEvents (HWND hwnd,
 	case PropertyNotify:
 	  break;
 
+	case MappingNotify:
+	  break;
+
 	default:
           ErrorF ("winClipboardFlushXEvents - unexpected event type %d\n", event.type);
 	  break;
commit e930aa7bbc7f04a128df8e6fd441aed5123a2eb6
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Tue Sep 14 16:02:53 2010 +0100

    Cygwin/X: Add Turkish keyboard layouts to keyboard layout mapping table
    
    0x0000041f "Turkish Q" => layout tr
    0x0001041f "Turkish F" => layout tr variant f
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winlayouts.h b/hw/xwin/winlayouts.h
index 288af19..ce502a0 100644
--- a/hw/xwin/winlayouts.h
+++ b/hw/xwin/winlayouts.h
@@ -81,6 +81,8 @@ WinKBLayoutRec winKBLayouts[] =
     {  0x00000816, -1, "pc105",     "pt",        NULL,        NULL, "Portuguese (Portugal)"},
     {  0x0000041a, -1, "pc105",     "hr",        NULL,        NULL, "Croatian"},
     {  0x0000041d, -1, "pc105",     "se",        NULL,        NULL, "Swedish (Sweden)"},
+    {  0x0000041f, -1, "pc105",     "tr",        NULL,        NULL, "Turkish (Q)"},
+    {  0x0001041f, -1, "pc105",     "tr",        "f",         NULL, "Turkish (F)"},
     {  0x00000424, -1, "pc105",     "si",        NULL,        NULL, "Slovenian"},
     {  0x00000425, -1, "pc105",     "ee",        NULL,        NULL, "Estonian"},
     {  0x00000452, -1, "pc105",     "gb",        "intl",      NULL, "United Kingdom (Extended)"},
commit ae99a6f895a3a5b6f71e2dd4874cd4bb0235aff0
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Sun Jul 18 13:42:29 2010 +0100

    Cygwin/X: Make the keyboard layout detection logging a bit clearer
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winconfig.c b/hw/xwin/winconfig.c
index 758c54d..76bf8e2 100644
--- a/hw/xwin/winconfig.c
+++ b/hw/xwin/winconfig.c
@@ -240,6 +240,7 @@ Bool
 winConfigKeyboard (DeviceIntPtr pDevice)
 {
   char                          layoutName[KL_NAMELENGTH];
+  unsigned char                 layoutFriendlyName[256];
   static unsigned int           layoutNum = 0;
   int                           keyboardType;
 #ifdef XWIN_XF86CONFIG
@@ -299,11 +300,32 @@ winConfigKeyboard (DeviceIntPtr pDevice)
 	    if (LoadKeyboardLayout("00000409", KLF_ACTIVATE) != NULL)
 	      winMsg (X_INFO, "Loading US keyboard layout.\n");
 	    else
-	      winMsg (X_ERROR, "LoadKeyboardLaout failed.\n");
+	      winMsg (X_ERROR, "LoadKeyboardLayout failed.\n");
 	  }
     }
-    winMsg (X_PROBED, "winConfigKeyboard - Layout: \"%s\" (%08x) \n", 
-            layoutName, layoutNum);
+
+    /* Discover the friendly name of the current layout */
+    {
+      HKEY                regkey = NULL;
+      const char          regtempl[] = "SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\";
+      char                *regpath;
+      DWORD               namesize = sizeof(layoutFriendlyName);
+
+      regpath = malloc(sizeof(regtempl) + KL_NAMELENGTH + 1);
+      strcpy(regpath, regtempl);
+      strcat(regpath, layoutName);
+
+      if (!RegOpenKey(HKEY_LOCAL_MACHINE, regpath, &regkey))
+          RegQueryValueEx(regkey, "Layout Text", 0, NULL, layoutFriendlyName, &namesize);
+
+      /* Close registry key */
+      if (regkey)
+        RegCloseKey (regkey);
+      free(regpath);
+    }
+
+    winMsg (X_PROBED, "Windows keyboard layout: \"%s\" (%08x) \"%s\", type %d\n",
+            layoutName, layoutNum, layoutFriendlyName, keyboardType);
 
     for (pLayout = winKBLayouts; pLayout->winlayout != -1; pLayout++)
       {
@@ -311,46 +333,35 @@ winConfigKeyboard (DeviceIntPtr pDevice)
 	  continue;
 	if (pLayout->winkbtype > 0 && pLayout->winkbtype != keyboardType)
 	  continue;
-	
+
         bfound = TRUE;
 	winMsg (X_PROBED,
-		"Using preset keyboard for \"%s\" (%x), type \"%d\"\n",
-		pLayout->layoutname, pLayout->winlayout, keyboardType);
-	
+		"Found matching XKB configuration \"%s\"\n",
+		pLayout->layoutname);
+
+        winMsg(X_PROBED,
+               "Model = \"%s\" Layout = \"%s\""
+               " Variant = \"%s\" Options = \"%s\"\n",
+               pLayout->xkbmodel ? pLayout->xkbmodel : "none",
+               pLayout->xkblayout ? pLayout->xkblayout : "none",
+               pLayout->xkbvariant ? pLayout->xkbvariant : "none",
+               pLayout->xkboptions ? pLayout->xkboptions : "none");
+
 	g_winInfo.xkb.model = pLayout->xkbmodel;
 	g_winInfo.xkb.layout = pLayout->xkblayout;
 	g_winInfo.xkb.variant = pLayout->xkbvariant;
-	g_winInfo.xkb.options = pLayout->xkboptions; 
+	g_winInfo.xkb.options = pLayout->xkboptions;
+
+
 	break;
       }
-    
+
     if (!bfound)
       {
-        HKEY                regkey = NULL;
-        const char          regtempl[] = 
-          "SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\";
-        char                *regpath;
-        unsigned char       lname[256];
-        DWORD               namesize = sizeof(lname);
-
-        regpath = malloc(sizeof(regtempl) + KL_NAMELENGTH + 1);
-        strcpy(regpath, regtempl);
-        strcat(regpath, layoutName);
-
-        if (!RegOpenKey(HKEY_LOCAL_MACHINE, regpath, &regkey) &&
-          !RegQueryValueEx(regkey, "Layout Text", 0, NULL, lname, &namesize))
-          {
-	    winMsg (X_ERROR,
-		"Keyboardlayout \"%s\" (%s) is unknown\n", lname, layoutName);
-          }
-
-	/* Close registry key */
-	if (regkey)
-	  RegCloseKey (regkey);
-        free(regpath);
+        winMsg (X_ERROR, "Keyboardlayout \"%s\" (%s) is unknown, using X server default layout\n", layoutFriendlyName, layoutName);
       }
-  }  
-  
+  }
+
   /* parse the configuration */
 #ifdef XWIN_XF86CONFIG
   if (g_cmdline.keyboard)
commit 57ca09441ee5ff2a8deb95eaa17a2625a756d912
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Thu Jul 1 14:54:48 2010 +0100

    Cygwin/X: Update mapping for Canadian keyboard layouts
    
    0x00000c0c "Canadian French (legacy)" => layout ca variant fr-legacy
    0x00001009 "Canadian French" => layout ca variant fr
    0x00011009 "Canadian Multilingual Standard" => layout ca variant multix
    
    Signed-off-by: Yaakov Selkowitz <yselkowitz at users.sourceforge.net>
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winlayouts.h b/hw/xwin/winlayouts.h
index 9500689..288af19 100644
--- a/hw/xwin/winlayouts.h
+++ b/hw/xwin/winlayouts.h
@@ -55,13 +55,15 @@ WinKBLayoutRec winKBLayouts[] =
     {  0x00010409, -1, "pc105",     "dvorak",    NULL,        NULL, "English (USA,Dvorak)"},
     {  0x00020409, -1, "pc105",     "us_intl",   NULL,        NULL, "English (USA,International)"},
     {  0x00000809, -1, "pc105",     "gb",        NULL,        NULL, "English (United Kingdom)"},
+    {  0x00001009, -1, "pc105",     "ca",        "fr",        NULL, "French (Canada)"},
+    {  0x00011009, -1, "pc105",     "ca",        "multix",    NULL, "Canadian Multilingual Standard"},
     {  0x00001809, -1, "pc105",     "ie",        NULL,        NULL, "Irish"},
     {  0x0000040a, -1, "pc105",     "es",        NULL,        NULL, "Spanish (Spain,Traditional Sort)"},
     {  0x0000080a, -1, "pc105",     "latam",     NULL,        NULL, "Latin American"},
     {  0x0000040b, -1, "pc105",     "fi",        NULL,        NULL, "Finnish"},
     {  0x0000040c, -1, "pc105",     "fr",        NULL,        NULL, "French (Standard)"},
     {  0x0000080c, -1, "pc105",     "be",        NULL,        NULL, "French (Belgian)"},
-    {  0x00000c0c, -1, "pc105",     "ca",        "fr",        NULL, "French (Canada)"},
+    {  0x00000c0c, -1, "pc105",     "ca",        "fr-legacy", NULL, "French (Canada, Legacy)"},
     {  0x0000100c, -1, "pc105",     "ch",        "fr",        NULL, "French (Switzerland)"},
     {  0x0000040d, -1, "pc105",     "il",        NULL,        NULL, "Hebrew"},
     {  0x0000040e, -1, "pc105",     "hu",        NULL,        NULL, "Hungarian"},
@@ -89,5 +91,3 @@ WinKBLayoutRec winKBLayouts[] =
   See http://technet.microsoft.com/en-us/library/cc766503%28WS.10%29.aspx
   for a listing of input locale (keyboard layout) codes
 */
-
-
commit be3e5bb50178406e46368be00860331e1b6c4093
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Apr 14 21:45:29 2010 +0100

    Cygwin/X: Better keycode debugging output
    
    Replace useless #if 0/ErrorF/#endif with winDebug
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winkeybd.c b/hw/xwin/winkeybd.c
index 83fea21..9e5a9b0 100644
--- a/hw/xwin/winkeybd.c
+++ b/hw/xwin/winkeybd.c
@@ -73,6 +73,8 @@ winTranslateKey (WPARAM wParam, LPARAM lParam, int *piScanCode)
   int		iParam = HIWORD (lParam);
   int		iParamScanCode = LOBYTE (iParam);
 
+  winDebug("winTranslateKey: wParam %08x lParam %08x\n", wParam, lParam);
+
 /* WM_ key messages faked by Vista speech recognition (WSR) don't have a
  * scan code.
  *
@@ -488,10 +490,8 @@ winSendKeyEvent (DWORD dwKey, Bool fDown)
   for (i = 0; i < nevents; i++)
     mieqEnqueue(g_pwinKeyboard, (InternalEvent*)events[i].event);
 
-#if CYGDEBUG
-  ErrorF("winSendKeyEvent: dwKey: %d, fDown: %d, nEvents %d\n",
-          dwKey, fDown, nevents);
-#endif
+  winDebug("winSendKeyEvent: dwKey: %d, fDown: %d, nEvents %d\n",
+           dwKey, fDown, nevents);
 }
 
 BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam)
diff --git a/hw/xwin/winkeyhook.c b/hw/xwin/winkeyhook.c
index fe1156d..cbee7cb 100644
--- a/hw/xwin/winkeyhook.c
+++ b/hw/xwin/winkeyhook.c
@@ -88,9 +88,7 @@ winKeyboardMessageHookLL (int iCode, WPARAM wParam, LPARAM lParam)
   /* Pass keystrokes on to our main message loop */
   if (iCode == HC_ACTION)
     {
-#if 0
-      ErrorF ("vkCode: %08x\tscanCode: %08x\n", p->vkCode, p->scanCode);
-#endif
+      winDebug("winKeyboardMessageHook: vkCode: %08x scanCode: %08x\n", p->vkCode, p->scanCode);
 
       switch (wParam)
 	{
commit 81892bf6b7e3730ebd19318183734f55dbaa5d4b
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Apr 14 21:34:39 2010 +0100

    Cygwin/X: Generate X keycodes for multimedia keys
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winkeybd.h b/hw/xwin/winkeybd.h
index 5b2a589..662392b 100644
--- a/hw/xwin/winkeybd.h
+++ b/hw/xwin/winkeybd.h
@@ -216,13 +216,13 @@ g_iKeyMap [] = {
   /* 170 */	0,		0,		0,
   /* 171 */	0,		0,		0,
   /* 172 */	0,		0,		0,
-  /* 173 */	0,		0,		0,
-  /* 174 */	0,		0,		0,
-  /* 175 */	0,		0,		0,
-  /* 176 */	0,		0,		0,
-  /* 177 */	0,		0,		0,
-  /* 178 */	0,		0,		0,
-  /* 179 */	0,		0,		0,
+  /* 173 */	VK_VOLUME_MUTE,	0,		KEY_Mute,
+  /* 174 */	VK_VOLUME_DOWN,	0,		KEY_AudioLower,
+  /* 175 */	VK_VOLUME_UP,	0,		KEY_AudioRaise,
+  /* 176 */	VK_MEDIA_NEXT_TRACK,	0,	KEY_NEXTSONG,
+  /* 177 */	VK_MEDIA_PREV_TRACK,	0,	KEY_PREVIOUSSONG,
+  /* 178 */	VK_MEDIA_STOP,	0,		KEY_STOPCD,
+  /* 179 */	VK_MEDIA_PLAY_PAUSE,	0,	KEY_PLAYPAUSE,
   /* 180 */	0,		0,		0,
   /* 181 */	0,		0,		0,
   /* 182 */	0,		0,		0,
diff --git a/hw/xwin/winkeynames.h b/hw/xwin/winkeynames.h
index 3d59383..914016a 100644
--- a/hw/xwin/winkeynames.h
+++ b/hw/xwin/winkeynames.h
@@ -23,10 +23,6 @@
  *
  */
 
-#define XK_TECHNICAL
-#define	XK_KATAKANA
-#include <X11/keysym.h>
-
 #define GLYPHS_PER_KEY	4
 #define NUM_KEYCODES	248
 #define MIN_KEYCODE     8
@@ -194,6 +190,15 @@
 #define KEY_HKTG         /* Hirugana/Katakana tog 0xc8  */  200
 #define KEY_BSlash2      /* \           _         0xcb  */  203
 
+#define KEY_Mute         /* Audio Mute                  */  152
+#define KEY_AudioLower   /* Audio Lower                 */  168
+#define KEY_AudioRaise   /* Audio Raise                 */  166
+
+#define KEY_NEXTSONG     /* Media next                  */  145
+#define KEY_PLAYPAUSE    /* Media play/pause toggle     */  154
+#define KEY_PREVIOUSSONG /* Media previous              */  136
+#define KEY_STOPCD       /* Media stop                  */  156
+
 /* These are for "notused" and "unknown" entries in translation maps. */
 #define KEY_NOTUSED	  0
 #define KEY_UNKNOWN	255
commit 5d020c31351594c104fb46615ce41f256cd8e8b9
Author: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
Date:   Fri Jan 14 15:03:28 2011 +0200

    xf86/xv: Only register PostValidateTree hook when there is work to do
    
    If none of Xv ports were affected by window tree modifications we don't
    want scan the port list. To avoid useless scanning of port list
    PostValidateTree hook is only registered when ClipNotify was called for
    any port.
    
    Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at nokia.com>

diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index ea286df..53ebe8f 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -100,6 +100,8 @@ static void xf86XVWindowExposures(WindowPtr pWin, RegionPtr r1, RegionPtr r2);
 static void xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind);
 static void xf86XVClipNotify(WindowPtr pWin, int dx, int dy);
 
+#define PostValidateTreeUndefined ((PostValidateTreeProcPtr)-1)
+
 /* ScrnInfoRec functions */
 
 static Bool xf86XVEnterVT(int, int);
@@ -283,7 +285,7 @@ xf86XVScreenInit(
 
   ScreenPriv->DestroyWindow = pScreen->DestroyWindow;
   ScreenPriv->WindowExposures = pScreen->WindowExposures;
-  ScreenPriv->PostValidateTree = pScreen->PostValidateTree;
+  ScreenPriv->PostValidateTree = PostValidateTreeUndefined;
   ScreenPriv->ClipNotify = pScreen->ClipNotify;
   ScreenPriv->EnterVT = pScrn->EnterVT;
   ScreenPriv->LeaveVT = pScrn->LeaveVT;
@@ -292,7 +294,6 @@ xf86XVScreenInit(
 
   pScreen->DestroyWindow = xf86XVDestroyWindow;
   pScreen->WindowExposures = xf86XVWindowExposures;
-  pScreen->PostValidateTree = xf86XVPostValidateTree;
   pScreen->ClipNotify = xf86XVClipNotify;
   pScrn->EnterVT = xf86XVEnterVT;
   pScrn->LeaveVT = xf86XVLeaveVT;
@@ -1165,12 +1166,11 @@ xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind)
 
     xf86XVReputOrStopAllPorts(pScrn, TRUE);
 
-    if (ScreenPriv->PostValidateTree) {
-	pScreen->PostValidateTree = ScreenPriv->PostValidateTree;
+    pScreen->PostValidateTree = ScreenPriv->PostValidateTree;
+    if (pScreen->PostValidateTree) {
 	(*pScreen->PostValidateTree)(pWin, pLayerWin, kind);
-	ScreenPriv->PostValidateTree = pScreen->PostValidateTree;
-	pScreen->PostValidateTree = xf86XVPostValidateTree;
     }
+    ScreenPriv->PostValidateTree = PostValidateTreeUndefined;
 }
 
 static void
@@ -1247,6 +1247,11 @@ xf86XVClipNotify(WindowPtr pWin, int dx, int dy)
 
      pPriv->clipChanged = TRUE;
 
+     if (ScreenPriv->PostValidateTree == PostValidateTreeUndefined) {
+        ScreenPriv->PostValidateTree = pScreen->PostValidateTree;
+        pScreen->PostValidateTree = xf86XVPostValidateTree;
+     }
+
      WinPriv = WinPriv->next;
   }
 
@@ -1274,7 +1279,6 @@ xf86XVCloseScreen(int i, ScreenPtr pScreen)
 
   pScreen->DestroyWindow = ScreenPriv->DestroyWindow;
   pScreen->WindowExposures = ScreenPriv->WindowExposures;
-  pScreen->PostValidateTree = ScreenPriv->PostValidateTree;
   pScreen->ClipNotify = ScreenPriv->ClipNotify;
 
   pScrn->EnterVT = ScreenPriv->EnterVT;
commit ddf32df5cc2e73b833f6e414276d938fdc38869e
Author: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
Date:   Thu Jan 13 20:50:16 2011 +0200

    xf86/xv: Use PostValidateTree to do reput
    
    ValidateTree calls first ClipNotify and later might call
    WindowExposures. To avoid useless double reput ClipNotify delays reput
    to WindowExposures or PostValidateTree.
    
    PostValidatTree checks all ports if there is clip changes. On clip
    changes reput is done to move or scale the overlay.
    
    Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at nokia.com>

diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index 21e0035..ea286df 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -97,6 +97,7 @@ static int xf86XVQueryImageAttributes(ClientPtr, XvPortPtr, XvImagePtr,
 
 static Bool xf86XVDestroyWindow(WindowPtr pWin);
 static void xf86XVWindowExposures(WindowPtr pWin, RegionPtr r1, RegionPtr r2);
+static void xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind);
 static void xf86XVClipNotify(WindowPtr pWin, int dx, int dy);
 
 /* ScrnInfoRec functions */
@@ -282,6 +283,7 @@ xf86XVScreenInit(
 
   ScreenPriv->DestroyWindow = pScreen->DestroyWindow;
   ScreenPriv->WindowExposures = pScreen->WindowExposures;
+  ScreenPriv->PostValidateTree = pScreen->PostValidateTree;
   ScreenPriv->ClipNotify = pScreen->ClipNotify;
   ScreenPriv->EnterVT = pScrn->EnterVT;
   ScreenPriv->LeaveVT = pScrn->LeaveVT;
@@ -290,6 +292,7 @@ xf86XVScreenInit(
 
   pScreen->DestroyWindow = xf86XVDestroyWindow;
   pScreen->WindowExposures = xf86XVWindowExposures;
+  pScreen->PostValidateTree = xf86XVPostValidateTree;
   pScreen->ClipNotify = xf86XVClipNotify;
   pScrn->EnterVT = xf86XVEnterVT;
   pScrn->LeaveVT = xf86XVLeaveVT;
@@ -1038,6 +1041,7 @@ xf86XVRemovePortFromWindow(WindowPtr pWin, XvPortRecPrivatePtr portPriv)
 	RegionDestroy(portPriv->ckeyFilled);
 	portPriv->ckeyFilled = NULL;
      }
+     portPriv->clipChanged = FALSE;
 }
 
 static void
@@ -1072,7 +1076,7 @@ xf86XVReputOrStopPort(XvPortRecPrivatePtr pPriv,
 }
 
 static void
-xf86XVReputOrStopAllPorts(ScrnInfoPtr pScrn)
+xf86XVReputOrStopAllPorts(ScrnInfoPtr pScrn, Bool onlyChanged)
 {
     ScreenPtr pScreen = pScrn->pScreen;
     XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
@@ -1090,6 +1094,9 @@ xf86XVReputOrStopAllPorts(ScrnInfoPtr pScrn)
 	    if (pPriv->isOn == XV_OFF || !pWin)
 		continue;
 
+	    if (onlyChanged && !pPriv->clipChanged)
+		continue;
+
 	    visible = pWin->visibility == VisibilityUnobscured ||
 		      pWin->visibility == VisibilityPartiallyObscured;
 
@@ -1101,6 +1108,8 @@ xf86XVReputOrStopAllPorts(ScrnInfoPtr pScrn)
 		visible = FALSE;
 
 	    xf86XVReputOrStopPort(pPriv, pWin, visible);
+
+	    pPriv->clipChanged = FALSE;
 	}
     }
 }
@@ -1139,6 +1148,30 @@ xf86XVDestroyWindow(WindowPtr pWin)
   return ret;
 }
 
+static void
+xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind)
+{
+    ScreenPtr pScreen;
+    XF86XVScreenPtr ScreenPriv;
+    ScrnInfoPtr pScrn;
+
+    if (pWin)
+	pScreen = pWin->drawable.pScreen;
+    else
+	pScreen = pLayerWin->drawable.pScreen;
+
+    ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+    pScrn = xf86Screens[pScreen->myNum];
+
+    xf86XVReputOrStopAllPorts(pScrn, TRUE);
+
+    if (ScreenPriv->PostValidateTree) {
+	pScreen->PostValidateTree = ScreenPriv->PostValidateTree;
+	(*pScreen->PostValidateTree)(pWin, pLayerWin, kind);
+	ScreenPriv->PostValidateTree = pScreen->PostValidateTree;
+	pScreen->PostValidateTree = xf86XVPostValidateTree;
+    }
+}
 
 static void
 xf86XVWindowExposures(WindowPtr pWin, RegionPtr reg1, RegionPtr reg2)
@@ -1187,10 +1220,11 @@ xf86XVWindowExposures(WindowPtr pWin, RegionPtr reg1, RegionPtr reg2)
 
      WinPriv = WinPriv->next;
      xf86XVReputOrStopPort(pPriv, pWin, visible);
+
+     pPriv->clipChanged = FALSE;
   }
 }
 
-
 static void
 xf86XVClipNotify(WindowPtr pWin, int dx, int dy)
 {
@@ -1200,9 +1234,6 @@ xf86XVClipNotify(WindowPtr pWin, int dx, int dy)
   XvPortRecPrivatePtr pPriv;
 
   while(WinPriv) {
-     Bool visible = pWin->visibility == VisibilityUnobscured ||
-		    pWin->visibility == VisibilityPartiallyObscured;
-
      pPriv = WinPriv->PortRec;
 
      if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
@@ -1214,15 +1245,9 @@ xf86XVClipNotify(WindowPtr pWin, int dx, int dy)
         (*pPriv->AdaptorRec->ClipNotify)(pPriv->pScrn, pPriv->DevPriv.ptr,
                                          pWin, dx, dy);
 
-     /*
-      * Stop and remove still/images if
-      * ReputImage isn't supported.
-      */
-     if (!pPriv->type && !pPriv->AdaptorRec->ReputImage)
-	visible = FALSE;
+     pPriv->clipChanged = TRUE;
 
      WinPriv = WinPriv->next;
-     xf86XVReputOrStopPort(pPriv, pWin, visible);
   }
 
   if(ScreenPriv->ClipNotify) {
@@ -1249,6 +1274,7 @@ xf86XVCloseScreen(int i, ScreenPtr pScreen)
 
   pScreen->DestroyWindow = ScreenPriv->DestroyWindow;
   pScreen->WindowExposures = ScreenPriv->WindowExposures;
+  pScreen->PostValidateTree = ScreenPriv->PostValidateTree;
   pScreen->ClipNotify = ScreenPriv->ClipNotify;
 
   pScrn->EnterVT = ScreenPriv->EnterVT;
@@ -1355,7 +1381,7 @@ xf86XVAdjustFrame(int index, int x, int y, int flags)
 	pScrn->AdjustFrame = xf86XVAdjustFrame;
   }
 
-  xf86XVReputOrStopAllPorts(pScrn);
+  xf86XVReputOrStopAllPorts(pScrn, FALSE);
 }
 
 static void
@@ -1376,7 +1402,7 @@ xf86XVModeSet(ScrnInfoPtr pScrn)
 	pScrn->ModeSet = xf86XVModeSet;
     }
 
-    xf86XVReputOrStopAllPorts(pScrn);
+    xf86XVReputOrStopAllPorts(pScrn, FALSE);
 }
 
 /**** XvAdaptorRec fields ****/
diff --git a/hw/xfree86/common/xf86xvpriv.h b/hw/xfree86/common/xf86xvpriv.h
index 3f1106d..2a459f1 100644
--- a/hw/xfree86/common/xf86xvpriv.h
+++ b/hw/xfree86/common/xf86xvpriv.h
@@ -40,6 +40,7 @@ typedef struct {
    DestroyWindowProcPtr		DestroyWindow;
    ClipNotifyProcPtr		ClipNotify;
    WindowExposuresProcPtr	WindowExposures;
+   PostValidateTreeProcPtr	PostValidateTree;
    void                         (*AdjustFrame)(int, int, int, int);
    Bool                         (*EnterVT)(int, int);
    void                         (*LeaveVT)(int, int);
@@ -73,6 +74,7 @@ typedef struct {
    Bool FreeCompositeClip;
    XvAdaptorRecPrivatePtr AdaptorRec;
    XvStatus isOn;
+   Bool clipChanged;
    int vid_x, vid_y, vid_w, vid_h;
    int drw_x, drw_y, drw_w, drw_h;
    DevUnion DevPriv;
commit 5678a41f6bc0ef8965bd50a88c5ef01ba7eb8b24
Author: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
Date:   Mon Jan 17 16:58:00 2011 +0200

    xf86/xv: Fill color key on expose
    
    If window gets exposed but clipboxes doesn't change drivers would avoid
    color key fill. This makes XResizeWindo&co to lose colorkey if
    background is painted.
    
    To help drivers to avoid filling colorkey for each put server can
    provide helper function if there is exposed areas. Server can subtract
    exposed areas from filled region.
    
    As a side effect we can avoid useless color key fills if window only
    moves in screen without background fills.
    
    v3:
    * Change tracking to filled area to account for client initiated clip
      changes
    * Make overlaid XvPutImage behavior like textured XvPutImage or PutImage
    * Make region dynamically allocated only when required.
    
    v4:
    * Simplify new driver interface to reduce duplicate code
    
    Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at nokia.com>

diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index 6dcd497..21e0035 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -331,6 +331,8 @@ xf86XVFreeAdaptor(XvAdaptorPtr pAdaptor)
 		RegionDestroy(pPriv->clientClip);
 	     if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
 		RegionDestroy(pPriv->pCompositeClip);
+	     if (pPriv->ckeyFilled)
+		RegionDestroy(pPriv->ckeyFilled);
 	     free(pPriv);
 	  }
       }
@@ -1016,7 +1018,6 @@ static void
 xf86XVRemovePortFromWindow(WindowPtr pWin, XvPortRecPrivatePtr portPriv)
 {
      XF86XVWindowPtr winPriv, prevPriv = NULL;
-
      winPriv = GET_XF86XV_WINDOW(pWin);
 
      while(winPriv) {
@@ -1033,6 +1034,10 @@ xf86XVRemovePortFromWindow(WindowPtr pWin, XvPortRecPrivatePtr portPriv)
 	winPriv = winPriv->next;
      }
      portPriv->pDraw = NULL;
+     if (portPriv->ckeyFilled) {
+	RegionDestroy(portPriv->ckeyFilled);
+	portPriv->ckeyFilled = NULL;
+     }
 }
 
 static void
@@ -1165,6 +1170,21 @@ xf86XVWindowExposures(WindowPtr pWin, RegionPtr reg1, RegionPtr reg2)
      if (!pPriv->type && !pPriv->AdaptorRec->ReputImage)
 	visible = !AreasExposed;
 
+     /*
+      * Subtract exposed areas from overlaid image to match textured video
+      * behavior.
+      */
+     if (!pPriv->type && pPriv->clientClip)
+	    RegionSubtract(pPriv->clientClip, pPriv->clientClip, reg1);
+
+     if (visible && pPriv->ckeyFilled) {
+        RegionRec tmp;
+        RegionNull(&tmp);
+        RegionCopy(&tmp, reg1);
+        RegionTranslate(&tmp, pWin->drawable.x, pWin->drawable.y);
+        RegionSubtract(pPriv->ckeyFilled, pPriv->ckeyFilled, &tmp);
+     }
+
      WinPriv = WinPriv->next;
      xf86XVReputOrStopPort(pPriv, pWin, visible);
   }
@@ -1860,12 +1880,12 @@ xf86XVQueryImageAttributes(
 }
 
 void
-xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes)
+xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr fillboxes)
 {
    ScreenPtr pScreen = pDraw->pScreen;
    ChangeGCVal pval[2];
-   BoxPtr pbox = RegionRects(clipboxes);
-   int i, nbox = RegionNumRects(clipboxes);
+   BoxPtr pbox = RegionRects(fillboxes);
+   int i, nbox = RegionNumRects(fillboxes);
    xRectangle *rects;
    GCPtr gc;
 
@@ -1894,11 +1914,57 @@ xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes)
 }
 
 void
-xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
+xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr fillboxes)
 {
-    xf86XVFillKeyHelperDrawable (&pScreen->root->drawable, key, clipboxes);
+    xf86XVFillKeyHelperDrawable (&pScreen->root->drawable, key, fillboxes);
 }
 
+void
+xf86XVFillKeyHelperPort (DrawablePtr pDraw, pointer data, CARD32 key, RegionPtr clipboxes, Bool fillEverything)
+{
+    WindowPtr pWin = (WindowPtr)pDraw;
+    XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
+    XvPortRecPrivatePtr portPriv = NULL;
+    RegionRec reg;
+    RegionPtr fillboxes;
+
+    while (WinPriv) {
+	XvPortRecPrivatePtr pPriv = WinPriv->PortRec;
+
+	if (data == pPriv->DevPriv.ptr) {
+	    portPriv = pPriv;
+	    break;
+	}
+
+	WinPriv = WinPriv->next;
+    }
+
+    if (!portPriv)
+	return;
+
+    if (!portPriv->ckeyFilled)
+	portPriv->ckeyFilled = RegionCreate(NULL, 0);
+
+    if (!fillEverything) {
+	RegionNull(&reg);
+	fillboxes = ®
+	RegionSubtract(fillboxes, clipboxes, portPriv->ckeyFilled);
+
+	if (!RegionNotEmpty(fillboxes))
+	    goto out;
+    } else
+	fillboxes = clipboxes;
+
+
+    RegionCopy(portPriv->ckeyFilled, clipboxes);
+
+    xf86XVFillKeyHelperDrawable(pDraw, key, fillboxes);
+out:
+    if (!fillEverything)
+        RegionUninit(&reg);
+}
+
+
 /* xf86XVClipVideoHelper -
 
    Takes the dst box in standard X BoxRec form (top and left
diff --git a/hw/xfree86/common/xf86xv.h b/hw/xfree86/common/xf86xv.h
index 47061fe..f0d8495 100644
--- a/hw/xfree86/common/xf86xv.h
+++ b/hw/xfree86/common/xf86xv.h
@@ -244,6 +244,9 @@ xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes);
 extern _X_EXPORT void
 xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes);
 
+extern _X_EXPORT void
+xf86XVFillKeyHelperPort (DrawablePtr pDraw, pointer data, CARD32 key, RegionPtr clipboxes, Bool fillEverything);
+
 extern _X_EXPORT Bool
 xf86XVClipVideoHelper(
     BoxPtr dst,
diff --git a/hw/xfree86/common/xf86xvpriv.h b/hw/xfree86/common/xf86xvpriv.h
index 4572218..3f1106d 100644
--- a/hw/xfree86/common/xf86xvpriv.h
+++ b/hw/xfree86/common/xf86xvpriv.h
@@ -68,6 +68,7 @@ typedef struct {
    unsigned char type;
    unsigned int subWindowMode;
    RegionPtr clientClip;
+   RegionPtr ckeyFilled;
    RegionPtr pCompositeClip;
    Bool FreeCompositeClip;
    XvAdaptorRecPrivatePtr AdaptorRec;
commit 9b048ca420864e19862f63f4a491a4da0ff9b54f
Author: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
Date:   Mon Jan 17 15:07:28 2011 +0200

    xf86/xv: Remove unused variable from XvPortRecPrivate
    
    Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at nokia.com>

diff --git a/hw/xfree86/common/xf86xvpriv.h b/hw/xfree86/common/xf86xvpriv.h
index c667926..4572218 100644
--- a/hw/xfree86/common/xf86xvpriv.h
+++ b/hw/xfree86/common/xf86xvpriv.h
@@ -72,7 +72,6 @@ typedef struct {
    Bool FreeCompositeClip;
    XvAdaptorRecPrivatePtr AdaptorRec;
    XvStatus isOn;
-   Bool moved;
    int vid_x, vid_y, vid_w, vid_h;
    int drw_x, drw_y, drw_w, drw_h;
    DevUnion DevPriv;
commit 4f8f803280894a8c41691e350b7a34bfd719fe05
Author: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
Date:   Thu Jan 13 20:21:09 2011 +0200

    xf86/xv: Remove unused GC pointers
    
    Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at nokia.com>

diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index f1a87f1..6dcd497 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -280,8 +280,6 @@ xf86XVScreenInit(
 
   pScrn = xf86Screens[pScreen->myNum];
 
-  ScreenPriv->videoGC = NULL;  /* for the helper */
-
   ScreenPriv->DestroyWindow = pScreen->DestroyWindow;
   ScreenPriv->WindowExposures = pScreen->WindowExposures;
   ScreenPriv->ClipNotify = pScreen->ClipNotify;
@@ -1123,9 +1121,6 @@ xf86XVDestroyWindow(WindowPtr pWin)
 
      pPriv->pDraw = NULL;
      tmp = WinPriv;
-     if(WinPriv->pGC) {
-       FreeGC(WinPriv->pGC, 0);
-     }
      WinPriv = WinPriv->next;
      free(tmp);
   }
@@ -1232,11 +1227,6 @@ xf86XVCloseScreen(int i, ScreenPtr pScreen)
 
   if(!ScreenPriv) return TRUE;
 
-  if(ScreenPriv->videoGC) {
-     FreeGC(ScreenPriv->videoGC, 0);
-     ScreenPriv->videoGC = NULL;
-  }
-
   pScreen->DestroyWindow = ScreenPriv->DestroyWindow;
   pScreen->WindowExposures = ScreenPriv->WindowExposures;
   pScreen->ClipNotify = ScreenPriv->ClipNotify;
diff --git a/hw/xfree86/common/xf86xvpriv.h b/hw/xfree86/common/xf86xvpriv.h
index 88e7a0e..c667926 100644
--- a/hw/xfree86/common/xf86xvpriv.h
+++ b/hw/xfree86/common/xf86xvpriv.h
@@ -43,7 +43,6 @@ typedef struct {
    void                         (*AdjustFrame)(int, int, int, int);
    Bool                         (*EnterVT)(int, int);
    void                         (*LeaveVT)(int, int);
-   GCPtr			videoGC;
    xf86ModeSetProc		*ModeSet;
 } XF86XVScreenRec, *XF86XVScreenPtr;
 
@@ -82,7 +81,6 @@ typedef struct {
 typedef struct _XF86XVWindowRec{
    XvPortRecPrivatePtr PortRec;
    struct _XF86XVWindowRec *next;
-   GCPtr pGC;
 } XF86XVWindowRec, *XF86XVWindowPtr;
 
 #endif  /* _XF86XVPRIV_H_ */
commit e012f2312b4bcdf31bb5d622ddd34571f3c12429
Author: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
Date:   Thu Jan 13 20:19:18 2011 +0200

    xf86/xv: Remove copy paste code.
    
    xf86XVFillKeyHelperDrawable can be used to implement
    xf86XVFillKeyHelper.
    
    V2:
    * Remove RegionTranslate that clobbered parameter region.
    
    Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at nokia.com>

diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index 016db1f..f1a87f1 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -1869,62 +1869,10 @@ xf86XVQueryImageAttributes(
 			format->id, width, height, pitches, offsets);
 }
 
-
 void
 xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes)
 {
    ScreenPtr pScreen = pDraw->pScreen;
-   WindowPtr pWin = (WindowPtr)pDraw;
-   XF86XVWindowPtr pPriv = GET_XF86XV_WINDOW(pWin);
-   GCPtr pGC = NULL;
-   BoxPtr pbox = RegionRects(clipboxes);
-   int i, nbox = RegionNumRects(clipboxes);
-   xRectangle *rects;
-
-   if(!xf86Screens[pScreen->myNum]->vtSema) return;
-
-   if(pPriv)
-      pGC = pPriv->pGC;
-
-   if(!pGC) {
-       int status;
-       XID pval[2];
-       pval[0] = key;
-       pval[1] = IncludeInferiors;
-       pGC = CreateGC(pDraw, GCForeground | GCSubwindowMode, pval, &status,
-		      (XID)0, serverClient);
-       if(!pGC) return;
-       ValidateGC(pDraw, pGC);
-       if (pPriv) pPriv->pGC = pGC;
-   } else if (key != pGC->fgPixel){
-       ChangeGCVal val;
-       val.val = key;
-       ChangeGC(NullClient, pGC, GCForeground, &val);
-       ValidateGC(pDraw, pGC);
-   }
-
-   RegionTranslate(clipboxes, -pDraw->x, -pDraw->y);
-
-   rects = malloc(nbox * sizeof(xRectangle));
-
-   for(i = 0; i < nbox; i++, pbox++) {
-      rects[i].x = pbox->x1;
-      rects[i].y = pbox->y1;
-      rects[i].width = pbox->x2 - pbox->x1;
-      rects[i].height = pbox->y2 - pbox->y1;
-   }
-
-   (*pGC->ops->PolyFillRect)(pDraw, pGC, nbox, rects);
-
-   if (!pPriv) FreeGC(pGC, 0);
-
-   free(rects);
-}
-
-void
-xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
-{
-   DrawablePtr root = &pScreen->root->drawable;
    ChangeGCVal pval[2];
    BoxPtr pbox = RegionRects(clipboxes);
    int i, nbox = RegionNumRects(clipboxes);
@@ -1933,28 +1881,34 @@ xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
 
    if(!xf86Screens[pScreen->myNum]->vtSema) return;
 
-   gc = GetScratchGC(root->depth, pScreen);
+   gc = GetScratchGC(pDraw->depth, pScreen);
    pval[0].val = key;
    pval[1].val = IncludeInferiors;
    (void) ChangeGC(NullClient, gc, GCForeground|GCSubwindowMode, pval);
-   ValidateGC(root, gc);
+   ValidateGC(pDraw, gc);
 
    rects = malloc(nbox * sizeof(xRectangle));
 
    for(i = 0; i < nbox; i++, pbox++) 
    {
-      rects[i].x = pbox->x1;
-      rects[i].y = pbox->y1;
+      rects[i].x = pbox->x1 - pDraw->x;
+      rects[i].y = pbox->y1 - pDraw->y;
       rects[i].width = pbox->x2 - pbox->x1;
       rects[i].height = pbox->y2 - pbox->y1;
    }
    
-   (*gc->ops->PolyFillRect)(root, gc, nbox, rects);
+   (*gc->ops->PolyFillRect)(pDraw, gc, nbox, rects);
    
    free(rects);
    FreeScratchGC (gc);
 }
 
+void
+xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
+{
+    xf86XVFillKeyHelperDrawable (&pScreen->root->drawable, key, clipboxes);
+}
+
 /* xf86XVClipVideoHelper -
 
    Takes the dst box in standard X BoxRec form (top and left
commit ea1ffd3e60bdcedbec5a6f28929f8677bf45d450
Merge: 12b0f7d... 53602c3...
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 2 15:19:55 2011 -0800

    Merge remote branch 'whot/for-keith'

commit 12b0f7df2caa78d68b453aaa91248bb3577fd724
Author: Evan Broder <ebroder at mokafive.com>
Date:   Tue Feb 1 16:09:50 2011 -0800

    xfree86/modes: Be sure to only use new EDID for physical output dimensions
    
    The EDID processing regards physical dimensions of 0mm x 0mm as
    invalid. Previously the old values for height and width would be
    preserved if none of the physical dimension specifications in the new
    EDID were considered valid.
    
    This will come up in particular if first a monitor is connected to an
    output, and then a projector is connected. Since projectors generally
    report physical dimensions of 0mm x 0mm, this would result in the
    projector claiming to have the physical dimensions of the monitor.
    
    Signed-off-by: Evan Broder <ebroder at mokafive.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index c4470c3..47d3ad1 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -3016,6 +3016,8 @@ xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon)
     free(output->MonInfo);
     
     output->MonInfo = edid_mon;
+    output->mm_width = 0;
+    output->mm_height = 0;
 
     if (debug_modes) {
 	xf86DrvMsg(scrn->scrnIndex, X_INFO, "EDID for output %s\n",
commit 0b15033031d78836582bd1b641c3160c3803a708
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Mon Jan 31 23:25:10 2011 +0100

    xserver: enable TLS even if AIGLX is not enabled
    
    This aligns the xorg server build with the mesa build, which is needed on
    systems where aiglx with dri support is not enabled. Else the following error is
    obtained when trying to load the software raster:
    
    (EE) AIGLX error: dlopen of /usr/lib/dri/swrast_dri.so failed (/usr/lib/dri/swrast_dri.so: undefined symbol: _glapi_tls_Context)
    (EE) GLX: could not load software renderer
    (II) GLX: no usable GL providers found for screen 0
    
    because mesa always enables TLS use in GLX, even if dri is not available.
    
    Signed-off-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
    Signed-off-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index 628760e..9b3e2be 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1013,7 +1013,7 @@ else
 fi
 AM_CONDITIONAL(AIGLX, test "x$AIGLX" = xyes)
 
-if test "x$GLX_USE_TLS" = xyes -a "x$AIGLX" = xyes; then
+if test "x$GLX_USE_TLS" = xyes ; then
 	GLX_DEFINES="-DGLX_USE_TLS -DPTHREADS"
 	GLX_SYS_LIBS="$GLX_SYS_LIBS -lpthread"
 fi
commit 541b25038a5de74411a094570b407c5ae018c2ba
Author: Maarten Maathuis <madman2003 at gmail.com>
Date:   Sun Jan 30 14:06:16 2011 +0100

    exa/mixed: Exclude frontbuffer from deferred pixmap handling.
    
    - Apps like xterm can trigger a lot of fallback rendering.
    - This can lead to (annoyingly) high latencies, because you
      have to wait for the block handler.
    - You need a driver that doesn't directly access the front
      buffer to trigger this (NV50+ nouveau for example).
    - Repeatingly doing dmesg on an xterm with a bitmap font
      will reveal that you never see part of the text.
    - I have recieved at least one complaint in the past of slow
      terminal performance, which was related to core font
      rendering.
    - This does sacrifice some throughput, roughly 33% slower.
    
    Reviewed-by: Michel Dänzer <michel at daenzer.net>
    Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
index fb47151..4f49905 100644
--- a/exa/exa_migration_mixed.c
+++ b/exa/exa_migration_mixed.c
@@ -138,6 +138,7 @@ void
 exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure)
 {
     PixmapPtr pPixmap = closure;
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
     ExaPixmapPriv(pPixmap);
 
     /* Move back results of software rendering on system memory copy of mixed driver
@@ -149,10 +150,18 @@ exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure)
     if (!pExaPixmap->use_gpu_copy && exaPixmapHasGpuCopy(pPixmap)) {
 	ExaScreenPriv(pPixmap->drawable.pScreen);
 
-	if (pExaScr->deferred_mixed_pixmap &&
-	    pExaScr->deferred_mixed_pixmap != pPixmap)
-	    exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
-	pExaScr->deferred_mixed_pixmap = pPixmap;
+	/* Front buffer: Don't wait for the block handler to copy back the data.
+	 * This avoids annoying latency if you encounter a lot of software rendering.
+	 */
+	if (pPixmap == pScreen->GetScreenPixmap(pScreen))
+		exaMoveInPixmap_mixed(pPixmap);
+	else {
+		if (pExaScr->deferred_mixed_pixmap &&
+		    pExaScr->deferred_mixed_pixmap != pPixmap)
+		    exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
+
+		pExaScr->deferred_mixed_pixmap = pPixmap;
+	}
     }
 }
 
commit af87f6367ef733d1a4f3cfca4eeb92bfd84c2b6f
Author: Maarten Maathuis <madman2003 at gmail.com>
Date:   Sun Jan 30 14:06:15 2011 +0100

    exa: Only call driver FinishAccess hook if PrepareAccess hook succeeded.
    
    Reviewed-by: Michel Dänzer <michel at daenzer.net>
    Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/exa/exa.c b/exa/exa.c
index 8adf847..a4e294a 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -421,7 +421,8 @@ exaFinishAccess(DrawablePtr pDrawable, int index)
     /* We always hide the devPrivate.ptr. */
     pPixmap->devPrivate.ptr = NULL;
 
-    if (!pExaScr->info->FinishAccess || !exaPixmapHasGpuCopy(pPixmap))
+    /* Only call FinishAccess if PrepareAccess was called and succeeded. */
+    if (!pExaScr->info->FinishAccess || !pExaScr->access[i].retval)
 	return;
 
     if (i >= EXA_PREPARE_AUX_DEST &&
commit 648d4fe5172cad33c6f09e05dd3d8d7171ef1a7f
Author: Maarten Maathuis <madman2003 at gmail.com>
Date:   Sun Jan 30 14:06:14 2011 +0100

    exa/driver: set pExaPixmap->use_gpu_copy to the right value
    
    - Not sure if it was causing problems, but you never know.
    
    Reviewed-by: Michel Dänzer <michel at daenzer.net>
    Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/exa/exa_driver.c b/exa/exa_driver.c
index a913cfb..b9903d1 100644
--- a/exa/exa_driver.c
+++ b/exa/exa_driver.c
@@ -115,6 +115,8 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
     exaSetAccelBlock(pExaScr, pExaPixmap,
                      w, h, bpp);
 
+    pExaPixmap->use_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
+
     /* During a fallback we must prepare access. */
     if (pExaScr->fallback_counter)
 	exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
commit 246d40b685292fa6393ba22127152137494af2af
Merge: 70f2d39... 8c1f75a...
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 2 14:51:33 2011 -0800

    Merge remote branch 'jeremyhu/master'

commit 70f2d39fbde38d0baa687f1755b6c4c686f23052
Merge: 3a91c2d... a9d3c43...
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 2 14:43:19 2011 -0800

    Merge remote branch 'jturney/master'

commit 3a91c2d21c3231e2a011d95c3cfc01785430c1cf
Merge: ac0a00a... 82b1eaa...
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Feb 2 14:37:00 2011 -0800

    Merge remote branch 'dbn/build-fixes'

commit ac0a00a840a5d8d8374e5db2b849e5959550ca4e
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jan 20 23:01:03 2011 -0500

    xselinux: Fix GetDrawableContext
    
    M_DRAWABLE_PIXMAP is the lookup mask to dixLookupDrawable, and _not_ the
    type value in the drawable itself.
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Eamon Walsh <ewalsh at tycho.nsa.gov>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/Xext/xselinux_ext.c b/Xext/xselinux_ext.c
index 93c1b59..374571c 100644
--- a/Xext/xselinux_ext.c
+++ b/Xext/xselinux_ext.c
@@ -231,13 +231,11 @@ ProcSELinuxGetDrawableContext(ClientPtr client)
     REQUEST(SELinuxGetContextReq);
     REQUEST_SIZE_MATCH(SELinuxGetContextReq);
 
-    rc = dixLookupDrawable(&pDraw, stuff->id, client,
-			   M_WINDOW | M_DRAWABLE_PIXMAP,
-			   DixGetAttrAccess);
+    rc = dixLookupDrawable(&pDraw, stuff->id, client, 0, DixGetAttrAccess);
     if (rc != Success)
 	return rc;
 
-    if (pDraw->type == M_DRAWABLE_PIXMAP)
+    if (pDraw->type == DRAWABLE_PIXMAP)
 	privatePtr = &((PixmapPtr)pDraw)->devPrivates;
     else
 	privatePtr = &((WindowPtr)pDraw)->devPrivates;
commit 53602c36217487e0a80880e8328f89ab302d85c8
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:49 2011 +0200

    xfree86/dga: Remove DGAIsDgaEvent()
    
    DGAIsDgaEvent() is not used anymore.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 28fffc1..74eb739 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -999,18 +999,6 @@ DGAStealButtonEvent(DeviceIntPtr dev, int index, int button, int is_down)
 
 /* We have the power to steal or modify events that are about to get queued */
 
-Bool
-DGAIsDgaEvent (xEvent *e)
-{
-    int	    coreEquiv;
-    if (!DGAScreenKeyRegistered || XDGAEventBase == 0)
-	return FALSE;
-    coreEquiv = e->u.u.type - *XDGAEventBase;
-    if (KeyPress <= coreEquiv && coreEquiv <= MotionNotify)
-	return TRUE;
-    return FALSE;
-}
-
 #define NoSuchEvent 0x80000000	/* so doesn't match NoEventMask */
 static Mask filters[] =
 {
diff --git a/hw/xfree86/dixmods/extmod/dgaproc.h b/hw/xfree86/dixmods/extmod/dgaproc.h
index 6745a6e..a13a517 100644
--- a/hw/xfree86/dixmods/extmod/dgaproc.h
+++ b/hw/xfree86/dixmods/extmod/dgaproc.h
@@ -124,7 +124,6 @@ extern _X_EXPORT Bool DGAStealButtonEvent(DeviceIntPtr dev, int Index, int butto
                          int is_down);
 extern _X_EXPORT Bool DGAStealMotionEvent(DeviceIntPtr dev, int Index, int dx, int dy);
 extern _X_EXPORT Bool DGAStealKeyEvent(DeviceIntPtr dev, int Index, int key_code, int is_down);
-extern _X_EXPORT Bool DGAIsDgaEvent (xEvent *e);
 	    
 extern _X_EXPORT Bool DGAOpenFramebuffer(int Index, char **name, unsigned char **mem,
 			int *size, int *offset, int *flags);
commit 2081728b7432e949c274e0dbbabc296fa4db17f9
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:48 2011 +0200

    xfree86/dga: Only send DGA events for master devices
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index d3c0577..28fffc1 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1210,6 +1210,9 @@ DGAHandleEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
     if (!pScreenPriv)
 	return;
 
+    if (!IsMaster(device))
+	return;
+
     switch (event->subtype) {
     case KeyPress:
     case KeyRelease:
commit 9f09b62e594321a8e45a33f4f13559827d660ed3
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:47 2011 +0200

    xfree86/dga: Remove useless ifdefs
    
    Move some variables to the scope where they are used.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 6fdf1eb..74365e1 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -1011,11 +1011,6 @@ xf86PostMotionEventM(DeviceIntPtr	device,
     DeviceEvent *event;
     int flags = 0;
 
-#if XFreeXDGA
-    int index;
-    int dx = 0, dy = 0;
-#endif
-
     if (valuator_mask_num_valuators(mask) > 0)
     {
         if (is_absolute)
@@ -1029,7 +1024,9 @@ xf86PostMotionEventM(DeviceIntPtr	device,
     if (valuator_mask_isset(mask, 0) ||
         valuator_mask_isset(mask, 1))
         if (miPointerGetScreen(device)) {
-            index = miPointerGetScreen(device)->myNum;
+            int index = miPointerGetScreen(device)->myNum;
+            int dx = 0, dy = 0;
+
             if (valuator_mask_isset(mask, 0))
             {
                 dx = valuator_mask_get(mask, 0);
@@ -1160,10 +1157,6 @@ xf86PostButtonEventM(DeviceIntPtr	device,
     int i = 0, nevents = 0;
     int flags = 0;
 
-#if XFreeXDGA
-    int index;
-#endif
-
     if (valuator_mask_num_valuators(mask) > 0)
     {
         if (is_absolute)
@@ -1174,7 +1167,8 @@ xf86PostButtonEventM(DeviceIntPtr	device,
 
 #if XFreeXDGA
     if (miPointerGetScreen(device)) {
-        index = miPointerGetScreen(device)->myNum;
+        int index = miPointerGetScreen(device)->myNum;
+
         if (DGAStealButtonEvent(device, index, button, is_down))
             return;
     }
@@ -1241,13 +1235,13 @@ xf86PostKeyEventM(DeviceIntPtr	device,
     int i = 0, nevents = 0;
 
 #if XFreeXDGA
-    int index;
     DeviceIntPtr pointer;
 
     /* Some pointers send key events, paired device is wrong then. */
     pointer = IsPointerDevice(device) ? device : GetPairedDevice(device);
     if (miPointerGetScreen(pointer)) {
-        index = miPointerGetScreen(pointer)->myNum;
+        int index = miPointerGetScreen(pointer)->myNum;
+
         if (DGAStealKeyEvent(device, index, key_code, is_down))
             return;
     }
commit 5c941c04ca68cdc2b236c524970bc23f91906af4
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:46 2011 +0200

    xfree86/dga: DGAProcessKeyboardEvent() forgot ET_Internal
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 77d1ff8..d3c0577 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1032,6 +1032,7 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr keybd)
     DeviceEvent     ev;
 
     memset(&ev, 0, sizeof(ev));
+    ev.header = ET_Internal;
     ev.length = sizeof(ev);
     ev.detail.key = event->detail;
     ev.type = event->subtype;
commit ce4e0f660beb097e90110c97d039981702f0b0bd
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:45 2011 +0200

    xfree86/dga: Remove DGAMouseX and DGAMouseY
    
    Previously some sort of absolute coordinates were sent out in
    the padding of the DGA2 Motion and Button events. DGAMouseX
    and DGAMouseY were used to keep track of said coordinates.
    libXxf86dga doesn't use that data for anything, and at least
    git history didn't show any past usage either. So let's just
    remove the last remnants of of this mess.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 3093505..77d1ff8 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -942,8 +942,6 @@ DGAStealKeyEvent(DeviceIntPtr dev, int index, int key_code, int is_down)
    return TRUE;
 }  
 
-static int  DGAMouseX, DGAMouseY;
-
 Bool
 DGAStealMotionEvent(DeviceIntPtr dev, int index, int dx, int dy)
 {
@@ -958,17 +956,6 @@ DGAStealMotionEvent(DeviceIntPtr dev, int index, int dx, int dy)
    if(!pScreenPriv || !pScreenPriv->grabMouse) /* no direct mode */
         return FALSE;
 
-    DGAMouseX += dx;
-    if (DGAMouseX < 0)
-        DGAMouseX = 0;
-    else if (DGAMouseX > screenInfo.screens[index]->width)
-        DGAMouseX = screenInfo.screens[index]->width;
-    DGAMouseY += dy;
-    if (DGAMouseY < 0)
-        DGAMouseY = 0;
-    else if (DGAMouseY > screenInfo.screens[index]->height)
-        DGAMouseY = screenInfo.screens[index]->height;
-
     memset(&event, 0, sizeof(event));
     event.header = ET_Internal;
     event.type = ET_DGAEvent;
commit ee8faeadb60f51a36edce19e568600dab7c8b357
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:44 2011 +0200

    xfree86/dga: DGA2 events are missing the dx/dy information
    
    Copy dx/dy from the internal event to the DGA2 Motion/Button events.
    Do the same for Key events for the sake of keeping the code consistent.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 9d0c621..3093505 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1064,8 +1064,8 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr keybd)
         de.u.u.type = *XDGAEventBase + GetCoreType((InternalEvent*)&ev);
         de.u.u.detail = event->detail;
         de.u.event.time = event->time;
-        de.u.event.dx = 0;
-        de.u.event.dy = 0;
+        de.u.event.dx = event->dx;
+        de.u.event.dy = event->dy;
         de.u.event.screen = pScreen->myNum;
         de.u.event.state = ev.corestate;
 
@@ -1120,8 +1120,8 @@ DGAProcessPointerEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr mouse)
         de.u.u.type = *XDGAEventBase + coreEquiv;
         de.u.u.detail = event->detail;
         de.u.event.time = event->time;
-        de.u.event.dx = 0;
-        de.u.event.dy = 0;
+        de.u.event.dx = event->dx;
+        de.u.event.dy = event->dy;
         de.u.event.screen = pScreen->myNum;
         de.u.event.state = ev.corestate;
 
commit e3fef815cf85cf59256f3edeaa21c1267898b42c
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:43 2011 +0200

    xfree86/dga: Make mieq_install Bool
    
    mieq_installed is used as a boolean, so why not make it such. Also
    it's a static variable, so the the explicit zero initialization can
    be removed.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index c4b2d7d..9d0c621 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -53,7 +53,7 @@
 
 static DevPrivateKeyRec DGAScreenKeyRec;
 #define DGAScreenKeyRegistered dixPrivateKeyRegistered(&DGAScreenKeyRec)
-static int mieq_installed = 0;
+static Bool mieq_installed;
 
 static Bool DGACloseScreen(int i, ScreenPtr pScreen);
 static void DGADestroyColormap(ColormapPtr pmap);
@@ -252,7 +252,7 @@ DGACloseScreen(int i, ScreenPtr pScreen)
 
    if (mieq_installed) {
        mieqSetHandler(ET_DGAEvent, NULL);
-       mieq_installed = 0;
+       mieq_installed = FALSE;
    }
 
    FreeMarkedVisuals(pScreen);
@@ -449,7 +449,7 @@ xf86SetDGAMode(
 
    if (!mieq_installed) {
       mieqSetHandler(ET_DGAEvent, DGAHandleEvent);
-      mieq_installed = 1;
+      mieq_installed = TRUE;
    }
 
    return Success;
@@ -472,7 +472,7 @@ DGASetInputMode(int index, Bool keyboard, Bool mouse)
 
       if (!mieq_installed) {
           mieqSetHandler(ET_DGAEvent, DGAHandleEvent);
-          mieq_installed = 1;
+          mieq_installed = TRUE;
       }
    }
 }
commit f4cb25c2ed832bf4cfcd4d25198fe5a895430fed
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:42 2011 +0200

    xfree86/dga: Remove the ET_DGAEvent handler only if it was installed
    
    Remove the handler only if it was installed. Also mark it as
    uninstalled, otherwise it wouldn't get reinstalled after a
    server reset.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 3cded85..c4b2d7d 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -250,9 +250,10 @@ DGACloseScreen(int i, ScreenPtr pScreen)
 {
    DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
 
-   if (XDGAEventBase) {
+   if (mieq_installed) {
        mieqSetHandler(ET_DGAEvent, NULL);
-    }
+       mieq_installed = 0;
+   }
 
    FreeMarkedVisuals(pScreen);
 
commit e1547a9f1f6d7991219b7711f4cacc2852dbf88c
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:41 2011 +0200

    xfree86/dga: Install the DGA event handler when DGA2 is used
    
    The ET_DGAEvent handler is only installed when a client
    requests relative events via DGA1. Do it also when a client
    requests DGA2 events.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 1058a46..3cded85 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -446,6 +446,11 @@ xf86SetDGAMode(
    pScreenPriv->grabMouse = TRUE;
    pScreenPriv->grabKeyboard = TRUE;
 
+   if (!mieq_installed) {
+      mieqSetHandler(ET_DGAEvent, DGAHandleEvent);
+      mieq_installed = 1;
+   }
+
    return Success;
 }
 
commit 7b16e8633d5a95167aac0c19e43fcfe38bd4a6a4
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:40 2011 +0200

    xfree86/input: Restore DGAStealKeyEvent()
    
    DGA key event support was lost in commit
    8da0ff2d51086666d10ca7330d428e8610a4a0e3. Bring it back.
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index b9006ab..6fdf1eb 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -1240,6 +1240,19 @@ xf86PostKeyEventM(DeviceIntPtr	device,
 {
     int i = 0, nevents = 0;
 
+#if XFreeXDGA
+    int index;
+    DeviceIntPtr pointer;
+
+    /* Some pointers send key events, paired device is wrong then. */
+    pointer = IsPointerDevice(device) ? device : GetPairedDevice(device);
+    if (miPointerGetScreen(pointer)) {
+        index = miPointerGetScreen(pointer)->myNum;
+        if (DGAStealKeyEvent(device, index, key_code, is_down))
+            return;
+    }
+#endif
+
     if (is_absolute) {
         nevents = GetKeyboardValuatorEvents(xf86Events, device,
                                             is_down ? KeyPress : KeyRelease,
commit a2c481821997ae14aa5816895ae36db2ca2e4dec
Author: Ville Syrjala <syrjala at sci.fi>
Date:   Mon Jan 24 01:06:39 2011 +0200

    include: Fix a copy/paste error in a comment
    
    Signed-off-by: Ville Syrjala <syrjala at sci.fi>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/eventstr.h b/include/eventstr.h
index 377cceb..673207c 100644
--- a/include/eventstr.h
+++ b/include/eventstr.h
@@ -177,7 +177,7 @@ struct _DGAEvent
     Time time;            /**<  Time in ms */
     int subtype;          /**<  KeyPress, KeyRelease, ButtonPress,
                                 ButtonRelease, MotionNotify */
-    int detail;           /**<  Relative x coordinate */
+    int detail;           /**<  Button number or key code */
     int dx;               /**<  Relative x coordinate */
     int dy;               /**<  Relative y coordinate */
     int screen;           /**<  Screen number this event applies to */
commit 77af0dc5217fc9c446097d6d487c8ddaf00bdd2a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jan 24 10:06:34 2011 +1000

    xfree86: bump input minor ABI
    
    The new valuator_mask_free() call requires a minor bump.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index 609819b..49a98bd 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -83,7 +83,7 @@ typedef enum {
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
 #define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(9, 0)
-#define ABI_XINPUT_VERSION	SET_ABI_VERSION(12, 1)
+#define ABI_XINPUT_VERSION	SET_ABI_VERSION(12, 2)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(5, 0)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
 
commit 5927e070b45fbe3fea4b394920ffd6f7d036f1ed
Author: Erkki Seppälä <erkki.seppala at vincit.fi>
Date:   Fri Jan 21 15:56:22 2011 +0200

    xkb: Cancel a key's repetition when its autorepeat is disabled.
    
    When XkbChangeEnabledControls is called to disable key repetition of a
    certain key (or keys), currently ongoing repetition of that key was
    not cancelled. It was cancelled if ChangeKeyboardControl was used to
    disable key repetition globally.
    
    Reviewed-by: Rami Ylimäki <rami.ylimaki at vincit.fi>
    Reviewed-by: Dirk Wallenstein <halsmit at t-online.de>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index bbb1d9d..6fd66c5 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -915,9 +915,14 @@ ProcXkbSetControls(ClientPtr client)
                                        stuff->axtOptsMask);
             }
 
-            if (stuff->changeCtrls & XkbPerKeyRepeatMask)
+            if (stuff->changeCtrls & XkbPerKeyRepeatMask) {
                 memcpy(new.per_key_repeat, stuff->perKeyRepeat,
                        XkbPerKeyBitArraySize);
+                if (xkbi->repeatKey &&
+                    !BitIsOn(new.per_key_repeat, xkbi->repeatKey)) {
+                    AccessXCancelRepeatKey(xkbi, xkbi->repeatKey);
+                }
+            }
 
             old= *ctrl;
             *ctrl= new;
commit a9d3c43a57cbaf42d9e96ad49cf12bbf1d275fe5
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Jan 19 15:57:59 2011 +0000

    Fix compilation of xf86bigfont.c
    
    xf86bigfont.c: In function 'XFree86BigfontExtensionInit':
    xf86bigfont.c:146: error: 'ProcXF86BigfontDispatch' undeclared (first use in this function)
    xf86bigfont.c:147: error: 'SProcXF86BigfontDispatch' undeclared (first use in this function)
    
    It seems this has been broken since commit cbd4d5dbb70db62ba1cb79c7b904e6fa11f62d7e
    "delete pervasively use of DISPATCH_PROC" (2010-09-28), which is a bit worrying as
    that presumably indicates that no tinderbox is configuring with --enable-xf86bigfont.
    
    In a similar fashion to that commit, fix by moving XFree86BigfontExtensionInit()
    below the definitions of the static dispatch functions it references.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Julien Cristau <jcristau at debian.org>

diff --git a/Xext/xf86bigfont.c b/Xext/xf86bigfont.c
index da35287..de82744 100644
--- a/Xext/xf86bigfont.c
+++ b/Xext/xf86bigfont.c
@@ -137,51 +137,6 @@ CheckForShmSyscall(void)
 
 #endif
 
-void
-XFree86BigfontExtensionInit(void)
-{
-    if (AddExtension(XF86BIGFONTNAME,
-		     XF86BigfontNumberEvents,
-		     XF86BigfontNumberErrors,
-		     ProcXF86BigfontDispatch,
-		     SProcXF86BigfontDispatch,
-		     XF86BigfontResetProc,
-		     StandardMinorOpcode)) {
-#ifdef HAS_SHM
-#ifdef MUST_CHECK_FOR_SHM_SYSCALL
-	/*
-	 * Note: Local-clients will not be optimized without shared memory
-	 * support. Remote-client optimization does not depend on shared
-	 * memory support.  Thus, the extension is still registered even
-	 * when shared memory support is not functional.  
-	 */
-	if (!CheckForShmSyscall()) {
-	    ErrorF(XF86BIGFONTNAME " extension local-client optimization disabled due to lack of shared memory support in the kernel\n");
-	    return;
-	}
-#endif
-
-	srand((unsigned int) time(NULL));
-	signature = ((unsigned int) (65536.0/(RAND_MAX+1.0) * rand()) << 16)
-	           + (unsigned int) (65536.0/(RAND_MAX+1.0) * rand());
-	/* fprintf(stderr, "signature = 0x%08X\n", signature); */
-
-	FontShmdescIndex = AllocateFontPrivateIndex();
-
-#if !defined(CSRG_BASED) && !defined(__CYGWIN__)
-	pagesize = SHMLBA;
-#else
-# ifdef _SC_PAGESIZE
-	pagesize = sysconf(_SC_PAGESIZE);
-# else
-	pagesize = getpagesize();
-# endif
-#endif
-#endif
-    }
-}
-
-
 /* ========== Management of shared memory segments ========== */
 
 #ifdef HAS_SHM
@@ -749,3 +704,47 @@ SProcXF86BigfontDispatch(
 	    return BadRequest;
     }
 }
+
+void
+XFree86BigfontExtensionInit(void)
+{
+    if (AddExtension(XF86BIGFONTNAME,
+		     XF86BigfontNumberEvents,
+		     XF86BigfontNumberErrors,
+		     ProcXF86BigfontDispatch,
+		     SProcXF86BigfontDispatch,
+		     XF86BigfontResetProc,
+		     StandardMinorOpcode)) {
+#ifdef HAS_SHM
+#ifdef MUST_CHECK_FOR_SHM_SYSCALL
+	/*
+	 * Note: Local-clients will not be optimized without shared memory
+	 * support. Remote-client optimization does not depend on shared
+	 * memory support.  Thus, the extension is still registered even
+	 * when shared memory support is not functional.
+	 */
+	if (!CheckForShmSyscall()) {
+	    ErrorF(XF86BIGFONTNAME " extension local-client optimization disabled due to lack of shared memory support in the kernel\n");
+	    return;
+	}
+#endif
+
+	srand((unsigned int) time(NULL));
+	signature = ((unsigned int) (65536.0/(RAND_MAX+1.0) * rand()) << 16)
+	           + (unsigned int) (65536.0/(RAND_MAX+1.0) * rand());
+	/* fprintf(stderr, "signature = 0x%08X\n", signature); */
+
+	FontShmdescIndex = AllocateFontPrivateIndex();
+
+#if !defined(CSRG_BASED) && !defined(__CYGWIN__)
+	pagesize = SHMLBA;
+#else
+# ifdef _SC_PAGESIZE
+	pagesize = sysconf(_SC_PAGESIZE);
+# else
+	pagesize = getpagesize();
+# endif
+#endif
+#endif
+    }
+}
commit 82b1eaa6cad20f39dbf15573bdb3d62acbcd91f9
Author: Tom Fogal <tfogal at alumni.unh.edu>
Date:   Wed Dec 22 14:39:48 2010 -0700

    Autodetect TLS support instead of defaulting to disabled.
    
    Uses the AX_TLS macro to figure out if the current platform
    supports TLS.  If it does, enable TLS automagically.  Still
    respects --enable option, regardless.
    
    Signed-off-by: Tom Fogal <tfogal at alumni.unh.edu>
    Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>

diff --git a/configure.ac b/configure.ac
index 1ceffe7..e6ada8d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -597,9 +597,14 @@ dnl GLX build options
 AC_ARG_ENABLE(aiglx,          AS_HELP_STRING([--enable-aiglx], [Build accelerated indirect GLX (default: enabled)]),
                                 [AIGLX=$enableval],
                                 [AIGLX=yes])
-AC_ARG_ENABLE(glx-tls,        AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]),
+AX_TLS
+AC_ARG_ENABLE(glx-tls,        AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: auto)]),
                                 [GLX_USE_TLS=$enableval],
-                                [GLX_USE_TLS=no])
+                                [GLX_USE_TLS=no
+                                 if test "${ac_cv_tls}" != "none" ; then
+                                   GLX_USE_TLS=yes
+                                 fi])
+AC_SUBST(GLX_TLS, ${GLX_USE_TLS})
 
 dnl Extensions.
 AC_ARG_ENABLE(registry,       AS_HELP_STRING([--disable-registry], [Build string registry module (default: enabled)]), [XREGISTRY=$enableval], [XREGISTRY=yes])
commit 93393411e39fbb0f72cf6c2f79ebde177aa86932
Author: Tom Fogal <tfogal at alumni.unh.edu>
Date:   Wed Dec 22 16:03:03 2010 -0700

    Add macro for detecting thread local storage support.
    
    This adds an AX_TLS macro which attempts to identify if the
    underlying compiler/platform supports thread local storage (TLS).
    The macro comes from the autoconf macro archive.
    
    Signed-off-by: Tom Fogal <tfogal at alumni.unh.edu>
    Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>

diff --git a/m4/ax_tls.m4 b/m4/ax_tls.m4
new file mode 100644
index 0000000..481c3d0
--- /dev/null
+++ b/m4/ax_tls.m4
@@ -0,0 +1,74 @@
+# ===========================================================================
+#             http://www.nongnu.org/autoconf-archive/ax_tls.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_TLS
+#
+# DESCRIPTION
+#
+#   Provides a test for the compiler support of thread local storage (TLS)
+#   extensions. Defines TLS if it is found. Currently only knows about GCC
+#   and MSVC. I think SunPro uses the same as GCC, and Borland apparently
+#   supports either.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Alan Woodland <ajw05 at aber.ac.uk>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+AC_DEFUN([AX_TLS], [
+  AC_MSG_CHECKING(for thread local storage (TLS) class)
+  AC_CACHE_VAL(ac_cv_tls, [
+    ax_tls_keywords="__thread __declspec(thread) none"
+    for ax_tls_keyword in $ax_tls_keywords; do
+       case $ax_tls_keyword in
+          none) ac_cv_tls=none ; break ;;
+          *)
+             AC_TRY_COMPILE(
+                [#include <stdlib.h>
+                 static void
+                 foo(void) {
+                 static ] $ax_tls_keyword [ int bar;
+                 exit(1);
+                 }],
+                 [],
+                 [ac_cv_tls=$ax_tls_keyword ; break],
+                 ac_cv_tls=none
+             )
+       esac
+    done
+])
+
+  if test "$ac_cv_tls" != "none"; then
+    dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here])
+    AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here])
+  fi
+  AC_MSG_RESULT($ac_cv_tls)
+])
commit 60801ff8703ec36995139a6dd7b1fc26ae8854a6
Author: Dan Nicholson <dbn.lists at gmail.com>
Date:   Tue Nov 23 11:38:50 2010 -0800

    xfree86: Convert libxf86config to static libtool library
    
    In order to use libxf86config in a shared library, all the code must be
    compiled with -fPIC. Add proper PIC support for libxf86config by turning
    it into a libtool library. However, since we don't want to guarantee API
    or ABI stability, make sure it's only built static.
    
    Signed-off-by: Dan Nicholson <dbn.lists at gmail.com>
    Acked-by: Gaetan Nadon <memsize at videotron.ca>

diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am
index fb5d49e..1cd70e7 100644
--- a/hw/xfree86/parser/Makefile.am
+++ b/hw/xfree86/parser/Makefile.am
@@ -1,6 +1,6 @@
 if INSTALL_LIBXF86CONFIG
 noinst_LTLIBRARIES = libxf86config_internal.la
-lib_LIBRARIES = libxf86config.a
+lib_LTLIBRARIES = libxf86config.la
 LIBHEADERS = \
 	xf86Optrec.h \
 	xf86Parser.h
@@ -30,10 +30,11 @@ INTERNAL_SOURCES= \
 libxf86config_internal_la_SOURCES = \
 	$(INTERNAL_SOURCES)
 
-libxf86config_a_SOURCES = \
+libxf86config_la_SOURCES = \
 	$(top_srcdir)/os/xprintf.c \
 	$(INTERNAL_SOURCES)
-libxf86config_a_CFLAGS = $(AM_CFLAGS)
+libxf86config_la_CFLAGS = $(AM_CFLAGS)
+libxf86config_la_LDFLAGS = -static
 
 AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) \
 	-DSYSCONFDIR=\"$(sysconfdir)\" \


More information about the Xquartz-changes mailing list