xf86-video-intel: Branch 'screen-conv-api' - 154 commits - configure.ac src/Makefile.am src/common.h src/compat-api.h src/i830_render.c src/i915_render.c src/i965_render.c src/i965_video.c src/intel.h src/intel_batchbuffer.c src/intel_display.c src/intel_dri.c src/intel_driver.c src/intel_driver.h src/intel_glamor.c src/intel_hwmc.c src/intel_module.c src/intel_options.c src/intel_options.h src/intel_shadow.c src/intel_uxa.c src/intel_video.c src/legacy/i810 src/legacy/legacy.h src/sna/blt.c src/sna/compiler.h src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/kgem.h src/sna/kgem_debug.c src/sna/sna.h src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_composite.c src/sna/sna_display.c src/sna/sna_dri.c src/sna/sna_driver.c src/sna/sna_glyphs.c src/sna/sna_gradient.c src/sna/sna_io.c src/sna/sna_module.h src/sna/sna_render.c src/sna/sna_render.h src/sna/sna_transform .c src/sna/sna_trapezoids.c src/sna/sna_video.c src/sna/sna_video.h src/sna/sna_video_overlay.c src/sna/sna_video_sprite.c src/sna/sna_video_textured.c test/Makefile.am test/basic-rectangle.c test/basic-string.c uxa/uxa-glyphs.c uxa/uxa-priv.h uxa/uxa.c

Dave Airlie airlied at kemper.freedesktop.org
Tue Jun 5 02:42:10 PDT 2012


Rebased ref, commits from common ancestor:
commit 5d47884cda80888e73e7593fe49f313575b00fd6
Author: Dave Airlie <airlied at redhat.com>
Date:   Tue May 22 15:44:28 2012 +0100

    sna: port to compat api
    
    This ports SNA to the new compat-api.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index a389acf..8da4f52 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -83,7 +83,7 @@ DevPrivateKeyRec sna_gc_index;
 DevPrivateKeyRec sna_glyph_key;
 DevPrivateKeyRec sna_glyph_image_key;
 
-static Bool sna_enter_vt(int scrnIndex, int flags);
+static Bool sna_enter_vt(VT_FUNC_ARGS_DECL);
 
 /* temporary */
 extern void xf86SetCursor(ScreenPtr screen, CursorPtr pCurs, int x, int y);
@@ -162,6 +162,7 @@ sna_load_palette(ScrnInfoPtr scrn, int numColors, int *indices,
  */
 static Bool sna_create_screen_resources(ScreenPtr screen)
 {
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	struct sna *sna = to_sna_from_screen(screen);
 
 	DBG(("%s(%dx%d@%d)\n", __FUNCTION__,
@@ -204,7 +205,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 
 	sna_copy_fbcon(sna);
 
-	if (!sna_enter_vt(screen->myNum, 0)) {
+	if (!sna_enter_vt(VT_FUNC_ARGS(0))) {
 		xf86DrvMsg(screen->myNum, X_ERROR,
 			   "[intel] Failed to become DRM master\n");
 		goto cleanup_front;
@@ -575,25 +576,27 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 }
 
 static void
-sna_block_handler(int i, pointer data, pointer timeout, pointer read_mask)
+sna_block_handler(BLOCKHANDLER_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86ScreenToScrn(screenInfo.screens[i]);
+	SCREEN_PTR(arg);
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	struct sna *sna = to_sna(scrn);
 	struct timeval **tv = timeout;
 
 	DBG(("%s (tv=%ld.%06ld)\n", __FUNCTION__,
 	     *tv ? (*tv)->tv_sec : -1, *tv ? (*tv)->tv_usec : 0));
 
-	sna->BlockHandler(i, data, timeout, read_mask);
+	sna->BlockHandler(BLOCKHANDLER_ARGS);
 
 	if (*tv == NULL || ((*tv)->tv_usec | (*tv)->tv_sec))
 		sna_accel_block_handler(sna, tv);
 }
 
 static void
-sna_wakeup_handler(int i, pointer data, unsigned long result, pointer read_mask)
+sna_wakeup_handler(WAKEUPHANDLER_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86ScreenToScrn(screenInfo.screens[i]);
+	SCREEN_PTR(arg);
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
@@ -602,7 +605,7 @@ sna_wakeup_handler(int i, pointer data, unsigned long result, pointer read_mask)
 	if ((int)result < 0)
 		return;
 
-	sna->WakeupHandler(i, data, result, read_mask);
+	sna->WakeupHandler(WAKEUPHANDLER_ARGS);
 
 	sna_accel_wakeup_handler(sna, read_mask);
 
@@ -720,9 +723,9 @@ sna_uevent_fini(ScrnInfoPtr scrn)
 }
 #endif /* HAVE_UDEV */
 
-static void sna_leave_vt(int scrnIndex, int flags)
+static void sna_leave_vt(VT_FUNC_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	struct sna *sna = to_sna(scrn);
 	int ret;
 
@@ -750,9 +753,9 @@ static Bool sna_dri_has_pending_events(struct sna *sna)
 	return poll(&pfd, 1, 0) == 1;
 }
 
-static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
+static Bool sna_close_screen(CLOSE_SCREEN_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
@@ -766,7 +769,7 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
 		sna_dri_wakeup(sna);
 
 	if (scrn->vtSema == TRUE)
-		sna_leave_vt(scrnIndex, 0);
+		sna_leave_vt(VT_FUNC_ARGS(0));
 
 	sna_accel_close(sna);
 
@@ -776,7 +779,7 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
 	screen->devPrivate = NULL;
 
 	screen->CloseScreen = sna->CloseScreen;
-	(*screen->CloseScreen) (scrnIndex, screen);
+	(*screen->CloseScreen) (CLOSE_SCREEN_ARGS);
 
 	if (sna->directRenderingOpen) {
 		sna_dri_close(sna, screen);
@@ -788,7 +791,7 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
 		screen->DestroyPixmap(sna->front);
 		sna->front = NULL;
 	}
-	xf86GARTCloseScreen(scrnIndex);
+	xf86GARTCloseScreen(scrn->scrnIndex);
 
 	scrn->vtSema = FALSE;
 	return TRUE;
@@ -825,7 +828,7 @@ agp_aperture_size(struct pci_device *dev, int gen)
 }
 
 static Bool
-sna_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
+sna_screen_init(SCREEN_INIT_ARGS_DECL)
 {
 	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	struct sna *sna = to_sna(scrn);
@@ -946,13 +949,13 @@ sna_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 	return TRUE;
 }
 
-static void sna_adjust_frame(int scrnIndex, int x, int y, int flags)
+static void sna_adjust_frame(ADJUST_FRAME_ARGS_DECL)
 {
 }
 
-static void sna_free_screen(int scrnIndex, int flags)
+static void sna_free_screen(FREE_SCREEN_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
@@ -970,9 +973,9 @@ static void sna_free_screen(int scrnIndex, int flags)
 /*
  * This gets called when gaining control of the VT, and from ScreenInit().
  */
-static Bool sna_enter_vt(int scrnIndex, int flags)
+static Bool sna_enter_vt(VT_FUNC_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
@@ -991,14 +994,15 @@ static Bool sna_enter_vt(int scrnIndex, int flags)
 	return TRUE;
 }
 
-static Bool sna_switch_mode(int scrnIndex, DisplayModePtr mode, int flags)
+static Bool sna_switch_mode(SWITCH_MODE_ARGS_DECL)
 {
+	SCRN_INFO_PTR(arg);
 	DBG(("%s\n", __FUNCTION__));
-	return xf86SetSingleMode(xf86Screens[scrnIndex], mode, RR_Rotate_0);
+	return xf86SetSingleMode(scrn, mode, RR_Rotate_0);
 }
 
 static ModeStatus
-sna_valid_mode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
+sna_valid_mode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags)
 {
 	return MODE_OK;
 }
@@ -1015,9 +1019,9 @@ sna_valid_mode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
  * DoApmEvent() in common/xf86PM.c, including if we want to see events other
  * than suspend/resume.
  */
-static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo)
+static Bool sna_pm_event(SCRN_ARG_TYPE arg, pmEvent event, Bool undo)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
@@ -1029,12 +1033,12 @@ static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo)
 	case XF86_APM_SYS_STANDBY:
 	case XF86_APM_USER_STANDBY:
 		if (!undo && !sna->suspended) {
-			scrn->LeaveVT(scrnIndex, 0);
+			scrn->LeaveVT(VT_FUNC_ARGS(0));
 			sna->suspended = TRUE;
 			sleep(SUSPEND_SLEEP);
 		} else if (undo && sna->suspended) {
 			sleep(RESUME_SLEEP);
-			scrn->EnterVT(scrnIndex, 0);
+			scrn->EnterVT(VT_FUNC_ARGS(0));
 			sna->suspended = FALSE;
 		}
 		break;
@@ -1043,7 +1047,7 @@ static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo)
 	case XF86_APM_CRITICAL_RESUME:
 		if (sna->suspended) {
 			sleep(RESUME_SLEEP);
-			scrn->EnterVT(scrnIndex, 0);
+			scrn->EnterVT(VT_FUNC_ARGS(0));
 			sna->suspended = FALSE;
 			/*
 			 * Turn the screen saver off when resuming.  This seems to be
commit ac8140f62f553f0078d325da38f9df2fb05a4b84
Author: Dave Airlie <airlied at redhat.com>
Date:   Tue May 22 15:35:01 2012 +0100

    intel: port legacy and uxa to new API.
    
    This ports the legacy and uxa driver to the new server API.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/compat-api.h b/src/compat-api.h
index 1bb7724..2daf910 100644
--- a/src/compat-api.h
+++ b/src/compat-api.h
@@ -38,4 +38,68 @@
 #define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
 #endif
 
+#ifndef XF86_SCRN_INTERFACE
+
+#define SCRN_ARG_TYPE int
+#define SCRN_INFO_PTR(arg1) ScrnInfoPtr scrn = xf86Screens[(arg1)]
+
+#define SCREEN_ARG_TYPE int
+#define SCREEN_PTR(arg1) ScreenPtr screen = screenInfo.screens[(arg1)]
+
+#define SCREEN_INIT_ARGS_DECL int scrnIndex, ScreenPtr screen, int argc, char **argv
+
+#define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer timeout, pointer read_mask
+#define BLOCKHANDLER_ARGS arg, blockData, timeout, read_mask
+
+#define WAKEUPHANDLER_ARGS_DECL int arg, pointer wakeupData, unsigned long result, pointer read_mask
+#define WAKEUPHANDLER_ARGS arg, wakeupData, result, read_mask
+
+#define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr screen
+#define CLOSE_SCREEN_ARGS scrnIndex, screen
+
+#define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags
+#define ADJUST_FRAME_ARGS(arg, x, y) (arg)->scrnIndex, x, y, 0
+
+#define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags
+#define SWITCH_MODE_ARGS(arg, m) (arg)->scrnIndex, m, 0
+
+#define FREE_SCREEN_ARGS_DECL int arg, int flags
+
+#define VT_FUNC_ARGS_DECL int arg, int flags
+#define VT_FUNC_ARGS(flags) scrn->scrnIndex, (flags)
+
+#define XF86_ENABLEDISABLEFB_ARG(x) ((x)->scrnIndex)
+
+#else
+#define SCRN_ARG_TYPE ScrnInfoPtr
+#define SCRN_INFO_PTR(arg1) ScrnInfoPtr scrn = (arg1)
+
+#define SCREEN_ARG_TYPE ScreenPtr
+#define SCREEN_PTR(arg1) ScreenPtr screen = (arg1)
+
+#define SCREEN_INIT_ARGS_DECL ScreenPtr screen, int argc, char **argv
+
+#define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer timeout, pointer read_mask
+#define BLOCKHANDLER_ARGS arg, timeout, read_mask
+
+#define WAKEUPHANDLER_ARGS_DECL ScreenPtr arg, unsigned long result, pointer read_mask
+#define WAKEUPHANDLER_ARGS arg, result, read_mask
+
+#define CLOSE_SCREEN_ARGS_DECL ScreenPtr screen
+#define CLOSE_SCREEN_ARGS screen
+
+#define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y
+#define ADJUST_FRAME_ARGS(arg, x, y) arg, x, y
+
+#define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode
+#define SWITCH_MODE_ARGS(arg, m) arg, m
+
+#define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg
+
+#define VT_FUNC_ARGS_DECL ScrnInfoPtr arg
+#define VT_FUNC_ARGS(flags) scrn
+
+#define XF86_ENABLEDISABLEFB_ARG(x) (x)
+
+#endif
 #endif
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 190517f..67cec48 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -80,9 +80,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "intel_glamor.h"
 #include "intel_options.h"
 
-static void i830AdjustFrame(int scrnIndex, int x, int y, int flags);
-static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen);
-static Bool I830EnterVT(int scrnIndex, int flags);
+static void i830AdjustFrame(ADJUST_FRAME_ARGS_DECL);
+static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL);
+static Bool I830EnterVT(VT_FUNC_ARGS_DECL);
 
 /* temporary */
 extern void xf86SetCursor(ScreenPtr screen, CursorPtr pCurs, int x, int y);
@@ -677,15 +677,15 @@ void IntelEmitInvarientState(ScrnInfoPtr scrn)
 }
 
 static void
-I830BlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask)
+I830BlockHandler(BLOCKHANDLER_ARGS_DECL)
 {
-	ScreenPtr screen = screenInfo.screens[i];
-	ScrnInfoPtr scrn = xf86Screens[i];
+	SCREEN_PTR(arg);
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	screen->BlockHandler = intel->BlockHandler;
 
-	(*screen->BlockHandler) (i, blockData, pTimeout, pReadmask);
+	(*screen->BlockHandler) (BLOCKHANDLER_ARGS);
 
 	intel->BlockHandler = screen->BlockHandler;
 	screen->BlockHandler = I830BlockHandler;
@@ -837,7 +837,7 @@ I830UeventFini(ScrnInfoPtr scrn)
 #endif /* HAVE_UDEV */
 
 static Bool
-I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
+I830ScreenInit(SCREEN_INIT_ARGS_DECL)
 {
 	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
@@ -1007,16 +1007,16 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 	 * later memory should be bound when allocating, e.g rotate_mem */
 	scrn->vtSema = TRUE;
 
-	return I830EnterVT(scrnIndex, 0);
+	return I830EnterVT(VT_FUNC_ARGS(0));
 }
 
-static void i830AdjustFrame(int scrnIndex, int x, int y, int flags)
+static void i830AdjustFrame(ADJUST_FRAME_ARGS_DECL)
 {
 }
 
-static void I830FreeScreen(int scrnIndex, int flags)
+static void I830FreeScreen(FREE_SCREEN_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if (intel) {
@@ -1029,9 +1029,9 @@ static void I830FreeScreen(int scrnIndex, int flags)
 	}
 }
 
-static void I830LeaveVT(int scrnIndex, int flags)
+static void I830LeaveVT(VT_FUNC_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	int ret;
 
@@ -1048,9 +1048,9 @@ static void I830LeaveVT(int scrnIndex, int flags)
 /*
  * This gets called when gaining control of the VT, and from ScreenInit().
  */
-static Bool I830EnterVT(int scrnIndex, int flags)
+static Bool I830EnterVT(VT_FUNC_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	int ret;
 
@@ -1067,16 +1067,16 @@ static Bool I830EnterVT(int scrnIndex, int flags)
 	return TRUE;
 }
 
-static Bool I830SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
+static Bool I830SwitchMode(SWITCH_MODE_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 
 	return xf86SetSingleMode(scrn, mode, RR_Rotate_0);
 }
 
-static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen)
+static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 #if HAVE_UDEV
@@ -1084,7 +1084,7 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen)
 #endif
 
 	if (scrn->vtSema == TRUE) {
-		I830LeaveVT(scrnIndex, 0);
+		I830LeaveVT(VT_FUNC_ARGS(0));
 	}
 
 	DeleteCallback(&FlushCallback, intel_flush_callback, scrn);
@@ -1141,7 +1141,7 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen)
 	i965_free_video(scrn);
 
 	screen->CloseScreen = intel->CloseScreen;
-	(*screen->CloseScreen) (scrnIndex, screen);
+	(*screen->CloseScreen) (CLOSE_SCREEN_ARGS);
 
 	if (intel->directRenderingOpen
 	    && intel->directRenderingType == DRI_DRI2) {
@@ -1149,18 +1149,19 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen)
 		I830DRI2CloseScreen(screen);
 	}
 
-	xf86GARTCloseScreen(scrnIndex);
+	xf86GARTCloseScreen(scrn->scrnIndex);
 
 	scrn->vtSema = FALSE;
 	return TRUE;
 }
 
 static ModeStatus
-I830ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
+I830ValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags)
 {
+	SCRN_INFO_PTR(arg);
 	if (mode->Flags & V_INTERLACE) {
 		if (verbose) {
-			xf86DrvMsg(scrnIndex, X_PROBED,
+			xf86DrvMsg(scrn->scrnIndex, X_PROBED,
 				   "Removing interlaced mode \"%s\"\n",
 				   mode->name);
 		}
@@ -1181,9 +1182,9 @@ I830ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
  * DoApmEvent() in common/xf86PM.c, including if we want to see events other
  * than suspend/resume.
  */
-static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo)
+static Bool I830PMEvent(SCRN_ARG_TYPE arg, pmEvent event, Bool undo)
 {
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	switch (event) {
@@ -1193,12 +1194,12 @@ static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo)
 	case XF86_APM_SYS_STANDBY:
 	case XF86_APM_USER_STANDBY:
 		if (!undo && !intel->suspended) {
-			scrn->LeaveVT(scrnIndex, 0);
+			scrn->LeaveVT(VT_FUNC_ARGS(0));
 			intel->suspended = TRUE;
 			sleep(SUSPEND_SLEEP);
 		} else if (undo && intel->suspended) {
 			sleep(RESUME_SLEEP);
-			scrn->EnterVT(scrnIndex, 0);
+			scrn->EnterVT(VT_FUNC_ARGS(0));
 			intel->suspended = FALSE;
 		}
 		break;
@@ -1207,7 +1208,7 @@ static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo)
 	case XF86_APM_CRITICAL_RESUME:
 		if (intel->suspended) {
 			sleep(RESUME_SLEEP);
-			scrn->EnterVT(scrnIndex, 0);
+			scrn->EnterVT(VT_FUNC_ARGS(0));
 			intel->suspended = FALSE;
 			/*
 			 * Turn the screen saver off when resuming.  This seems to be
diff --git a/src/legacy/i810/i810.h b/src/legacy/i810/i810.h
index f4caf56..874551b 100644
--- a/src/legacy/i810/i810.h
+++ b/src/legacy/i810/i810.h
@@ -287,8 +287,8 @@ extern Bool I810UnbindGARTMemory(ScrnInfoPtr pScrn);
 
 extern int I810CheckAvailableMemory(ScrnInfoPtr pScrn);
 
-extern Bool I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
-extern void I810AdjustFrame(int scrnIndex, int x, int y, int flags);
+extern Bool I810SwitchMode(SWITCH_MODE_ARGS_DECL);
+extern void I810AdjustFrame(ADJUST_FRAME_ARGS_DECL);
 
 extern void I810SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
 					   int ydir, int rop,
diff --git a/src/legacy/i810/i810_dga.c b/src/legacy/i810/i810_dga.c
index baf0011..336588c 100644
--- a/src/legacy/i810/i810_dga.c
+++ b/src/legacy/i810/i810_dga.c
@@ -148,8 +148,8 @@ I810_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode)
    if (!pMode) {			/* restore the original mode */
       if (pI810->DGAactive) {
 	 pScrn->currentMode = I810SavedDGAModes[index];
-	 pScrn->SwitchMode(index, pScrn->currentMode, 0);
-	 pScrn->AdjustFrame(index, 0, 0, 0);
+	 pScrn->SwitchMode(SWITCH_MODE_ARGS(pScrn, pScrn->currentMode));
+	 pScrn->AdjustFrame(ADJUST_FRAME_ARGS(pScrn, 0, 0));
 	 pI810->DGAactive = FALSE;
       }
    } else {
@@ -157,8 +157,7 @@ I810_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode)
 	 I810SavedDGAModes[index] = pScrn->currentMode;
 	 pI810->DGAactive = TRUE;
       }
-
-      pScrn->SwitchMode(index, pMode->mode, 0);
+      pScrn->SwitchMode(SWITCH_MODE_ARGS(pScrn, pMode->mode));
    }
 
    return TRUE;
@@ -178,7 +177,7 @@ I810_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags)
    I810Ptr pI810 = I810PTR(pScrn);
    vgaHWPtr hwp = VGAHWPTR(pScrn);
 
-   pScrn->AdjustFrame(pScrn->pScreen->myNum, x, y, flags);
+   pScrn->AdjustFrame(ADJUST_FRAME_ARGS(pScrn, x, y));
 
    /* wait for retrace */
    while ((hwp->readST01(hwp) & 0x08)) ;
diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c
index 4a73e9b..519a4f0 100644
--- a/src/legacy/i810/i810_driver.c
+++ b/src/legacy/i810/i810_driver.c
@@ -77,18 +77,17 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "../legacy.h"
 
-static Bool I810PreInit(ScrnInfoPtr scrn, int flags);
-static Bool I810ScreenInit(int Index, ScreenPtr screen, int argc,
-			   char **argv);
-static Bool I810EnterVT(int scrnIndex, int flags);
-static void I810LeaveVT(int scrnIndex, int flags);
-static Bool I810CloseScreen(int scrnIndex, ScreenPtr screen);
-static Bool I810SaveScreen(ScreenPtr screen, Bool unblank);
-static void I810FreeScreen(int scrnIndex, int flags);
-static void I810DisplayPowerManagementSet(ScrnInfoPtr scrn,
+static Bool I810PreInit(ScrnInfoPtr pScrn, int flags);
+static Bool I810ScreenInit(SCREEN_INIT_ARGS);
+static Bool I810EnterVT(VT_FUNC_ARGS_DECL);
+static void I810LeaveVT(VT_FUNC_ARGS_DECL);
+static Bool I810CloseScreen(CLOSE_SCREEN_ARGS_DECL);
+static Bool I810SaveScreen(ScreenPtr pScreen, Bool unblank);
+static void I810FreeScreen(FREE_SCREEN_ARGS_DECL);
+static void I810DisplayPowerManagementSet(ScrnInfoPtr pScrn,
 					  int PowerManagermentMode,
 					  int flags);
-static ModeStatus I810ValidMode(int scrnIndex, DisplayModePtr mode,
+static ModeStatus I810ValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode,
 				Bool verbose, int flags);
 
 typedef enum {
@@ -1570,7 +1569,7 @@ I810AllocateFront(ScrnInfoPtr scrn)
 }
 
 static Bool
-I810ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
+I810ScreenInit(SCREEN_INIT_ARGS_DECL)
 {
    ScrnInfoPtr scrn;
    vgaHWPtr hwp;
@@ -1649,7 +1648,7 @@ I810ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
       return FALSE;
 
    I810SaveScreen(screen, FALSE);
-   I810AdjustFrame(scrnIndex, scrn->frameX0, scrn->frameY0, 0);
+   I810AdjustFrame(ADJUST_FRAME_ARGS(scrn, scrn->frameX0, scrn->frameY0));
 
    if (!fbScreenInit(screen, pI810->FbBase + scrn->fbOffset,
 		     scrn->virtualX, scrn->virtualY,
@@ -1785,14 +1784,14 @@ I810ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 }
 
 Bool
-I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
+I810SwitchMode(SWITCH_MODE_ARGS_DECL)
 {
-   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   SCRN_INFO_PTR(arg);
 #if 0
    I810Ptr pI810 = I810PTR(scrn);
 #endif
    if (I810_DEBUG & DEBUG_VERBOSE_CURSOR)
-      ErrorF("I810SwitchMode %p %x\n", (void *)mode, flags);
+      ErrorF("I810SwitchMode %p\n", (void *)mode);
 
 #if 0
 /* 
@@ -1836,9 +1835,9 @@ I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
 }
 
 void
-I810AdjustFrame(int scrnIndex, int x, int y, int flags)
+I810AdjustFrame(ADJUST_FRAME_ARGS_DECL)
 {
-   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   SCRN_INFO_PTR(arg);
    I810Ptr pI810 = I810PTR(scrn);
    vgaHWPtr hwp = VGAHWPTR(scrn);
    int Base;
@@ -1856,7 +1855,7 @@ I810AdjustFrame(int scrnIndex, int x, int y, int flags)
    Base = (y * scrn->displayWidth + x) >> 2;
 
    if (I810_DEBUG & DEBUG_VERBOSE_CURSOR)
-      ErrorF("I810AdjustFrame %d,%d %x\n", x, y, flags);
+      ErrorF("I810AdjustFrame %d,%d\n", x, y);
 
    switch (scrn->bitsPerPixel) {
    case 8:
@@ -1888,9 +1887,9 @@ I810AdjustFrame(int scrnIndex, int x, int y, int flags)
 /* These functions are usually called with the lock **not held**.
  */
 static Bool
-I810EnterVT(int scrnIndex, int flags)
+I810EnterVT(VT_FUNC_ARGS_DECL)
 {
-   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   SCRN_INFO_PTR(arg);
 
 #ifdef HAVE_DRI1
    I810Ptr pI810 = I810PTR(scrn);
@@ -1909,21 +1908,21 @@ I810EnterVT(int scrnIndex, int flags)
    if (pI810->directRenderingEnabled) {
       if (I810_DEBUG & DEBUG_VERBOSE_DRI)
 	 ErrorF("calling dri unlock\n");
-      DRIUnlock(screenInfo.screens[scrnIndex]);
+      DRIUnlock(xf86ScrnToScreen(scrn));
       pI810->LockHeld = 0;
    }
 #endif
 
    if (!I810ModeInit(scrn, scrn->currentMode))
       return FALSE;
-   I810AdjustFrame(scrnIndex, scrn->frameX0, scrn->frameY0, 0);
+   I810AdjustFrame(ADJUST_FRAME_ARGS(scrn, scrn->frameX0, scrn->frameY0));
    return TRUE;
 }
 
 static void
-I810LeaveVT(int scrnIndex, int flags)
+I810LeaveVT(VT_FUNC_ARGS_DECL)
 {
-   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   SCRN_INFO_PTR(arg);
    vgaHWPtr hwp = VGAHWPTR(scrn);
    I810Ptr pI810 = I810PTR(scrn);
 
@@ -1934,7 +1933,7 @@ I810LeaveVT(int scrnIndex, int flags)
    if (pI810->directRenderingEnabled) {
       if (I810_DEBUG & DEBUG_VERBOSE_DRI)
 	 ErrorF("calling dri lock\n");
-      DRILock(screenInfo.screens[scrnIndex], 0);
+      DRILock(xf86ScrnToScreen(scrn), 0);
       pI810->LockHeld = 1;
    }
 #endif
@@ -1957,9 +1956,9 @@ I810LeaveVT(int scrnIndex, int flags)
 }
 
 static Bool
-I810CloseScreen(int scrnIndex, ScreenPtr screen)
+I810CloseScreen(CLOSE_SCREEN_ARGS_DECL)
 {
-   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
    vgaHWPtr hwp = VGAHWPTR(scrn);
    I810Ptr pI810 = I810PTR(scrn);
    XAAInfoRecPtr infoPtr = pI810->AccelInfoRec;
@@ -2015,30 +2014,32 @@ I810CloseScreen(int scrnIndex, ScreenPtr screen)
    /* Need to actually close the gart fd, or the unbound memory will just sit
     * around.  Will prevent the Xserver from recycling.
     */
-   xf86GARTCloseScreen(scrnIndex);
+   xf86GARTCloseScreen(scrn->scrnIndex);
 
    free(pI810->LpRing);
    pI810->LpRing = NULL;
 
    scrn->vtSema = FALSE;
    screen->CloseScreen = pI810->CloseScreen;
-   return (*screen->CloseScreen) (scrnIndex, screen);
+   return (*screen->CloseScreen) (CLOSE_SCREEN_ARGS);
 }
 
 static void
-I810FreeScreen(int scrnIndex, int flags)
+I810FreeScreen(FREE_SCREEN_ARGS_DECL)
 {
-   I810FreeRec(xf86Screens[scrnIndex]);
+   SCRN_INFO_PTR(arg);
+   I810FreeRec(scrn);
    if (xf86LoaderCheckSymbol("vgaHWFreeHWRec"))
-      vgaHWFreeHWRec(xf86Screens[scrnIndex]);
+     vgaHWFreeHWRec(scrn);
 }
 
 static ModeStatus
-I810ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
+I810ValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags)
 {
+   SCRN_INFO_PTR(arg);
    if (mode->Flags & V_INTERLACE) {
       if (verbose) {
-	 xf86DrvMsg(scrnIndex, X_PROBED,
+	 xf86DrvMsg(scrn->scrnIndex, X_PROBED,
 		    "Removing interlaced mode \"%s\"\n", mode->name);
       }
       return MODE_BAD;
diff --git a/src/legacy/i810/i810_video.c b/src/legacy/i810/i810_video.c
index 613cbf2..440f9f7 100644
--- a/src/legacy/i810/i810_video.c
+++ b/src/legacy/i810/i810_video.c
@@ -78,7 +78,7 @@ static int I810PutImage( ScrnInfoPtr,
 static int I810QueryImageAttributes(ScrnInfoPtr, 
 	int, unsigned short *, unsigned short *,  int *, int *);
 
-static void I810BlockHandler(int, pointer, pointer, pointer);
+static void I810BlockHandler(BLOCKHANDLER_ARGS_DECL);
 
 #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
 
@@ -1139,21 +1139,17 @@ I810QueryImageAttributes(
 }
 
 static void
-I810BlockHandler (
-    int i,
-    pointer     blockData,
-    pointer     pTimeout,
-    pointer     pReadmask
-){
-    ScreenPtr   screen = screenInfo.screens[i];
-    ScrnInfoPtr pScrn = xf86Screens[i];
+I810BlockHandler (BLOCKHANDLER_ARGS_DECL)
+{
+    SCREEN_PTR(arg);
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
     I810Ptr      pI810 = I810PTR(pScrn);
     I810PortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn);
     I810OverlayRegPtr overlay = (I810OverlayRegPtr) (pI810->FbBase + pI810->OverlayStart); 
 
     screen->BlockHandler = pI810->BlockHandler;
     
-    (*screen->BlockHandler) (i, blockData, pTimeout, pReadmask);
+    (*screen->BlockHandler) (BLOCKHANDLER_ARGS);
 
     screen->BlockHandler = I810BlockHandler;
 
diff --git a/uxa/uxa.c b/uxa/uxa.c
index 1cc82ab..2635b50 100644
--- a/uxa/uxa.c
+++ b/uxa/uxa.c
@@ -363,11 +363,11 @@ void uxa_set_force_fallback(ScreenPtr screen, Bool value)
  * uxa_close_screen() unwraps its wrapped screen functions and tears down UXA's
  * screen private, before calling down to the next CloseSccreen.
  */
-static Bool uxa_close_screen(int i, ScreenPtr pScreen)
+static Bool uxa_close_screen(CLOSE_SCREEN_ARGS_DECL)
 {
-	uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+	uxa_screen_t *uxa_screen = uxa_get_screen(screen);
 #ifdef RENDER
-	PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+	PictureScreenPtr ps = GetPictureScreenIfSet(screen);
 #endif
 	int n;
 
@@ -380,28 +380,28 @@ static Bool uxa_close_screen(int i, ScreenPtr pScreen)
 	for (n = 0; n < uxa_screen->solid_cache_size; n++)
 		FreePicture(uxa_screen->solid_cache[n].picture, 0);
 
-	uxa_glyphs_fini(pScreen);
+	uxa_glyphs_fini(screen);
 
-	if (pScreen->devPrivate) {
+	if (screen->devPrivate) {
 		/* Destroy the pixmap created by miScreenInit() *before*
 		 * chaining up as we finalize ourselves here and so this
 		 * is the last chance we have of releasing our resources
 		 * associated with the Pixmap. So do it first.
 		 */
-		(void) (*pScreen->DestroyPixmap) (pScreen->devPrivate);
-		pScreen->devPrivate = NULL;
+		(void) (*screen->DestroyPixmap) (screen->devPrivate);
+		screen->devPrivate = NULL;
 	}
 
-	pScreen->CreateGC = uxa_screen->SavedCreateGC;
-	pScreen->CloseScreen = uxa_screen->SavedCloseScreen;
-	pScreen->GetImage = uxa_screen->SavedGetImage;
-	pScreen->GetSpans = uxa_screen->SavedGetSpans;
-	pScreen->CreatePixmap = uxa_screen->SavedCreatePixmap;
-	pScreen->DestroyPixmap = uxa_screen->SavedDestroyPixmap;
-	pScreen->CopyWindow = uxa_screen->SavedCopyWindow;
-	pScreen->ChangeWindowAttributes =
+	screen->CreateGC = uxa_screen->SavedCreateGC;
+	screen->CloseScreen = uxa_screen->SavedCloseScreen;
+	screen->GetImage = uxa_screen->SavedGetImage;
+	screen->GetSpans = uxa_screen->SavedGetSpans;
+	screen->CreatePixmap = uxa_screen->SavedCreatePixmap;
+	screen->DestroyPixmap = uxa_screen->SavedDestroyPixmap;
+	screen->CopyWindow = uxa_screen->SavedCopyWindow;
+	screen->ChangeWindowAttributes =
 	    uxa_screen->SavedChangeWindowAttributes;
-	pScreen->BitmapToRegion = uxa_screen->SavedBitmapToRegion;
+	screen->BitmapToRegion = uxa_screen->SavedBitmapToRegion;
 #ifdef RENDER
 	if (ps) {
 		ps->Composite = uxa_screen->SavedComposite;
@@ -416,7 +416,7 @@ static Bool uxa_close_screen(int i, ScreenPtr pScreen)
 
 	free(uxa_screen);
 
-	return (*pScreen->CloseScreen) (i, pScreen);
+	return (*screen->CloseScreen) (CLOSE_SCREEN_ARGS);
 }
 
 /**
@@ -435,7 +435,7 @@ uxa_driver_t *uxa_driver_alloc(void)
 }
 
 /**
- * @param pScreen screen being initialized
+ * @param screen screen being initialized
  * @param pScreenInfo UXA driver record
  *
  * uxa_driver_init sets up UXA given a driver record filled in by the driver.
commit 982efcc2da07353e6e0a1ca381582867de37e096
Author: Dave Airlie <airlied at redhat.com>
Date:   Tue Jun 5 10:38:21 2012 +0100

    sna: drop using block/wakeup data.
    
    These went away in the new server API, and really if this
    made any measurable difference, I'd be impressed.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index df7f42f..f8ec796 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -252,9 +252,7 @@ struct sna {
 	struct intel_chipset chipset;
 
 	ScreenBlockHandlerProcPtr BlockHandler;
-	void *BlockData;
 	ScreenWakeupHandlerProcPtr WakeupHandler;
-	void *WakeupData;
 	CloseScreenProcPtr CloseScreen;
 
 	PicturePtr clear;
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 59ee57f..a389acf 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -577,13 +577,14 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 static void
 sna_block_handler(int i, pointer data, pointer timeout, pointer read_mask)
 {
-	struct sna *sna = data;
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screenInfo.screens[i]);
+	struct sna *sna = to_sna(scrn);
 	struct timeval **tv = timeout;
 
 	DBG(("%s (tv=%ld.%06ld)\n", __FUNCTION__,
 	     *tv ? (*tv)->tv_sec : -1, *tv ? (*tv)->tv_usec : 0));
 
-	sna->BlockHandler(i, sna->BlockData, timeout, read_mask);
+	sna->BlockHandler(i, data, timeout, read_mask);
 
 	if (*tv == NULL || ((*tv)->tv_usec | (*tv)->tv_sec))
 		sna_accel_block_handler(sna, tv);
@@ -592,7 +593,8 @@ sna_block_handler(int i, pointer data, pointer timeout, pointer read_mask)
 static void
 sna_wakeup_handler(int i, pointer data, unsigned long result, pointer read_mask)
 {
-	struct sna *sna = data;
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screenInfo.screens[i]);
+	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
 
@@ -600,7 +602,7 @@ sna_wakeup_handler(int i, pointer data, unsigned long result, pointer read_mask)
 	if ((int)result < 0)
 		return;
 
-	sna->WakeupHandler(i, sna->WakeupData, result, read_mask);
+	sna->WakeupHandler(i, data, result, read_mask);
 
 	sna_accel_wakeup_handler(sna, read_mask);
 
@@ -900,14 +902,10 @@ sna_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 	scrn->vtSema = TRUE;
 
 	sna->BlockHandler = screen->BlockHandler;
-	sna->BlockData = screen->blockData;
 	screen->BlockHandler = sna_block_handler;
-	screen->blockData = sna;
 
 	sna->WakeupHandler = screen->WakeupHandler;
-	sna->WakeupData = screen->wakeupData;
 	screen->WakeupHandler = sna_wakeup_handler;
-	screen->wakeupData = sna;
 
 	screen->SaveScreen = xf86SaveScreen;
 	sna->CloseScreen = screen->CloseScreen;
commit cba4574878de78ae0eeb6444ddd4780a4e225f41
Author: Dave Airlie <airlied at redhat.com>
Date:   Tue Jun 5 10:04:48 2012 +0100

    uxa: drop enable disable access hook
    
    This looks to be unused.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/uxa/uxa-priv.h b/uxa/uxa-priv.h
index b74a625..91ef4e0 100644
--- a/uxa/uxa-priv.h
+++ b/uxa/uxa-priv.h
@@ -131,7 +131,6 @@ typedef struct {
 	AddTrapsProcPtr SavedAddTraps;
 	UnrealizeGlyphProcPtr SavedUnrealizeGlyph;
 #endif
-	EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
 
 	Bool force_fallback;
 	Bool fallback_debug;
diff --git a/uxa/uxa.c b/uxa/uxa.c
index 0ba6869..1cc82ab 100644
--- a/uxa/uxa.c
+++ b/uxa/uxa.c
@@ -366,7 +366,6 @@ void uxa_set_force_fallback(ScreenPtr screen, Bool value)
 static Bool uxa_close_screen(int i, ScreenPtr pScreen)
 {
 	uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
-	ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
 #ifdef RENDER
 	PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
 #endif
@@ -403,7 +402,6 @@ static Bool uxa_close_screen(int i, ScreenPtr pScreen)
 	pScreen->ChangeWindowAttributes =
 	    uxa_screen->SavedChangeWindowAttributes;
 	pScreen->BitmapToRegion = uxa_screen->SavedBitmapToRegion;
-	scrn->EnableDisableFBAccess = uxa_screen->SavedEnableDisableFBAccess;
 #ifdef RENDER
 	if (ps) {
 		ps->Composite = uxa_screen->SavedComposite;
commit 81f09347f2ab59cf0a3eaca7be83ded555655e93
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 16:45:05 2012 +0100

    uxa/i965: Silence static analyser by asserting the bo exists for the video
    
    This is already checked at the beginning of PutImageTextured, so this
    check upon the return value of intel_get_pixmap_bo() should only be
    required to keep static analysers happy.
    
    Reported-by: Zdenek Kabelac <zdenek.kabelac at gmail.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i965_video.c b/src/i965_video.c
index c94f530..d9350ce 100644
--- a/src/i965_video.c
+++ b/src/i965_video.c
@@ -388,6 +388,7 @@ static void i965_create_dst_surface_state(ScrnInfoPtr scrn,
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct brw_surface_state dest_surf_state;
 	drm_intel_bo *pixmap_bo = intel_get_pixmap_bo(pixmap);
+	assert(pixmap_bo != NULL);
 
 	memset(&dest_surf_state, 0, sizeof(dest_surf_state));
 
@@ -484,6 +485,7 @@ static void gen7_create_dst_surface_state(ScrnInfoPtr scrn,
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct gen7_surface_state dest_surf_state;
 	drm_intel_bo *pixmap_bo = intel_get_pixmap_bo(pixmap);
+	assert(pixmap_bo != NULL);
 
 	memset(&dest_surf_state, 0, sizeof(dest_surf_state));
 
commit 1f43de322b400dcd64eb4545a978ad9b1c7de185
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 15:39:39 2012 +0100

    sna: Exclude consideration of tiling flags from overwriting BLT commands
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 82c61df..e84c87f 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -431,7 +431,7 @@ static void sna_blt_copy_one(struct sna *sna,
 	/* Compare against a previous fill */
 	if (kgem->nbatch >= 6 &&
 	    blt->overwrites &&
-	    kgem->batch[kgem->nbatch-6] == ((blt->cmd & ~XY_SRC_COPY_BLT_CMD) | XY_COLOR_BLT) &&
+	    kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (blt->cmd & BLT_WRITE_ALPHA | BLT_WRITE_RGB)) &&
 	    kgem->batch[kgem->nbatch-4] == ((uint32_t)dst_y << 16 | (uint16_t)dst_x) &&
 	    kgem->batch[kgem->nbatch-3] == ((uint32_t)(dst_y+height) << 16 | (uint16_t)(dst_x+width)) &&
 	    kgem->reloc[kgem->nreloc-1].target_handle == blt->bo[1]->handle) {
commit ebb1c9d5f82e8822f7400ff11a887ab047a0d78e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 15:28:31 2012 +0100

    sna: Make the bo-is-busy DBG more useful by saying which bo it is
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index deff5df..e4a5b4c 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -474,8 +474,8 @@ static inline bool kgem_bo_can_map(struct kgem *kgem, struct kgem_bo *bo)
 
 static inline bool kgem_bo_is_busy(struct kgem_bo *bo)
 {
-	DBG_HDR(("%s: domain: %d exec? %d, rq? %d\n",
-		 __FUNCTION__, bo->domain, bo->exec != NULL, bo->rq != NULL));
+	DBG_HDR(("%s: handle=%d, domain: %d exec? %d, rq? %d\n", __FUNCTION__,
+		 bo->handle, bo->domain, bo->exec != NULL, bo->rq != NULL));
 	return bo->rq;
 }
 
commit 6dc5ddfe807b307ca10af971c4f84498b2fb82a2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 13:49:35 2012 +0100

    sna: Remove bogus check for color == 0
    
    This was written when the RGBA color value was being passed around and
    not the pointer to the xRenderColor. As such, the NULL deref check
    doesn't gain much and the check for rgba==0 irrelevant in this scenario.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index c3c6666..e06e3c2 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -154,10 +154,8 @@ no_render_fill_boxes(struct sna *sna,
 	     __FUNCTION__, op,
 	     color->red, color->green, color->blue, color->alpha));
 
-	if (color == 0)
-		op = PictOpClear;
-
 	if (op == PictOpClear) {
+		pixel = 0;
 		alu = GXclear;
 		op = PictOpSrc;
 	}
@@ -170,7 +168,8 @@ no_render_fill_boxes(struct sna *sna,
 	if (op != PictOpSrc)
 		return FALSE;
 
-	if (!sna_get_pixel_from_rgba(&pixel,
+	if (alu == GXcopy &&
+	    !sna_get_pixel_from_rgba(&pixel,
 				     color->red,
 				     color->green,
 				     color->blue,
commit 9b3937228c692598899fb39bfe448a9b457315db
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 13:47:58 2012 +0100

    sna: Simplify selecting default tiling for framebuffers
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index eb85cb4..afd9ed7 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -477,21 +477,19 @@ static inline uint32_t default_tiling(PixmapPtr pixmap)
 constant static uint32_t sna_pixmap_choose_tiling(PixmapPtr pixmap)
 {
 	struct sna *sna = to_sna_from_pixmap(pixmap);
-	uint32_t tiling = default_tiling(pixmap);
-	uint32_t bit;
+	uint32_t tiling, bit;
 
 	/* Use tiling by default, but disable per user request */
 	if (pixmap->usage_hint == SNA_CREATE_FB) {
-		tiling = I915_TILING_X;
+		tiling = -I915_TILING_X;
 		bit = SNA_TILING_FB;
-	} else
+	} else {
+		tiling = default_tiling(pixmap);
 		bit = SNA_TILING_2D;
+	}
 	if ((sna->tiling && (1 << bit)) == 0)
 		tiling = I915_TILING_NONE;
 
-	if (pixmap->usage_hint == SNA_CREATE_FB)
-		tiling = -tiling;
-
 	/* Also adjust tiling if it is not supported or likely to
 	 * slow us down,
 	 */
commit ff91fd4a2749f1ea8722189aaec938e51bce4222
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:41:05 2012 +0100

    uxa: Check for failure from drmModeGetConnector()
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index fcb3239..7d75abb 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -717,6 +717,12 @@ intel_output_detect(xf86OutputPtr output)
 	drmModeFreeConnector(intel_output->mode_output);
 	intel_output->mode_output =
 		drmModeGetConnector(mode->fd, intel_output->output_id);
+	if (intel_output->mode_output == NULL) {
+		/* and hope we are safe everywhere else */
+		xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
+			   "drmModeGetConnector failed, reporting output disconnected\n");
+		return XF86OutputStatusDisconnected;
+	}
 
 	switch (intel_output->mode_output->connection) {
 	case DRM_MODE_CONNECTED:
commit 4712a4008aaff7b3c57a8dd0a5e639992c9b6d30
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:40:56 2012 +0100

    shadow

diff --git a/src/intel_shadow.c b/src/intel_shadow.c
index 1342b79..6892567 100644
--- a/src/intel_shadow.c
+++ b/src/intel_shadow.c
@@ -182,7 +182,7 @@ void intel_shadow_create(struct intel_screen_private *intel)
 		free(intel->shadow_buffer);
 		intel->shadow_buffer = buffer;
 	} else {
-		free(bufer);
+		free(buffer);
 		stride = intel->shadow_stride;
 	}
 
commit 63a55e9db97b647cbf7385403a0f30ee4d24dc3b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:36:11 2012 +0100

    uxa/shadow: Free the buffer along the unexpected failure to attach to the pixmap
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_shadow.c b/src/intel_shadow.c
index 393a038..1342b79 100644
--- a/src/intel_shadow.c
+++ b/src/intel_shadow.c
@@ -181,8 +181,10 @@ void intel_shadow_create(struct intel_screen_private *intel)
 				       stride, buffer)) {
 		free(intel->shadow_buffer);
 		intel->shadow_buffer = buffer;
-	} else
+	} else {
+		free(bufer);
 		stride = intel->shadow_stride;
+	}
 
 	if (!intel->shadow_damage) {
 		intel->shadow_damage =
commit c9bd4ed7d7d5c9ba6924e911652e03abc9267865
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:29:58 2012 +0100

    legacy/i810: Silence a compiler warning for missing 'const'
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_common.h b/src/legacy/i810/i810_common.h
index 14b2993..efa2a7d 100644
--- a/src/legacy/i810/i810_common.h
+++ b/src/legacy/i810/i810_common.h
@@ -77,7 +77,7 @@ static inline void memcpy_volatile(volatile void *dst, const void *src,
     int i;
     
     for (i = 0; i < len; i++)
-	((volatile char *)dst)[i] = ((volatile char *)src)[i];
+	((volatile char *)dst)[i] = ((const volatile char *)src)[i];
 }
 
 /* Memory mapped register access macros */
commit 6f8b411b8a833cca6fce8888ce515db6413d57ca
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:21:27 2012 +0100

    uxa: Preferred order for calloc is (count, size)
    
    And assert that the allocation succeeds for good measure. A great big
    dollop of graceful failure is missing...
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i965_render.c b/src/i965_render.c
index 7bfbcbd..75c99e2 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -2342,8 +2342,10 @@ void gen4_render_state_init(ScrnInfoPtr scrn)
 
 	intel->surface_used = 0;
 
-	if (intel->gen4_render_state == NULL)
-		intel->gen4_render_state = calloc(sizeof(*render), 1);
+	if (intel->gen4_render_state == NULL) {
+		intel->gen4_render_state = calloc(1, sizeof(*render));
+		assert(intel->gen4_render_state != NULL);
+	}
 
 	if (INTEL_INFO(intel)->gen >= 60)
 		return gen6_render_state_init(scrn);
commit 72a29aa74a1488269c2184300e573d060c49e232
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:21:27 2012 +0100

    sna: Check that the buffer was allocated prior to caching it
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 7feaa24..c3c6666 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1139,7 +1139,8 @@ sna_render_picture_extract(struct sna *sna,
 						      &box,
 						      pixmap->devKind,
 						      pixmap->drawable.bitsPerPixel);
-			if (pixmap->usage_hint == 0 &&
+			if (bo != NULL &&
+			    pixmap->usage_hint == 0 &&
 			    box.x2 - box.x1 == pixmap->drawable.width &&
 			    box.y2 - box.y1 == pixmap->drawable.height) {
 				struct sna_pixmap *priv = sna_pixmap(pixmap);
commit 9bff89b1892cee90a80909255876240126b700b2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:21:27 2012 +0100

    legacy/i810: Be paranoid and guard against xf86GetPciInfoForEntity
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c
index 6ead393..4a73e9b 100644
--- a/src/legacy/i810/i810_driver.c
+++ b/src/legacy/i810/i810_driver.c
@@ -254,7 +254,7 @@ I810PreInit(ScrnInfoPtr scrn, int flags)
    pI810 = I810PTR(scrn);
 
    pI810->pEnt = xf86GetEntityInfo(scrn->entityList[0]);
-   if (pI810->pEnt->location.type != BUS_PCI)
+   if (pI810->pEnt == NULL || pI810->pEnt->location.type != BUS_PCI)
       return FALSE;
 
    if (flags & PROBE_DETECT) {
commit ed6004f7ad09329bd4097331aaff38edc83107b6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:21:27 2012 +0100

    uxa: Be paranoid and guard against xf86GetPciInfoForEntity
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_driver.c b/src/intel_driver.c
index fadc0a6..190517f 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -480,6 +480,8 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
 		return FALSE;
 
 	pEnt = xf86GetEntityInfo(scrn->entityList[0]);
+	if (pEnt == NULL || pEnt->location.type != BUS_PCI)
+		return FALSE;
 
 	if (flags & PROBE_DETECT)
 		return TRUE;
@@ -497,9 +499,6 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
 
 	scrn->displayWidth = 640;	/* default it */
 
-	if (intel->pEnt->location.type != BUS_PCI)
-		return FALSE;
-
 	intel->PciInfo = xf86GetPciInfoForEntity(intel->pEnt->index);
 
 	if (!intel_open_drm_master(scrn))
commit abb8d893742f4ba9567330da9706adda4e636e75
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:21:27 2012 +0100

    sna: Be paranoid and guard against xf86GetPciInfoForEntity
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index a1581f3..59ee57f 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -426,7 +426,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 		return FALSE;
 
 	pEnt = xf86GetEntityInfo(scrn->entityList[0]);
-	if (pEnt->location.type != BUS_PCI)
+	if (pEnt == NULL || pEnt->location.type != BUS_PCI)
 		return FALSE;
 
 	if (flags & PROBE_DETECT)
commit 782cd6eafa9917a5bdb181d66b7f4c05392950ba
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:20:17 2012 +0100

    uxa: check for failure to allocate drmModeCrtc
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index 609cbf7..fcb3239 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -680,6 +680,11 @@ intel_crtc_init(ScrnInfoPtr scrn, struct intel_mode *mode, int num)
 
 	intel_crtc->mode_crtc = drmModeGetCrtc(mode->fd,
 					       mode->mode_res->crtcs[num]);
+	if (intel_crtc->mode_crtc == NULL) {
+		free(intel_crtc);
+		return;
+	}
+
 	intel_crtc->mode = mode;
 	crtc->driver_private = intel_crtc;
 
commit a99bf0125f8f166ff2d65449ecd376c99c3024b8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:15:51 2012 +0100

    uxa/i965: Drop superfluous 'state' variable
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i965_render.c b/src/i965_render.c
index c4c1dd3..7bfbcbd 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -2538,20 +2538,21 @@ gen6_composite_create_blend_state(intel_screen_private *intel)
 static drm_intel_bo *
 gen6_composite_create_depth_stencil_state(intel_screen_private *intel)
 {
-	struct gen6_depth_stencil_state *state;
 	drm_intel_bo *depth_stencil_bo;
 	int ret;
 
-	depth_stencil_bo = drm_intel_bo_alloc(intel->bufmgr,
-					"gen6 DEPTH_STENCIL state",
-					sizeof(*state),
-					4096);
+	depth_stencil_bo =
+		drm_intel_bo_alloc(intel->bufmgr,
+				   "gen6 DEPTH_STENCIL state",
+				   sizeof(struct gen6_depth_stencil_state),
+				   4096);
 	assert(depth_stencil_bo);
 
 	ret = drm_intel_bo_map(depth_stencil_bo, TRUE);
 	assert(ret == 0);
 
-	state = memset(depth_stencil_bo->virtual, 0, sizeof(*state));
+	memset(depth_stencil_bo->virtual, 0,
+	       sizeof(struct gen6_depth_stencil_state));
 	drm_intel_bo_unmap(depth_stencil_bo);
 
 	return depth_stencil_bo;
commit 15a00ba047fdb7d388a322f2e33894d20787af2f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:09:52 2012 +0100

    sna/gen2: Remove double 'const'
    
    So constant, we const'ed it twice.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index e1b31d7..7b3e1ec 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -977,7 +977,7 @@ static void gen2_vertex_flush(struct sna *sna,
 }
 
 inline static int gen2_get_rectangles(struct sna *sna,
-				      const const struct sna_composite_op *op,
+				      const struct sna_composite_op *op,
 				      int want)
 {
 	struct gen2_render_state *state = &sna->render_state.gen2;
commit 99129c369c16d9ff7588a0e59f9285cc339b7eb3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:08:11 2012 +0100

    sna/gen4+: Use an explicit invalid value for alu
    
    Since the static analyser also doesn't like comparing a uint8_t against
    ~0.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index f982b41..80f6a95 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2916,7 +2916,7 @@ gen4_render_fill_boxes(struct sna *sna,
 	    (prefer_blt(sna) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen4_check_dst_format(format))) {
-		uint8_t alu = ~0;
+		uint8_t alu = GXinvalid;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -2929,7 +2929,7 @@ gen4_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != ~0 &&
+		if (alu != GXinvalid &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 56db4a0..6746a58 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -3250,7 +3250,7 @@ gen5_render_fill_boxes(struct sna *sna,
 	    (prefer_blt_fill(sna) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen5_check_dst_format(format))) {
-		uint8_t alu = ~0;
+		uint8_t alu = GXinvalid;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -3263,7 +3263,7 @@ gen5_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != ~0 &&
+		if (alu != GXinvalid &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index cc6cc50..87a2c9c 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3661,7 +3661,7 @@ gen6_render_fill_boxes(struct sna *sna,
 	    (prefer_blt_fill(sna, dst_bo) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen6_check_dst_format(format))) {
-		uint8_t alu = ~0;
+		uint8_t alu = GXinvalid;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -3674,7 +3674,7 @@ gen6_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != ~0 &&
+		if (alu != GXinvalid &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 50eb07e..e30d941 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3743,7 +3743,7 @@ gen7_render_fill_boxes(struct sna *sna,
 	    (prefer_blt_fill(sna, dst_bo) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen7_check_dst_format(format))) {
-		uint8_t alu = ~0;
+		uint8_t alu = GXinvalid;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -3756,7 +3756,7 @@ gen7_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != ~0 &&
+		if (alu != GXinvalid &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index b9360c3..9db1891 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -7,6 +7,8 @@
 
 #define GRADIENT_CACHE_SIZE 16
 
+#define GXinvalid 0xff
+
 struct sna;
 struct sna_glyph;
 struct sna_video;
commit fae9c054d47203b68a6c09647945d23074ea4df9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:04:30 2012 +0100

    legacy/i810: Remove unused variable
    
    In order to reduce the volumes of output from static analysers.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_dri.c b/src/legacy/i810/i810_dri.c
index a98ed43..24632d4 100644
--- a/src/legacy/i810/i810_dri.c
+++ b/src/legacy/i810/i810_dri.c
@@ -659,9 +659,7 @@ I810DRIScreenInit(ScreenPtr pScreen)
    pI810->cursorARGBHandle = agpHandle;
 
    if (agpHandle != DRM_AGP_NO_HANDLE) {
- 	int r;
-
-      if ((r = drmAgpBind(pI810->drmSubFD, agpHandle, tom)) == 0) {
+      if (drmAgpBind(pI810->drmSubFD, agpHandle, tom) == 0) {
 	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
 		    "[agp] GART: Allocated 16K for ARGB mouse cursor image\n");
 	 pI810->CursorARGBStart = tom;
commit 880ec2c9a56d3de33c7fbbfa4c043082fbcf7a78
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 12:04:30 2012 +0100

    legacy/i810: Reorder DRI teardown code to avoid potential NULL derefs
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_dri.c b/src/legacy/i810/i810_dri.c
index 28a3b91..a98ed43 100644
--- a/src/legacy/i810/i810_dri.c
+++ b/src/legacy/i810/i810_dri.c
@@ -898,30 +898,42 @@ I810DRICloseScreen(ScreenPtr pScreen)
 {
    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
-   I810DRIPtr pI810DRI = (I810DRIPtr) pI810->pDRIInfo->devPrivate;
 
-   if (pI810DRI->irq) {
-       drmCtlUninstHandler(pI810->drmSubFD);
-       pI810DRI->irq = 0;
-   }
+   if (pI810->pDRIInfo) {
+       I810DRIPtr pI810DRI = (I810DRIPtr) pI810->pDRIInfo->devPrivate;
+
+       if (pI810DRI) {
+	   if (pI810DRI->irq) {
+	       drmCtlUninstHandler(pI810->drmSubFD);
+	       pI810DRI->irq = 0;
+	   }
 
-   I810CleanupDma(pScrn);
+	   free(pI810->pDRIInfo->devPrivate);
+	   pI810->pDRIInfo->devPrivate = NULL;
+       }
+
+       I810CleanupDma(pScrn);
+
+       DRICloseScreen(pScreen);
+       DRIDestroyInfoRec(pI810->pDRIInfo);
+       pI810->pDRIInfo = NULL;
+   }
 
    if (pI810->dcacheHandle!=DRM_AGP_NO_HANDLE)
-      drmAgpFree(pI810->drmSubFD, pI810->dcacheHandle);
+       drmAgpFree(pI810->drmSubFD, pI810->dcacheHandle);
    if (pI810->backHandle!=DRM_AGP_NO_HANDLE)
-      drmAgpFree(pI810->drmSubFD, pI810->backHandle);
+       drmAgpFree(pI810->drmSubFD, pI810->backHandle);
    if (pI810->zHandle!=DRM_AGP_NO_HANDLE)
-      drmAgpFree(pI810->drmSubFD, pI810->zHandle);
+       drmAgpFree(pI810->drmSubFD, pI810->zHandle);
    if (pI810->cursorHandle!=DRM_AGP_NO_HANDLE)
-      drmAgpFree(pI810->drmSubFD, pI810->cursorHandle);
+       drmAgpFree(pI810->drmSubFD, pI810->cursorHandle);
    if (pI810->xvmcHandle!=DRM_AGP_NO_HANDLE)
-      drmAgpFree(pI810->drmSubFD, pI810->xvmcHandle);
+       drmAgpFree(pI810->drmSubFD, pI810->xvmcHandle);
    if (pI810->sysmemHandle!=DRM_AGP_NO_HANDLE)
-      drmAgpFree(pI810->drmSubFD, pI810->sysmemHandle);
+       drmAgpFree(pI810->drmSubFD, pI810->sysmemHandle);
 
    if (pI810->agpAcquired == TRUE)
-      drmAgpRelease(pI810->drmSubFD);
+       drmAgpRelease(pI810->drmSubFD);
 
    pI810->backHandle = DRM_AGP_NO_HANDLE;
    pI810->zHandle = DRM_AGP_NO_HANDLE;
@@ -930,17 +942,6 @@ I810DRICloseScreen(ScreenPtr pScreen)
    pI810->sysmemHandle = DRM_AGP_NO_HANDLE;
    pI810->agpAcquired = FALSE;
    pI810->dcacheHandle = DRM_AGP_NO_HANDLE;
-
-   DRICloseScreen(pScreen);
-
-   if (pI810->pDRIInfo) {
-      if (pI810->pDRIInfo->devPrivate) {
-	 free(pI810->pDRIInfo->devPrivate);
-	 pI810->pDRIInfo->devPrivate = NULL;
-      }
-      DRIDestroyInfoRec(pI810->pDRIInfo);
-      pI810->pDRIInfo = NULL;
-   }
 }
 
 static Bool
commit 7424ea7dd08e304baa4efa09e887b833737ac9f6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:59:24 2012 +0100

    uxa/dri: Free wait_info along DRI2WaitMSC error paths
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_dri.c b/src/intel_dri.c
index a177815..4890fe4 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -1522,7 +1522,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 				   strerror(errno));
 			limit--;
 		}
-		goto out_complete;
+		goto out_free;
 	}
 
 	current_msc = vbl.reply.sequence;
@@ -1556,7 +1556,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 					   strerror(errno));
 				limit--;
 			}
-			goto out_complete;
+			goto out_free;
 		}
 
 		wait_info->frame = vbl.reply.sequence;
@@ -1595,7 +1595,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 				   strerror(errno));
 			limit--;
 		}
-		goto out_complete;
+		goto out_free;
 	}
 
 	wait_info->frame = vbl.reply.sequence;
@@ -1603,6 +1603,8 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 
 	return TRUE;
 
+out_free:
+	i830_dri2_del_frame_event(draw, wait_info);
 out_complete:
 	DRI2WaitMSCComplete(client, draw, target_msc, 0, 0);
 	return TRUE;
commit ebd6dea009479e612c67d78416b8680bb23dba94
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:56:11 2012 +0100

    uxa/dri: Make sure is_glamor_pixmap is always initialised
    
    The code paths are too twisty to be sure otherwise.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_dri.c b/src/intel_dri.c
index 389ecdd..a177815 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -263,7 +263,7 @@ I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments,
 	DRI2BufferPtr buffers;
 	I830DRI2BufferPrivatePtr privates;
 	PixmapPtr pixmap, pDepthPixmap;
-	int is_glamor_pixmap = FALSE;
+	bool is_glamor_pixmap = false;
 	int i;
 
 	buffers = calloc(count, sizeof *buffers);
@@ -282,7 +282,7 @@ I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments,
 			pixmap = get_front_buffer(drawable);
 
 			if (pixmap && intel_get_pixmap_private(pixmap) == NULL) {
-				is_glamor_pixmap = TRUE;
+				is_glamor_pixmap = true;
 				drawable = &pixmap->drawable;
 				pixmap = NULL;
 			}
@@ -390,7 +390,7 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
 	DRI2Buffer2Ptr buffer;
 	I830DRI2BufferPrivatePtr privates;
 	PixmapPtr pixmap;
-	int is_glamor_pixmap;
+	bool is_glamor_pixmap = false;
 
 	buffer = calloc(1, sizeof *buffer);
 	if (buffer == NULL)
@@ -406,7 +406,7 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
 		pixmap = get_front_buffer(drawable);
 
 		if (pixmap && intel_get_pixmap_private(pixmap) == NULL) {
-			is_glamor_pixmap = TRUE;
+			is_glamor_pixmap = true;
 			drawable = &pixmap->drawable;
 			pixmap = NULL;
 		}
commit 33f0b4b96662d953052232b1c0477ced0c326a62
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:54:28 2012 +0100

    legacy/i810: Free offscreen image info struct on failure
    
    Impossible with the current code, the server aborts on failure. However,
    this looks to be the simple answer to keep static analysers quiet.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_video.c b/src/legacy/i810/i810_video.c
index 729aa8b..613cbf2 100644
--- a/src/legacy/i810/i810_video.c
+++ b/src/legacy/i810/i810_video.c
@@ -1411,6 +1411,7 @@ I810InitOffscreenImages(ScreenPtr screen)
     offscreenImages[0].num_attributes = 1;
     offscreenImages[0].attributes = Attributes;
 
-    xf86XVRegisterOffscreenImages(screen, offscreenImages, 1);
+    if (!xf86XVRegisterOffscreenImages(screen, offscreenImages, 1))
+	    free(offscreenImages);
 }
 
commit d24340747389db971c04349d1ee517f195c2b28e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:53:26 2012 +0100

    sna: Free clip boxes (if allocated) along error path
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 0d6fbbb..3c6044c 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -646,8 +646,11 @@ tile:
 								       tmp.drawable.bitsPerPixel,
 								       KGEM_BUFFER_WRITE_INPLACE,
 								       &ptr);
-					if (!src_bo)
+					if (!src_bo) {
+						if (clipped != stack)
+							free(clipped);
 						goto fallback;
+					}
 
 					c = clipped;
 					for (n = 0; n < nbox; n++) {
@@ -683,8 +686,11 @@ tile:
 
 					kgem_bo_destroy(&sna->kgem, src_bo);
 
-					if (!n)
+					if (!n) {
+						if (clipped != stack)
+							free(clipped);
 						goto fallback;
+					}
 				}
 			}
 
commit 1215abc5c30cc3e183bde59b1523c09b59c484e3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:49:15 2012 +0100

    sna: Make the ignored return value explicit
    
    The return from __kgem_throttle_retire() is just a hint as to whether
    any forward progress was made. In the case of the error path, though it
    is a last ditch effort before aborting, so we do not really care whether
    or not it succeeds, we must try again.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 537a6b0..3d1e5be 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -191,7 +191,7 @@ retry_gtt:
 	if (drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &mmap_arg)) {
 		ErrorF("%s: failed to achieve GTT offset for handle=%d: %d\n",
 		       __FUNCTION__, bo->handle, errno);
-		__kgem_throttle_retire(kgem, 0);
+		(void)__kgem_throttle_retire(kgem, 0);
 		if (kgem_expire_cache(kgem))
 			goto retry_gtt;
 
commit e230b460515a043a1b7353d153e864754ca5e064
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:48:23 2012 +0100

    ux/i965: create_sampler_state_bo() expects enums, so feed it the right types
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i965_render.c b/src/i965_render.c
index 508a846..c4c1dd3 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -2325,9 +2325,13 @@ void gen4_render_state_init(ScrnInfoPtr scrn)
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct gen4_render_state *render;
 	const struct wm_kernel_info *wm_kernels;
-	int i, j, k, l, m;
+	sampler_state_filter_t src_filter;
+	sampler_state_extend_t src_extend;
+	sampler_state_filter_t mask_filter;
+	sampler_state_extend_t mask_extend;
 	drm_intel_bo *sf_kernel_bo, *sf_kernel_mask_bo;
 	drm_intel_bo *border_color_bo;
+	int m;
 
 	intel->needs_3d_invariant = TRUE;
 
@@ -2389,20 +2393,20 @@ void gen4_render_state_init(ScrnInfoPtr scrn)
 	 * kernel.
 	 */
 	border_color_bo = sampler_border_color_create(intel);
-	for (i = 0; i < FILTER_COUNT; i++) {
-		for (j = 0; j < EXTEND_COUNT; j++) {
-			for (k = 0; k < FILTER_COUNT; k++) {
-				for (l = 0; l < EXTEND_COUNT; l++) {
+	for (src_filter = 0; src_filter < FILTER_COUNT; src_filter++) {
+		for (src_extend = 0; src_extend < EXTEND_COUNT; src_extend++) {
+			for (mask_filter = 0; mask_filter < FILTER_COUNT; mask_filter++) {
+				for (mask_extend = 0; mask_extend < EXTEND_COUNT; mask_extend++) {
 					drm_intel_bo *sampler_state_bo;
 
 					sampler_state_bo =
 					    i965_create_sampler_state(intel,
-								      i, j,
-								      k, l,
+								      src_filter, src_extend,
+								      mask_filter, mask_extend,
 								      border_color_bo);
 
 					for (m = 0; m < KERNEL_COUNT; m++) {
-						render->wm_state_bo[m][i][j][k][l] =
+						render->wm_state_bo[m][src_filter][src_extend][mask_filter][mask_extend] =
 							gen4_create_wm_state
 							(intel,
 							 wm_kernels[m]. has_mask,
@@ -2875,7 +2879,11 @@ gen6_render_state_init(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct gen4_render_state *render;
-	int i, j, k, l, m;
+	sampler_state_filter_t src_filter;
+	sampler_state_filter_t mask_filter;
+	sampler_state_extend_t src_extend;
+	sampler_state_extend_t mask_extend;
+	int m;
 	drm_intel_bo *border_color_bo;
 	const struct wm_kernel_info *wm_kernels;
 
@@ -2899,14 +2907,14 @@ gen6_render_state_init(ScrnInfoPtr scrn)
 
 	border_color_bo = sampler_border_color_create(intel);
 
-	for (i = 0; i < FILTER_COUNT; i++) {
-		for (j = 0; j < EXTEND_COUNT; j++) {
-			for (k = 0; k < FILTER_COUNT; k++) {
-				for (l = 0; l < EXTEND_COUNT; l++) {
-					render->ps_sampler_state_bo[i][j][k][l] =
+	for (src_filter = 0; src_filter < FILTER_COUNT; src_filter++) {
+		for (src_extend = 0; src_extend < EXTEND_COUNT; src_extend++) {
+			for (mask_filter = 0; mask_filter < FILTER_COUNT; mask_filter++) {
+				for (mask_extend = 0; mask_extend < EXTEND_COUNT; mask_extend++) {
+					render->ps_sampler_state_bo[src_filter][src_extend][mask_filter][mask_extend] =
 						i965_create_sampler_state(intel,
-								i, j,
-								k, l,
+									  src_filter, src_extend,
+									  mask_filter, mask_extend,
 								border_color_bo);
 				}
 			}
commit 072d7a8b42f04600c9d8054f3648642a1aaff57a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:40:01 2012 +0100

    sna/debug: Assert the non-existence of the relocation handle at source
    
    This should help the static analyzer pinpoint the blame and make it
    quieter.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem_debug.c b/src/sna/kgem_debug.c
index e833a6f..e46ffca 100644
--- a/src/sna/kgem_debug.c
+++ b/src/sna/kgem_debug.c
@@ -48,6 +48,7 @@ kgem_debug_get_reloc_entry(struct kgem *kgem, uint32_t offset)
 		if (kgem->reloc[i].offset == offset)
 			return kgem->reloc+i;
 
+	assert(!"valid relocation entry, unknown batch offset");
 	return NULL;
 }
 
@@ -265,7 +266,6 @@ decode_2d(struct kgem *kgem, uint32_t offset)
 		kgem_debug_print(data, offset, 3, "(%d,%d)\n",
 			  data[3] & 0xffff, data[3] >> 16);
 		reloc = kgem_debug_get_reloc_entry(kgem, offset+4);
-		assert(reloc);
 		kgem_debug_print(data, offset, 4, "dst offset 0x%08x [handle=%d, delta=%d, read=%x, write=%x (fenced? %d, tiling? %d)]\n",
 				 data[4],
 				 reloc->target_handle, reloc->delta,
commit 4a3c355e056339aed68b70470556633dea899b1b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jun 4 11:32:42 2012 +0100

    sna: Silence a compiler warning for loss of 'const' qualifier
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/blt.c b/src/sna/blt.c
index 65d586c..e9d06eb 100644
--- a/src/sna/blt.c
+++ b/src/sna/blt.c
@@ -150,7 +150,7 @@ memcpy_blt(const void *src, void *dst, int bpp,
 	   int16_t dst_x, int16_t dst_y,
 	   uint16_t width, uint16_t height)
 {
-	uint8_t *src_bytes;
+	const uint8_t *src_bytes;
 	uint8_t *dst_bytes;
 	int byte_width;
 
commit 791029cc16bca36b8dec82297ff7e07a972c51ab
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 13:28:43 2012 +0100

    sna/trapezoids: Implement trapezoidal opaque fills inplace
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/compiler.h b/src/sna/compiler.h
index 364ea62..653435f 100644
--- a/src/sna/compiler.h
+++ b/src/sna/compiler.h
@@ -32,6 +32,7 @@
 #define likely(expr) (__builtin_expect (!!(expr), 1))
 #define unlikely(expr) (__builtin_expect (!!(expr), 0))
 #define noinline __attribute__((noinline))
+#define force_inline __attribute__((always_inline))
 #define fastcall __attribute__((regparm(3)))
 #define must_check __attribute__((warn_unused_result))
 #define constant __attribute__((const))
@@ -39,6 +40,7 @@
 #define likely(expr) (expr)
 #define unlikely(expr) (expr)
 #define noinline
+#define force_inline
 #define fastcall
 #define must_check
 #define constant
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index d65c249..e2212b9 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -3666,7 +3666,10 @@ trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 struct inplace {
 	uint32_t stride;
 	uint8_t *ptr;
-	uint8_t opacity;
+	union {
+		uint8_t opacity;
+		uint32_t color;
+	};
 };
 
 static inline uint8_t
@@ -3838,6 +3841,110 @@ tor_blt_add_clipped(struct sna *sna,
 	pixman_region_fini(&region);
 }
 
+#define ONE_HALF 0x7f
+#define RB_MASK 0x00ff00ff
+#define RB_ONE_HALF 0x007f007f
+#define RB_MASK_PLUS_ONE 0x01000100
+#define G_SHIFT 8
+
+static force_inline uint32_t
+mul8x2_8 (uint32_t a, uint8_t b)
+{
+	uint32_t t = (a & RB_MASK) * b + RB_ONE_HALF;
+	return ((t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT) & RB_MASK;
+}
+
+static force_inline uint32_t
+add8x2_8x2(uint32_t a, uint32_t b)
+{
+	uint32_t t = a + b;
+	t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);
+	return t & RB_MASK;
+}
+
+static force_inline uint32_t
+lerp8x4(uint32_t src, uint8_t a, uint32_t dst)
+{
+	return (add8x2_8x2(mul8x2_8(src, a),
+			   mul8x2_8(dst, ~a)) |
+		add8x2_8x2(mul8x2_8(src >> G_SHIFT, a),
+			   mul8x2_8(dst >> G_SHIFT, ~a)) << G_SHIFT);
+}
+
+static void
+tor_blt_lerp32(struct sna *sna,
+	       struct sna_composite_spans_op *op,
+	       pixman_region16_t *clip,
+	       const BoxRec *box,
+	       int coverage)
+{
+	struct inplace *in = (struct inplace *)op;
+	uint32_t *ptr = (uint32_t *)in->ptr;
+	int stride = in->stride / sizeof(uint32_t);
+	int h, w, i;
+
+	if (coverage == 0)
+		return;
+
+	ptr += box->y1 * stride + box->x1;
+
+	h = box->y2 - box->y1;
+	w = box->x2 - box->x1;
+	if (coverage == FAST_SAMPLES_XY) {
+		if ((w | h) == 1) {
+			*ptr = in->color;
+		} else {
+			if (w < 16) {
+				do {
+					for (i = 0; i < w; i++)
+						ptr[i] = in->color;
+					ptr += stride;
+				} while (--h);
+			} else {
+				pixman_fill(ptr, stride, 32,
+					    0, 0, w, h, in->color);
+			}
+		}
+	} else {
+		coverage = coverage * 256 / FAST_SAMPLES_XY;
+		coverage -= coverage >> 8;
+
+		if ((w | h) == 1) {
+			*ptr = lerp8x4(in->color, coverage, *ptr);
+		} else if (w == 1) {
+			do {
+				*ptr = lerp8x4(in->color, coverage, *ptr);
+				ptr += stride;
+			} while (--h);
+		} else{
+			do {
+				for (i = 0; i < w; i++)
+					ptr[i] = lerp8x4(in->color, coverage, ptr[i]);
+				ptr += stride;
+			} while (--h);
+		}
+	}
+}
+
+static void
+tor_blt_lerp32_clipped(struct sna *sna,
+		       struct sna_composite_spans_op *op,
+		       pixman_region16_t *clip,
+		       const BoxRec *box,
+		       int coverage)
+{
+	pixman_region16_t region;
+	int n;
+
+	pixman_region_init_rects(&region, box, 1);
+	RegionIntersect(&region, &region, clip);
+	n = REGION_NUM_RECTS(&region);
+	box = REGION_RECTS(&region);
+	while (n--)
+		tor_blt_lerp32(sna, op, NULL, box++, coverage);
+	pixman_region_fini(&region);
+}
+
 struct mono_inplace_composite {
 	pixman_image_t *src, *dst;
 	int dx, dy;
@@ -4130,6 +4237,134 @@ unbounded_pass:
 }
 
 static bool
+trapezoid_span_inplace__x8r8g8b8(CARD8 op,
+				 uint32_t color,
+				 PicturePtr src,
+				 PicturePtr dst,
+				 PictFormatPtr maskFormat,
+				 int ntrap, xTrapezoid *traps)
+{
+	struct tor tor;
+	span_func_t span;
+	RegionRec region;
+	int16_t dst_x, dst_y;
+	int dx, dy;
+	int n;
+
+	if (op == PictOpOver && (color >> 24) == 0xff)
+		op = PictOpSrc;
+	if (op == PictOpOver) {
+		struct sna_pixmap *priv = sna_pixmap_from_drawable(dst->pDrawable);
+		if (priv && priv->clear && priv->clear_color == 0)
+			op = PictOpSrc;
+	}
+
+	switch (op) {
+	case PictOpSrc:
+		break;
+	default:
+		DBG(("%s: fallback -- can not perform op [%d] in place\n",
+		     __FUNCTION__, op));
+		return false;
+	}
+
+	DBG(("%s: format=%x, op=%d, color=%x\n",
+	     __FUNCTION__, dst->format, op, color));
+
+	if (maskFormat == NULL && ntrap > 1) {
+		DBG(("%s: individual rasterisation requested\n",
+		     __FUNCTION__));
+		do {
+			/* XXX unwind errors? */
+			if (!trapezoid_span_inplace__x8r8g8b8(op, color,
+							      src, dst, NULL,
+							      1, traps++))
+				return false;
+		} while (--ntrap);
+		return true;
+	}
+
+	trapezoids_bounds(ntrap, traps, &region.extents);
+	if (region.extents.y1 >= region.extents.y2 ||
+	    region.extents.x1 >= region.extents.x2)
+		return true;
+
+	DBG(("%s: extents (%d, %d), (%d, %d)\n",
+	     __FUNCTION__,
+	     region.extents.x1, region.extents.y1,
+	     region.extents.x2, region.extents.y2));
+
+	if (!sna_compute_composite_extents(&region.extents,
+					   src, NULL, dst,
+					   0, 0,
+					   0, 0,
+					   region.extents.x1, region.extents.y1,
+					   region.extents.x2 - region.extents.x1,
+					   region.extents.y2 - region.extents.y1))
+		return true;
+
+	DBG(("%s: clipped extents (%d, %d), (%d, %d)\n",
+	     __FUNCTION__,
+	     region.extents.x1, region.extents.y1,
+	     region.extents.x2, region.extents.y2));
+
+	if (tor_init(&tor, &region.extents, 2*ntrap))
+		return true;
+
+	dx = dst->pDrawable->x * FAST_SAMPLES_X;
+	dy = dst->pDrawable->y * FAST_SAMPLES_Y;
+
+	for (n = 0; n < ntrap; n++) {
+		xTrapezoid t;
+
+		if (!project_trapezoid_onto_grid(&traps[n], dx, dy, &t))
+			continue;
+
+		if (pixman_fixed_to_int(traps[n].top) >= region.extents.y2 - dst->pDrawable->y ||
+		    pixman_fixed_to_int(traps[n].bottom) < region.extents.y1 - dst->pDrawable->y)
+			continue;
+
+		tor_add_edge(&tor, &t, &t.left, 1);
+		tor_add_edge(&tor, &t, &t.right, -1);
+	}
+
+	switch (op) {
+	case PictOpSrc:
+		if (dst->pCompositeClip->data)
+			span = tor_blt_lerp32_clipped;
+		else
+			span = tor_blt_lerp32;
+		break;
+	}
+
+	DBG(("%s: move-to-cpu\n", __FUNCTION__));
+	region.data = NULL;
+	if (sna_drawable_move_region_to_cpu(dst->pDrawable, &region,
+					    MOVE_WRITE | MOVE_READ)) {
+		PixmapPtr pixmap;
+		struct inplace inplace;
+
+		pixmap = get_drawable_pixmap(dst->pDrawable);
+
+		get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y);
+
+		inplace.ptr = pixmap->devPrivate.ptr;
+		inplace.ptr += dst_y * pixmap->devKind + dst_x;
+		inplace.stride = pixmap->devKind;
+		inplace.color = color;
+
+		DBG(("%s: render inplace op=%d, color=%08x\n",
+		     __FUNCTION__, op, color));
+		tor_render(NULL, &tor, (void*)&inplace,
+			   dst->pCompositeClip, span, false);
+
+		tor_fini(&tor);
+	}
+
+	return true;
+}
+
+static bool
 trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 		       PictFormatPtr maskFormat, INT16 src_x, INT16 src_y,
 		       int ntrap, xTrapezoid *traps,
@@ -4178,6 +4413,11 @@ trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 		return false;
 	}
 
+	if (dst->format == PICT_a8r8g8b8 || dst->format == PICT_x8r8g8b8)
+		return trapezoid_span_inplace__x8r8g8b8(op, color,
+							src, dst, maskFormat,
+							ntrap, traps);
+
 	if (dst->format != PICT_a8) {
 		DBG(("%s: fallback -- can not perform operation in place, format=%x\n",
 		     __FUNCTION__, dst->format));
@@ -4185,36 +4425,49 @@ trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 	}
 
 	pixmap = get_drawable_pixmap(dst->pDrawable);
-	priv = sna_pixmap(pixmap);
-	if (priv == NULL) {
-		DBG(("%s: fallback -- unattached\n", __FUNCTION__));
-		return false;
-	}
 
 	unbounded = false;
-	switch (op) {
-	case PictOpAdd:
-		if (priv->clear && priv->clear_color == 0) {
+	priv = sna_pixmap(pixmap);
+	if (priv) {
+		switch (op) {
+		case PictOpAdd:
+			if (priv->clear && priv->clear_color == 0) {
+				unbounded = true;
+				op = PictOpSrc;
+			}
+			if ((color >> 24) == 0)
+				return true;
+			break;
+		case PictOpIn:
+			if (priv->clear && priv->clear_color == 0)
+				return true;
+			if (priv->clear && priv->clear_color == 0xff)
+				op = PictOpSrc;
 			unbounded = true;
-			op = PictOpSrc;
+			break;
+		case PictOpSrc:
+			unbounded = true;
+			break;
+		default:
+			DBG(("%s: fallback -- can not perform op [%d] in place\n",
+			     __FUNCTION__, op));
+			return false;
+		}
+	} else {
+		switch (op) {
+		case PictOpAdd:
+			if ((color >> 24) == 0)
+				return true;
+			break;
+		case PictOpIn:
+		case PictOpSrc:
+			unbounded = true;
+			break;
+		default:
+			DBG(("%s: fallback -- can not perform op [%d] in place\n",
+			     __FUNCTION__, op));
+			return false;
 		}
-		if ((color >> 24) == 0)
-			return true;
-		break;
-	case PictOpIn:
-		if (priv->clear && priv->clear_color == 0)
-			return true;
-		if (priv->clear && priv->clear_color == 0xff)
-			op = PictOpSrc;
-		unbounded = true;
-		break;
-	case PictOpSrc:
-		unbounded = true;
-		break;
-	default:
-		DBG(("%s: fallback -- can not perform op [%d] in place\n",
-		     __FUNCTION__, op));
-		return false;
 	}
 
 	DBG(("%s: format=%x, op=%d, color=%x\n",
commit 1f78a934a423911e18d340f0585e31941f6e8663
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 13:27:52 2012 +0100

    sna: Clear the counters prior to querying the property
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index c93f472..fbf35cc 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1085,6 +1085,8 @@ sna_output_attach_edid(xf86OutputPtr output)
 
 		VG_CLEAR(prop);
 		prop.prop_id = koutput->props[i];
+		prop.count_values = 0;
+		prop.count_enum_blobs = 0;
 		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop))
 			continue;
 
@@ -1280,6 +1282,8 @@ sna_output_dpms(xf86OutputPtr output, int dpms)
 
 		VG_CLEAR(prop);
 		prop.prop_id = koutput->props[i];
+		prop.count_values = 0;
+		prop.count_enum_blobs = 0;
 		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop))
 			continue;
 
commit a1953f1d4abc6e158a5e3ca53d3207548842254c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 12:02:55 2012 +0100

    sna: Prefer to use memset() for extremely large clears
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 9dc3808..973a657 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -868,7 +868,12 @@ fallback:
 						  dst->format))
 			goto fallback_composite;
 
-		do {
+		if (pixel == 0 &&
+		    box->x2 - box->x1 == pixmap->drawable.width &&
+		    box->y2 - box->y1 == pixmap->drawable.height) {
+			memset(pixmap->devPrivate.ptr, 0,
+			       pixmap->devKind*pixmap->drawable.height);
+		} else do {
 			DBG(("%s: fallback fill: (%d, %d)x(%d, %d) %08x\n",
 			     __FUNCTION__,
 			     box->x1, box->y1,
commit ce85cd1a36e31795a966ea8983c2d6f803a4eccd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 11:46:06 2012 +0100

    sna: Add some DBG to retreiving EDID
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 2e1be46..c93f472 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1072,13 +1072,16 @@ sna_output_attach_edid(xf86OutputPtr output)
 	struct sna *sna = to_sna(output->scrn);
 	struct sna_output *sna_output = output->driver_private;
 	drmModeConnectorPtr koutput = sna_output->mode_output;
-	drmModePropertyBlobPtr edid_blob = NULL;
+	void *raw = NULL;
+	int raw_length = 0;
 	xf86MonPtr mon = NULL;
 	int i;
 
 	/* look for an EDID property */
 	for (i = 0; i < koutput->count_props; i++) {
 		struct drm_mode_get_property prop;
+		struct drm_mode_get_blob blob;
+		void *tmp;
 
 		VG_CLEAR(prop);
 		prop.prop_id = koutput->props[i];
@@ -1091,23 +1094,41 @@ sna_output_attach_edid(xf86OutputPtr output)
 		if (strcmp(prop.name, "EDID"))
 			continue;
 
-		drmModeFreePropertyBlob(edid_blob);
-		edid_blob = drmModeGetPropertyBlob(sna->kgem.fd,
-						   koutput->prop_values[i]);
-	}
+		VG_CLEAR(blob);
+		blob.length = 0;
+		blob.data =0;
+		blob.blob_id = koutput->prop_values[i];
+
+		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPBLOB, &blob))
+			continue;
 
-	if (edid_blob) {
-		mon = xf86InterpretEDID(output->scrn->scrnIndex,
-					edid_blob->data);
+		DBG(("%s: retreiving blob (property %d, id=%d, value=%ld), length=%d\n",
+		     __FUNCTION__, i, koutput->props[i], (long)koutput->prop_values[i],
+		     blob.length));
 
-		if (mon && edid_blob->length > 128)
+		tmp = malloc(blob.length);
+		if (tmp == NULL)
+			continue;
+
+		blob.data = (uintptr_t)tmp;
+		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPBLOB, &blob)) {
+			free(tmp);
+			continue;
+		}
+
+		free(raw);
+		raw = tmp;
+		raw_length = blob.length;
+	}
+
+	if (raw) {
+		mon = xf86InterpretEDID(output->scrn->scrnIndex, raw);
+		if (mon && raw_length > 128)
 			mon->flags |= MONITOR_EDID_COMPLETE_RAWDATA;
 	}
 
 	xf86OutputSetEDID(output, mon);
-
-	if (0&&edid_blob)
-		drmModeFreePropertyBlob(edid_blob);
+	free(raw);
 }
 
 static DisplayModePtr
commit e8eb273bd6153c232a9ffc558e3b7fd4beaab01b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 10:43:03 2012 +0100

    sna/gen7: Add DBG for ring switching
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 2ee5b6f..50eb07e 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -4233,8 +4233,11 @@ gen7_render_context_switch(struct kgem *kgem,
 	if (!new_mode)
 		return;
 
-	if (kgem->mode)
+	if (kgem->mode) {
+		DBG(("%s: switch rings %d -> %d\n",
+		     __FUNCTION__, kgem->mode, new_mode));
 		kgem_submit(kgem);
+	}
 
 	kgem->ring = new_mode;
 }
commit 722afa6bc910a2ccfbb0442872a878d1b6b78315
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 10:04:02 2012 +0100

    sna: Remove some unused members from the KMS state tracking
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 9fd59f8..2e1be46 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -54,17 +54,14 @@
 #endif
 
 struct sna_crtc {
-	struct sna *sna;
 	struct drm_mode_modeinfo kmode;
 	PixmapPtr shadow;
 	uint32_t shadow_fb_id;
 	uint32_t cursor;
-	xf86CrtcPtr crtc;
-	int num;
-	int id;
-	int pipe;
-	int plane;
-	int active;
+	uint8_t id;
+	uint8_t pipe;
+	uint8_t plane;
+	uint8_t active;
 	struct list link;
 };
 
@@ -76,12 +73,10 @@ struct sna_property {
 };
 
 struct sna_output {
-	struct sna_mode *mode;
-	int output_id;
+	int id;
 	drmModeConnectorPtr mode_output;
 	int num_props;
 	struct sna_property *props;
-	void *private_data;
 
 	Bool has_panel_limits;
 	int panel_hdisplay;
@@ -91,7 +86,6 @@ struct sna_output {
 	const char *backlight_iface;
 	int backlight_active_level;
 	int backlight_max;
-	xf86OutputPtr output;
 	struct list link;
 };
 
@@ -104,7 +98,7 @@ sna_output_dpms(xf86OutputPtr output, int mode);
  * List of available kernel interfaces in priority order
  */
 static const char *backlight_interfaces[] = {
-	"sna", /* prefer our own native backlight driver */
+	"intel", /* prefer our own native backlight driver */
 	"asus-laptop",
 	"eeepc",
 	"thinkpad_screen",
@@ -493,15 +487,16 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 }
 
 static void
-sna_crtc_restore(struct sna *sna)
+sna_crtc_restore(ScrnInfoPtr scrn)
 {
-	ScrnInfoPtr scrn = sna->scrn;
+	struct sna *sna = to_sna(scrn);
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
 	struct kgem_bo *bo;
 	int i;
 
-	DBG(("%s (fb_pixmap=%d, front=%d)\n", __FUNCTION__,
-	     sna->mode.fb_pixmap, sna->front->drawable.serialNumber));
+	DBG(("%s (fb_pixmap=%ld, front=%ld)\n", __FUNCTION__,
+	     (long)sna->mode.fb_pixmap,
+	     (long)sna->front->drawable.serialNumber));
 
 	if (sna->mode.fb_pixmap == sna->front->drawable.serialNumber)
 		return;
@@ -548,7 +543,7 @@ sna_crtc_dpms(xf86CrtcPtr crtc, int mode)
 	     __FUNCTION__, sna_crtc->pipe, mode, mode == DPMSModeOn));
 
 	if (mode != DPMSModeOff)
-		sna_crtc_restore(sna_crtc->sna);
+		sna_crtc_restore(crtc->scrn);
 	else
 		sna_crtc->active = false;
 }
@@ -984,7 +979,6 @@ sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	if (sna_crtc == NULL)
 		return;
 
-	sna_crtc->num = num;
 	sna_crtc->id = mode->mode_res->crtcs[num];
 
 	VG_CLEAR(get_pipe);
@@ -1012,8 +1006,6 @@ sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 
 	sna_crtc->cursor = gem_create(sna->kgem.fd, 64*64*4);
 
-	sna_crtc->sna = sna;
-	sna_crtc->crtc = crtc;
 	list_add(&sna_crtc->link, &mode->crtcs);
 
 	DBG(("%s: attached crtc[%d] id=%d, pipe=%d\n",
@@ -1039,7 +1031,7 @@ sna_output_detect(xf86OutputPtr output)
 
 	drmModeFreeConnector(sna_output->mode_output);
 	sna_output->mode_output =
-		drmModeGetConnector(sna->kgem.fd, sna_output->output_id);
+		drmModeGetConnector(sna->kgem.fd, sna_output->id);
 
 	switch (sna_output->mode_output->connection) {
 	case DRM_MODE_CONNECTED:
@@ -1286,7 +1278,7 @@ sna_output_dpms(xf86OutputPtr output, int dpms)
 						  dpms);
 
 		drmModeConnectorSetProperty(sna->kgem.fd,
-					    sna_output->output_id,
+					    sna_output->id,
 					    prop.prop_id,
 					    dpms);
 
@@ -1497,7 +1489,7 @@ sna_output_set_property(xf86OutputPtr output, Atom property,
 				return FALSE;
 			val = *(uint32_t *)value->data;
 
-			drmModeConnectorSetProperty(sna->kgem.fd, sna_output->output_id,
+			drmModeConnectorSetProperty(sna->kgem.fd, sna_output->id,
 						    p->mode_prop->prop_id, (uint64_t)val);
 			return TRUE;
 		} else if (p->mode_prop->flags & DRM_MODE_PROP_ENUM) {
@@ -1515,7 +1507,7 @@ sna_output_set_property(xf86OutputPtr output, Atom property,
 			/* search for matching name string, then set its value down */
 			for (j = 0; j < p->mode_prop->count_enums; j++) {
 				if (!strcmp(p->mode_prop->enums[j].name, name)) {
-					drmModeConnectorSetProperty(sna->kgem.fd, sna_output->output_id,
+					drmModeConnectorSetProperty(sna->kgem.fd, sna_output->id,
 								    p->mode_prop->prop_id, p->mode_prop->enums[j].value);
 					return TRUE;
 				}
@@ -1683,9 +1675,8 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	if (!sna_output)
 		goto cleanup_output;
 
-	sna_output->output_id = mode->mode_res->connectors[num];
+	sna_output->id = mode->mode_res->connectors[num];
 	sna_output->mode_output = koutput;
-	sna_output->mode = mode;
 
 	output->mm_width = koutput->mmWidth;
 	output->mm_height = koutput->mmHeight;
@@ -1700,7 +1691,6 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	output->possible_clones = enc.possible_clones;
 	output->interlaceAllowed = TRUE;
 
-	sna_output->output = output;
 	list_add(&sna_output->link, &mode->outputs);
 
 	return;
@@ -1853,11 +1843,11 @@ static int do_page_flip(struct sna *sna, void *data, int ref_crtc_hw_id)
 		 * completion event. All other crtc's events will be discarded.
 		 */
 		evdata = (uintptr_t)data;
-		evdata |= sna_crtc_to_pipe(crtc->crtc) == ref_crtc_hw_id;
+		evdata |= crtc->pipe == ref_crtc_hw_id;
 
 		DBG(("%s: crtc %d [ref? %d] --> fb %d\n",
 		     __FUNCTION__, crtc_id(crtc),
-		     sna_crtc_to_pipe(crtc->crtc) == ref_crtc_hw_id,
+		     crtc->pipe == ref_crtc_hw_id,
 		     sna->mode.fb_id));
 		if (drmModePageFlip(sna->kgem.fd,
 				    crtc_id(crtc),
commit 26e7bb3f25f0c83d39ff505fa7e05bfcb976e39c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 09:16:51 2012 +0100

    sna: Add a DBG message to indicate flushing for GPU idle
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7b7190d..eb85cb4 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -12459,9 +12459,11 @@ set_tv:
 
 void sna_accel_wakeup_handler(struct sna *sna, fd_set *ready)
 {
+	DBG(("%s\n", __FUNCTION__));
 	if (sna->kgem.need_retire)
 		kgem_retire(&sna->kgem);
 	if (!sna->kgem.need_retire) {
+		DBG(("%s: GPU idle, flushing\n", __FUNCTION__));
 		kgem_submit(&sna->kgem);
 		sna->kgem.flush_now = 0;
 	}
commit 58fc03b8c36688e9fa7925aa82b83d36c9decb7e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 08:53:24 2012 +0100

    sna: Prevent NULL deref with early termination and DBG enabled
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index f8e386b..a1581f3 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -213,6 +213,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
 	return TRUE;
 
 cleanup_front:
+	screen->SetScreenPixmap(NULL);
 	screen->DestroyPixmap(sna->front);
 	sna->front = NULL;
 	return FALSE;
@@ -326,7 +327,8 @@ static int sna_open_drm_master(ScrnInfoPtr scrn)
 	err = drmSetInterfaceVersion(fd, &sv);
 	if (err != 0) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] failed to set drm interface version.\n");
+			   "[drm] failed to set drm interface version: %s [%d].\n",
+			   strerror(-err), -err);
 		drmClose(fd);
 		return -1;
 	}
@@ -362,8 +364,10 @@ static void sna_close_drm_master(ScrnInfoPtr scrn)
 {
 	struct sna_device *dev = sna_device(scrn);
 
-	DBG(("%s(open_count=%d)\n", __FUNCTION__, dev->open_count));
+	if (dev == NULL)
+		return;
 
+	DBG(("%s(open_count=%d)\n", __FUNCTION__, dev->open_count));
 	if (--dev->open_count)
 		return;
 
commit 1be2afb81df887ed664ac31d0641da808cfb8888
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 08:04:02 2012 +0100

    legacy/i810/video: Release memory after creating adaptors
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_video.c b/src/legacy/i810/i810_video.c
index 2999ee0..729aa8b 100644
--- a/src/legacy/i810/i810_video.c
+++ b/src/legacy/i810/i810_video.c
@@ -155,40 +155,34 @@ static Atom xvBrightness, xvContrast, xvColorKey;
 void I810InitVideo(ScreenPtr screen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
-    XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
-    XF86VideoAdaptorPtr newAdaptor = NULL;
+    XF86VideoAdaptorPtr *adaptors;
     int num_adaptors;
-	
-    if (pScrn->bitsPerPixel != 8) 
-    {
+
+    num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
+
+    if (pScrn->bitsPerPixel != 8) {
+	XF86VideoAdaptorPtr newAdaptor;
+
 	newAdaptor = I810SetupImageVideo(screen);
 	I810InitOffscreenImages(screen);
-    }
 
-    num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
+	if (newAdaptor) {
+	    XF86VideoAdaptorPtr *newAdaptors;
 
-    if(newAdaptor) {
-	if(!num_adaptors) {
-	    num_adaptors = 1;
-	    adaptors = &newAdaptor;
-	} else {
-	    newAdaptors =  /* need to free this someplace */
-		malloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr*));
-	    if(newAdaptors) {
-		memcpy(newAdaptors, adaptors, num_adaptors * 
-					sizeof(XF86VideoAdaptorPtr));
-		newAdaptors[num_adaptors] = newAdaptor;
+	    newAdaptors =
+		realloc(adaptors,
+			(num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr));
+	    if (newAdaptors != NULL) {
+		newAdaptors[num_adaptors++] = newAdaptor;
 		adaptors = newAdaptors;
-		num_adaptors++;
 	    }
 	}
     }
 
-    if(num_adaptors)
-        xf86XVScreenInit(screen, adaptors, num_adaptors);
+    if (num_adaptors)
+	xf86XVScreenInit(screen, adaptors, num_adaptors);
 
-    if(newAdaptors)
-	free(newAdaptors);
+    free(adaptors);
 }
 
 /* *INDENT-OFF* */
commit 261d086265fff6c9b28a67d2fcceed8f107d5cb0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    legacy/i810/dri: Propagate failure from allocating texture memory
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_dri.c b/src/legacy/i810/i810_dri.c
index 2b3f1e1..28a3b91 100644
--- a/src/legacy/i810/i810_dri.c
+++ b/src/legacy/i810/i810_dri.c
@@ -809,7 +809,12 @@ I810DRIScreenInit(ScreenPtr pScreen)
       return FALSE;
    }
 
-   I810AllocLow(&(pI810->TexMem), &(pI810->SysMem), pI810DRI->textureSize);
+   if (!I810AllocLow(&(pI810->TexMem), &(pI810->SysMem), pI810DRI->textureSize)) {
+      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+		 "[agp] Texure memory allocation failed\n");
+      DRICloseScreen(pScreen);
+      return FALSE;
+   }
 
    if (drmAddMap(pI810->drmSubFD, (drm_handle_t) pI810->TexMem.Start,
 		 pI810->TexMem.Size, DRM_AGP, 0, 
commit 2ea12b56d42686f75deb33fc126d09acee7e2899
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    legacy/i810: Fix memset(sizeof(*ptr)) rather than memset(sizeof(ptr))
    
    Clear the entire structure and not the first 4 bytes...
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/legacy/i810/i810_dri.c b/src/legacy/i810/i810_dri.c
index 2f02dd9..2b3f1e1 100644
--- a/src/legacy/i810/i810_dri.c
+++ b/src/legacy/i810/i810_dri.c
@@ -959,7 +959,7 @@ I810DRIFinishScreenInit(ScreenPtr pScreen)
    ScrnInfoPtr        pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr info  = I810PTR(pScrn);
 
-   memset(sPriv, 0, sizeof(sPriv));
+   memset(sPriv, 0, sizeof(*sPriv));
 
    /* Have shadow run only while there is 3d active.
     */
commit d3e15d1460faad192781d74fdc2b5092e9c148ad
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 08:14:23 2012 +0100

    uxa/i965: Make the unhandled allocation failures explicit
    
    Add assertions to the point of allocation and write failures.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i965_render.c b/src/i965_render.c
index f9d3158..508a846 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -778,13 +778,16 @@ static drm_intel_bo *gen4_create_sf_state(intel_screen_private *intel,
 {
 	struct brw_sf_unit_state *sf_state;
 	drm_intel_bo *sf_state_bo;
+	int ret;
 
 	sf_state_bo = drm_intel_bo_alloc(intel->bufmgr, "gen4 SF state",
 					 sizeof(*sf_state), 4096);
-	drm_intel_bo_map(sf_state_bo, TRUE);
-	sf_state = sf_state_bo->virtual;
+	assert(sf_state_bo);
 
-	memset(sf_state, 0, sizeof(*sf_state));
+	ret = drm_intel_bo_map(sf_state_bo, TRUE);
+	assert(ret == 0);
+
+	sf_state = memset(sf_state_bo->virtual, 0, sizeof(*sf_state));
 	sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
 	sf_state->thread0.kernel_start_pointer =
 	    intel_emit_reloc(sf_state_bo,
@@ -820,6 +823,7 @@ static drm_intel_bo *gen4_create_sf_state(intel_screen_private *intel,
 	drm_intel_bo_unmap(sf_state_bo);
 
 	return sf_state_bo;
+	(void)ret;
 }
 
 static drm_intel_bo *sampler_border_color_create(intel_screen_private *intel)
@@ -982,11 +986,16 @@ static drm_intel_bo *gen4_create_sampler_state(intel_screen_private *intel,
 {
 	drm_intel_bo *sampler_state_bo;
 	struct brw_sampler_state *sampler_state;
+	int ret;
 
 	sampler_state_bo =
 	    drm_intel_bo_alloc(intel->bufmgr, "gen4 sampler state",
 			       sizeof(struct brw_sampler_state) * 2, 4096);
-	drm_intel_bo_map(sampler_state_bo, TRUE);
+	assert(sampler_state_bo);
+
+	ret = drm_intel_bo_map(sampler_state_bo, TRUE);
+	assert(ret == 0);
+
 	sampler_state = sampler_state_bo->virtual;
 
 	gen4_sampler_state_init(sampler_state_bo,
@@ -999,6 +1008,7 @@ static drm_intel_bo *gen4_create_sampler_state(intel_screen_private *intel,
 	drm_intel_bo_unmap(sampler_state_bo);
 
 	return sampler_state_bo;
+	(void)ret;
 }
 
 static drm_intel_bo *
@@ -1011,11 +1021,16 @@ gen7_create_sampler_state(intel_screen_private *intel,
 {
 	drm_intel_bo *sampler_state_bo;
 	struct gen7_sampler_state *sampler_state;
+	int ret;
 
 	sampler_state_bo =
 	    drm_intel_bo_alloc(intel->bufmgr, "gen7 sampler state",
 			       sizeof(struct gen7_sampler_state) * 2, 4096);
-	drm_intel_bo_map(sampler_state_bo, TRUE);
+	assert(sampler_state_bo);
+
+	ret = drm_intel_bo_map(sampler_state_bo, TRUE);
+	assert(ret == 0);
+
 	sampler_state = sampler_state_bo->virtual;
 
 	gen7_sampler_state_init(sampler_state_bo,
@@ -1028,6 +1043,7 @@ gen7_create_sampler_state(intel_screen_private *intel,
 	drm_intel_bo_unmap(sampler_state_bo);
 
 	return sampler_state_bo;
+	(void)ret;
 }
 
 static inline drm_intel_bo *
@@ -1096,13 +1112,16 @@ static drm_intel_bo *gen4_create_wm_state(intel_screen_private *intel,
 {
 	struct brw_wm_unit_state *state;
 	drm_intel_bo *wm_state_bo;
+	int ret;
 
 	wm_state_bo = drm_intel_bo_alloc(intel->bufmgr, "gen4 WM state",
 					 sizeof(*state), 4096);
-	drm_intel_bo_map(wm_state_bo, TRUE);
-	state = wm_state_bo->virtual;
+	assert(wm_state_bo);
 
-	memset(state, 0, sizeof(*state));
+	ret = drm_intel_bo_map(wm_state_bo, TRUE);
+	assert(ret == 0);
+
+	state = memset(wm_state_bo->virtual, 0, sizeof(*state));
 	state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
 	state->thread0.kernel_start_pointer =
 	    intel_emit_reloc(wm_state_bo,
@@ -1162,21 +1181,27 @@ static drm_intel_bo *gen4_create_wm_state(intel_screen_private *intel,
 	drm_intel_bo_unmap(wm_state_bo);
 
 	return wm_state_bo;
+	(void)ret;
 }
 
 static drm_intel_bo *gen4_create_cc_viewport(intel_screen_private *intel)
 {
 	drm_intel_bo *bo;
 	struct brw_cc_viewport vp;
+	int ret;
 
 	vp.min_depth = -1.e35;
 	vp.max_depth = 1.e35;
 
 	bo = drm_intel_bo_alloc(intel->bufmgr, "gen4 render unit state",
 				sizeof(vp), 4096);
-	drm_intel_bo_subdata(bo, 0, sizeof(vp), &vp);
+	assert(bo);
+
+	ret = drm_intel_bo_subdata(bo, 0, sizeof(vp), &vp);
+	assert(ret == 0);
 
 	return bo;
+	(void)ret;
 }
 
 static drm_intel_bo *gen4_create_vs_unit_state(intel_screen_private *intel)
@@ -1204,14 +1229,18 @@ static drm_intel_bo *gen4_create_vs_unit_state(intel_screen_private *intel)
 static drm_intel_bo *gen4_create_cc_unit_state(intel_screen_private *intel)
 {
 	drm_intel_bo *cc_state_bo, *cc_vp_bo;
-	int i, j;
+	int i, j, ret;
 
 	cc_vp_bo = gen4_create_cc_viewport(intel);
 
 	cc_state_bo = drm_intel_bo_alloc(intel->bufmgr, "gen4 CC state",
 					 sizeof(struct gen4_cc_unit_state),
 					 4096);
-	drm_intel_bo_map(cc_state_bo, TRUE);
+	assert(cc_state_bo);
+
+	ret = drm_intel_bo_map(cc_state_bo, TRUE);
+	assert(ret == 0);
+
 	for (i = 0; i < BRW_BLENDFACTOR_COUNT; i++) {
 		for (j = 0; j < BRW_BLENDFACTOR_COUNT; j++) {
 			cc_state_init(cc_state_bo,
@@ -1225,6 +1254,7 @@ static drm_intel_bo *gen4_create_cc_unit_state(intel_screen_private *intel)
 	drm_intel_bo_unreference(cc_vp_bo);
 
 	return cc_state_bo;
+	(void)ret;
 }
 
 static uint32_t i965_get_card_format(PicturePtr picture)
@@ -1724,9 +1754,12 @@ static Bool i965_composite_check_aperture(intel_screen_private *intel)
 
 static void i965_surface_flush(struct intel_screen_private *intel)
 {
-	drm_intel_bo_subdata(intel->surface_bo,
-			     0, intel->surface_used,
-			     intel->surface_data);
+	int ret;
+
+	ret = drm_intel_bo_subdata(intel->surface_bo,
+				   0, intel->surface_used,
+				   intel->surface_data);
+	assert(ret == 0);
 	intel->surface_used = 0;
 
 	assert (intel->surface_reloc != 0);
@@ -1740,6 +1773,10 @@ static void i965_surface_flush(struct intel_screen_private *intel)
 	intel->surface_bo =
 		drm_intel_bo_alloc(intel->bufmgr, "surface data",
 				   sizeof(intel->surface_data), 4096);
+	assert(intel->surface_bo);
+
+	return;
+	(void)ret;
 }
 
 static void
@@ -2297,6 +2334,8 @@ void gen4_render_state_init(ScrnInfoPtr scrn)
 	intel->surface_bo =
 		drm_intel_bo_alloc(intel->bufmgr, "surface data",
 				   sizeof(intel->surface_data), 4096);
+	assert(intel->surface_bo);
+
 	intel->surface_used = 0;
 
 	if (intel->gen4_render_state == NULL)
@@ -2433,14 +2472,18 @@ gen6_composite_create_cc_state(intel_screen_private *intel)
 {
 	struct gen6_color_calc_state *state;
 	drm_intel_bo *cc_bo;
+	int ret;
 
 	cc_bo = drm_intel_bo_alloc(intel->bufmgr,
 				"gen6 CC state",
 				sizeof(*state),
 				4096);
-	drm_intel_bo_map(cc_bo, TRUE);
-	state = cc_bo->virtual;
-	memset(state, 0, sizeof(*state));
+	assert(cc_bo);
+
+	ret = drm_intel_bo_map(cc_bo, TRUE);
+	assert(ret == 0);
+
+	state = memset(cc_bo->virtual, 0, sizeof(*state));
 	state->constant_r = 1.0;
 	state->constant_g = 0.0;
 	state->constant_b = 1.0;
@@ -2448,21 +2491,25 @@ gen6_composite_create_cc_state(intel_screen_private *intel)
 	drm_intel_bo_unmap(cc_bo);
 
 	return cc_bo;
+	(void)ret;
 }
 
 static drm_intel_bo *
 gen6_composite_create_blend_state(intel_screen_private *intel)
 {
 	drm_intel_bo *blend_bo;
-	int src, dst;
+	int src, dst, ret;
 
 	blend_bo = drm_intel_bo_alloc(intel->bufmgr,
 				"gen6 BLEND state",
 				BRW_BLENDFACTOR_COUNT * BRW_BLENDFACTOR_COUNT * GEN6_BLEND_STATE_PADDED_SIZE,
 				4096);
-	drm_intel_bo_map(blend_bo, TRUE);
-	memset(blend_bo->virtual, 0, blend_bo->size);
+	assert(blend_bo);
 
+	ret = drm_intel_bo_map(blend_bo, TRUE);
+	assert(ret == 0);
+
+	memset(blend_bo->virtual, 0, blend_bo->size);
 	for (src = 0; src < BRW_BLENDFACTOR_COUNT; src++) {
 		for (dst = 0; dst < BRW_BLENDFACTOR_COUNT; dst++) {
 			uint32_t blend_state_offset = (src * BRW_BLENDFACTOR_COUNT + dst) * GEN6_BLEND_STATE_PADDED_SIZE;
@@ -2481,6 +2528,7 @@ gen6_composite_create_blend_state(intel_screen_private *intel)
 
 	drm_intel_bo_unmap(blend_bo);
 	return blend_bo;
+	(void)ret;
 }
 
 static drm_intel_bo *
@@ -2488,17 +2536,22 @@ gen6_composite_create_depth_stencil_state(intel_screen_private *intel)
 {
 	struct gen6_depth_stencil_state *state;
 	drm_intel_bo *depth_stencil_bo;
+	int ret;
 
 	depth_stencil_bo = drm_intel_bo_alloc(intel->bufmgr,
 					"gen6 DEPTH_STENCIL state",
 					sizeof(*state),
 					4096);
-	drm_intel_bo_map(depth_stencil_bo, TRUE);
-	state = depth_stencil_bo->virtual;
-	memset(state, 0, sizeof(*state));
+	assert(depth_stencil_bo);
+
+	ret = drm_intel_bo_map(depth_stencil_bo, TRUE);
+	assert(ret == 0);
+
+	state = memset(depth_stencil_bo->virtual, 0, sizeof(*state));
 	drm_intel_bo_unmap(depth_stencil_bo);
 
 	return depth_stencil_bo;
+	(void)ret;
 }
 
 static void
diff --git a/src/intel.h b/src/intel.h
index 9e9de04..20d8282 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -601,11 +601,16 @@ static inline drm_intel_bo *intel_bo_alloc_for_data(intel_screen_private *intel,
 						    const char *name)
 {
 	drm_intel_bo *bo;
+	int ret;
 
 	bo = drm_intel_bo_alloc(intel->bufmgr, name, size, 4096);
-	if (bo)
-		drm_intel_bo_subdata(bo, 0, size, data);
+	assert(bo);
+
+	ret = drm_intel_bo_subdata(bo, 0, size, data);
+	assert(ret == 0);
+
 	return bo;
+	(void)ret;
 }
 
 void intel_debug_flush(ScrnInfoPtr scrn);
commit 46fbb3d31bf73df4bd0259a146e9929f62a9c488
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    uxa: NameForAtom may return NULL
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index 89f7259..609cbf7 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -1176,6 +1176,8 @@ intel_output_set_property(xf86OutputPtr output, Atom property,
 				return FALSE;
 			memcpy(&atom, value->data, 4);
 			name = NameForAtom(atom);
+			if (name == NULL)
+				return FALSE;
 
 			/* search for matching name string, then set its value down */
 			for (j = 0; j < p->mode_prop->count_enums; j++) {
commit 8451d5dd3c992bcfad9f71aa890b6b225884b978
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    uxa: Use unsigned bitfields for single bits
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel.h b/src/intel.h
index 4bdeab3..9e9de04 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -88,9 +88,9 @@ struct intel_pixmap {
 	uint16_t stride;
 	uint8_t tiling;
 	int8_t busy :2;
-	int8_t dirty :1;
-	int8_t offscreen :1;
-	int8_t pinned :1;
+	uint8_t dirty :1;
+	uint8_t offscreen :1;
+	uint8_t pinned :1;
 };
 
 #if HAS_DEVPRIVATEKEYREC
commit d66ca06865973833398560a04186e0067d9cb206
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    uxa: Intialize is_glamor_pixmap
    
    It is not clear whether is_glamor_pixmap is always initialized prior to
    use, so set it to a safe^W likely value.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_dri.c b/src/intel_dri.c
index 2a95edb..389ecdd 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -263,8 +263,8 @@ I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments,
 	DRI2BufferPtr buffers;
 	I830DRI2BufferPrivatePtr privates;
 	PixmapPtr pixmap, pDepthPixmap;
+	int is_glamor_pixmap = FALSE;
 	int i;
-	int is_glamor_pixmap;
 
 	buffers = calloc(count, sizeof *buffers);
 	if (buffers == NULL)
commit 25a17b2ca5e3945150151c4308761891c0e20bab
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    uxa: Remove 'render_source_is_solid' dead code
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i965_render.c b/src/i965_render.c
index 98231b8..f9d3158 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -1847,47 +1847,45 @@ i965_emit_composite_primitive(intel_screen_private *intel,
 	float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
 	Bool is_affine = intel->gen4_render_state->composite_op.is_affine;
 
-	if (! intel->render_source_is_solid) {
-		if (is_affine) {
-			if (!intel_get_transformed_coordinates(srcX, srcY,
-							      intel->transform[0],
-							      &src_x[0],
-							      &src_y[0]))
-				return;
-
-			if (!intel_get_transformed_coordinates(srcX, srcY + h,
-							      intel->transform[0],
-							      &src_x[1],
-							      &src_y[1]))
-				return;
-
-			if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
-							      intel->transform[0],
-							      &src_x[2],
-							      &src_y[2]))
-				return;
-		} else {
-			if (!intel_get_transformed_coordinates_3d(srcX, srcY,
-								 intel->transform[0],
-								 &src_x[0],
-								 &src_y[0],
-								 &src_w[0]))
-				return;
-
-			if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
-								 intel->transform[0],
-								 &src_x[1],
-								 &src_y[1],
-								 &src_w[1]))
-				return;
-
-			if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
-								 intel->transform[0],
-								 &src_x[2],
-								 &src_y[2],
-								 &src_w[2]))
-				return;
-		}
+	if (is_affine) {
+		if (!intel_get_transformed_coordinates(srcX, srcY,
+						       intel->transform[0],
+						       &src_x[0],
+						       &src_y[0]))
+			return;
+
+		if (!intel_get_transformed_coordinates(srcX, srcY + h,
+						       intel->transform[0],
+						       &src_x[1],
+						       &src_y[1]))
+			return;
+
+		if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
+						       intel->transform[0],
+						       &src_x[2],
+						       &src_y[2]))
+			return;
+	} else {
+		if (!intel_get_transformed_coordinates_3d(srcX, srcY,
+							  intel->transform[0],
+							  &src_x[0],
+							  &src_y[0],
+							  &src_w[0]))
+			return;
+
+		if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
+							  intel->transform[0],
+							  &src_x[1],
+							  &src_y[1],
+							  &src_w[1]))
+			return;
+
+		if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
+							  intel->transform[0],
+							  &src_x[2],
+							  &src_y[2],
+							  &src_w[2]))
+			return;
 	}
 
 	if (intel->render_mask) {
diff --git a/src/intel.h b/src/intel.h
index 253a6bf..4bdeab3 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -268,8 +268,6 @@ typedef struct intel_screen_private {
 
 	PixmapPtr render_source, render_mask, render_dest;
 	PicturePtr render_source_picture, render_mask_picture, render_dest_picture;
-	CARD32 render_source_solid;
-	Bool render_source_is_solid;
 	Bool needs_3d_invariant;
 	Bool needs_render_state_emit;
 	Bool needs_render_vertex_emit;
commit ba0eb230836fa5f94a2f50da5880fdd3b9dfd72e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    uxa: Fix reallocation of XVAdaptors array
    
    Prevent the leak and remove some unsightly code in the process.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_video.c b/src/intel_video.c
index 83d1eab..09674e5 100644
--- a/src/intel_video.c
+++ b/src/intel_video.c
@@ -337,13 +337,12 @@ void I830InitVideo(ScreenPtr screen)
 	/* Give our adaptor list enough space for the overlay and/or texture video
 	 * adaptors.
 	 */
-	newAdaptors =
-	    malloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *));
-	if (newAdaptors == NULL)
+	newAdaptors = realloc(adaptors,
+			      (num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr));
+	if (newAdaptors == NULL) {
+		free(adaptors);
 		return;
-
-	memcpy(newAdaptors, adaptors,
-	       num_adaptors * sizeof(XF86VideoAdaptorPtr));
+	}
 	adaptors = newAdaptors;
 
 	/* Add the adaptors supported by our hardware.  First, set up the atoms
commit affb1f82c1401bac3f54654a342e3b16b8bd374b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 08:27:59 2012 +0100

    sna/gradient: Reuse old gradient bo if allocation of new fails
    
    Prefer a stall to a crash.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index 0fda6ce..9ac0328 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -235,6 +235,7 @@ static void
 sna_render_finish_solid(struct sna *sna, bool force)
 {
 	struct sna_solid_cache *cache = &sna->render.solid_cache;
+	struct kgem_bo *old;
 	int i;
 
 	DBG(("sna_render_finish_solid(force=%d, domain=%d, busy=%d, dirty=%d)\n",
@@ -253,16 +254,25 @@ sna_render_finish_solid(struct sna *sna, bool force)
 		kgem_bo_destroy(&sna->kgem, cache->bo[i]);
 		cache->bo[i] = NULL;
 	}
-	kgem_bo_destroy(&sna->kgem, cache->cache_bo);
+
+	old = cache->cache_bo;
 
 	DBG(("sna_render_finish_solid reset\n"));
 
 	cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(cache->color), 0);
+	if (cache->cache_bo == NULL) {
+		cache->cache_bo = old;
+		old = NULL;
+	}
+
 	cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
 					 0, sizeof(uint32_t));
 	cache->bo[0]->pitch = 4;
 	if (force)
 		cache->size = 1;
+
+	if (old)
+		kgem_bo_destroy(&sna->kgem, old);
 }
 
 struct kgem_bo *
commit e51f984a4c15de42c5bee3aeacee553e2dd4eca0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 2 08:23:35 2012 +0100

    sna: Check gradient allocations during init
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index a52cfb5..0fda6ce 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -336,10 +336,12 @@ static Bool sna_alpha_cache_init(struct sna *sna)
 						 cache->cache_bo,
 						 sizeof(uint32_t)*i,
 						 sizeof(uint32_t));
+		if (cache->bo[i] == NULL)
+			return FALSE;
+
 		cache->bo[i]->pitch = 4;
 	}
-	kgem_bo_write(&sna->kgem, cache->cache_bo, color, sizeof(color));
-	return TRUE;
+	return kgem_bo_write(&sna->kgem, cache->cache_bo, color, sizeof(color));
 }
 
 static Bool sna_solid_cache_init(struct sna *sna)
@@ -360,6 +362,9 @@ static Bool sna_solid_cache_init(struct sna *sna)
 	cache->color[0] = 0xffffffff;
 	cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
 					 0, sizeof(uint32_t));
+	if (cache->bo[0] == NULL)
+		return FALSE;
+
 	cache->bo[0]->pitch = 4;
 	cache->dirty = 1;
 	cache->size = 1;
commit 2c5647a18e7856b604bce70270463fc128c2cfcd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    sna: NameForAtom may return NULL
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 5ed3179..9fd59f8 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1509,6 +1509,8 @@ sna_output_set_property(xf86OutputPtr output, Atom property,
 				return FALSE;
 			memcpy(&atom, value->data, 4);
 			name = NameForAtom(atom);
+			if (name == NULL)
+				return FALSE;
 
 			/* search for matching name string, then set its value down */
 			for (j = 0; j < p->mode_prop->count_enums; j++) {
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index bc117a4..33f3f71 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -387,7 +387,7 @@ XF86VideoAdaptorPtr sna_video_textured_setup(struct sna *sna,
 		return NULL;
 	}
 
-	if (sna->kgem.wedged) {
+	if (wedged(sna)) {
 		xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
 			   "cannot enable XVideo whilst the GPU is wedged\n");
 		return FALSE;
commit 7867bff00caeff9e1fbe569ca3d37b94f704a4cd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    sna: Replace invalid signed value with unsigned ~0 for uint8_t
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 553cea8..f982b41 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2916,7 +2916,7 @@ gen4_render_fill_boxes(struct sna *sna,
 	    (prefer_blt(sna) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen4_check_dst_format(format))) {
-		uint8_t alu = -1;
+		uint8_t alu = ~0;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -2929,7 +2929,7 @@ gen4_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != -1 &&
+		if (alu != ~0 &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 8b970f4..56db4a0 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -3250,7 +3250,7 @@ gen5_render_fill_boxes(struct sna *sna,
 	    (prefer_blt_fill(sna) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen5_check_dst_format(format))) {
-		uint8_t alu = -1;
+		uint8_t alu = ~0;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -3263,7 +3263,7 @@ gen5_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != -1 &&
+		if (alu != ~0 &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index df2eeb2..cc6cc50 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3661,7 +3661,7 @@ gen6_render_fill_boxes(struct sna *sna,
 	    (prefer_blt_fill(sna, dst_bo) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen6_check_dst_format(format))) {
-		uint8_t alu = -1;
+		uint8_t alu = ~0;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -3674,7 +3674,7 @@ gen6_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != -1 &&
+		if (alu != ~0 &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 6bf25d3..2ee5b6f 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3743,7 +3743,7 @@ gen7_render_fill_boxes(struct sna *sna,
 	    (prefer_blt_fill(sna, dst_bo) ||
 	     too_large(dst->drawable.width, dst->drawable.height) ||
 	     !gen7_check_dst_format(format))) {
-		uint8_t alu = -1;
+		uint8_t alu = ~0;
 
 		pixel = 0;
 		if (op == PictOpClear)
@@ -3756,7 +3756,7 @@ gen7_render_fill_boxes(struct sna *sna,
 						 format))
 			alu = GXcopy;
 
-		if (alu != -1 &&
+		if (alu != ~0 &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
commit ca72b372237287af0f4475801a9b64efca975832
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 23:22:31 2012 +0100

    sna: Drop return value from 3D point transform
    
    And just fixup the computed coordinates in the face of an invalid
    matrix.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index dd66a46..553cea8 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -980,29 +980,24 @@ gen4_emit_composite_primitive(struct sna *sna,
 						&src_x[2],
 						&src_y[2]);
 	} else {
-		if (!sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
-							r->src.y + op->src.offset[1],
-							op->src.transform,
-							&src_x[0],
-							&src_y[0],
-							&src_w[0]))
-			return;
-
-		if (!sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
-							r->src.y + op->src.offset[1] + r->height,
-							op->src.transform,
-							&src_x[1],
-							&src_y[1],
-							&src_w[1]))
-			return;
-
-		if (!sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0] + r->width,
-							r->src.y + op->src.offset[1] + r->height,
-							op->src.transform,
-							&src_x[2],
-							&src_y[2],
-							&src_w[2]))
-			return;
+		sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
+						   r->src.y + op->src.offset[1],
+						   op->src.transform,
+						   &src_x[0],
+						   &src_y[0],
+						   &src_w[0]);
+		sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
+						   r->src.y + op->src.offset[1] + r->height,
+						   op->src.transform,
+						   &src_x[1],
+						   &src_y[1],
+						   &src_w[1]);
+		sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0] + r->width,
+						   r->src.y + op->src.offset[1] + r->height,
+						   op->src.transform,
+						   &src_x[2],
+						   &src_y[2],
+						   &src_w[2]);
 	}
 
 	if (op->mask.bo) {
@@ -1025,29 +1020,24 @@ gen4_emit_composite_primitive(struct sna *sna,
 							&mask_x[2],
 							&mask_y[2]);
 		} else {
-			if (!sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
-								r->mask.y + op->mask.offset[1],
-								op->mask.transform,
-								&mask_x[0],
-								&mask_y[0],
-								&mask_w[0]))
-				return;
-
-			if (!sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
-								r->mask.y + op->mask.offset[1] + r->height,
-								op->mask.transform,
-								&mask_x[1],
-								&mask_y[1],
-								&mask_w[1]))
-				return;
-
-			if (!sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0] + r->width,
-								r->mask.y + op->mask.offset[1] + r->height,
-								op->mask.transform,
-								&mask_x[2],
-								&mask_y[2],
-								&mask_w[2]))
-				return;
+			sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
+							   r->mask.y + op->mask.offset[1],
+							   op->mask.transform,
+							   &mask_x[0],
+							   &mask_y[0],
+							   &mask_w[0]);
+			sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
+							   r->mask.y + op->mask.offset[1] + r->height,
+							   op->mask.transform,
+							   &mask_x[1],
+							   &mask_y[1],
+							   &mask_w[1]);
+			sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0] + r->width,
+							   r->mask.y + op->mask.offset[1] + r->height,
+							   op->mask.transform,
+							   &mask_x[2],
+							   &mask_y[2],
+							   &mask_w[2]);
 		}
 	}
 
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 9c30041..8b970f4 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -983,29 +983,24 @@ gen5_emit_composite_primitive(struct sna *sna,
 						&src_x[2],
 						&src_y[2]);
 	} else {
-		if (!sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
-							r->src.y + op->src.offset[1],
-							op->src.transform,
-							&src_x[0],
-							&src_y[0],
-							&src_w[0]))
-			return;
-
-		if (!sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
-							r->src.y + op->src.offset[1] + r->height,
-							op->src.transform,
-							&src_x[1],
-							&src_y[1],
-							&src_w[1]))
-			return;
-
-		if (!sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0] + r->width,
-							r->src.y + op->src.offset[1] + r->height,
-							op->src.transform,
-							&src_x[2],
-							&src_y[2],
-							&src_w[2]))
-			return;
+		sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
+						   r->src.y + op->src.offset[1],
+						   op->src.transform,
+						   &src_x[0],
+						   &src_y[0],
+						   &src_w[0]);
+		sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0],
+						   r->src.y + op->src.offset[1] + r->height,
+						   op->src.transform,
+						   &src_x[1],
+						   &src_y[1],
+						   &src_w[1]);
+		sna_get_transformed_coordinates_3d(r->src.x + op->src.offset[0] + r->width,
+						   r->src.y + op->src.offset[1] + r->height,
+						   op->src.transform,
+						   &src_x[2],
+						   &src_y[2],
+						   &src_w[2]);
 	}
 
 	if (op->mask.bo) {
@@ -1028,29 +1023,25 @@ gen5_emit_composite_primitive(struct sna *sna,
 							&mask_x[2],
 							&mask_y[2]);
 		} else {
-			if (!sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
-								r->mask.y + op->mask.offset[1],
-								op->mask.transform,
-								&mask_x[0],
-								&mask_y[0],
-								&mask_w[0]))
-				return;
-
-			if (!sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
-								r->mask.y + op->mask.offset[1] + r->height,
-								op->mask.transform,
-								&mask_x[1],
-								&mask_y[1],
-								&mask_w[1]))
-				return;
-
-			if (!sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0] + r->width,
-								r->mask.y + op->mask.offset[1] + r->height,
-								op->mask.transform,
-								&mask_x[2],
-								&mask_y[2],
-								&mask_w[2]))
-				return;
+			sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
+							   r->mask.y + op->mask.offset[1],
+							   op->mask.transform,
+							   &mask_x[0],
+							   &mask_y[0],
+							   &mask_w[0]);
+
+			sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0],
+							   r->mask.y + op->mask.offset[1] + r->height,
+							   op->mask.transform,
+							   &mask_x[1],
+							   &mask_y[1],
+							   &mask_w[1]);
+			sna_get_transformed_coordinates_3d(r->mask.x + op->mask.offset[0] + r->width,
+							   r->mask.y + op->mask.offset[1] + r->height,
+							   op->mask.transform,
+							   &mask_x[2],
+							   &mask_y[2],
+							   &mask_w[2]);
 		}
 	}
 
diff --git a/src/sna/sna.h b/src/sna/sna.h
index d9fd9d1..df7f42f 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -500,7 +500,7 @@ sna_get_transformed_coordinates(int x, int y,
 				const PictTransform *transform,
 				float *x_out, float *y_out);
 
-Bool
+void
 sna_get_transformed_coordinates_3d(int x, int y,
 				   const PictTransform *transform,
 				   float *x_out, float *y_out, float *z_out);
diff --git a/src/sna/sna_transform.c b/src/sna/sna_transform.c
index 644d404..54852b1 100644
--- a/src/sna/sna_transform.c
+++ b/src/sna/sna_transform.c
@@ -114,7 +114,7 @@ sna_get_transformed_coordinates(int x, int y,
 /**
  * Returns the un-normalized floating-point coordinates transformed by the given transform.
  */
-Bool
+void
 sna_get_transformed_coordinates_3d(int x, int y,
 				   const PictTransform *transform,
 				   float *x_out, float *y_out, float *w_out)
@@ -126,13 +126,13 @@ sna_get_transformed_coordinates_3d(int x, int y,
 	} else {
 		int64_t result[3];
 
-		if (!_sna_transform_point(transform, x, y, result))
-			return FALSE;
-
-		*x_out = result[0] / 65536.;
-		*y_out = result[1] / 65536.;
-		*w_out = result[2] / 65536.;
+		if (_sna_transform_point(transform, x, y, result)) {
+			*x_out = result[0] / 65536.;
+			*y_out = result[1] / 65536.;
+			*w_out = result[2] / 65536.;
+		} else {
+			*x_out = *y_out = 0;
+			*w_out = 1.;
+		}
 	}
-
-	return TRUE;
 }
commit b83e2a79f2a082630e0d3147abec8d3599f3f4b4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 17:17:49 2012 +0100

    uxa: Static analysis warning fixes
    
    A smattering of bugs and confusing code.
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i915_render.c b/src/i915_render.c
index 5605edf..0ad991a 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -665,7 +665,7 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 	drm_intel_bo *bo_table[] = {
 		NULL,		/* batch_bo */
 		intel_get_pixmap_bo(dest),
-		source ? intel_get_pixmap_bo(source) : NULL,
+		intel_get_pixmap_bo(source),
 		mask ? intel_get_pixmap_bo(mask) : NULL,
 	};
 	int tex_unit = 0;
diff --git a/src/intel_dri.c b/src/intel_dri.c
index 3261e54..2a95edb 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -1034,9 +1034,6 @@ can_exchange(DrawablePtr drawable, DRI2BufferPtr front, DRI2BufferPtr back)
 	struct intel_pixmap *front_intel = intel_get_pixmap_private(front_pixmap);
 	struct intel_pixmap *back_intel = intel_get_pixmap_private(back_pixmap);
 
-	if (drawable == NULL)
-		return FALSE;
-
 	if (!DRI2CanFlip(drawable))
 		return FALSE;
 
@@ -1275,7 +1272,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	swap_info->event_data = data;
 	swap_info->front = front;
 	swap_info->back = back;
-	swap_info->pipe = I830DRI2DrawablePipe(draw);
+	swap_info->pipe = pipe;
 
 	if (!i830_dri2_add_frame_event(swap_info)) {
 	    free(swap_info);
commit 67e8ac365c4b7dd9c4eb2abe46aecc8cc04d4278
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 17:20:51 2012 +0100

    sna/gen3+: Guard against a kgem_bo_destroy(NULL)
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 8cafeb8..d8d1e09 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1651,7 +1651,8 @@ static int gen3_vertex_finish(struct sna *sna)
 	if (sna->render.vbo)
 		sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
 	if (sna->render.vertices == NULL) {
-		kgem_bo_destroy(&sna->kgem, sna->render.vbo);
+		if (sna->render.vbo)
+			kgem_bo_destroy(&sna->kgem, sna->render.vbo);
 		sna->render.vbo = NULL;
 		return 0;
 	}
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 8ab707f..dd66a46 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -401,7 +401,8 @@ static int gen4_vertex_finish(struct sna *sna)
 	if (sna->render.vbo)
 		sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
 	if (sna->render.vertices == NULL) {
-		kgem_bo_destroy(&sna->kgem, sna->render.vbo);
+		if (sna->render.vbo)
+			kgem_bo_destroy(&sna->kgem, sna->render.vbo);
 		sna->render.vbo = NULL;
 		return 0;
 	}
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 68c1bb7..9c30041 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -393,7 +393,8 @@ static int gen5_vertex_finish(struct sna *sna)
 	if (sna->render.vbo)
 		sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
 	if (sna->render.vertices == NULL) {
-		kgem_bo_destroy(&sna->kgem, sna->render.vbo);
+		if (sna->render.vbo)
+			kgem_bo_destroy(&sna->kgem, sna->render.vbo);
 		sna->render.vbo = NULL;
 		return 0;
 	}
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index d9068de..df2eeb2 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -967,7 +967,8 @@ static int gen6_vertex_finish(struct sna *sna)
 	if (sna->render.vbo)
 		sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
 	if (sna->render.vertices == NULL) {
-		kgem_bo_destroy(&sna->kgem, sna->render.vbo);
+		if (sna->render.vbo)
+			kgem_bo_destroy(&sna->kgem, sna->render.vbo);
 		sna->render.vbo = NULL;
 		return 0;
 	}
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 3f31437..6bf25d3 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1105,7 +1105,8 @@ static int gen7_vertex_finish(struct sna *sna)
 	if (sna->render.vbo)
 		sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
 	if (sna->render.vertices == NULL) {
-		kgem_bo_destroy(&sna->kgem, sna->render.vbo);
+		if (sna->render.vbo)
+			kgem_bo_destroy(&sna->kgem, sna->render.vbo);
 		sna->render.vbo = NULL;
 		return 0;
 	}
commit e91b27ae14a5366175a4fe9c87ee15a0a25b5a42
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 17:12:36 2012 +0100

    sna: Fix potential deference of NULL cpu_bo inside assertion
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7eeb7af..7b7190d 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2486,7 +2486,7 @@ done:
 	if (DAMAGE_IS_ALL(priv->gpu_damage)) {
 		priv->undamaged = false;
 		if (priv->ptr) {
-			assert(!priv->cpu_bo->sync);
+			assert(priv->cpu_bo == NULL || !priv->cpu_bo->sync);
 			sna_pixmap_free_cpu(sna, priv);
 		}
 	}
commit 048161e69612324d6c077ec487a2a64aaaa7c1f5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 17:09:21 2012 +0100

    sna/trapezoids: Check for malloc failure
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index c7f6671..d65c249 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2598,8 +2598,11 @@ composite_aligned_boxes(struct sna *sna,
 	DBG(("%s\n", __FUNCTION__));
 
 	boxes = stack_boxes;
-	if (ntrap > (int)ARRAY_SIZE(stack_boxes))
+	if (ntrap > (int)ARRAY_SIZE(stack_boxes)) {
 		boxes = malloc(sizeof(BoxRec)*ntrap);
+		if (boxes == NULL)
+			return false;
+	}
 
 	dx = dst->pDrawable->x;
 	dy = dst->pDrawable->y;
commit 2896aa7b46931d3b95567121ccb07844725ab45c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 17:08:01 2012 +0100

    sna/io: Free the heap clip boxes on error paths
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 3f39de5..0d6fbbb 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -261,14 +261,19 @@ fallback:
 								       tmp.drawable.bitsPerPixel,
 								       KGEM_BUFFER_LAST,
 								       &ptr);
-					if (!dst_bo)
+					if (!dst_bo) {
+						if (clipped != stack)
+							free(clipped);
 						goto fallback;
+					}
 
 					if (!sna->render.copy_boxes(sna, GXcopy,
 								    dst, src_bo, src_dx, src_dy,
 								    &tmp, dst_bo, -tile.x1, -tile.y1,
 								    clipped, c-clipped)) {
 						kgem_bo_destroy(&sna->kgem, dst_bo);
+						if (clipped != stack)
+							free(clipped);
 						goto fallback;
 					}
 
commit 1ef00ff720226c211444806d9fdf67ce2046685b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 17:05:55 2012 +0100

    sna/dri: Fix typo, check for NULL after allocations to spot failure!
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index c74ecc4..c26c128 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1369,7 +1369,7 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		}
 
 		info = calloc(1, sizeof(struct sna_dri_frame_event));
-		if (!info)
+		if (info == NULL)
 			return FALSE;
 
 		info->type = type;
@@ -1415,7 +1415,7 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 				 info->event_data);
 	} else {
 		info = calloc(1, sizeof(struct sna_dri_frame_event));
-		if (info)
+		if (info == NULL)
 			return FALSE;
 
 		info->sna = sna;
commit dc0fe44bebfdee63bcda4d185b85fe9e1cb16a71
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 16:54:41 2012 +0100

    sna: Fix a smattering of static analysis warnings
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index ee18ebe..8cafeb8 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2477,7 +2477,6 @@ gen3_composite_set_target(struct sna *sna,
 	op->dst.format = dst->format;
 	op->dst.width = op->dst.pixmap->drawable.width;
 	op->dst.height = op->dst.pixmap->drawable.height;
-	priv = sna_pixmap(op->dst.pixmap);
 
 	op->dst.bo = NULL;
 	priv = sna_pixmap(op->dst.pixmap);
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 0090639..7eeb7af 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3277,10 +3277,10 @@ sna_put_image(DrawablePtr drawable, GCPtr gc, int depth,
 	if (priv == NULL) {
 		DBG(("%s: fbPutImage, unattached(%d, %d, %d, %d)\n",
 		     __FUNCTION__, x, y, w, h));
-		if (!sna_gc_move_to_cpu(gc, drawable))
-			goto out;
-
-		fbPutImage(drawable, gc, depth, x, y, w, h, left, format, bits);
+		if (sna_gc_move_to_cpu(gc, drawable))
+			fbPutImage(drawable, gc, depth,
+				   x, y, w, h, left,
+				   format, bits);
 		return;
 	}
 
diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index ce1e284..6999548 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -174,7 +174,7 @@ sna_video_clip_helper(ScrnInfoPtr scrn,
 	ret = xf86XVClipVideoHelper(dst, &x1, &x2, &y1, &y2,
 				    crtc_region, frame->width, frame->height);
 	if (crtc_region != reg)
-		RegionUninit(&crtc_region_local);
+		RegionUninit(crtc_region);
 
 	frame->top = y1 >> 16;
 	frame->left = (x1 >> 16) & ~1;
@@ -539,13 +539,12 @@ void sna_video_init(struct sna *sna, ScreenPtr screen)
 		return;
 
 	num_adaptors = xf86XVListGenericAdaptors(sna->scrn, &adaptors);
-	newAdaptors =
-	    malloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *));
-	if (newAdaptors == NULL)
+	newAdaptors = realloc(adaptors,
+			      (num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr));
+	if (newAdaptors == NULL) {
+		free(adaptors);
 		return;
-
-	memcpy(newAdaptors, adaptors,
-	       num_adaptors * sizeof(XF86VideoAdaptorPtr));
+	}
 	adaptors = newAdaptors;
 
 	/* Set up textured video if we can do it at this depth and we are on
commit 8eed569fb386a9af48a8beb28666d72c6678e48c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 13:02:50 2012 +0100

    sna/trapezoids: Correct extents declaration for fallback
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 0fd1b03..c7f6671 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -4428,7 +4428,7 @@ trapezoid_span_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
 		region.extents.x1 = dst_x + dst->pDrawable->x;
 		region.extents.y1 = dst_y + dst->pDrawable->y;
 		region.extents.x2 = region.extents.x1 + extents.x2;
-		region.extents.y2 = region.extents.y2 + extents.y2;
+		region.extents.y2 = region.extents.y1 + extents.y2;
 		region.data = NULL;
 
 		DBG(("%s: move-to-cpu\n", __FUNCTION__));
commit 91419576eef562378cccf90968c4f0277139b03d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 12:09:19 2012 +0100

    sna: Tiny DBG message tweak
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index bdaf0b5..0090639 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -10791,7 +10791,7 @@ static inline bool sna_font_too_large(FontPtr font)
 	int top = max(FONTMAXBOUNDS(font, ascent), FONTASCENT(font));
 	int bot = max(FONTMAXBOUNDS(font, descent), FONTDESCENT(font));
 	int width = max(FONTMAXBOUNDS(font, characterWidth), -FONTMINBOUNDS(font, characterWidth));
-	DBG(("%s: (%d + %d) x %d: %d\n", __FUNCTION__,
+	DBG(("%s? (%d + %d) x %d: %d > 124\n", __FUNCTION__,
 	     top, bot, width, (top + bot) * (width + 7)/8));
 	return (top + bot) * (width + 7)/8 > 124;
 }
commit 4bdecc5b07a184ba136129e75a7fef914ac3b8d2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 11:06:04 2012 +0100

    test: Add a very basic test to exercise BLT text drawing
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/test/Makefile.am b/test/Makefile.am
index 59fae6b..b0e0e13 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,6 +1,7 @@
 stress_TESTS = \
 	basic-fillrect \
 	basic-rectangle \
+	basic-string \
 	basic-copyarea \
 	basic-copyarea-size \
 	basic-putimage \
diff --git a/test/basic-string.c b/test/basic-string.c
new file mode 100644
index 0000000..9f59c91
--- /dev/null
+++ b/test/basic-string.c
@@ -0,0 +1,102 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <X11/Xutil.h> /* for XDestroyImage */
+
+#include "test.h"
+
+static void draw_string(struct test_display *t, Drawable d, uint8_t alu,
+			int x, int y, uint32_t fg, uint32_t bg, int s, int fill)
+{
+	const char *strings[] = {
+		"Hello",
+		"World",
+		"Cairo's twin is Giza",
+	};
+	XGCValues val;
+	GC gc;
+
+	val.function = alu;
+	val.foreground = fg;
+	val.background = bg;
+
+	gc = XCreateGC(t->dpy, d, GCForeground | GCBackground | GCFunction, &val);
+	if (fill)
+		XDrawImageString(t->dpy, d, gc, x, y, strings[s%3], strlen(strings[s%3]));
+	else
+		XDrawString(t->dpy, d, gc, x, y, strings[s%3], strlen(strings[s%3]));
+	XFreeGC(t->dpy, gc);
+}
+
+static void clear(struct test_display *dpy, struct test_target *tt)
+{
+	XRenderColor render_color = {0};
+	XRenderFillRectangle(dpy->dpy, PictOpClear, tt->picture, &render_color,
+			     0, 0, tt->width, tt->height);
+}
+
+static void string_tests(struct test *t, int reps, int sets, enum target target)
+{
+	struct test_target real, ref;
+	int r, s;
+
+	printf("Testing general (%s): ", test_target_name(target));
+	fflush(stdout);
+
+	test_target_create_render(&t->real, target, &real);
+	clear(&t->real, &real);
+
+	test_target_create_render(&t->ref, target, &ref);
+	clear(&t->ref, &ref);
+
+	for (s = 0; s < sets; s++) {
+		for (r = 0; r < reps; r++) {
+			int x = rand() % (2*real.width) - real.width;
+			int y = rand() % (2*real.height) - real.height;
+			uint8_t alu = rand() % (GXset + 1);
+			uint32_t fg = rand();
+			uint32_t bg = rand();
+			int str = rand();
+			int fill = rand() & 1;
+
+			draw_string(&t->real, real.draw, alu, x, y, fg, bg, str, fill);
+			draw_string(&t->ref, ref.draw, alu, x, y, fg, bg, str, fill);
+		}
+
+		test_compare(t,
+			     real.draw, real.format,
+			     ref.draw, ref.format,
+			     0, 0, real.width, real.height,
+			     "");
+	}
+
+	printf("passed [%d iterations x %d]\n", reps, sets);
+
+	test_target_destroy_render(&t->real, &real);
+	test_target_destroy_render(&t->ref, &ref);
+}
+
+int main(int argc, char **argv)
+{
+	struct test test;
+	int i;
+
+	test_init(&test, argc, argv);
+
+	for (i = 0; i <= DEFAULT_ITERATIONS; i++) {
+		int reps = 1 << i;
+		int sets = 1 << (12 - i);
+		enum target t;
+
+		if (sets < 2)
+			sets = 2;
+
+		for (t = TARGET_FIRST; t <= TARGET_LAST; t++) {
+			string_tests(&test, reps, sets, t);
+		}
+	}
+
+	return 0;
+}
commit ea0f326d80f21f89c3cff3595a6e1afc42b52efd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 09:04:23 2012 +0100

    sna: Debug XDrawRectangle
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index d7750c7..bdaf0b5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -7782,6 +7782,9 @@ zero:
 	do {
 		xRectangle rr = *r++;
 
+		if ((rr.width | rr.height) == 0)
+			continue;
+
 		DBG(("%s - zero : r[%d] = (%d, %d) x (%d, %d)\n", __FUNCTION__,
 		     n, rr.x, rr.y, rr.width, rr.height));
 		rr.x += dx;
@@ -7794,11 +7797,11 @@ zero:
 			b = boxes;
 		}
 
-		if (rr.width <= 2 || rr.height <= 2) {
+		if (rr.width <= 1 || rr.height <= 1) {
 			b->x1 = rr.x;
 			b->y1 = rr.y;
-			b->x2 = rr.x + rr.width + 1;
-			b->y2 = rr.y + rr.height + 1;
+			b->x2 = rr.x + rr.width + (rr.height != 0);
+			b->y2 = rr.y + rr.height + (rr.width != 0);
 			DBG(("%s: blt (%d, %d), (%d, %d)\n",
 			     __FUNCTION__,
 			     b->x1, b->y1, b->x2,b->y2));
@@ -7847,14 +7850,18 @@ zero_clipped:
 
 				DBG(("%s - zero, clipped complex: r[%d] = (%d, %d) x (%d, %d)\n", __FUNCTION__,
 				     n, rr.x, rr.y, rr.width, rr.height));
+
+				if ((rr.width | rr.height) == 0)
+					continue;
+
 				rr.x += drawable->x;
 				rr.y += drawable->y;
 
-				if (rr.width <= 2 || rr.height <= 2) {
+				if (rr.width <= 1 || rr.height <= 1) {
 					box[0].x1 = rr.x;
 					box[0].y1 = rr.y;
-					box[0].x2 = rr.x + rr.width + 1;
-					box[0].y2 = rr.y + rr.height + 1;
+					box[0].x2 = rr.x + rr.width + (rr.height != 0);
+					box[0].y2 = rr.y + rr.height + (rr.width != 0);
 					count = 1;
 				} else {
 					box[0].x1 = rr.x;
@@ -7907,14 +7914,18 @@ zero_clipped:
 				xRectangle rr = *r++;
 				DBG(("%s - zero, clip: r[%d] = (%d, %d) x (%d, %d)\n", __FUNCTION__,
 				     n, rr.x, rr.y, rr.width, rr.height));
+
+				if ((rr.width | rr.height) == 0)
+					continue;
+
 				rr.x += drawable->x;
 				rr.y += drawable->y;
 
-				if (rr.width <= 2 || rr.height <= 2) {
+				if (rr.width <= 1 || rr.height <= 1) {
 					box[0].x1 = rr.x;
 					box[0].y1 = rr.y;
-					box[0].x2 = rr.x + rr.width + 1;
-					box[0].y2 = rr.y + rr.height + 1;
+					box[0].x2 = rr.x + rr.width + (rr.height != 0);
+					box[0].y2 = rr.y + rr.height + (rr.width != 0);
 					count = 1;
 				} else {
 					box[0].x1 = rr.x;
@@ -7968,6 +7979,10 @@ wide_clipped:
 
 		region_set(&clip, extents);
 		region_maybe_clip(&clip, gc->pCompositeClip);
+		DBG(("%s: wide clipped: extents=((%d, %d), (%d, %d))\n",
+		     __FUNCTION__,
+		     clip.extents.x1, clip.extents.y1,
+		     clip.extents.x2, clip.extents.y2));
 		if (!RegionNotEmpty(&clip))
 			goto done;
 
@@ -7978,23 +7993,27 @@ wide_clipped:
 			do {
 				xRectangle rr = *r++;
 				int count;
+
+				if ((rr.width | rr.height) == 0)
+					continue;
+
 				rr.x += drawable->x;
 				rr.y += drawable->y;
 
 				if (rr.height <= offset2 || rr.width <= offset2) {
 					if (rr.height == 0) {
 						box[0].x1 = rr.x;
-						box[0].x2 = rr.x + rr.width + 1;
+						box[0].x2 = rr.x + rr.width;
 					} else {
 						box[0].x1 = rr.x - offset1;
-						box[0].x2 = box[0].x1 + rr.width + offset2;
+						box[0].x2 = rr.x + rr.width + offset3;
 					}
 					if (rr.width == 0) {
 						box[0].y1 = rr.y;
-						box[0].y2 = rr.y + rr.height + 1;
+						box[0].y2 = rr.y + rr.height;
 					} else {
 						box[0].y1 = rr.y - offset1;
-						box[0].y2 = box[0].y1 + rr.height + offset2;
+						box[0].y2 = rr.y + rr.height + offset3;
 					}
 					count = 1;
 				} else {
@@ -8009,8 +8028,8 @@ wide_clipped:
 					box[1].y2 = rr.y + rr.height - offset1;
 
 					box[2] = box[1];
-					box[3].x1 += rr.width;
-					box[3].x2 += rr.width;
+					box[2].x1 += rr.width;
+					box[2].x2 += rr.width;
 
 					box[3] = box[0];
 					box[3].y1 += rr.height;
@@ -8043,23 +8062,27 @@ wide_clipped:
 				}
 			} while (--n);
 		} else {
+			DBG(("%s: singular clip offset1=%d, offset2=%d, offset3=%d\n",
+			     __FUNCTION__, offset1, offset2, offset3));
 			do {
 				xRectangle rr = *r++;
 				int count;
 				rr.x += drawable->x;
 				rr.y += drawable->y;
 
+				DBG(("%s: r=(%d, %d)x(%d, %d)\n",
+				     __FUNCTION__, rr.x, rr.y, rr.width, rr.height));
 				if (rr.height <= offset2 || rr.width <= offset2) {
 					if (rr.height == 0) {
 						box[0].x1 = rr.x;
-						box[0].x2 = rr.x + rr.width + 1;
+						box[0].x2 = rr.x + rr.width;
 					} else {
 						box[0].x1 = rr.x - offset1;
 						box[0].x2 = box[0].x1 + rr.width + offset2;
 					}
 					if (rr.width == 0) {
 						box[0].y1 = rr.y;
-						box[0].y2 = rr.y + rr.height + 1;
+						box[0].y2 = rr.y + rr.height;
 					} else {
 						box[0].y1 = rr.y - offset1;
 						box[0].y2 = box[0].y1 + rr.height + offset2;
@@ -8070,19 +8093,36 @@ wide_clipped:
 					box[0].x2 = box[0].x1 + rr.width + offset2;
 					box[0].y1 = rr.y - offset1;
 					box[0].y2 = box[0].y1 + offset2;
+					DBG(("%s: box[0]=(%d, %d), (%d, %d)\n",
+					     __FUNCTION__,
+					     box[0].x1, box[0].y1,
+					     box[0].x2, box[0].y2));
 
 					box[1].x1 = rr.x - offset1;
 					box[1].x2 = box[1].x1 + offset2;
 					box[1].y1 = rr.y + offset3;
 					box[1].y2 = rr.y + rr.height - offset1;
+					DBG(("%s: box[1]=(%d, %d), (%d, %d)\n",
+					     __FUNCTION__,
+					     box[1].x1, box[1].y1,
+					     box[1].x2, box[1].y2));
 
 					box[2] = box[1];
-					box[3].x1 += rr.width;
-					box[3].x2 += rr.width;
+					box[2].x1 += rr.width;
+					box[2].x2 += rr.width;
+					DBG(("%s: box[2]=(%d, %d), (%d, %d)\n",
+					     __FUNCTION__,
+					     box[2].x1, box[2].y1,
+					     box[2].x2, box[2].y2));
 
 					box[3] = box[0];
 					box[3].y1 += rr.height;
 					box[3].y2 += rr.height;
+					DBG(("%s: box[3]=(%d, %d), (%d, %d)\n",
+					     __FUNCTION__,
+					     box[3].x1, box[3].y1,
+					     box[3].x2, box[3].y2));
+
 					count = 4;
 				}
 
@@ -8117,6 +8157,10 @@ wide:
 
 		do {
 			xRectangle rr = *r++;
+
+			if ((rr.width | rr.height) == 0)
+				continue;
+
 			rr.x += dx;
 			rr.y += dy;
 
@@ -8130,17 +8174,17 @@ wide:
 			if (rr.height <= offset2 || rr.width <= offset2) {
 				if (rr.height == 0) {
 					b->x1 = rr.x;
-					b->x2 = rr.x + rr.width + 1;
+					b->x2 = rr.x + rr.width;
 				} else {
 					b->x1 = rr.x - offset1;
-					b->x2 = rr.x + rr.width + offset2;
+					b->x2 = rr.x + rr.width + offset3;
 				}
 				if (rr.width == 0) {
 					b->y1 = rr.y;
-					b->y2 = rr.y + rr.height + 1;
+					b->y2 = rr.y + rr.height;
 				} else {
 					b->y1 = rr.y - offset1;
-					b->y2 = rr.y + rr.height + offset2;
+					b->y2 = rr.y + rr.height + offset3;
 				}
 				b++;
 			} else {
@@ -8149,18 +8193,18 @@ wide:
 				b[0].y1 = rr.y - offset1;
 				b[0].y2 = b[0].y1 + offset2;
 
-				b[1] = b[0];
-				b[1].y1 = rr.y + rr.height - offset1;
-				b[1].y2 = b[1].y1 + offset2;
+				b[1].x1 = rr.x - offset1;
+				b[1].x2 = b[1].x1 + offset2;
+				b[1].y1 = rr.y + offset3;
+				b[1].y2 = rr.y + rr.height - offset1;
 
-				b[2].x1 = rr.x - offset1;
-				b[2].x2 = b[2].x1 + offset2;
-				b[2].y1 = rr.y + offset3;
-				b[2].y2 = rr.y + rr.height - offset1;
+				b[2] = b[1];
+				b[2].x1 += rr.width;
+				b[2].x2 += rr.width;
 
-				b[3] = b[2];
-				b[3].x1 = rr.x + rr.width - offset1;
-				b[3].x2 = b[3].x1 + offset2;
+				b[3] = b[0];
+				b[3].y1 += rr.height;
+				b[3].y2 += rr.height;
 				b += 4;
 			}
 		} while (--n);
@@ -8217,9 +8261,11 @@ sna_poly_rectangle(DrawablePtr drawable, GCPtr gc, int n, xRectangle *r)
 	     gc->lineStyle, gc->lineStyle == LineSolid,
 	     gc->joinStyle, gc->joinStyle == JoinMiter,
 	     gc->planemask, PM_IS_SOLID(drawable, gc->planemask)));
-	if (gc->lineStyle == LineSolid &&
-	    gc->joinStyle == JoinMiter &&
-	    PM_IS_SOLID(drawable, gc->planemask)) {
+
+	if (!PM_IS_SOLID(drawable, gc->planemask))
+		goto fallback;
+
+	if (gc->lineStyle == LineSolid && gc->joinStyle == JoinMiter) {
 		DBG(("%s: trying blt solid fill [%08lx] paths\n",
 		     __FUNCTION__, gc->fgPixel));
 		if ((bo = sna_drawable_use_bo(drawable, true,
@@ -11742,7 +11788,7 @@ static GCOps sna_gc_ops__tmp = {
 static void
 sna_validate_gc(GCPtr gc, unsigned long changes, DrawablePtr drawable)
 {
-	DBG(("%s\n", __FUNCTION__));
+	DBG(("%s changes=%x\n", __FUNCTION__, changes));
 
 	if (changes & (GCClipMask|GCSubwindowMode) ||
 	    drawable->serialNumber != (gc->serialNumber & DRAWABLE_SERIAL_BITS) ||
commit 6a7efa991a705bdb5a3b9d5300d824a1ce8759af
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 1 08:47:20 2012 +0100

    test: Exercise basic rectangle drawing code
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/test/Makefile.am b/test/Makefile.am
index a14396e..59fae6b 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,5 +1,6 @@
 stress_TESTS = \
 	basic-fillrect \
+	basic-rectangle \
 	basic-copyarea \
 	basic-copyarea-size \
 	basic-putimage \
diff --git a/test/basic-rectangle.c b/test/basic-rectangle.c
new file mode 100644
index 0000000..8f78bba
--- /dev/null
+++ b/test/basic-rectangle.c
@@ -0,0 +1,223 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <X11/Xutil.h> /* for XDestroyImage */
+
+#include "test.h"
+
+static void draw_rect(struct test_display *t, Drawable d, uint8_t alu,
+		      int x, int y, int w, int h, uint32_t fg, int lw)
+{
+	XGCValues val;
+	GC gc;
+
+	val.function = alu;
+	val.foreground = fg;
+	val.line_width = lw;
+
+	gc = XCreateGC(t->dpy, d, GCForeground | GCFunction | GCLineWidth, &val);
+	XDrawRectangle(t->dpy, d, gc, x, y, w, h);
+	XFreeGC(t->dpy, gc);
+}
+
+static void clear(struct test_display *dpy, struct test_target *tt)
+{
+	XRenderColor render_color = {0};
+	XRenderFillRectangle(dpy->dpy, PictOpClear, tt->picture, &render_color,
+			     0, 0, tt->width, tt->height);
+}
+
+static void zrect_tests(struct test *t, int reps, int sets, enum target target)
+{
+	struct test_target real, ref;
+	int r, s;
+
+	printf("Testing empty rects (%s): ", test_target_name(target));
+	fflush(stdout);
+
+	test_target_create_render(&t->real, target, &real);
+	clear(&t->real, &real);
+
+	test_target_create_render(&t->ref, target, &ref);
+	clear(&t->ref, &ref);
+
+	for (s = 0; s < sets; s++) {
+		for (r = 0; r < reps; r++) {
+			int x = rand() % (2*real.width) - real.width;
+			int y = rand() % (2*real.height) - real.height;
+			uint8_t alu = rand() % (GXset + 1);
+			uint32_t fg = rand();
+			uint32_t lw = rand() % 4;
+
+			draw_rect(&t->real, real.draw, alu,
+				  x, y, 0, 0, fg, lw);
+			draw_rect(&t->ref, ref.draw, alu,
+				  x, y, 0, 0, fg, lw);
+		}
+
+		test_compare(t,
+			     real.draw, real.format,
+			     ref.draw, ref.format,
+			     0, 0, real.width, real.height,
+			     "");
+	}
+
+	printf("passed [%d iterations x %d]\n", reps, sets);
+
+	test_target_destroy_render(&t->real, &real);
+	test_target_destroy_render(&t->ref, &ref);
+}
+
+static void hrect_tests(struct test *t, int reps, int sets, enum target target)
+{
+	struct test_target real, ref;
+	int r, s;
+
+	printf("Testing horizontal rects (%s): ", test_target_name(target));
+	fflush(stdout);
+
+	test_target_create_render(&t->real, target, &real);
+	clear(&t->real, &real);
+
+	test_target_create_render(&t->ref, target, &ref);
+	clear(&t->ref, &ref);
+
+	for (s = 0; s < sets; s++) {
+		for (r = 0; r < reps; r++) {
+			int x = rand() % (2*real.width) - real.width;
+			int y = rand() % (2*real.height) - real.height;
+			int w = rand() % (2*real.width);
+			uint8_t alu = rand() % (GXset + 1);
+			uint32_t fg = rand();
+			uint32_t lw = rand() % 4;
+
+			draw_rect(&t->real, real.draw, alu,
+				  x, y, w, 0, fg, lw);
+			draw_rect(&t->ref, ref.draw, alu,
+				  x, y, w, 0, fg, lw);
+		}
+
+		test_compare(t,
+			     real.draw, real.format,
+			     ref.draw, ref.format,
+			     0, 0, real.width, real.height,
+			     "");
+	}
+
+	printf("passed [%d iterations x %d]\n", reps, sets);
+
+	test_target_destroy_render(&t->real, &real);
+	test_target_destroy_render(&t->ref, &ref);
+}
+
+static void vrect_tests(struct test *t, int reps, int sets, enum target target)
+{
+	struct test_target real, ref;
+	int r, s;
+
+	printf("Testing vertical rects (%s): ", test_target_name(target));
+	fflush(stdout);
+
+	test_target_create_render(&t->real, target, &real);
+	clear(&t->real, &real);
+
+	test_target_create_render(&t->ref, target, &ref);
+	clear(&t->ref, &ref);
+
+	for (s = 0; s < sets; s++) {
+		for (r = 0; r < reps; r++) {
+			int x = rand() % (2*real.width) - real.width;
+			int y = rand() % (2*real.height) - real.height;
+			int h = rand() % (2*real.width);
+			uint8_t alu = rand() % (GXset + 1);
+			uint32_t fg = rand();
+			uint32_t lw = rand() % 4;
+
+			draw_rect(&t->real, real.draw, alu,
+				  x, y, 0, h, fg, lw);
+			draw_rect(&t->ref, ref.draw, alu,
+				  x, y, 0, h, fg, lw);
+		}
+
+		test_compare(t,
+			     real.draw, real.format,
+			     ref.draw, ref.format,
+			     0, 0, real.width, real.height,
+			     "");
+	}
+
+	printf("passed [%d iterations x %d]\n", reps, sets);
+
+	test_target_destroy_render(&t->real, &real);
+	test_target_destroy_render(&t->ref, &ref);
+}
+
+static void rect_tests(struct test *t, int reps, int sets, enum target target)
+{
+	struct test_target real, ref;
+	int r, s;
+
+	printf("Testing general (%s): ", test_target_name(target));
+	fflush(stdout);
+
+	test_target_create_render(&t->real, target, &real);
+	clear(&t->real, &real);
+
+	test_target_create_render(&t->ref, target, &ref);
+	clear(&t->ref, &ref);
+
+	for (s = 0; s < sets; s++) {
+		for (r = 0; r < reps; r++) {
+			int x = rand() % (2*real.width) - real.width;
+			int y = rand() % (2*real.height) - real.height;
+			int w = rand() % (2*real.width);
+			int h = rand() % (2*real.height);
+			uint8_t alu = rand() % (GXset + 1);
+			uint32_t fg = rand();
+			uint32_t lw = rand() % 4;
+
+			draw_rect(&t->real, real.draw, alu,
+				  x, y, w, h, fg, lw);
+			draw_rect(&t->ref, ref.draw, alu,
+				  x, y, w, h, fg, lw);
+		}
+
+		test_compare(t,
+			     real.draw, real.format,
+			     ref.draw, ref.format,
+			     0, 0, real.width, real.height,
+			     "");
+	}
+
+	printf("passed [%d iterations x %d]\n", reps, sets);
+
+	test_target_destroy_render(&t->real, &real);
+	test_target_destroy_render(&t->ref, &ref);
+}
+
+int main(int argc, char **argv)
+{
+	struct test test;
+	int i;
+
+	test_init(&test, argc, argv);
+
+	for (i = 0; i <= DEFAULT_ITERATIONS; i++) {
+		int reps = 1 << i;
+		int sets = 1 << (12 - i);
+		enum target t;
+
+		if (sets < 2)
+			sets = 2;
+
+		for (t = TARGET_FIRST; t <= TARGET_LAST; t++) {
+			zrect_tests(&test, reps, sets, t);
+			hrect_tests(&test, reps, sets, t);
+			vrect_tests(&test, reps, sets, t);
+			rect_tests(&test, reps, sets, t);
+		}
+	}
+
+	return 0;
+}
commit bc4323558bebd53e474fbc5404e1c41ab16d02e6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 21:19:26 2012 +0100

    sna: Handle negative values when computing the stipple modulus
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7f3af05..d7750c7 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -9772,6 +9772,8 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 
 	for (y1 = box->y1; y1 < box->y2; y1 = y2) {
 		int oy = (y1 - origin->y) % gc->stipple->drawable.height;
+		if (oy < 0)
+			oy += gc->stipple->drawable.height;
 
 		y2 = box->y2;
 		if (y2 - y1 > gc->stipple->drawable.height - oy)
@@ -9783,6 +9785,8 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 
 			x2 = box->x2;
 			ox = (x1 - origin->x) % gc->stipple->drawable.width;
+			if (ox < 0)
+				ox += gc->stipple->drawable.width;
 			bx1 = ox & ~7;
 			bx2 = ox + (x2 - x1);
 			if (bx2 > gc->stipple->drawable.width) {
commit aca994e03e6e0e16f55841418b0061b175e91e5d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 21:17:24 2012 +0100

    sna: Fill early break for clip process of spans
    
    When on the same Y-band as the span, as soon as the clip boxes are too
    far to the right, we can stop searching for more intersections.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 1ea5074..7f3af05 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4155,12 +4155,10 @@ sna_fill_spans__cpu(DrawablePtr drawable,
 		    GCPtr gc, int n,
 		    DDXPointPtr pt, int *width, int sorted)
 {
-	RegionRec *clip = sna_gc(gc)->priv;
-	BoxRec extents;
+	const RegionRec *clip = sna_gc(gc)->priv;
 
 	DBG(("%s x %d\n", __FUNCTION__, n));
 
-	extents = clip->extents;
 	while (n--) {
 		BoxRec b;
 
@@ -4171,26 +4169,37 @@ sna_fill_spans__cpu(DrawablePtr drawable,
 		b.x2 = b.x1 + *width++;
 		b.y2 = b.y1 + 1;
 
-		if (!box_intersect(&b, &extents))
+		if (!box_intersect(&b, &clip->extents))
 			continue;
 
 		if (region_is_singular(clip)) {
+			DBG(("%s: singular fill: (%d, %d) x %d\n",
+			     __FUNCTION__, b.x1, b.y1, b.x2 - b.x1));
 			fbFill(drawable, gc, b.x1, b.y1, b.x2 - b.x1, 1);
 		} else {
 			const BoxRec * const clip_start = RegionBoxptr(clip);
 			const BoxRec * const clip_end = clip_start + clip->data->numRects;
 			const BoxRec *c;
 
+			DBG(("%s: multiple fills: (%d, %d) x %d, clip start((%d, %d), (%d,%d)), end((%d, %d), (%d, %d))\n",
+			     __FUNCTION__, b.x1, b.y1, b.x2 - b.x1,
+			     clip_start->x1, clip_start->y1,
+			     clip_start->x2, clip_start->y2,
+			     clip_end[-1].x1, clip_end[-1].y1,
+			     clip_end[-1].x2, clip_end[-1].y2));
+
 			c = find_clip_box_for_y(clip_start, clip_end, b.y1);
 			while (c != clip_end) {
 				int16_t x1, x2;
 
-				if (b.y2 <= c->y1)
-					break;
+				DBG(("%s: clip box? (%d, %d), (%d, %d)\n",
+				     __FUNCTION__,
+				     c->x1, c->y1, c->x2, c->y2));
 
-				if (b.x1 >= c->x2)
+				if (b.y2 <= c->y1 || b.x2 <= c->x1)
 					break;
-				if (b.x2 <= c->x1) {
+
+				if (b.x1 > c->x2) {
 					c++;
 					continue;
 				}
@@ -4203,9 +4212,12 @@ sna_fill_spans__cpu(DrawablePtr drawable,
 					x1 = b.x1;
 				if (x2 > b.x2)
 					x2 = b.x2;
-				if (x2 > x1)
+				if (x2 > x1) {
+					DBG(("%s: fbFill(%d, %d) x %d\n",
+					     __FUNCTION__, x1, b.y1, x2 - x1));
 					fbFill(drawable, gc,
 					       x1, b.y1, x2 - x1, 1);
+				}
 			}
 		}
 	}
@@ -4518,12 +4530,10 @@ sna_fill_spans__fill_clip_boxes(DrawablePtr drawable,
 
 		c = find_clip_box_for_y(clip_start, clip_end, y);
 		while (c != clip_end) {
-			if (y + 1 <= c->y1)
+			if (y + 1 <= c->y1 || X2 <= c->x1)
 				break;
 
-			if (X1 >= c->x2)
-				break;
-			if (X2 <= c->x1) {
+			if (X1 >= c->x2) {
 				c++;
 				continue;
 			}
@@ -4719,12 +4729,10 @@ no_damage_clipped:
 							clip_end,
 							y);
 				while (c != clip_end) {
-					if (y + 1 <= c->y1)
+					if (y + 1 <= c->y1 || X2 <= c->x1)
 						break;
 
-					if (X1 >= c->x2)
-						break;
-					if (X2 <= c->x1) {
+					if (X1 >= c->x2) {
 						c++;
 						continue;
 					}
@@ -4824,12 +4832,10 @@ damage_clipped:
 							clip_end,
 							y);
 				while (c != clip_end) {
-					if (y + 1 <= c->y1)
+					if (y + 1 <= c->y1 || X2 <= c->x1)
 						break;
 
-					if (X1 >= c->x2)
-						break;
-					if (X2 <= c->x1) {
+					if (X1 >= c->x2) {
 						c++;
 						continue;
 					}
@@ -10364,7 +10370,7 @@ fallback:
 							       true)))
 		goto out;
 
-	DBG(("%s: fallback -- miFillPolygon -> sna_fill_spans__cpu\n",
+	DBG(("%s: fallback -- miPolyFillArc -> sna_fill_spans__cpu\n",
 	     __FUNCTION__));
 	sna_gc(gc)->priv = &data.region;
 	assert(gc->ops == (GCOps *)&sna_gc_ops);
commit 0fe150f898120ba9a00e1e6b9d66bec10d7e8a29
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 20:02:47 2012 +0100

    sna: Fix computation of box for clipped stippled rectangles
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 3a9f325..1ea5074 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -9900,19 +9900,28 @@ sna_poly_fill_rect_stippled_n_blt(DrawablePtr drawable,
 
 		region_set(&clip, extents);
 		region_maybe_clip(&clip, gc->pCompositeClip);
-		if (!RegionNotEmpty(&clip))
+		if (!RegionNotEmpty(&clip)) {
+			DBG(("%s: all clipped\n", __FUNCTION__));
 			return true;
+		}
 
 		if (clip.data == NULL) {
+			DBG(("%s: clipped to extents ((%d, %d), (%d, %d))\n",
+			     __FUNCTION__,
+			     clip.extents.x1, clip.extents.y1,
+			     clip.extents.x2, clip.extents.y2));
 			do {
 				BoxRec box;
 
 				box.x1 = r->x + drawable->x;
-				box.x2 = bound(r->x, r->width);
+				box.x2 = bound(box.x1, r->width);
 				box.y1 = r->y + drawable->y;
-				box.y2 = bound(r->y, r->height);
+				box.y2 = bound(box.y1, r->height);
 				r++;
 
+				DBG(("%s: box (%d, %d), (%d, %d)\n",
+				     __FUNCTION__,
+				     box.x1, box.y1, box.x2, box.y2));
 				if (!box_intersect(&box, &clip.extents))
 					continue;
 
@@ -9928,13 +9937,18 @@ sna_poly_fill_rect_stippled_n_blt(DrawablePtr drawable,
 			const BoxRec * const clip_end = clip_start + clip.data->numRects;
 			const BoxRec *c;
 
+			DBG(("%s: clipped to boxes: start((%d, %d), (%d, %d)); end=((%d, %d), (%d, %d))\n", __FUNCTION__,
+			     clip_start->x1, clip_start->y1,
+			     clip_start->x2, clip_start->y2,
+			     clip_end->x1, clip_end->y1,
+			     clip_end->x2, clip_end->y2));
 			do {
 				BoxRec unclipped;
 
 				unclipped.x1 = r->x + drawable->x;
-				unclipped.x2 = bound(r->x, r->width);
+				unclipped.x2 = bound(unclipped.x1, r->width);
 				unclipped.y1 = r->y + drawable->y;
-				unclipped.y2 = bound(r->y, r->height);
+				unclipped.y2 = bound(unclipped.y1, r->height);
 				r++;
 
 				c = find_clip_box_for_y(clip_start,
commit a65c3b7b45df46ba993af6755b2460aa80fde930
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 19:15:05 2012 +0100

    sna: Add some more DBG for stippled blts
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index d68c59c..3a9f325 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -9758,8 +9758,8 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 				  struct kgem_bo *bo,
 				  uint32_t br00, uint32_t br13,
 				  GCPtr gc,
-				  BoxRec *box,
-				  DDXPointRec *origin)
+				  const BoxRec *box,
+				  const DDXPointRec *origin)
 {
 	int x1, x2, y1, y2;
 	uint32_t *b;
@@ -9787,8 +9787,13 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 			bw = ALIGN(bw, 2);
 			bh = y2 - y1;
 
-			DBG(("%s: box(%d, %d), (%d, %d) pat=(%d, %d), up=(%d, %d)\n",
-			     __FUNCTION__, x1, y1, x2, y2, ox, oy, bx1, bx2));
+			DBG(("%s: box((%d, %d)x(%d, %d)) origin=(%d, %d), pat=(%d, %d), up=(%d, %d), stipple=%dx%d\n",
+			     __FUNCTION__,
+			     x1, y1, x2-x1, y2-y1,
+			     origin->x, origin->y,
+			     ox, oy, bx1, bx2,
+			     gc->stipple->drawable.width,
+			     gc->stipple->drawable.height));
 
 			len = bw*bh;
 			len = ALIGN(len, 8) / 4;
@@ -9846,11 +9851,11 @@ sna_poly_fill_rect_stippled_n_blt(DrawablePtr drawable,
 	int16_t dx, dy;
 	uint32_t br00, br13;
 
-	DBG(("%s: upload (%d, %d), (%d, %d), origin (%d, %d), clipped=%d\n", __FUNCTION__,
+	DBG(("%s: upload (%d, %d), (%d, %d), origin (%d, %d), clipped=%d, alu=%d, opaque=%d\n", __FUNCTION__,
 	     extents->x1, extents->y1,
 	     extents->x2, extents->y2,
 	     origin.x, origin.y,
-	     clipped));
+	     clipped, gc->alu, gc->fillStyle == FillOpaqueStippled));
 
 	if (gc->stipple->drawable.width > 32 ||
 	    gc->stipple->drawable.height > 32)
commit b2cc64253217a90cf2ade9a8d6f1ed21b23fe875
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 19:45:56 2012 +0100

    sna: And combine the two migrate to CPU clauses
    
    Just a small tidy up to remove a duplicated predicate.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index dfe4c5a..d68c59c 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1528,22 +1528,23 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 		     region->extents.x2 - region->extents.x1,
 		     region->extents.y2 - region->extents.y1));
 
-		if ((flags & MOVE_WRITE) == 0 && priv->cpu_damage == NULL &&
-		    region->extents.x2 - region->extents.x1 == 1 &&
-		    region->extents.y2 - region->extents.y1 == 1) {
-			/*  Often associated with synchronisation, KISS */
-			sna_read_boxes(sna,
-				       priv->gpu_bo, 0, 0,
-				       pixmap, 0, 0,
-				       &region->extents, 1);
-			goto done;
+		if (priv->cpu_damage == NULL) {
+			if ((flags & MOVE_WRITE) == 0 &&
+			    region->extents.x2 - region->extents.x1 == 1 &&
+			    region->extents.y2 - region->extents.y1 == 1) {
+				/*  Often associated with synchronisation, KISS */
+				sna_read_boxes(sna,
+					       priv->gpu_bo, 0, 0,
+					       pixmap, 0, 0,
+					       &region->extents, 1);
+				goto done;
+			}
+		} else {
+			if (sna_damage_contains_box__no_reduce(priv->cpu_damage,
+							       &region->extents))
+				goto done;
 		}
 
-		if (priv->cpu_damage &&
-		    sna_damage_contains_box__no_reduce(priv->cpu_damage,
-						       &region->extents))
-			goto done;
-
 		if (sna_damage_contains_box(priv->gpu_damage,
 					    &region->extents) != PIXMAN_REGION_OUT) {
 			RegionRec want, *r = region;
commit bd1dd4cf663ca230724dc6beb329b7eb270ea9d5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 17:57:56 2012 +0100

    sna: If the CPU damage already contains the migration region, we are done
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 4f4b7b3..dfe4c5a 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1539,6 +1539,11 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 			goto done;
 		}
 
+		if (priv->cpu_damage &&
+		    sna_damage_contains_box__no_reduce(priv->cpu_damage,
+						       &region->extents))
+			goto done;
+
 		if (sna_damage_contains_box(priv->gpu_damage,
 					    &region->extents) != PIXMAN_REGION_OUT) {
 			RegionRec want, *r = region;
commit a2d92ade3911e62f950c85b5650fb13da1279ced
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 17:49:01 2012 +0100

    sna: Prevent readback of 1x1 if it lies inside CPU damage
    
    If the pixel exists only in the CPU damage, attempting to read it back
    from the GPU only results in garbage.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 4511ec8..4f4b7b3 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1528,7 +1528,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 		     region->extents.x2 - region->extents.x1,
 		     region->extents.y2 - region->extents.y1));
 
-		if ((flags & MOVE_WRITE) == 0 &&
+		if ((flags & MOVE_WRITE) == 0 && priv->cpu_damage == NULL &&
 		    region->extents.x2 - region->extents.x1 == 1 &&
 		    region->extents.y2 - region->extents.y1 == 1) {
 			/*  Often associated with synchronisation, KISS */
@@ -1548,6 +1548,16 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 			     region->extents.x2 - region->extents.x1,
 			     region->extents.y2 - region->extents.y1));
 
+			if ((flags & MOVE_WRITE) == 0 &&
+			    region->extents.x2 - region->extents.x1 == 1 &&
+			    region->extents.y2 - region->extents.y1 == 1) {
+				sna_read_boxes(sna,
+					       priv->gpu_bo, 0, 0,
+					       pixmap, 0, 0,
+					       &region->extents, 1);
+				goto done;
+			}
+
 			/* Expand the region to move 32x32 pixel blocks at a
 			 * time, as we assume that we will continue writing
 			 * afterwards and so aim to coallesce subsequent
@@ -10079,8 +10089,11 @@ sna_poly_fill_rect(DrawablePtr draw, GCPtr gc, int n, xRectangle *rect)
 		goto fallback;
 	}
 
-	if (!PM_IS_SOLID(draw, gc->planemask))
+	if (!PM_IS_SOLID(draw, gc->planemask)) {
+		DBG(("%s: fallback -- planemask=%#lx (not-solid)\n",
+		     __FUNCTION__, gc->planemask));
 		goto fallback;
+	}
 
 	/* Clear the cpu damage so that we refresh the GPU status of the
 	 * pixmap upon a redraw after a period of inactivity.
commit a34a06c4ba36b21e386b1f6371a4bd3f03ff35a1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 20:14:38 2012 +0100

    sna/glyphs: Clip the damage to the drawable for unclipped glyphs-to-dst
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 0de1f70..ca70e76 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -415,6 +415,36 @@ static void apply_damage(struct sna_composite_op *op,
 	sna_damage_add_box(op->damage, &box);
 }
 
+static void apply_damage_clipped_to_dst(struct sna_composite_op *op,
+					const struct sna_composite_rectangles *r,
+					DrawablePtr dst)
+{
+	BoxRec box;
+
+	if (op->damage == NULL)
+		return;
+
+	box.x1 = r->dst.x + op->dst.x;
+	box.y1 = r->dst.y + op->dst.y;
+	box.x2 = box.x1 + r->width;
+	box.y2 = box.y1 + r->height;
+
+	if (box.x1 < dst->x)
+		box.x1 = dst->x;
+
+	if (box.x2 > op->dst.width)
+		box.x2 = op->dst.width;
+
+	if (box.y1 < dst->y)
+		box.y1 = dst->y;
+
+	if (box.y2 > op->dst.height)
+		box.y2 = op->dst.height;
+
+	assert_pixmap_contains_box(op->dst.pixmap, &box);
+	sna_damage_add_box(op->damage, &box);
+}
+
 static Bool
 glyphs_to_dst(struct sna *sna,
 	      CARD8 op,
@@ -553,7 +583,7 @@ glyphs_to_dst(struct sna *sna,
 				     r.width, r.height));
 
 				tmp.blt(sna, &tmp, &r);
-				apply_damage(&tmp, &r);
+				apply_damage_clipped_to_dst(&tmp, &r, dst->pDrawable);
 			}
 
 next_glyph:
commit dcc7ba8ccf95db1c265bd5492f041f94ce368b7a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 17:48:40 2012 +0100

    sna/composite: Add debugging modes to disable acceleration
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index d281776..9dc3808 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -41,6 +41,9 @@
 #define DBG(x) ErrorF x
 #endif
 
+#define NO_COMPOSITE 0
+#define NO_COMPOSITE_RECTANGLES 0
+
 #define BOUND(v)	(INT16) ((v) < MINSHORT ? MINSHORT : (v) > MAXSHORT ? MAXSHORT : (v))
 
 Bool sna_composite_create(struct sna *sna)
@@ -450,10 +453,13 @@ sna_composite(CARD8 op,
 					  src, mask, dst,
 					  src_x,  src_y,
 					  mask_x, mask_y,
-					  dst_x, dst_y,
+					  dst_x,  dst_y,
 					  width,  height))
 		return;
 
+	if (NO_COMPOSITE)
+		goto fallback;
+
 	if (wedged(sna)) {
 		DBG(("%s: fallback -- wedged\n", __FUNCTION__));
 		goto fallback;
@@ -526,13 +532,15 @@ sna_composite(CARD8 op,
 	goto out;
 
 fallback:
-	DBG(("%s -- fallback dst=(%d, %d)+(%d, %d), size=(%d, %d)\n",
+	DBG(("%s -- fallback dst=(%d, %d)+(%d, %d), size=(%d, %d): region=((%d,%d), (%d, %d))\n",
 	     __FUNCTION__,
 	     dst_x, dst_y,
 	     dst->pDrawable->x, dst->pDrawable->y,
-	     width, height));
-	if (op == PictOpSrc || op == PictOpClear)
-		flags = MOVE_WRITE;
+	     width, height,
+	     region.extents.x1, region.extents.y1,
+	     region.extents.x2, region.extents.y2));
+	if (op <= PictOpSrc && !dst->alphaMap)
+		flags = MOVE_WRITE | MOVE_INPLACE_HINT;
 	else
 		flags = MOVE_WRITE | MOVE_READ;
 	if (!sna_drawable_move_region_to_cpu(dst->pDrawable, &region, flags))
@@ -563,10 +571,10 @@ fallback:
 
 	DBG(("%s: fallback -- fbComposite\n", __FUNCTION__));
 	fbComposite(op, src, mask, dst,
-		    src_x, src_y,
+		    src_x,  src_y,
 		    mask_x, mask_y,
-		    dst_x, dst_y,
-		    width, height);
+		    dst_x,  dst_y,
+		    width,  height);
 out:
 	REGION_UNINIT(NULL, &region);
 }
@@ -758,6 +766,9 @@ sna_composite_rectangles(CARD8		 op,
 	     RegionExtents(&region)->x1, RegionExtents(&region)->y1,
 	     RegionExtents(&region)->x2, RegionExtents(&region)->y2));
 
+	if (NO_COMPOSITE_RECTANGLES)
+		goto fallback;
+
 	if (wedged(sna))
 		goto fallback;
 
commit 984400b95a879c7c020de14545ac2e1d9e759e05
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 16:56:21 2012 +0100

    sna/glyphs: Don't apply drawable offsets twice
    
    The offsets from image_from_pict() already include the drawable offset
    so we need not apply them twice.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 45c24d8..0de1f70 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -1173,10 +1173,8 @@ glyphs_fallback(CARD8 op,
 		y -= region.extents.y1;
 	} else {
 		mask_image = dst_image;
-		src_x -= x;
-		src_y -= y;
-		x += dst->pDrawable->x;
-		y += dst->pDrawable->y;
+		src_x -= x - dst->pDrawable->x;
+		src_y -= y - dst->pDrawable->y;
 	}
 
 	do {
commit 7bbd445c8cbeb7bcea2c56c4deb9bf6ccf6f2497
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 16:45:03 2012 +0100

    sna/trapezoids: Apply the drawable offset for the CPU migration
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index e604720..0fd1b03 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -4425,10 +4425,10 @@ trapezoid_span_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
 	if (mask) {
 		RegionRec region;
 
-		region.extents.x1 = dst_x;
-		region.extents.y1 = dst_y;
-		region.extents.x2 = dst_x + extents.x2;
-		region.extents.y2 = dst_y + extents.y2;
+		region.extents.x1 = dst_x + dst->pDrawable->x;
+		region.extents.y1 = dst_y + dst->pDrawable->y;
+		region.extents.x2 = region.extents.x1 + extents.x2;
+		region.extents.y2 = region.extents.y2 + extents.y2;
 		region.data = NULL;
 
 		DBG(("%s: move-to-cpu\n", __FUNCTION__));
commit c5313620a2f66bc8daf211fc77a9c480a79ea271
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 15:06:16 2012 +0100

    sna: Suppress flushes once we have cleared the kernel dirtiness
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 15261b6..537a6b0 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2954,7 +2954,11 @@ void _kgem_bo_destroy(struct kgem *kgem, struct kgem_bo *bo)
 bool __kgem_flush(struct kgem *kgem, struct kgem_bo *bo)
 {
 	/* The kernel will emit a flush *and* update its own flushing lists. */
-	return kgem_busy(kgem, bo->handle);
+	if (!bo->needs_flush)
+		return false;
+
+	bo->needs_flush = kgem_busy(kgem, bo->handle);
+	return bo->needs_flush;
 }
 
 bool kgem_check_bo(struct kgem *kgem, ...)
commit 0347c8abec9740d706d87dd2f719ac68f3d1c32e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 13:50:31 2012 +0100

    sna/glyphs: Fix upconverting of glyphs via gpu
    
    When using the mask instead of the src for adding the glyphs we need to
    pass the glyph coordinates through the mask coordinates rather than the
    source.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 81e833e..45c24d8 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -940,7 +940,11 @@ next_image:
 					if (glyph_atlas)
 						tmp.done(sna, &tmp);
 
-					if (this_atlas->format == format->format) {
+					DBG(("%s: atlas format=%08x, mask format=%08x\n",
+					     __FUNCTION__,
+					     (int)this_atlas->format,
+					     (int)(format->depth << 24 | format->format)));
+					if (this_atlas->format == (format->depth << 24 | format->format)) {
 						ok = sna->render.composite(sna, PictOpAdd,
 									   this_atlas, NULL, mask,
 									   0, 0, 0, 0, 0, 0,
@@ -954,6 +958,8 @@ next_image:
 									   &tmp);
 					}
 					if (!ok) {
+						DBG(("%s: fallback -- can not handle PictOpAdd of glyph onto mask!\n",
+						     __FUNCTION__));
 						FreePicture(mask, 0);
 						return FALSE;
 					}
@@ -968,6 +974,7 @@ next_image:
 				     r.src.x, r.src.y,
 				     glyph->info.width, glyph->info.height));
 
+				r.mask = r.src;
 				r.dst.x = x - glyph->info.x;
 				r.dst.y = y - glyph->info.y;
 				r.width  = glyph->info.width;
commit 90ae4f853222ee33206134f4efdc4accfb2f2c38
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 14:17:40 2012 +0100

    sna: Avoid mixing signed/unsigned int/int16 arithmetric
    
    Life becomes unpleasant with sign extension.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index cebfc7e..4511ec8 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5881,7 +5881,7 @@ sna_poly_zero_line_blt(DrawablePtr drawable,
 
 		while (--n) {
 			int16_t sdx, sdy;
-			uint16_t adx, ady, length;
+			int adx, ady, length;
 			int e, e1, e2, e3;
 			int x1 = x2, x;
 			int y1 = y2, y;
@@ -7079,7 +7079,7 @@ sna_poly_zero_segment_blt(DrawablePtr drawable,
 		const xSegment *s = _s;
 		do {
 			int16_t sdx, sdy;
-			uint16_t adx, ady, length;
+			int adx, ady, length;
 			int e, e1, e2, e3;
 			int x1, x2;
 			int y1, y2;
commit 660c89e9742bac5ce7cbd480e08b4667e37dee8c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 13:18:21 2012 +0100

    sna: Use full 16-bit unsigned values for absolute differences
    
    Beware the overflow implicit in:
      adx = x2 >= x1 ? x2 - x1 : x1 - x2;
    when both x2 and x1 may be large signed 16-bit values
    
    Reported-by: Zdenek Kabelac <zdenek.kabelac at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50532
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index ee2f69a..cebfc7e 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5881,9 +5881,8 @@ sna_poly_zero_line_blt(DrawablePtr drawable,
 
 		while (--n) {
 			int16_t sdx, sdy;
-			int16_t adx, ady;
-			int16_t e, e1, e2, e3;
-			int16_t length;
+			uint16_t adx, ady, length;
+			int e, e1, e2, e3;
 			int x1 = x2, x;
 			int y1 = y2, y;
 			int oc1 = oc2;
@@ -7080,9 +7079,8 @@ sna_poly_zero_segment_blt(DrawablePtr drawable,
 		const xSegment *s = _s;
 		do {
 			int16_t sdx, sdy;
-			int16_t adx, ady;
-			int16_t e, e1, e2, e3;
-			int16_t length;
+			uint16_t adx, ady, length;
+			int e, e1, e2, e3;
 			int x1, x2;
 			int y1, y2;
 			int oc1, oc2;
commit 035c2953751f58225bd6b1fcb4c1275ccb5526cb
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 31 09:29:40 2012 +0100

    sna/glyphs: use add(WHITE, glyph, mask) for channel expansion
    
    If the glyph format does not match the mask format we can not simply add
    the two together, but must first perform a channel expansion (or
    contraction) by multiplying the glyph against a WHITE source.
    
    Normally the glyph and the mask are equivalent formats and so we hit the
    fast path.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 0a2e042..81e833e 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -130,6 +130,15 @@ static void unrealize_glyph_caches(struct sna *sna)
 		free(cache->glyphs);
 	}
 	memset(render->glyph, 0, sizeof(render->glyph));
+
+	if (render->white_image) {
+		pixman_image_unref(render->white_image);
+		render->white_image = NULL;
+	}
+	if (render->white_picture) {
+		FreePicture(render->white_picture, 0);
+		render->white_picture = NULL;
+	}
 }
 
 /* All caches for a single format share a single pixmap for glyph storage,
@@ -144,11 +153,13 @@ static void unrealize_glyph_caches(struct sna *sna)
 static Bool realize_glyph_caches(struct sna *sna)
 {
 	ScreenPtr screen = sna->scrn->pScreen;
+	pixman_color_t white = { 0xffff, 0xffff, 0xffff, 0xffff };
 	unsigned int formats[] = {
 		PIXMAN_a8,
 		PIXMAN_a8r8g8b8,
 	};
 	unsigned int i;
+	int error;
 
 	DBG(("%s\n", __FUNCTION__));
 
@@ -163,7 +174,6 @@ static Bool realize_glyph_caches(struct sna *sna)
 		PictFormatPtr pPictFormat;
 		CARD32 component_alpha;
 		int depth = PIXMAN_FORMAT_DEPTH(formats[i]);
-		int error;
 
 		pPictFormat = PictureMatchFormat(screen, depth, formats[i]);
 		if (!pPictFormat)
@@ -205,7 +215,10 @@ static Bool realize_glyph_caches(struct sna *sna)
 		cache->evict = rand() % GLYPH_CACHE_SIZE;
 	}
 
-	return TRUE;
+	sna->render.white_image = pixman_image_create_solid_fill(&white);
+	sna->render.white_picture =
+		CreateSolidPicture(0, (xRenderColor *)&white, &error);
+	return sna->render.white_image && sna->render.white_picture;
 
 bail:
 	unrealize_glyph_caches(sna);
@@ -412,7 +425,6 @@ glyphs_to_dst(struct sna *sna,
 {
 	struct sna_composite_op tmp;
 	ScreenPtr screen = dst->pDrawable->pScreen;
-	int index = screen->myNum;
 	PicturePtr glyph_atlas;
 	BoxPtr rects;
 	int nrect;
@@ -566,7 +578,6 @@ glyphs_slow(struct sna *sna,
 {
 	struct sna_composite_op tmp;
 	ScreenPtr screen = dst->pDrawable->pScreen;
-	int index = screen->myNum;
 	int16_t x, y;
 
 	if (NO_GLYPHS_SLOW)
@@ -705,7 +716,6 @@ glyphs_via_mask(struct sna *sna,
 {
 	ScreenPtr screen = dst->pDrawable->pScreen;
 	struct sna_composite_op tmp;
-	int index = screen->myNum;
 	CARD32 component_alpha;
 	PixmapPtr pixmap;
 	PicturePtr glyph_atlas, mask;
@@ -759,7 +769,6 @@ glyphs_via_mask(struct sna *sna,
 	    ((uint32_t)width * height * format->depth < 8 * 4096 ||
 	     too_large(sna, width, height))) {
 		pixman_image_t *mask_image;
-		int s;
 
 		DBG(("%s: small mask [format=%lx, depth=%d, size=%d], rendering glyphs to upload buffer\n",
 		     __FUNCTION__, (unsigned long)format->format,
@@ -784,7 +793,6 @@ upload:
 		}
 
 		memset(pixmap->devPrivate.ptr, 0, pixmap->devKind*height);
-		s = dst->pDrawable->pScreen->myNum;
 		do {
 			int n = list->len;
 			x += list->xOff;
@@ -833,15 +841,28 @@ upload:
 				     g->info.width,
 				     g->info.height));
 
-				pixman_image_composite(PictOpAdd,
-						       glyph_image,
-						       NULL,
-						       mask_image,
-						       0, 0,
-						       0, 0,
-						       xi, yi,
-						       g->info.width,
-						       g->info.height);
+				if (list->format == format) {
+					assert(pixman_image_get_format(glyph_image) == pixman_image_get_format(mask_image));
+					pixman_image_composite(PictOpAdd,
+							       glyph_image,
+							       NULL,
+							       mask_image,
+							       0, 0,
+							       0, 0,
+							       xi, yi,
+							       g->info.width,
+							       g->info.height);
+				} else {
+					pixman_image_composite(PictOpAdd,
+							       sna->render.white_image,
+							       glyph_image,
+							       mask_image,
+							       0, 0,
+							       0, 0,
+							       xi, yi,
+							       g->info.width,
+							       g->info.height);
+				}
 
 next_image:
 				x += g->info.xOff;
@@ -914,14 +935,25 @@ next_image:
 				}
 
 				if (this_atlas != glyph_atlas) {
+					bool ok;
+
 					if (glyph_atlas)
 						tmp.done(sna, &tmp);
 
-					if (!sna->render.composite(sna, PictOpAdd,
-								   this_atlas, NULL, mask,
-								   0, 0, 0, 0, 0, 0,
-								   width, height,
-								   &tmp)) {
+					if (this_atlas->format == format->format) {
+						ok = sna->render.composite(sna, PictOpAdd,
+									   this_atlas, NULL, mask,
+									   0, 0, 0, 0, 0, 0,
+									   width, height,
+									   &tmp);
+					} else {
+						ok = sna->render.composite(sna, PictOpAdd,
+									   sna->render.white_picture, this_atlas, mask,
+									   0, 0, 0, 0, 0, 0,
+									   width, height,
+									   &tmp);
+					}
+					if (!ok) {
 						FreePicture(mask, 0);
 						return FALSE;
 					}
@@ -1046,6 +1078,7 @@ glyphs_fallback(CARD8 op,
 		GlyphListPtr list,
 		GlyphPtr *glyphs)
 {
+	struct sna *sna = to_sna_from_drawable(dst->pDrawable);
 	pixman_image_t *dst_image, *mask_image, *src_image;
 	int dx, dy, x, y;
 	BoxRec box;
@@ -1178,16 +1211,30 @@ glyphs_fallback(CARD8 op,
 				     g->info.width,
 				     g->info.height));
 
-				pixman_image_composite(PictOpAdd,
-						       glyph_image,
-						       NULL,
-						       mask_image,
-						       dx, dy,
-						       0, 0,
-						       x - g->info.x,
-						       y - g->info.y,
-						       g->info.width,
-						       g->info.height);
+				if (list->format == mask_format) {
+					assert(pixman_image_get_format(glyph_image) == pixman_image_get_format(mask_image));
+					pixman_image_composite(PictOpAdd,
+							       glyph_image,
+							       NULL,
+							       mask_image,
+							       dx, dy,
+							       0, 0,
+							       x - g->info.x,
+							       y - g->info.y,
+							       g->info.width,
+							       g->info.height);
+				} else {
+					pixman_image_composite(PictOpAdd,
+							       sna->render.white_image,
+							       glyph_image,
+							       mask_image,
+							       dx, dy,
+							       0, 0,
+							       x - g->info.x,
+							       y - g->info.y,
+							       g->info.width,
+							       g->info.height);
+				}
 			} else {
 				int xi = x - g->info.x;
 				int yi = y - g->info.y;
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 8764796..b9360c3 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -274,6 +274,8 @@ struct sna_render {
 		uint16_t count;
 		uint16_t evict;
 	} glyph[2];
+	pixman_image_t *white_image;
+	PicturePtr white_picture;
 
 	uint16_t vertex_start;
 	uint16_t vertex_index;
commit cf5b3e2ebf4ee0330f5421b9377bb512a94ec284
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 30 14:44:59 2012 +0100

    sna: Don't attempt to flush scanout if unattached
    
    This was lost in the midst of the OSTimer overhaul.
    
    Reported-by: Zdenek Kabelac <zdenek.kabelac at gmail.com>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=50393
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 8f2fdea..ee2f69a 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -11899,7 +11899,7 @@ static bool sna_accel_do_flush(struct sna *sna)
 	struct sna_pixmap *priv;
 
 	priv = sna_accel_scanout(sna);
-	if (priv == NULL) {
+	if (priv == NULL || priv->gpu_bo == NULL) {
 		DBG(("%s -- no scanout attached\n", __FUNCTION__));
 		sna_accel_disarm_timer(sna, FLUSH_TIMER);
 		return false;
commit 3a64ba0895035f6567e9a15357396b06c0f2d6dd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 30 13:51:07 2012 +0100

    sna: Convert remaining drmCommands to drmIoctl
    
    This helps to silence valgrind
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 828df03..15261b6 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -568,6 +568,11 @@ static bool semaphores_enabled(void)
 	return detected;
 }
 
+static bool __kgem_throttle(struct kgem *kgem)
+{
+	return drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_THROTTLE, NULL) == -EIO;
+}
+
 void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
 {
 	struct drm_i915_gem_get_aperture aperture;
@@ -579,7 +584,7 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
 
 	kgem->fd = fd;
 	kgem->gen = gen;
-	kgem->wedged = drmCommandNone(kgem->fd, DRM_I915_GEM_THROTTLE) == -EIO;
+	kgem->wedged = __kgem_throttle(kgem);
 	kgem->wedged |= DBG_NO_HW;
 
 	kgem->batch_size = ARRAY_SIZE(kgem->batch);
@@ -1864,7 +1869,7 @@ void _kgem_submit(struct kgem *kgem)
 				       DRM_IOCTL_I915_GEM_EXECBUFFER2,
 				       &execbuf);
 			while (ret == -1 && errno == EBUSY && retry--) {
-				drmCommandNone(kgem->fd, DRM_I915_GEM_THROTTLE);
+				__kgem_throttle(kgem);
 				ret = drmIoctl(kgem->fd,
 					       DRM_IOCTL_I915_GEM_EXECBUFFER2,
 					       &execbuf);
@@ -1954,8 +1959,7 @@ void kgem_throttle(struct kgem *kgem)
 {
 	static int warned;
 
-	kgem->wedged |= drmCommandNone(kgem->fd, DRM_I915_GEM_THROTTLE) == -EIO;
-
+	kgem->wedged |= __kgem_throttle(kgem);
 	if (kgem->wedged && !warned) {
 		struct sna *sna = container_of(kgem, struct sna, kgem);
 		xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR,
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 10f4421..f8e386b 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -334,8 +334,7 @@ static int sna_open_drm_master(ScrnInfoPtr scrn)
 	val = FALSE;
 	gp.param = I915_PARAM_HAS_BLT;
 	gp.value = &val;
-	if (drmCommandWriteRead(fd, DRM_I915_GETPARAM,
-				&gp, sizeof(gp))) {
+	if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp)) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 			   "Failed to detect BLT.  Kernel 2.6.37 required.\n");
 		drmClose(fd);
commit 47e2db0ba8ae3fbcdf58cba26c58ec0932b4c90b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 30 10:37:22 2012 +0100

    sna: Replace FREELIKE_BLOCK with MAKE_MEM_NOACCESS
    
    And similarly for MALLOCLIKE_BLOCK. The issue being that valgrind may
    overwrite such blocks with alloc-fill and free-fill values, but when in
    fact they are defined and still in use by the GPU. This can lead to the
    GPU processing garbage, and GPU hangs.
    
    Reported-by: Zdenek Kabelac <zdenek.kabelac at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50393
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 8587936..828df03 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -984,7 +984,7 @@ static void kgem_bo_release_map(struct kgem *kgem, struct kgem_bo *bo)
 	     __FUNCTION__, type ? "CPU" : "GTT",
 	     bo->handle, kgem->vma[type].count));
 
-	VG(if (type) VALGRIND_FREELIKE_BLOCK(MAP(bo->map), 0));
+	VG(if (type) VALGRIND_MAKE_MEM_NOACCESS(MAP(bo->map), bytes(bo)));
 	munmap(MAP(bo->map), bytes(bo));
 	bo->map = NULL;
 
@@ -3194,7 +3194,7 @@ static void kgem_trim_vma_cache(struct kgem *kgem, int type, int bucket)
 		assert(bo->map);
 		assert(bo->rq == NULL);
 
-		VG(if (type) VALGRIND_FREELIKE_BLOCK(MAP(bo->map), 0));
+		VG(if (type) VALGRIND_MAKE_MEM_NOACCESS(MAP(bo->map), bytes(bo)));
 		munmap(MAP(bo->map), bytes(bo));
 		bo->map = NULL;
 		list_del(&bo->vma);
@@ -3348,7 +3348,7 @@ retry:
 		return NULL;
 	}
 
-	VG(VALGRIND_MALLOCLIKE_BLOCK(mmap_arg.addr_ptr, bytes(bo), 0, 1));
+	VG(VALGRIND_MAKE_MEM_DEFINED(mmap_arg.addr_ptr, bytes(bo)));
 
 	DBG(("%s: caching CPU vma for %d\n", __FUNCTION__, bo->handle));
 	bo->map = MAKE_CPU_MAP(mmap_arg.addr_ptr);
commit 08a630dc5ef87e551865e558fe4fc45ea66457b4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 30 08:50:44 2012 +0100

    sna: Ensure we flush scanout even when otherwise idle.
    
    Reported-by: Zdenek Kabelac <zdenek.kabelac at gmail.com>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=50477
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 72bb893..8f2fdea 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -11924,11 +11924,12 @@ static bool sna_accel_do_flush(struct sna *sna)
 			return priv->cpu_damage || !__kgem_flush(&sna->kgem, priv->gpu_bo);
 		}
 	} else {
-		if (priv->cpu_damage == NULL && priv->gpu_bo->exec == NULL) {
+		if (priv->cpu_damage == NULL &&
+		    !__kgem_flush(&sna->kgem, priv->gpu_bo)) {
 			DBG(("%s -- no pending write to scanout\n", __FUNCTION__));
 		} else {
 			sna->timer_active |= 1 << FLUSH_TIMER;
-			sna->timer_ready |= 1 << FLUSH_TIMER;
+			sna->timer_ready  |= 1 << FLUSH_TIMER;
 			sna->timer_expire[FLUSH_TIMER] =
 				sna->time + sna->vblank_interval / 2;
 			DBG(("%s (time=%ld), starting\n", __FUNCTION__, (long)sna->time));
commit 10ca765ad346931087be146f3e6d1f4069c95f26
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 30 08:32:34 2012 +0100

    Mark a few more options as being UXA specific
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_options.c b/src/intel_options.c
index 5679e0e..56f1ae9 100644
--- a/src/intel_options.c
+++ b/src/intel_options.c
@@ -12,15 +12,12 @@ const OptionInfoRec intel_options[] = {
 	{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	1},
 	{OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	0},
 	{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	1},
+	{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},
+	{OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	1},
+	{OPTION_RELAXED_FENCING,"RelaxedFencing",	OPTV_BOOLEAN,	{0},	1},
 #ifdef INTEL_XVMC
 	{OPTION_XVMC,	"XvMC",		OPTV_BOOLEAN,	{0},	1},
 #endif
-	{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},
-	{OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, 0},
-	{OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, 0},
-	{OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, 0},
-	{OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	1},
-	{OPTION_RELAXED_FENCING,	"RelaxedFencing",	OPTV_BOOLEAN,	{0},	1},
 #ifdef USE_SNA
 	{OPTION_THROTTLE,	"Throttle",	OPTV_BOOLEAN,	{0},	1},
 	{OPTION_VMAP,	"UseVmap",	OPTV_BOOLEAN,	{0},	1},
@@ -29,6 +26,9 @@ const OptionInfoRec intel_options[] = {
 #endif
 #ifdef USE_UXA
 	{OPTION_FALLBACKDEBUG,	"FallbackDebug",OPTV_BOOLEAN,	{0},	0},
+	{OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, 0},
+	{OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, 0},
+	{OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, 0},
 	{OPTION_BUFFER_CACHE,	"BufferCache",	OPTV_BOOLEAN,   {0},    1},
 	{OPTION_SHADOW,		"Shadow",	OPTV_BOOLEAN,	{0},	0},
 	{OPTION_TRIPLE_BUFFER,	"TripleBuffer", OPTV_BOOLEAN,	{0},	1},
commit 740368c4c6eb547adad247ff529d16e594d6459b
Author: Nick Bowler <nbowler at draconx.ca>
Date:   Mon May 28 18:28:28 2012 -0400

    Include config.h in intel_options.c
    
    Commit 8a9a585341e2 ("Only create a single instance of the intel_options
    array") moved the definition of intel_options into a separate .c file.
    Several of the defined options are #ifdef'd based on the configuration,
    but since config.h is never included, the macros being tested are never
    defined.  Therefore, none of the configuration-specific options will
    ever be available at runtime, even if they should be.
    
    Add an inclusion of config.h so that such configuration-specific options
    work again.
    
    Signed-off-by: Nick Bowler <nbowler at draconx.ca>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_options.c b/src/intel_options.c
index 56929be..5679e0e 100644
--- a/src/intel_options.c
+++ b/src/intel_options.c
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include "intel_options.h"
 
 const OptionInfoRec intel_options[] = {
commit e1b720c40cf511b4ed6d387891d715522d0d54b6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 30 07:47:53 2012 +0100

    sna/sprite: Restore another xf86drm.h
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index fff31fb..8c3cdaa 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -33,6 +33,7 @@
 
 #include "intel_options.h"
 
+#include <xf86drm.h>
 #include <xf86xv.h>
 #include <X11/extensions/Xv.h>
 #include <fourcc.h>
@@ -197,9 +198,9 @@ sna_video_sprite_show(struct sna *sna,
 		set.plane_id = plane;
 		set.value = video->color_key;
 
-		if (drmCommandWrite(sna->kgem.fd,
-				    DRM_I915_SET_SPRITE_DESTKEY,
-				    &set, sizeof(set)))
+		if (drmIoctl(sna->kgem.fd,
+			     DRM_IOCTL_I915_SET_SPRITE_DESTKEY,
+			     &set))
 			xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR,
 				   "failed to update color key\n");
 
commit e986b06162abf286b3f8f97b791fd66dcf8f9aec
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 22:21:05 2012 +0100

    sna/overlay: Handle return from GETPARAM query correctly
    
    drmIoctl() returns 0 on success, not a positive value.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index c39bbfc..945818a 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -114,7 +114,7 @@ static Bool sna_has_overlay(struct sna *sna)
 	gp.param = I915_PARAM_HAS_OVERLAY;
 	gp.value = &has_overlay;
 	ret = drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GETPARAM, &gp);
-	return ret > 0 && has_overlay;
+	return ret == 0 && has_overlay;
 }
 
 static Bool sna_video_overlay_update_attrs(struct sna *sna,
commit 68874e2d694cc68f5f051ba5fe4a79a71fdb2dbc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 21:28:39 2012 +0100

    sna: Fix chunking for large stipples
    
    Reported-and-tested-by: Matti Hamalainen <ccr at tnsp.org>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=49510
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 9029d9f..72bb893 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -9751,7 +9751,7 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 	uint32_t *b;
 
 	for (y1 = box->y1; y1 < box->y2; y1 = y2) {
-		int oy = (y1 - origin->y)  % gc->stipple->drawable.height;
+		int oy = (y1 - origin->y) % gc->stipple->drawable.height;
 
 		y2 = box->y2;
 		if (y2 - y1 > gc->stipple->drawable.height - oy)
@@ -9765,12 +9765,11 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 			ox = (x1 - origin->x) % gc->stipple->drawable.width;
 			bx1 = ox & ~7;
 			bx2 = ox + (x2 - x1);
-			if (bx2 - bx1 > gc->stipple->drawable.width) {
-				bx2 = bx1 + gc->stipple->drawable.width;
-				x2 = x1 + (bx1-ox) + gc->stipple->drawable.width;
+			if (bx2 > gc->stipple->drawable.width) {
+				bx2 = gc->stipple->drawable.width;
+				x2 = x1 + bx2-ox;
 			}
-			bx2 = (bx2 + 7) & ~7;
-			bw = (bx2 - bx1)/8;
+			bw = (bx2 - bx1 + 7)/8;
 			bw = ALIGN(bw, 2);
 			bh = y2 - y1;
 
commit 12af82581118470f59817f626d61df655950e243
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 21:45:32 2012 +0100

    sna/overlay: Replace drmCommand with direct invocations of drmIoctl
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index d7a62f3..c39bbfc 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -113,10 +113,8 @@ static Bool sna_has_overlay(struct sna *sna)
 
 	gp.param = I915_PARAM_HAS_OVERLAY;
 	gp.value = &has_overlay;
-	ret = drmCommandWriteRead(sna->kgem.fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
-
-	return !! has_overlay;
-	(void)ret;
+	ret = drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GETPARAM, &gp);
+	return ret > 0 && has_overlay;
 }
 
 static Bool sna_video_overlay_update_attrs(struct sna *sna,
@@ -138,22 +136,18 @@ static Bool sna_video_overlay_update_attrs(struct sna *sna,
 	attrs.gamma4 = video->gamma4;
 	attrs.gamma5 = video->gamma5;
 
-	return drmCommandWriteRead(sna->kgem.fd, DRM_I915_OVERLAY_ATTRS,
-				  &attrs, sizeof(attrs)) == 0;
+	return drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_OVERLAY_ATTRS, &attrs) == 0;
 }
 
 static void sna_video_overlay_off(struct sna *sna)
 {
 	struct drm_intel_overlay_put_image request;
-	int ret;
 
 	DBG(("%s()\n", __FUNCTION__));
 
 	request.flags = 0;
 
-	ret = drmCommandWrite(sna->kgem.fd, DRM_I915_OVERLAY_PUT_IMAGE,
-			      &request, sizeof(request));
-	(void)ret;
+	drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_OVERLAY_PUT_IMAGE, &request);
 }
 
 static void sna_video_overlay_stop(ScrnInfoPtr scrn,
@@ -448,8 +442,7 @@ sna_video_overlay_show(struct sna *sna,
 
 	DBG(("%s: flags=%x\n", __FUNCTION__, request.flags));
 
-	return drmCommandWrite(sna->kgem.fd, DRM_I915_OVERLAY_PUT_IMAGE,
-			       &request, sizeof(request)) == 0;
+	return drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_OVERLAY_PUT_IMAGE, &request) == 0;
 }
 
 static int
commit 3a1b6e57fbbbb4c8e5ac9588537840f4ec176ae6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 21:37:16 2012 +0100

    sna/overlay: Restore one xf86drm.h include
    
    This was removed in haste, when it is required for drmIoctl and friends.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index eb39a25..d7a62f3 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -31,6 +31,7 @@
 #include "sna.h"
 #include "sna_video.h"
 
+#include <xf86drm.h>
 #include <xf86xv.h>
 #include <X11/extensions/Xv.h>
 #include <fourcc.h>
commit 264d1b1e1fb368f7845a8112bfa2ad2224acabd9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 13:03:56 2012 +0100

    sna: Also check for a free exec slot for the upload buffers
    
    As we check before allocating the upload buffer, we can not be certain
    that we will allocate an already attached bo or that we have a free exec
    slot. So always check that we have an extra exec slot available - the
    false positive rate is going to be negligible.
    
    Reported-by: Zdenek Kabelac <zdenek.kabelac at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50457
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index b8f0970..ee18ebe 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1792,11 +1792,8 @@ static int gen3_get_rectangles__flush(struct sna *sna,
 {
 	if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 105: 5))
 		return 0;
-	if (!kgem_check_exec(&sna->kgem, 1))
+	if (!kgem_check_reloc_and_exec(&sna->kgem, 1))
 		return 0;
-	if (!kgem_check_reloc(&sna->kgem, 1))
-		return 0;
-
 	if (op->need_magic_ca_pass && sna->render.vbo)
 		return 0;
 
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 4bc4bf3..8ab707f 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1155,9 +1155,7 @@ static int gen4_get_rectangles__flush(struct sna *sna,
 {
 	if (!kgem_check_batch(&sna->kgem, 25))
 		return 0;
-	if (!kgem_check_exec(&sna->kgem, 1))
-		return 0;
-	if (!kgem_check_reloc(&sna->kgem, 1))
+	if (!kgem_check_reloc_and_exec(&sna->kgem, 1))
 		return 0;
 
 	if (op->need_magic_ca_pass && sna->render.vbo)
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index bb6bcf2..deff5df 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -327,6 +327,11 @@ static inline bool kgem_check_exec(struct kgem *kgem, int n)
 	return likely(kgem->nexec + n <= KGEM_EXEC_SIZE(kgem));
 }
 
+static inline bool kgem_check_reloc_and_exec(struct kgem *kgem, int n)
+{
+	return kgem_check_reloc(kgem, n) && kgem_check_exec(kgem, n);
+}
+
 static inline bool kgem_check_batch_with_surfaces(struct kgem *kgem,
 						  int num_dwords,
 						  int num_surfaces)
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 02c11cf..9029d9f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3041,7 +3041,7 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 
 		if (!kgem_check_batch(&sna->kgem, 8) ||
 		    !kgem_check_bo_fenced(&sna->kgem, bo) ||
-		    !kgem_check_reloc(&sna->kgem, 2)) {
+		    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 			_kgem_submit(&sna->kgem);
 			_kgem_set_mode(&sna->kgem, KGEM_BLT);
 		}
@@ -3170,7 +3170,7 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 
 			if (!kgem_check_batch(&sna->kgem, 12) ||
 			    !kgem_check_bo_fenced(&sna->kgem, bo) ||
-			    !kgem_check_reloc(&sna->kgem, 2)) {
+			    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 				_kgem_submit(&sna->kgem);
 				_kgem_set_mode(&sna->kgem, KGEM_BLT);
 			}
@@ -5226,7 +5226,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
 
 			if (!kgem_check_batch(&sna->kgem, 8) ||
 			    !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
-			    !kgem_check_reloc(&sna->kgem, 2)) {
+			    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 				_kgem_submit(&sna->kgem);
 				_kgem_set_mode(&sna->kgem, KGEM_BLT);
 			}
@@ -5344,7 +5344,7 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr drawable, GCPtr gc,
 
 		if (!kgem_check_batch(&sna->kgem, 8) ||
 		    !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
-		    !kgem_check_reloc(&sna->kgem, 2)) {
+		    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 			_kgem_submit(&sna->kgem);
 			_kgem_set_mode(&sna->kgem, KGEM_BLT);
 		}
@@ -9400,7 +9400,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 
 				if (!kgem_check_batch(&sna->kgem, 8) ||
 				    !kgem_check_bo_fenced(&sna->kgem, bo) ||
-				    !kgem_check_reloc(&sna->kgem, 2)) {
+				    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 					_kgem_submit(&sna->kgem);
 					_kgem_set_mode(&sna->kgem, KGEM_BLT);
 				}
@@ -9539,7 +9539,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 				} else {
 					if (!kgem_check_batch(&sna->kgem, 8) ||
 					    !kgem_check_bo_fenced(&sna->kgem, bo) ||
-					    !kgem_check_reloc(&sna->kgem, 2)) {
+					    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 						_kgem_submit(&sna->kgem);
 						_kgem_set_mode(&sna->kgem, KGEM_BLT);
 					}
@@ -9679,7 +9679,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 					} else {
 						if (!kgem_check_batch(&sna->kgem, 8) ||
 						    !kgem_check_bo_fenced(&sna->kgem, bo) ||
-						    !kgem_check_reloc(&sna->kgem, 2)) {
+						    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 							_kgem_submit(&sna->kgem);
 							_kgem_set_mode(&sna->kgem, KGEM_BLT);
 						}
@@ -11502,7 +11502,7 @@ sna_push_pixels_solid_blt(GCPtr gc,
 
 		if (!kgem_check_batch(&sna->kgem, 8) ||
 		    !kgem_check_bo_fenced(&sna->kgem, bo) ||
-		    !kgem_check_reloc(&sna->kgem, 2)) {
+		    !kgem_check_reloc_and_exec(&sna->kgem, 2)) {
 			_kgem_submit(&sna->kgem);
 			_kgem_set_mode(&sna->kgem, KGEM_BLT);
 		}
commit c7bcca9a3fb6c669d8b093e6399914693770b0b3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 12:49:12 2012 +0100

    sna: Make finding DPMS property valgrind clean
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index b8e69b5..5ed3179 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1263,41 +1263,40 @@ sna_output_dpms(xf86OutputPtr output, int dpms)
 	DBG(("%s: dpms=%d\n", __FUNCTION__, dpms));
 
 	for (i = 0; i < koutput->count_props; i++) {
-		drmModePropertyPtr props;
+		struct drm_mode_get_property prop;
 
-		props = drmModeGetProperty(sna->kgem.fd, koutput->props[i]);
-		if (!props)
+		VG_CLEAR(prop);
+		prop.prop_id = koutput->props[i];
+		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop))
 			continue;
 
-		if (!strcmp(props->name, "DPMS")) {
-			/* Record thevalue of the backlight before turning
-			 * off the display, and reset if after turnging it on.
-			 * Order is important as the kernel may record and also
-			 * reset the backlight across DPMS. Hence we need to
-			 * record the value before the kernel modifies it
-			 * and reapply it afterwards.
-			 */
-			if (dpms == DPMSModeOff)
-				sna_output_dpms_backlight(output,
-							  sna_output->dpms_mode,
-							  dpms);
-
-			drmModeConnectorSetProperty(sna->kgem.fd,
-						    sna_output->output_id,
-						    props->prop_id,
-						    dpms);
-
-			if (dpms != DPMSModeOff)
-				sna_output_dpms_backlight(output,
-							  sna_output->dpms_mode,
-							  dpms);
-
-			sna_output->dpms_mode = dpms;
-			drmModeFreeProperty(props);
-			return;
-		}
+		if (strcmp(prop.name, "DPMS"))
+			continue;
 
-		drmModeFreeProperty(props);
+		/* Record thevalue of the backlight before turning
+		 * off the display, and reset if after turnging it on.
+		 * Order is important as the kernel may record and also
+		 * reset the backlight across DPMS. Hence we need to
+		 * record the value before the kernel modifies it
+		 * and reapply it afterwards.
+		 */
+		if (dpms == DPMSModeOff)
+			sna_output_dpms_backlight(output,
+						  sna_output->dpms_mode,
+						  dpms);
+
+		drmModeConnectorSetProperty(sna->kgem.fd,
+					    sna_output->output_id,
+					    prop.prop_id,
+					    dpms);
+
+		if (dpms != DPMSModeOff)
+			sna_output_dpms_backlight(output,
+						  sna_output->dpms_mode,
+						  dpms);
+
+		sna_output->dpms_mode = dpms;
+		break;
 	}
 }
 
commit 3c074797094dc7675bb6ae549630fdf061ab5258
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 12:45:20 2012 +0100

    sna: Make GetEDID valgrind clean.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 1f67499..b8e69b5 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1086,24 +1086,22 @@ sna_output_attach_edid(xf86OutputPtr output)
 
 	/* look for an EDID property */
 	for (i = 0; i < koutput->count_props; i++) {
-		drmModePropertyPtr props;
+		struct drm_mode_get_property prop;
 
-		props = drmModeGetProperty(sna->kgem.fd, koutput->props[i]);
-		if (!props)
+		VG_CLEAR(prop);
+		prop.prop_id = koutput->props[i];
+		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop))
 			continue;
 
-		if (!(props->flags & DRM_MODE_PROP_BLOB)) {
-			drmModeFreeProperty(props);
+		if (!(prop.flags & DRM_MODE_PROP_BLOB))
 			continue;
-		}
 
-		if (!strcmp(props->name, "EDID")) {
-			drmModeFreePropertyBlob(edid_blob);
-			edid_blob =
-				drmModeGetPropertyBlob(sna->kgem.fd,
-						       koutput->prop_values[i]);
-		}
-		drmModeFreeProperty(props);
+		if (strcmp(prop.name, "EDID"))
+			continue;
+
+		drmModeFreePropertyBlob(edid_blob);
+		edid_blob = drmModeGetPropertyBlob(sna->kgem.fd,
+						   koutput->prop_values[i]);
 	}
 
 	if (edid_blob) {
commit 560e50c0a5afa0824086557581ca6aa5696b44a2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 12:36:31 2012 +0100

    sna: Make GetEncoder() valgrind clean
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index ae0030d..1f67499 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -79,7 +79,6 @@ struct sna_output {
 	struct sna_mode *mode;
 	int output_id;
 	drmModeConnectorPtr mode_output;
-	drmModeEncoderPtr mode_encoder;
 	int num_props;
 	struct sna_property *props;
 	void *private_data;
@@ -1649,7 +1648,7 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	struct sna *sna = to_sna(scrn);
 	xf86OutputPtr output;
 	drmModeConnectorPtr koutput;
-	drmModeEncoderPtr kencoder;
+	struct drm_mode_get_encoder enc;
 	struct sna_output *sna_output;
 	const char *output_name;
 	const char *s;
@@ -1660,8 +1659,9 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	if (!koutput)
 		return;
 
-	kencoder = drmModeGetEncoder(sna->kgem.fd, koutput->encoders[0]);
-	if (!kencoder)
+	VG_CLEAR(enc);
+	enc.encoder_id = koutput->encoders[0];
+	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETENCODER, &enc))
 		goto cleanup_connector;
 
 	if (koutput->connector_type < ARRAY_SIZE(output_names))
@@ -1673,12 +1673,12 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	if (xf86IsEntityShared(scrn->entityList[0])) {
 		s = xf86GetOptValString(sna->Options, OPTION_ZAPHOD);
 		if (s && !sna_zaphod_match(s, name))
-			goto cleanup_encoder;
+			goto cleanup_connector;
 	}
 
 	output = xf86OutputCreate(scrn, &sna_output_funcs, name);
 	if (!output)
-		goto cleanup_encoder;
+		goto cleanup_connector;
 
 	sna_output = calloc(sizeof(struct sna_output), 1);
 	if (!sna_output)
@@ -1686,7 +1686,6 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 
 	sna_output->output_id = mode->mode_res->connectors[num];
 	sna_output->mode_output = koutput;
-	sna_output->mode_encoder = kencoder;
 	sna_output->mode = mode;
 
 	output->mm_width = koutput->mmWidth;
@@ -1698,8 +1697,8 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	if (is_panel(koutput->connector_type))
 		sna_output_backlight_init(output);
 
-	output->possible_crtcs = kencoder->possible_crtcs;
-	output->possible_clones = kencoder->possible_clones;
+	output->possible_crtcs = enc.possible_crtcs;
+	output->possible_clones = enc.possible_clones;
 	output->interlaceAllowed = TRUE;
 
 	sna_output->output = output;
@@ -1711,8 +1710,6 @@ cleanup_output:
 	xf86OutputDestroy(output);
 cleanup_connector:
 	drmModeFreeConnector(koutput);
-cleanup_encoder:
-	drmModeFreeEncoder(kencoder);
 }
 
 struct sna_visit_set_pixmap_window {
commit b4b6fa795201379694a03d537064dbca446cfdfd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 29 11:32:28 2012 +0100

    sna: Trim the set of includes
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 3372e7e..4bc4bf3 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -34,8 +34,6 @@
 #include "config.h"
 #endif
 
-#include <xf86.h>
-
 #include "sna.h"
 #include "sna_reg.h"
 #include "sna_render.h"
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index b4d9203..68c1bb7 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -34,8 +34,6 @@
 #include "config.h"
 #endif
 
-#include <xf86.h>
-
 #include "sna.h"
 #include "sna_reg.h"
 #include "sna_render.h"
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index f3b7537..d9068de 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -34,8 +34,6 @@
 #include "config.h"
 #endif
 
-#include <xf86.h>
-
 #include "sna.h"
 #include "sna_reg.h"
 #include "sna_render.h"
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 9eed660..3f31437 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -34,8 +34,6 @@
 #include "config.h"
 #endif
 
-#include <xf86.h>
-
 #include "sna.h"
 #include "sna_reg.h"
 #include "sna_render.h"
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index a999441..8587936 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -39,6 +39,8 @@
 #include <errno.h>
 #include <fcntl.h>
 
+#include <xf86drm.h>
+
 #ifdef HAVE_VALGRIND
 #include <valgrind.h>
 #include <memcheck.h>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index b4f2ba4..d9fd9d1 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -45,18 +45,15 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "compiler.h"
 
-#include <xf86_OSproc.h>
-#include <xf86Pci.h>
-#include <xf86Cursor.h>
-#include <xf86xv.h>
 #include <xf86Crtc.h>
-#include <xf86RandR12.h>
+#include <windowstr.h>
+#include <glyphstr.h>
+#include <picturestr.h>
 #include <gcstruct.h>
 
 #include <xorg-server.h>
 #include <pciaccess.h>
 
-#include <xf86drm.h>
 #include <xf86drmMode.h>
 
 #include "../compat-api.h"
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 3ec2d23..ae0030d 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -40,7 +40,8 @@
 #include <xorgVersion.h>
 #include <X11/Xatom.h>
 #include <X11/extensions/dpmsconst.h>
-#include <xf86DDC.h>
+#include <xf86drm.h>
+#include <xf86DDC.h> /* for xf86InterpretEDID */
 
 #include "sna.h"
 #include "sna_reg.h"
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 59de4e2..c74ecc4 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -36,17 +36,16 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "config.h"
 #endif
 
-#include <xf86.h>
-#include <xf86_OSproc.h>
 #include <errno.h>
 #include <string.h>
 
-#include <i915_drm.h>
-#include <dri2.h>
-
 #include "sna.h"
 #include "sna_reg.h"
 
+#include <xf86drm.h>
+#include <i915_drm.h>
+#include <dri2.h>
+
 #if DRI2INFOREC_VERSION <= 2
 #error DRI2 version supported by the Xserver is too old
 #endif
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index af8bfe9..10f4421 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -46,6 +46,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <errno.h>
 
 #include <xf86cmap.h>
+#include <xf86drm.h>
 #include <micmap.h>
 #include <fb.h>
 
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 9c49281..8764796 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -3,6 +3,8 @@
 
 #include "compiler.h"
 
+#include <picturestr.h>
+
 #define GRADIENT_CACHE_SIZE 16
 
 struct sna;
diff --git a/src/sna/sna_transform.c b/src/sna/sna_transform.c
index 3cd9b07..644d404 100644
--- a/src/sna/sna_transform.c
+++ b/src/sna/sna_transform.c
@@ -31,7 +31,6 @@
 #include "config.h"
 #endif
 
-#include "xf86.h"
 #include "sna.h"
 
 /**
diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
index 687fbe1..7bfc971 100644
--- a/src/sna/sna_video.h
+++ b/src/sna/sna_video.h
@@ -27,8 +27,8 @@ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #ifndef SNA_VIDEO_H
 #define SNA_VIDEO_H
 
-#include <xf86.h>
 #include <xf86_OSproc.h>
+#include <xf86xv.h>
 #include <fourcc.h>
 
 #if defined(XvMCExtension) && defined(ENABLE_XVMC)
commit 9d1a9e666763a3e1270c8f000b1b37a6b926441f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 20:06:35 2012 +0100

    sna: Bump experimental ioctl number for vmap
    
    Gazumped!
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index af5b4b9..a999441 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -82,7 +82,7 @@ search_linear_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
 #define IS_VMAP_MAP(ptr) ((uintptr_t)(ptr) & 2)
 
 #if defined(USE_VMAP) && !defined(I915_PARAM_HAS_VMAP)
-#define DRM_I915_GEM_VMAP       0x2c
+#define DRM_I915_GEM_VMAP       0x2d
 #define DRM_IOCTL_I915_GEM_VMAP DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_VMAP, struct drm_i915_gem_vmap)
 #define I915_PARAM_HAS_VMAP              19
 struct drm_i915_gem_vmap {
commit 55e6f5f220401318529e81f7c96fe0af3b893a0c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 16:21:09 2012 +0100

    sna: Use the local function for turning the cursor off prior to release
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 5d84578..3ec2d23 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -915,7 +915,7 @@ sna_crtc_destroy(xf86CrtcPtr crtc)
 	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = crtc->driver_private;
 
-	drmModeSetCursor(sna->kgem.fd, crtc_id(sna_crtc), 0, 64, 64);
+	sna_crtc_hide_cursor(crtc);
 	gem_close(sna->kgem.fd, sna_crtc->cursor);
 
 	list_del(&sna_crtc->link);
commit 77dd429222922aa1ba7f283553e11e60e4d5c496
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 14:40:23 2012 +0100

    sna/dri: Make WAIT_VBLANK valgrind clean
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 2ce4e40..59de4e2 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -686,6 +686,11 @@ sna_dri_copy_region(DrawablePtr draw,
 	copy(sna, draw, region, dst, src, false);
 }
 
+static inline int sna_wait_vblank(struct sna *sna, drmVBlank *vbl)
+{
+	return drmIoctl(sna->kgem.fd, DRM_IOCTL_WAIT_VBLANK, vbl);
+}
+
 #if DRI2INFOREC_VERSION >= 4
 
 static int
@@ -1080,6 +1085,7 @@ static void sna_dri_vblank_handle(int fd,
 			if (kgem_bo_is_busy(info->bo)) {
 				drmVBlank vbl;
 
+				VG_CLEAR(vbl);
 				vbl.request.type =
 					DRM_VBLANK_RELATIVE |
 					DRM_VBLANK_EVENT;
@@ -1087,7 +1093,7 @@ static void sna_dri_vblank_handle(int fd,
 					vbl.request.type |= DRM_VBLANK_SECONDARY;
 				vbl.request.sequence = 1;
 				vbl.request.signal = (unsigned long)info;
-				if (!drmWaitVBlank(sna->kgem.fd, &vbl))
+				if (!sna_wait_vblank(sna, &vbl))
 					return;
 			}
 		}
@@ -1332,6 +1338,8 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	     (long long)divisor,
 	     (long long)remainder));
 
+	VG_CLEAR(vbl);
+
 	/* XXX In theory we can just exchange pixmaps.... */
 	pipe = sna_dri_get_pipe(draw);
 	if (pipe == -1)
@@ -1435,7 +1443,7 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		if (pipe > 0)
 			vbl.request.type |= DRM_VBLANK_SECONDARY;
 		vbl.request.sequence = 0;
-		if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
+		if (sna_wait_vblank(sna, &vbl)) {
 			sna_dri_frame_event_info_free(info);
 			return FALSE;
 		}
@@ -1491,7 +1499,7 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		/* Account for 1 frame extra pageflip delay */
 		vbl.request.sequence -= 1;
 		vbl.request.signal = (unsigned long)info;
-		if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
+		if (sna_wait_vblank(sna, &vbl)) {
 			sna_dri_frame_event_info_free(info);
 			return FALSE;
 		}
@@ -1559,6 +1567,8 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		goto blit_fallback;
 	}
 
+	VG_CLEAR(vbl);
+
 	/* Truncate to match kernel interfaces; means occasional overflow
 	 * misses, but that's generally not a big deal */
 	*target_msc &= 0xffffffff;
@@ -1607,7 +1617,7 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 				vbl.request.type |= DRM_VBLANK_SECONDARY;
 			vbl.request.sequence = 0;
 			vbl.request.signal = (unsigned long)info;
-			if (drmWaitVBlank(sna->kgem.fd, &vbl) == 0)
+			if (sna_wait_vblank(sna, &vbl) == 0)
 				return TRUE;
 		}
 
@@ -1621,7 +1631,7 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	if (pipe > 0)
 		vbl.request.type |= DRM_VBLANK_SECONDARY;
 	vbl.request.sequence = 0;
-	if (drmWaitVBlank(sna->kgem.fd, &vbl))
+	if (sna_wait_vblank(sna, &vbl))
 		goto blit_fallback;
 
 	current_msc = vbl.reply.sequence;
@@ -1648,7 +1658,7 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 			 vbl.request.type |= DRM_VBLANK_SECONDARY;
 		 vbl.request.sequence = *target_msc;
 		 vbl.request.signal = (unsigned long)info;
-		 if (drmWaitVBlank(sna->kgem.fd, &vbl))
+		 if (sna_wait_vblank(sna, &vbl))
 			 goto blit_fallback;
 
 		 return TRUE;
@@ -1683,7 +1693,7 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	vbl.request.sequence -= 1;
 
 	vbl.request.signal = (unsigned long)info;
-	if (drmWaitVBlank(sna->kgem.fd, &vbl))
+	if (sna_wait_vblank(sna, &vbl))
 		goto blit_fallback;
 
 	*target_msc = vbl.reply.sequence;
@@ -1849,20 +1859,14 @@ sna_dri_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
 		return TRUE;
 	}
 
+	VG_CLEAR(vbl);
+
 	vbl.request.type = DRM_VBLANK_RELATIVE;
 	if (pipe > 0)
 		vbl.request.type |= DRM_VBLANK_SECONDARY;
 	vbl.request.sequence = 0;
 
-	if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
-		static int limit = 5;
-		if (limit) {
-			xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
-				   "%s:%d get vblank counter failed: %s\n",
-				   __FUNCTION__, __LINE__,
-				   strerror(errno));
-			limit--;
-		}
+	if (sna_wait_vblank(sna, &vbl)) {
 		DBG(("%s: failed on pipe %d\n", __FUNCTION__, pipe));
 		return FALSE;
 	}
@@ -1906,22 +1910,15 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 	if (pipe == -1)
 		goto out_complete;
 
+	VG_CLEAR(vbl);
+
 	/* Get current count */
 	vbl.request.type = DRM_VBLANK_RELATIVE;
 	if (pipe > 0)
 		vbl.request.type |= DRM_VBLANK_SECONDARY;
 	vbl.request.sequence = 0;
-	if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
-		static int limit = 5;
-		if (limit) {
-			xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
-				   "%s:%d get vblank counter failed: %s\n",
-				   __FUNCTION__, __LINE__,
-				   strerror(errno));
-			limit--;
-		}
+	if (sna_wait_vblank(sna, &vbl))
 		goto out_complete;
-	}
 
 	current_msc = vbl.reply.sequence;
 
@@ -1961,17 +1958,8 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 			vbl.request.type |= DRM_VBLANK_SECONDARY;
 		vbl.request.sequence = target_msc;
 		vbl.request.signal = (unsigned long)info;
-		if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
-			static int limit = 5;
-			if (limit) {
-				xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
-					   "%s:%d get vblank counter failed: %s\n",
-					   __FUNCTION__, __LINE__,
-					   strerror(errno));
-				limit--;
-			}
+		if (sna_wait_vblank(sna, &vbl))
 			goto out_free_info;
-		}
 
 		info->frame = vbl.reply.sequence;
 		DRI2BlockClient(client, draw);
@@ -1998,17 +1986,8 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 		vbl.request.sequence += divisor;
 
 	vbl.request.signal = (unsigned long)info;
-	if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
-		static int limit = 5;
-		if (limit) {
-			xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
-				   "%s:%d get vblank counter failed: %s\n",
-				   __FUNCTION__, __LINE__,
-				   strerror(errno));
-			limit--;
-		}
+	if (sna_wait_vblank(sna, &vbl))
 		goto out_free_info;
-	}
 
 	info->frame = vbl.reply.sequence;
 	DRI2BlockClient(client, draw);
commit 8ebe84818ab70e662a9bb3f232b4664ff40ac375
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 14:27:46 2012 +0100

    sna: Make sna_copy_fbcon() valgrind clean
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index e0b9ee5..5d84578 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -554,7 +554,7 @@ sna_crtc_dpms(xf86CrtcPtr crtc, int mode)
 }
 
 static struct kgem_bo *sna_create_bo_for_fbcon(struct sna *sna,
-					       drmModeFBPtr fbcon)
+					       const struct drm_mode_fb_cmd *fbcon)
 {
 	struct drm_gem_flink flink;
 	struct kgem_bo *bo;
@@ -584,7 +584,7 @@ static struct kgem_bo *sna_create_bo_for_fbcon(struct sna *sna,
 void sna_copy_fbcon(struct sna *sna)
 {
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
-	drmModeFBPtr fbcon;
+	struct drm_mode_fb_cmd fbcon;
 	PixmapPtr scratch;
 	struct sna_pixmap *priv;
 	struct kgem_bo *bo;
@@ -600,22 +600,27 @@ void sna_copy_fbcon(struct sna *sna)
 	DBG(("%s\n", __FUNCTION__));
 
 	/* Scan the connectors for a framebuffer and assume that is the fbcon */
-	fbcon = NULL;
-	for (i = 0; fbcon == NULL && i < xf86_config->num_crtc; i++) {
+	VG_CLEAR(fbcon);
+	fbcon.fb_id = 0;
+	for (i = 0; i < xf86_config->num_crtc; i++) {
 		struct sna_crtc *crtc = xf86_config->crtc[i]->driver_private;
-		drmModeCrtcPtr mode_crtc;
+		struct drm_mode_crtc mode;
 
-		mode_crtc = drmModeGetCrtc(sna->kgem.fd,
-					   sna->mode.mode_res->crtcs[crtc->num]);
-		if (mode_crtc == NULL)
+		VG_CLEAR(mode);
+		mode.crtc_id = crtc->id;
+		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETCRTC, &mode))
+			continue;
+		if (!mode.fb_id)
 			continue;
 
-		if (mode_crtc->buffer_id)
-			fbcon = drmModeGetFB(sna->kgem.fd,
-					     mode_crtc->buffer_id);
-		drmModeFreeCrtc(mode_crtc);
+		fbcon.fb_id = mode.fb_id;
+		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETFB, &fbcon)) {
+			fbcon.fb_id = 0;
+			continue;
+		}
+		break;
 	}
-	if (fbcon == NULL) {
+	if (fbcon.fb_id == 0) {
 		DBG(("%s: no fbcon found\n", __FUNCTION__));
 		return;
 	}
@@ -625,17 +630,17 @@ void sna_copy_fbcon(struct sna *sna)
 	 * across a depth change upon starting X.
 	 */
 	scratch = GetScratchPixmapHeader(sna->scrn->pScreen,
-					fbcon->width, fbcon->height,
-					fbcon->depth, fbcon->bpp,
+					fbcon.width, fbcon.height,
+					fbcon.depth, fbcon.bpp,
 					0, NULL);
 	if (scratch == NullPixmap)
-		goto cleanup_fbcon;
+		return;
 
 	box.x1 = box.y1 = 0;
-	box.x2 = min(fbcon->width, sna->front->drawable.width);
-	box.y2 = min(fbcon->height, sna->front->drawable.height);
+	box.x2 = min(fbcon.width, sna->front->drawable.width);
+	box.y2 = min(fbcon.height, sna->front->drawable.height);
 
-	bo = sna_create_bo_for_fbcon(sna, fbcon);
+	bo = sna_create_bo_for_fbcon(sna, &fbcon);
 	if (bo == NULL)
 		goto cleanup_scratch;
 
@@ -645,14 +650,14 @@ void sna_copy_fbcon(struct sna *sna)
 	assert(priv && priv->gpu_bo);
 
 	sx = dx = 0;
-	if (box.x2 < (uint16_t)fbcon->width)
-		sx = (fbcon->width - box.x2) / 2.;
+	if (box.x2 < (uint16_t)fbcon.width)
+		sx = (fbcon.width - box.x2) / 2.;
 	if (box.x2 < sna->front->drawable.width)
 		dx = (sna->front->drawable.width - box.x2) / 2.;
 
 	sy = dy = 0;
-	if (box.y2 < (uint16_t)fbcon->height)
-		sy = (fbcon->height - box.y2) / 2.;
+	if (box.y2 < (uint16_t)fbcon.height)
+		sy = (fbcon.height - box.y2) / 2.;
 	if (box.y2 < sna->front->drawable.height)
 		dy = (sna->front->drawable.height - box.y2) / 2.;
 
@@ -669,8 +674,6 @@ void sna_copy_fbcon(struct sna *sna)
 
 cleanup_scratch:
 	FreeScratchPixmapHeader(scratch);
-cleanup_fbcon:
-	drmModeFreeFB(fbcon);
 }
 
 static void update_flush_interval(struct sna *sna)
commit f37dae734ebac5c0ed2d6f50fc92bc107f4e4a33
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 14:20:54 2012 +0100

    sna: Just use the CRTC id from the array
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 8ca8efb..e0b9ee5 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -971,7 +971,6 @@ static void
 sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 {
 	struct sna *sna = to_sna(scrn);
-	drmModeCrtcPtr mode_crtc;
 	xf86CrtcPtr crtc;
 	struct sna_crtc *sna_crtc;
 	struct drm_i915_get_pipe_from_crtc_id get_pipe;
@@ -983,10 +982,7 @@ sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 		return;
 
 	sna_crtc->num = num;
-
-	mode_crtc = drmModeGetCrtc(sna->kgem.fd, mode->mode_res->crtcs[num]);
-	sna_crtc->id = mode_crtc->crtc_id;
-	drmModeFreeCrtc(mode_crtc);
+	sna_crtc->id = mode->mode_res->crtcs[num];
 
 	VG_CLEAR(get_pipe);
 	get_pipe.pipe = 0;
commit b1f24a0eae4bb0081ff7469a2aee63a1f32140f7
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 14:16:03 2012 +0100

    sna: Make sna_crtc_apply() valgrind clean
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 9aade61..8ca8efb 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -54,7 +54,7 @@
 
 struct sna_crtc {
 	struct sna *sna;
-	drmModeModeInfo kmode;
+	struct drm_mode_modeinfo kmode;
 	PixmapPtr shadow;
 	uint32_t shadow_fb_id;
 	uint32_t cursor;
@@ -371,7 +371,7 @@ mode_from_kmode(ScrnInfoPtr scrn,
 }
 
 static void
-mode_to_kmode(drmModeModeInfoPtr kmode, DisplayModePtr mode)
+mode_to_kmode(struct drm_mode_modeinfo *kmode, DisplayModePtr mode)
 {
 	memset(kmode, 0, sizeof(*kmode));
 
@@ -415,6 +415,7 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 	struct sna_crtc *sna_crtc = crtc->driver_private;
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
 	struct sna_mode *mode = &sna->mode;
+	struct drm_mode_crtc arg;
 	uint32_t output_ids[16];
 	int output_count = 0;
 	int fb_id, x, y;
@@ -468,9 +469,16 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 	     fb_id, sna_crtc->shadow_fb_id ? " [shadow]" : "",
 	     output_count));
 
-	ret = drmModeSetCrtc(sna->kgem.fd, crtc_id(sna_crtc),
-			     fb_id, x, y, output_ids, output_count,
-			     &sna_crtc->kmode);
+	VG_CLEAR(arg);
+	arg.x = x;
+	arg.y = y;
+	arg.crtc_id = sna_crtc->id;
+	arg.fb_id = fb_id;
+	arg.set_connectors_ptr = (uintptr_t)output_ids;
+	arg.count_connectors = output_count;
+	arg.mode = sna_crtc->kmode;
+	arg.mode_valid = 1;
+	ret = drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETCRTC, &arg);
 	if (ret) {
 		xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
 			   "failed to set mode: %s\n", strerror(-ret));
commit 0ebfcdbb80245f98c0c7ef9f090a2be6900fb457
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 14:10:04 2012 +0100

    sna: Make AddFB valgrind clean
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 2d6cba4..9aade61 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -157,6 +157,7 @@ static unsigned get_fb(struct sna *sna, struct kgem_bo *bo,
 		       int width, int height)
 {
 	ScrnInfoPtr scrn = sna->scrn;
+	struct drm_mode_fb_cmd arg;
 	int ret;
 
 	assert(bo->proxy == NULL);
@@ -170,21 +171,25 @@ static unsigned get_fb(struct sna *sna, struct kgem_bo *bo,
 	     __FUNCTION__, width, height, scrn->depth, scrn->bitsPerPixel));
 
 	assert(bo->tiling != I915_TILING_Y);
-	ret = drmModeAddFB(sna->kgem.fd,
-			   width, height,
-			   scrn->depth, scrn->bitsPerPixel,
-			   bo->pitch, bo->handle,
-			   &bo->delta);
-	if (ret < 0) {
-		ErrorF("%s: failed to add fb: %dx%d depth=%d, bpp=%d, pitch=%d\n",
-		       __FUNCTION__,
-		       width, height,
-		       scrn->depth, scrn->bitsPerPixel, bo->pitch);
+
+	VG_CLEAR(arg);
+	arg.width = width;
+	arg.height = height;
+	arg.pitch = bo->pitch;
+	arg.bpp = scrn->bitsPerPixel;
+	arg.depth = scrn->depth;
+	arg.handle = bo->handle;
+
+	if ((ret = drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_ADDFB, &arg))) {
+		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+			   "%s: failed to add fb: %dx%d depth=%d, bpp=%d, pitch=%d: %d\n",
+			   __FUNCTION__, width, height,
+			   scrn->depth, scrn->bitsPerPixel, bo->pitch, ret);
 		return 0;
 	}
 
 	bo->scanout = true;
-	return bo->delta;
+	return bo->delta = arg.fb_id;
 }
 
 static uint32_t gem_create(int fd, int size)
commit 32ca3c7b65516b0bd48b0d0979b086ee1580167a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 14:02:11 2012 +0100

    sna: Make sna_crtc_is_bound() valgrind clean
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index ec0e03d..2d6cba4 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -393,6 +393,7 @@ bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc)
 {
 	struct drm_mode_crtc mode;
 
+	VG_CLEAR(mode);
 	mode.crtc_id = crtc_id(crtc->driver_private);
 	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETCRTC, &mode))
 		return false;
commit 7973f6751c9bf565dee4c89aa3e1badbcc45018f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 14:00:55 2012 +0100

    sna: Add a little bit more verbosity to cursor routines for valgrind
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index a218d83..ec0e03d 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -748,54 +748,78 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 }
 
 static void
-sna_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
+sna_crtc_hide_cursor(xf86CrtcPtr crtc)
 {
+	struct sna *sna = to_sna(crtc->scrn);
+	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct drm_mode_cursor arg;
+
+	DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
+
+	VG_CLEAR(arg);
+	arg.flags = DRM_MODE_CURSOR_BO;
+	arg.crtc_id = sna_crtc->id;
+	arg.width = arg.height = 64;
+	arg.handle = 0;
 
+	drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
 static void
-sna_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
+sna_crtc_show_cursor(xf86CrtcPtr crtc)
 {
 	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct drm_mode_cursor arg;
+
+	DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
 
-	drmModeMoveCursor(sna->kgem.fd, crtc_id(sna_crtc), x, y);
+	VG_CLEAR(arg);
+	arg.flags = DRM_MODE_CURSOR_BO;
+	arg.crtc_id = sna_crtc->id;
+	arg.width = arg.height = 64;
+	arg.handle = sna_crtc->cursor;
+
+	drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
 static void
-sna_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
+sna_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
 {
-	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
-	struct drm_i915_gem_pwrite pwrite;
-
-	VG_CLEAR(pwrite);
-	pwrite.handle = sna_crtc->cursor;
-	pwrite.offset = 0;
-	pwrite.size = 64*64*4;
-	pwrite.data_ptr = (uintptr_t)image;
-	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite);
 }
 
 static void
-sna_crtc_hide_cursor(xf86CrtcPtr crtc)
+sna_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
 {
 	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct drm_mode_cursor arg;
 
-	DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
-	drmModeSetCursor(sna->kgem.fd, crtc_id(sna_crtc), 0, 64, 64);
+	DBG(("%s: CRTC:%d (%d, %d)\n", __FUNCTION__, crtc_id(sna_crtc), x, y));
+
+	VG_CLEAR(arg);
+	arg.flags = DRM_MODE_CURSOR_MOVE;
+	arg.crtc_id = sna_crtc->id;
+	arg.x = x;
+	arg.y = y;
+	arg.handle = sna_crtc->cursor;
+
+	drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
 static void
-sna_crtc_show_cursor(xf86CrtcPtr crtc)
+sna_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
 {
 	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct drm_i915_gem_pwrite pwrite;
 
-	DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
-	drmModeSetCursor(sna->kgem.fd, crtc_id(sna_crtc),
-			 sna_crtc->cursor, 64, 64);
+	VG_CLEAR(pwrite);
+	pwrite.handle = sna_crtc->cursor;
+	pwrite.offset = 0;
+	pwrite.size = 64*64*4;
+	pwrite.data_ptr = (uintptr_t)image;
+	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite);
 }
 
 static void *
commit 19c463e52df919fc75de7e420fd3565f0e9a0576
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 12:54:35 2012 +0100

    sna: Only wait if there is a suitable active buffer
    
    There is not point repeating the search after retiring if we know that
    there is no outstanding suitable active buffer.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 0ef160c..af5b4b9 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2837,7 +2837,9 @@ search_inactive:
 		return bo;
 	}
 
-	if (flags & CREATE_INACTIVE && __kgem_throttle_retire(kgem, flags)) {
+	if (flags & CREATE_INACTIVE &&
+	    !list_is_empty(&kgem->active[bucket][tiling]) &&
+	    __kgem_throttle_retire(kgem, flags)) {
 		flags &= ~CREATE_INACTIVE;
 		goto search_inactive;
 	}
commit 5b99c7cd340f782d3057d4257865c5feb96b71f0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 10:55:49 2012 +0100

    uxa/dri: Enable vblank scheduling even with pageflipping disabled
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_dri.c b/src/intel_dri.c
index 34d00b6..3261e54 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -1685,15 +1685,13 @@ Bool I830DRI2ScreenInit(ScreenPtr screen)
 
 	info.CopyRegion = I830DRI2CopyRegion;
 #if DRI2INFOREC_VERSION >= 4
-	if (intel->use_pageflipping) {
-	    info.version = 4;
-	    info.ScheduleSwap = I830DRI2ScheduleSwap;
-	    info.GetMSC = I830DRI2GetMSC;
-	    info.ScheduleWaitMSC = I830DRI2ScheduleWaitMSC;
-	    info.numDrivers = 1;
-	    info.driverNames = driverNames;
-	    driverNames[0] = info.driverName;
-	}
+	info.version = 4;
+	info.ScheduleSwap = I830DRI2ScheduleSwap;
+	info.GetMSC = I830DRI2GetMSC;
+	info.ScheduleWaitMSC = I830DRI2ScheduleWaitMSC;
+	info.numDrivers = 1;
+	info.driverNames = driverNames;
+	driverNames[0] = info.driverName;
 #endif
 
 	return DRI2ScreenInit(screen, &info);
commit 810357ad65d551ec5d35dbf228f1b62fe235801f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 10:12:38 2012 +0100

    uxa/dri: Fix ordering of setting vs using swap members
    
    Trivial readibility fix, as the actual ordering is serialised through
    there being only a single thread.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_dri.c b/src/intel_dri.c
index 36e96ff..34d00b6 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -933,12 +933,12 @@ I830DRI2ScheduleFlip(struct intel_screen_private *intel,
 	int tmp_name;
 
 	if (!intel->use_triple_buffer) {
+		info->type = DRI2_SWAP;
 		if (!intel_do_pageflip(intel,
 				       intel_get_pixmap_bo(priv->pixmap),
 				       info, info->pipe))
 			return FALSE;
 
-		info->type = DRI2_SWAP;
 		I830DRI2ExchangeBuffers(intel, info->front, info->back);
 		return TRUE;
 	}
commit 2b56a188ef2c48f82572eca2201a3a0ecf6b4f45
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 10:01:09 2012 +0100

    Mark another couple of options as being UXA only.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_options.c b/src/intel_options.c
index 80572be..56929be 100644
--- a/src/intel_options.c
+++ b/src/intel_options.c
@@ -7,9 +7,7 @@ const OptionInfoRec intel_options[] = {
 	{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	0},
 	{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	1},
 	{OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	0},
-	{OPTION_SHADOW,	"Shadow",	OPTV_BOOLEAN,	{0},	0},
 	{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	1},
-	{OPTION_TRIPLE_BUFFER, "TripleBuffer", OPTV_BOOLEAN,	{0},	1},
 #ifdef INTEL_XVMC
 	{OPTION_XVMC,	"XvMC",		OPTV_BOOLEAN,	{0},	1},
 #endif
@@ -26,8 +24,10 @@ const OptionInfoRec intel_options[] = {
 	{OPTION_DELAYED_FLUSH,	"DelayedFlush",	OPTV_BOOLEAN,	{0},	1},
 #endif
 #ifdef USE_UXA
-	{OPTION_FALLBACKDEBUG, "FallbackDebug", OPTV_BOOLEAN, {0},	0},
-	{OPTION_BUFFER_CACHE,       "BufferCache",  OPTV_BOOLEAN,   {0},    1},
+	{OPTION_FALLBACKDEBUG,	"FallbackDebug",OPTV_BOOLEAN,	{0},	0},
+	{OPTION_BUFFER_CACHE,	"BufferCache",	OPTV_BOOLEAN,   {0},    1},
+	{OPTION_SHADOW,		"Shadow",	OPTV_BOOLEAN,	{0},	0},
+	{OPTION_TRIPLE_BUFFER,	"TripleBuffer", OPTV_BOOLEAN,	{0},	1},
 #endif
 	{-1,			NULL,		OPTV_NONE,	{0},	0}
 };
commit b025f1a604dbbbd456a23f330ceed5f97ecdffcf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 09:48:49 2012 +0100

    sna/dri: Tweak vblank_mode=n swapbuffers to account for throttle delay
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 0f582b5..2ce4e40 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1665,26 +1665,22 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		     (int)*target_msc,
 		     (int)divisor));
 
-	vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
-	vbl.request.type |= DRM_VBLANK_NEXTONMISS;
+	vbl.request.type =
+		DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | DRM_VBLANK_NEXTONMISS;
 	if (pipe > 0)
 		vbl.request.type |= DRM_VBLANK_SECONDARY;
 
 	vbl.request.sequence = current_msc - current_msc % divisor + remainder;
-
 	/*
 	 * If the calculated deadline vbl.request.sequence is smaller than
 	 * or equal to current_msc, it means we've passed the last point
 	 * when effective onset frame seq could satisfy
 	 * seq % divisor == remainder, so we need to wait for the next time
 	 * this will happen.
-	 *
-	 * This comparison takes the 1 frame swap delay in pageflipping mode
-	 * into account, as well as a potential DRM_VBLANK_NEXTONMISS delay
-	 * if we are blitting/exchanging instead of flipping.
 	 */
-	if (vbl.request.sequence <= current_msc)
+	if (vbl.request.sequence < current_msc)
 		vbl.request.sequence += divisor;
+	vbl.request.sequence -= 1;
 
 	vbl.request.signal = (unsigned long)info;
 	if (drmWaitVBlank(sna->kgem.fd, &vbl))
commit 45148a714f1461fff898aeb393ad225f081b9bd5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 09:39:51 2012 +0100

    sna/dri: Enable handling for Option "SwapBuffersWait"
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 92614d0..b4f2ba4 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -208,6 +208,8 @@ struct sna {
 	unsigned flags;
 #define SNA_NO_THROTTLE		0x1
 #define SNA_NO_DELAYED_FLUSH	0x2
+#define SNA_NO_WAIT		0x4
+#define SNA_NO_FLIP		0x8
 
 	unsigned watch_flush;
 	unsigned flush;
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index ee509c0..0f582b5 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -448,7 +448,8 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 			return NULL;
 		}
 
-		if (pixmap == sna->front && sync) {
+		if (pixmap == sna->front && sync &&
+		    (sna->flags & SNA_NO_WAIT) == 0) {
 			BoxRec crtc_box;
 
 			crtc = sna_covering_crtc(sna->scrn, &region->extents,
@@ -952,6 +953,11 @@ can_flip(struct sna * sna,
 		return FALSE;
 	}
 
+	if (sna->flags & SNA_NO_FLIP) {
+		DBG(("%s: no, pageflips disabled\n", __FUNCTION__));
+		return FALSE;
+	}
+
 	if (front->format != back->format) {
 		DBG(("%s: no, format mismatch, front = %d, back = %d\n",
 		     __FUNCTION__, front->format, back->format));
@@ -1591,21 +1597,22 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 						 get_private(front)->bo,
 						 get_private(back)->bo,
 						 true);
-
-		info->type = DRI2_SWAP_THROTTLE;
-		vbl.request.type =
-			DRM_VBLANK_RELATIVE |
-			DRM_VBLANK_NEXTONMISS |
-			DRM_VBLANK_EVENT;
-		if (pipe > 0)
-			vbl.request.type |= DRM_VBLANK_SECONDARY;
-		vbl.request.sequence = 0;
-		vbl.request.signal = (unsigned long)info;
-		if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
-			sna_dri_frame_event_info_free(info);
-			DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
+		if ((sna->flags & SNA_NO_WAIT) == 0) {
+			info->type = DRI2_SWAP_THROTTLE;
+			vbl.request.type =
+				DRM_VBLANK_RELATIVE |
+				DRM_VBLANK_NEXTONMISS |
+				DRM_VBLANK_EVENT;
+			if (pipe > 0)
+				vbl.request.type |= DRM_VBLANK_SECONDARY;
+			vbl.request.sequence = 0;
+			vbl.request.signal = (unsigned long)info;
+			if (drmWaitVBlank(sna->kgem.fd, &vbl) == 0)
+				return TRUE;
 		}
 
+		sna_dri_frame_event_info_free(info);
+		DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
 		return TRUE;
 	}
 
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 39e67c4..af8bfe9 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -62,6 +62,11 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <sys/poll.h>
 #include "i915_drm.h"
 
+#ifdef HAVE_VALGRIND
+#include <valgrind.h>
+#include <memcheck.h>
+#endif
+
 #if HAVE_DOT_GIT
 #include "git_version.h"
 #endif
@@ -372,6 +377,23 @@ static void sna_selftest(void)
 	sna_damage_selftest();
 }
 
+static bool has_pageflipping(struct sna *sna)
+{
+	drm_i915_getparam_t gp;
+	int v;
+
+	if (sna->flags & SNA_NO_WAIT)
+		return false;
+
+	VG_CLEAR(gp);
+	gp.param = I915_PARAM_HAS_PAGEFLIPPING;
+	gp.value = &v;
+	drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GETPARAM, &gp);
+
+	VG(VALGRIND_MAKE_MEM_DEFINED(&v, sizeof(v)));
+	return v > 0;
+}
+
 /**
  * This is called before ScreenInit to do any require probing of screen
  * configuration.
@@ -500,6 +522,10 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 		sna->flags |= SNA_NO_THROTTLE;
 	if (!xf86ReturnOptValBool(sna->Options, OPTION_DELAYED_FLUSH, TRUE))
 		sna->flags |= SNA_NO_DELAYED_FLUSH;
+	if (!xf86ReturnOptValBool(sna->Options, OPTION_SWAPBUFFERS_WAIT, TRUE))
+		sna->flags |= SNA_NO_WAIT;
+	if (!has_pageflipping(sna))
+		sna->flags |= SNA_NO_FLIP;
 
 	xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Framebuffer %s\n",
 		   sna->tiling & SNA_TILING_FB ? "tiled" : "linear");
commit c709f2447dfc6dc36c50ff741d5d9bbdc7c03b58
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 08:17:21 2012 +0100

    sna/dri: Requeue vblank throttling until the vsync'ed copy completes
    
    If the GPU is busy, then we may not actually schedule our copy for
    several vblanks, resulting in us falsely reporting that the work
    completed too early and allowing the client to continue scheduling more
    work and racing ahead of the queued copies.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 9d2fd99..0ef160c 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1382,17 +1382,18 @@ static bool kgem_retire__requests(struct kgem *kgem)
 			}
 		}
 
-		rq->bo->refcnt--;
-		assert(rq->bo->refcnt == 0);
 		assert(rq->bo->rq == NULL);
 		assert(list_is_empty(&rq->bo->request));
-		if (kgem_bo_set_purgeable(kgem, rq->bo)) {
-			kgem_bo_move_to_inactive(kgem, rq->bo);
-			retired = true;
-		} else {
-			DBG(("%s: closing %d\n",
-			     __FUNCTION__, rq->bo->handle));
-			kgem_bo_free(kgem, rq->bo);
+
+		if (--rq->bo->refcnt == 0) {
+			if (kgem_bo_set_purgeable(kgem, rq->bo)) {
+				kgem_bo_move_to_inactive(kgem, rq->bo);
+				retired = true;
+			} else {
+				DBG(("%s: closing %d\n",
+				     __FUNCTION__, rq->bo->handle));
+				kgem_bo_free(kgem, rq->bo);
+			}
 		}
 
 		if (kgem->sync == rq)
@@ -4221,3 +4222,17 @@ kgem_replace_bo(struct kgem *kgem,
 
 	return dst;
 }
+
+struct kgem_bo *kgem_get_last_request(struct kgem *kgem)
+{
+	struct kgem_request *rq;
+
+	if (list_is_empty(&kgem->requests))
+		return NULL;
+
+	rq = list_last_entry(&kgem->requests,
+			     struct kgem_request,
+			     list);
+
+	return kgem_bo_reference(rq->bo);
+}
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index fdabfae..bb6bcf2 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -245,6 +245,7 @@ void kgem_bo_set_binding(struct kgem_bo *bo, uint32_t format, uint16_t offset);
 
 void kgem_bo_retire(struct kgem *kgem, struct kgem_bo *bo);
 bool kgem_retire(struct kgem *kgem);
+struct kgem_bo *kgem_get_last_request(struct kgem *kgem);
 
 void _kgem_submit(struct kgem *kgem);
 static inline void kgem_submit(struct kgem *kgem)
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 632c57d..ee509c0 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -90,6 +90,7 @@ struct sna_dri_frame_event {
 	void *event_data;
 	DRI2BufferPtr front;
 	DRI2BufferPtr back;
+	struct kgem_bo *bo;
 
 	unsigned int fe_frame;
 	unsigned int fe_tv_sec;
@@ -395,13 +396,14 @@ static void set_bo(PixmapPtr pixmap, struct kgem_bo *bo)
 	priv->gpu_bo = ref(bo);
 }
 
-static void
+static struct kgem_bo *
 sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 		      struct kgem_bo *dst_bo, struct kgem_bo *src_bo,
 		      bool sync)
 {
 	PixmapPtr pixmap = get_drawable_pixmap(draw);
 	pixman_region16_t clip;
+	struct kgem_bo *bo = NULL;
 	bool flush = false;
 	xf86CrtcPtr crtc;
 	BoxRec box, *boxes;
@@ -421,7 +423,7 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 
 		if (!pixman_region_not_empty(region)) {
 			DBG(("%s: all clipped\n", __FUNCTION__));
-			return;
+			return NULL;
 		}
 	}
 
@@ -443,7 +445,7 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 		pixman_region_intersect(region, &win->clipList, region);
 		if (!pixman_region_not_empty(region)) {
 			DBG(("%s: all clipped\n", __FUNCTION__));
-			return;
+			return NULL;
 		}
 
 		if (pixmap == sna->front && sync) {
@@ -495,6 +497,7 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 	if (flush) { /* STAT! */
 		assert(sna_crtc_is_bound(sna, crtc));
 		kgem_submit(&sna->kgem);
+		bo = kgem_get_last_request(&sna->kgem);
 	}
 
 	pixman_region_translate(region, dx, dy);
@@ -503,6 +506,8 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 
 	if (region == &clip)
 		pixman_region_fini(&clip);
+
+	return bo;
 }
 
 static void
@@ -650,7 +655,7 @@ sna_dri_copy_region(DrawablePtr draw,
 
 	if (dst_buffer->attachment == DRI2BufferFrontLeft) {
 		dst = sna_pixmap_get_bo(pixmap);
-		copy = sna_dri_copy_to_front;
+		copy = (void *)sna_dri_copy_to_front;
 	} else
 		dst = get_private(dst_buffer)->bo;
 
@@ -884,6 +889,9 @@ sna_dri_frame_event_info_free(struct sna_dri_frame_event *info)
 		sna_dri_frame_event_release_bo(&info->sna->kgem,
 					       info->cache.bo);
 
+	if (info->bo)
+		kgem_bo_destroy(&info->sna->kgem, info->bo);
+
 	free(info);
 }
 
@@ -1052,13 +1060,32 @@ static void sna_dri_vblank_handle(int fd,
 		}
 		/* else fall through to blit */
 	case DRI2_SWAP:
-		sna_dri_copy_to_front(sna, draw, NULL,
-				      get_private(info->front)->bo,
-				      get_private(info->back)->bo,
-				      true);
+		info->bo = sna_dri_copy_to_front(sna, draw, NULL,
+						 get_private(info->front)->bo,
+						 get_private(info->back)->bo,
+						 true);
+		info->type = DRI2_SWAP_THROTTLE;
 	case DRI2_SWAP_THROTTLE:
 		DBG(("%s: %d complete, frame=%d tv=%d.%06d\n",
 		     __FUNCTION__, info->type, frame, tv_sec, tv_usec));
+
+		if (info->bo && kgem_bo_is_busy(info->bo)) {
+			kgem_retire(&sna->kgem);
+			if (kgem_bo_is_busy(info->bo)) {
+				drmVBlank vbl;
+
+				vbl.request.type =
+					DRM_VBLANK_RELATIVE |
+					DRM_VBLANK_EVENT;
+				if (info->pipe > 0)
+					vbl.request.type |= DRM_VBLANK_SECONDARY;
+				vbl.request.sequence = 1;
+				vbl.request.signal = (unsigned long)info;
+				if (!drmWaitVBlank(sna->kgem.fd, &vbl))
+					return;
+			}
+		}
+
 		DRI2SwapComplete(info->client,
 				 draw, frame,
 				 tv_sec, tv_usec,
@@ -1560,26 +1587,26 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		DBG(("%s: emitting immediate vsync'ed blit, throttling client\n",
 		     __FUNCTION__));
 
-		 info->type = DRI2_SWAP_THROTTLE;
+		info->bo = sna_dri_copy_to_front(sna, draw, NULL,
+						 get_private(front)->bo,
+						 get_private(back)->bo,
+						 true);
 
-		 vbl.request.type =
-			 DRM_VBLANK_RELATIVE |
-			 DRM_VBLANK_EVENT |
-			 DRM_VBLANK_NEXTONMISS;
-		 if (pipe > 0)
-			 vbl.request.type |= DRM_VBLANK_SECONDARY;
-		 vbl.request.sequence = 0;
-		 vbl.request.signal = (unsigned long)info;
-		 if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
-			 sna_dri_frame_event_info_free(info);
-			 DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
-		 }
-
-		 sna_dri_copy_to_front(sna, draw, NULL,
-				       get_private(front)->bo,
-				       get_private(back)->bo,
-				       true);
-		 return TRUE;
+		info->type = DRI2_SWAP_THROTTLE;
+		vbl.request.type =
+			DRM_VBLANK_RELATIVE |
+			DRM_VBLANK_NEXTONMISS |
+			DRM_VBLANK_EVENT;
+		if (pipe > 0)
+			vbl.request.type |= DRM_VBLANK_SECONDARY;
+		vbl.request.sequence = 0;
+		vbl.request.signal = (unsigned long)info;
+		if (drmWaitVBlank(sna->kgem.fd, &vbl)) {
+			sna_dri_frame_event_info_free(info);
+			DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
+		}
+
+		return TRUE;
 	}
 
 	/* Get current count */
commit 7e73fa02ed361a9c0c08f61d00421671bf10ce9f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 28 08:16:43 2012 +0100

    sna: Add some debugging to show count of outstanding requests during retire
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 00ef82d..9d2fd99 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1306,6 +1306,14 @@ static bool kgem_retire__flushing(struct kgem *kgem)
 				kgem_bo_free(kgem, bo);
 		}
 	}
+#if DEBUG_KGEM
+	{
+		int count = 0;
+		list_for_each_entry(bo, &kgem->flushing, request)
+			count++;
+		ErrorF("%s: %d bo on flushing list\n", __FUNCTION__, count);
+	}
+#endif
 
 	return retired;
 }
@@ -1394,6 +1402,24 @@ static bool kgem_retire__requests(struct kgem *kgem)
 		free(rq);
 	}
 
+#if DEBUG_KGEM
+	{
+		int count = 0;
+
+		list_for_each_entry(bo, &kgem->requests, request)
+			count++;
+
+		bo = NULL;
+		if (!list_is_empty(&kgem->requests))
+			bo = list_first_entry(&kgem->requests,
+					      struct kgem_request,
+					      list)->bo;
+
+		ErrorF("%s: %d outstanding requests, oldest=%d\n",
+		       __FUNCTION__, count, bo ? bo->handle : 0);
+	}
+#endif
+
 	return retired;
 }
 
commit 62b557065edc0555f2bf83b0eed9169329a2f2ba
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun May 27 16:52:51 2012 +0100

    sna: Use magic upload buffers for video textures
    
    So that we may benefit from the caching of buffers and the automatic
    selection  of the preferred upload method.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index 1f6e210..ce1e284 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -196,6 +196,7 @@ sna_video_frame_init(struct sna *sna,
 {
 	int align;
 
+	frame->bo = NULL;
 	frame->id = id;
 	frame->width = width;
 	frame->height = height;
@@ -444,12 +445,9 @@ sna_video_copy_data(struct sna *sna,
 {
 	uint8_t *dst;
 
-	if (frame->bo == NULL)
-		return FALSE;
-
 	DBG(("%s: handle=%d, size=%dx%d, rotation=%d\n",
-	     __FUNCTION__, frame->bo->handle, frame->width, frame->height,
-	     video->rotation));
+	     __FUNCTION__, frame->bo ? frame->bo->handle : 0,
+	     frame->width, frame->height, video->rotation));
 	DBG(("%s: top=%d, left=%d\n", __FUNCTION__, frame->top, frame->left));
 
 	/* In the common case, we can simply the upload in a single pwrite */
@@ -462,10 +460,22 @@ sna_video_copy_data(struct sna *sna,
 			if (pitch[0] == frame->pitch[0] &&
 			    pitch[1] == frame->pitch[1] &&
 			    frame->top == 0 && frame->left == 0) {
-				kgem_bo_write(&sna->kgem, frame->bo,
-					      buf,
-					      pitch[1]*frame->height +
-					      pitch[0]*frame->height);
+				if (frame->bo) {
+					kgem_bo_write(&sna->kgem, frame->bo,
+						      buf,
+						      pitch[1]*frame->height +
+						      pitch[0]*frame->height);
+				} else {
+					frame->bo = kgem_create_buffer(&sna->kgem, frame->size,
+								       KGEM_BUFFER_WRITE | KGEM_BUFFER_WRITE_INPLACE,
+								       (void **)&dst);
+					if (frame->bo == NULL)
+						return FALSE;
+
+					memcpy(dst, buf,
+					       pitch[1]*frame->height +
+					       pitch[0]*frame->height);
+				}
 				if (frame->id != FOURCC_I420) {
 					uint32_t tmp;
 					tmp = frame->VBufOffset;
@@ -476,18 +486,38 @@ sna_video_copy_data(struct sna *sna,
 			}
 		} else {
 			if (frame->width*2 == frame->pitch[0]) {
-				kgem_bo_write(&sna->kgem, frame->bo,
-					      buf + (frame->top * frame->width*2) + (frame->left << 1),
-					      frame->nlines*frame->width*2);
+				if (frame->bo) {
+					kgem_bo_write(&sna->kgem, frame->bo,
+						      buf + (frame->top * frame->width*2) + (frame->left << 1),
+						      frame->nlines*frame->width*2);
+				} else {
+					frame->bo = kgem_create_buffer(&sna->kgem, frame->size,
+								       KGEM_BUFFER_WRITE | KGEM_BUFFER_WRITE_INPLACE,
+								       (void **)&dst);
+					if (frame->bo == NULL)
+						return FALSE;
+
+					memcpy(dst,
+					       buf + (frame->top * frame->width*2) + (frame->left << 1),
+					       frame->nlines*frame->width*2);
+				}
 				return TRUE;
 			}
 		}
 	}
 
 	/* copy data, must use GTT so that we keep the overlay uncached */
-	dst = kgem_bo_map__gtt(&sna->kgem, frame->bo);
-	if (dst == NULL)
-		return FALSE;
+	if (frame->bo) {
+		dst = kgem_bo_map__gtt(&sna->kgem, frame->bo);
+		if (dst == NULL)
+			return FALSE;
+	} else {
+		frame->bo = kgem_create_buffer(&sna->kgem, frame->size,
+					       KGEM_BUFFER_WRITE | KGEM_BUFFER_WRITE_INPLACE,
+					       (void **)&dst);
+		if (frame->bo == NULL)
+			return FALSE;
+	}
 
 	if (is_planar_fourcc(frame->id))
 		sna_copy_planar_data(video, frame, buf, dst);
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index e1806d5..bc117a4 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -273,13 +273,6 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
 
 		assert(kgem_bo_size(frame.bo) >= frame.size);
 	} else {
-		frame.bo = kgem_create_linear(&sna->kgem, frame.size,
-					      CREATE_GTT_MAP);
-		if (frame.bo == NULL) {
-			DBG(("%s: failed to allocate bo\n", __FUNCTION__));
-			return BadAlloc;
-		}
-
 		if (!sna_video_copy_data(sna, video, &frame, buf)) {
 			DBG(("%s: failed to copy frame\n", __FUNCTION__));
 			kgem_bo_destroy(&sna->kgem, frame.bo);
commit 35291d2db813f75fedcdca9920a40592acd3cca3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun May 27 16:54:29 2012 +0100

    sna: Search the inactive bo cache for a mappable upload buffer
    
    See if we have a bo that we can cheaply map to an inplace upload, rather
    than rely on an existing GTT map.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 9a67c38..00ef82d 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -153,21 +153,25 @@ static int gem_set_tiling(int fd, uint32_t handle, int tiling, int stride)
 
 static bool __kgem_throttle_retire(struct kgem *kgem, unsigned flags)
 {
-	if (flags & CREATE_NO_RETIRE)
+	if (flags & CREATE_NO_RETIRE) {
+		DBG(("%s: not retiring per-request\n", __FUNCTION__));
 		return false;
+	}
 
-	if (!kgem->need_retire)
+	if (!kgem->need_retire) {
+		DBG(("%s: nothing to retire\n", __FUNCTION__));
 		return false;
+	}
 
 	if (kgem_retire(kgem))
 		return true;
 
-	if (!kgem->need_throttle)
+	if (flags & CREATE_NO_THROTTLE || !kgem->need_throttle) {
+		DBG(("%s: not throttling\n", __FUNCTION__));
 		return false;
+	}
 
-	if ((flags & CREATE_NO_THROTTLE) == 0)
-		kgem_throttle(kgem);
-
+	kgem_throttle(kgem);
 	return kgem_retire(kgem);
 }
 
@@ -3707,6 +3711,8 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
 		 * XXX This is especially noticeable on memory constrained
 		 * devices like gen2 or with relatively slow gpu like i3.
 		 */
+		DBG(("%s: searching for an inactive GTT map for upload\n",
+		     __FUNCTION__));
 		old = search_linear_cache(kgem, alloc,
 					  CREATE_EXACT | CREATE_INACTIVE | CREATE_GTT_MAP);
 #if HAVE_I915_GEM_BUFFER_INFO
@@ -3731,6 +3737,13 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
 		if (old == NULL)
 			old = search_linear_cache(kgem, NUM_PAGES(size),
 						  CREATE_EXACT | CREATE_INACTIVE | CREATE_GTT_MAP);
+		if (old == NULL) {
+			old = search_linear_cache(kgem, alloc, CREATE_INACTIVE);
+			if (old && !kgem_bo_is_mappable(kgem, old)) {
+				_kgem_bo_destroy(kgem, old);
+				old = NULL;
+			}
+		}
 		if (old) {
 			DBG(("%s: reusing handle=%d for buffer\n",
 			     __FUNCTION__, old->handle));
commit 36d53ff52b055b2b5fc03aff7b2cab83037d9f42
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun May 27 16:46:42 2012 +0100

    sna: Validate all CRTCs after updating one
    
    Updating one CRTC may cause the kernel to turn off another, so be
    paranoid and run the check in a loop after applying the CRTC set.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 1f2d085..92614d0 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -295,7 +295,7 @@ struct sna {
 
 Bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna);
 extern void sna_mode_remove_fb(struct sna *sna);
-extern void sna_mode_hotplug(struct sna *sna);
+extern void sna_mode_update(struct sna *sna);
 extern void sna_mode_fini(struct sna *sna);
 
 extern int sna_crtc_id(xf86CrtcPtr crtc);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 4b142a3..a218d83 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -397,8 +397,8 @@ bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc)
 	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETCRTC, &mode))
 		return false;
 
-	DBG(("%s: mode valid?=%d, fb attached?=%d\n", __FUNCTION__,
-	     mode.mode_valid, sna->mode.fb_id == mode.fb_id));
+	DBG(("%s: crtc=%d, mode valid?=%d, fb attached?=%d\n", __FUNCTION__,
+	     mode.crtc_id, mode.mode_valid, sna->mode.fb_id == mode.fb_id));
 	return mode.mode_valid && sna->mode.fb_id == mode.fb_id;
 }
 
@@ -469,10 +469,8 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 		xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
 			   "failed to set mode: %s\n", strerror(-ret));
 		ret = FALSE;
-	} else {
-		sna_crtc->active = sna_crtc_is_bound(sna, crtc);
+	} else
 		ret = TRUE;
-	}
 
 	if (crtc->scrn->pScreen)
 		xf86_reload_cursors(crtc->scrn->pScreen);
@@ -520,6 +518,7 @@ sna_crtc_restore(struct sna *sna)
 		if (crtc->enabled)
 			sna_crtc_apply(crtc);
 	}
+	sna_mode_update(sna);
 
 	kgem_bo_retire(&sna->kgem, bo);
 	scrn->displayWidth = bo->pitch / sna->mode.cpp;
@@ -742,6 +741,7 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 		crtc->mode = saved_mode;
 		return FALSE;
 	}
+	sna_mode_update(sna);
 
 	update_flush_interval(sna);
 	return TRUE;
@@ -1765,6 +1765,7 @@ sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
 		if (!sna_crtc_apply(crtc))
 			goto fail;
 	}
+	sna_mode_update(sna);
 
 	kgem_bo_retire(&sna->kgem, bo);
 
@@ -2243,7 +2244,7 @@ sna_wait_for_scanline(struct sna *sna,
 	return true;
 }
 
-void sna_mode_hotplug(struct sna *sna)
+void sna_mode_update(struct sna *sna)
 {
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	int i;
@@ -2251,9 +2252,10 @@ void sna_mode_hotplug(struct sna *sna)
 	/* Validate CRTC attachments */
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[i];
-		if (crtc->enabled) {
-			struct sna_crtc *sna_crtc = crtc->driver_private;
+		struct sna_crtc *sna_crtc = crtc->driver_private;
+		if (crtc->enabled)
 			sna_crtc->active = sna_crtc_is_bound(sna, crtc);
-		}
+		else
+			sna_crtc->active = false;
 	}
 }
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index f3f19e1..39e67c4 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -608,7 +608,7 @@ sna_handle_uevents(int fd, void *closure)
 	if (memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t)) == 0 &&
 	    hotplug && atoi(hotplug) == 1) {
 		DBG(("%s: hotplug event\n", __FUNCTION__));
-		sna_mode_hotplug(sna);
+		sna_mode_update(sna);
 		RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
 	}
 
commit 7fdd8bd6d2ba7bf113d4109e6bb6f750f909565f
Author: Johannes Obermayr <johannesobermayr at gmx.de>
Date:   Sat May 26 23:52:28 2012 +0200

    glamor: Fix misspelled xf86GetOptValString and OPTION_ACCEL_METHOD introduced by commit e456291.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_glamor.c b/src/intel_glamor.c
index 5c0186e..53043dd 100644
--- a/src/intel_glamor.c
+++ b/src/intel_glamor.c
@@ -39,6 +39,7 @@
 #include "i915_drm.h"
 #include "intel_glamor.h"
 #include "uxa.h"
+#include "intel_options.h"
 
 void
 intel_glamor_exchange_buffers(struct intel_screen_private *intel,
@@ -177,7 +178,7 @@ intel_glamor_enabled(intel_screen_private *intel)
 {
 	const char *s;
 
-	s = xf86GetOptString(intel->Options, ACCEL_METHOD);
+	s = xf86GetOptValString(intel->Options, OPTION_ACCEL_METHOD);
 	if (s == NULL)
 		return FALSE;
 
commit 8ea4ba081de0206351394481f54dcbe6922a085b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat May 26 21:48:16 2012 +0100

    sna: Fix typo for debug compilation
    
    s/ctrc/crtc/
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index a1f671a..632c57d 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -493,7 +493,7 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 
 	DBG(("%s: flushing? %d\n", __FUNCTION__, flush));
 	if (flush) { /* STAT! */
-		assert(sna_crtc_is_bound(sna, ctrc));
+		assert(sna_crtc_is_bound(sna, crtc));
 		kgem_submit(&sna->kgem);
 	}
 
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 9247e88..e1806d5 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -308,7 +308,7 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
 	 * we can hit the next vsync.
 	 */
 	if (flush) {
-		assert(sna_crtc_is_bound(sna, ctrc));
+		assert(sna_crtc_is_bound(sna, crtc));
 		kgem_submit(&sna->kgem);
 	}
 
commit 317bf05196086eb5dedb6436c07f253f01c9bf63
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 25 14:34:16 2012 +0100

    sna: Perform the selftest after probing
    
    We do no want to slow down the detection phase by performing our
    self-tests, so only running those before initialising the driver.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 0f43a46..f3f19e1 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -396,8 +396,6 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 
 	DBG(("%s\n", __FUNCTION__));
 
-	sna_selftest();
-
 	if (scrn->numEntities != 1)
 		return FALSE;
 
@@ -408,6 +406,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	if (flags & PROBE_DETECT)
 		return TRUE;
 
+	sna_selftest();
+
 	sna = to_sna(scrn);
 	if (sna == NULL) {
 		sna = xnfcalloc(sizeof(struct sna), 1);
commit a5fe863e3f1a6750edaffb518c4e768e9bc11521
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 25 14:28:56 2012 +0100

    sna: Check the bus type before declaring probe success
    
    This should never fail, but still better to fail during detection rather
    than pretend it works.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 9c6994b..0f43a46 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -402,6 +402,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 		return FALSE;
 
 	pEnt = xf86GetEntityInfo(scrn->entityList[0]);
+	if (pEnt->location.type != BUS_PCI)
+		return FALSE;
 
 	if (flags & PROBE_DETECT)
 		return TRUE;
@@ -419,9 +421,6 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 
 	scrn->displayWidth = 640;	/* default it */
 
-	if (sna->pEnt->location.type != BUS_PCI)
-		return FALSE;
-
 	sna->PciInfo = xf86GetPciInfoForEntity(sna->pEnt->index);
 
 	fd = sna_open_drm_master(scrn);
commit 4094826aee76ef24dad13bc5a8a723bfe4a69162
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 25 08:55:13 2012 +0100

    sna: Trust the crtc-is-bound determination after modeset and hotplug
    
    As these should be the only time that they change and we now have the
    checks in place, we can drop the workaround of doing the check just
    before emitting the wait.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 0a95da7..fdabfae 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -141,7 +141,6 @@ struct kgem {
 	uint16_t nexec;
 	uint16_t nreloc;
 	uint16_t nfence;
-	uint16_t wait;
 	uint16_t batch_size;
 	uint16_t min_alignment;
 
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 5f7b526..1f2d085 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -299,6 +299,7 @@ extern void sna_mode_hotplug(struct sna *sna);
 extern void sna_mode_fini(struct sna *sna);
 
 extern int sna_crtc_id(xf86CrtcPtr crtc);
+extern bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc);
 extern int sna_output_dpms_status(xf86OutputPtr output);
 
 extern int sna_page_flip(struct sna *sna,
@@ -353,7 +354,6 @@ extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn,
 
 extern bool sna_wait_for_scanline(struct sna *sna, PixmapPtr pixmap,
 				  xf86CrtcPtr crtc, const BoxRec *clip);
-extern bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc);
 
 Bool sna_dri_open(struct sna *sna, ScreenPtr pScreen);
 void sna_dri_wakeup(struct sna *sna);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index f1fcdbc..4b142a3 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -389,6 +389,19 @@ mode_to_kmode(drmModeModeInfoPtr kmode, DisplayModePtr mode)
 	kmode->name[DRM_DISPLAY_MODE_LEN-1] = 0;
 }
 
+bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc)
+{
+	struct drm_mode_crtc mode;
+
+	mode.crtc_id = crtc_id(crtc->driver_private);
+	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETCRTC, &mode))
+		return false;
+
+	DBG(("%s: mode valid?=%d, fb attached?=%d\n", __FUNCTION__,
+	     mode.mode_valid, sna->mode.fb_id == mode.fb_id));
+	return mode.mode_valid && sna->mode.fb_id == mode.fb_id;
+}
+
 static Bool
 sna_crtc_apply(xf86CrtcPtr crtc)
 {
@@ -2110,7 +2123,6 @@ static void sna_emit_wait_for_scanline_gen6(struct sna *sna,
 	b[1] = pipe;
 	b[2] = y2 - 1;
 	b[3] = MI_WAIT_FOR_EVENT | event;
-	sna->kgem.wait = sna->kgem.nbatch + 3;
 	kgem_advance_batch(&sna->kgem, 4);
 }
 
@@ -2140,7 +2152,6 @@ static void sna_emit_wait_for_scanline_gen4(struct sna *sna,
 	b[2] = b[0] = MI_LOAD_SCAN_LINES_INCL | pipe << 20;
 	b[3] = b[1] = (y1 << 16) | (y2-1);
 	b[4] = MI_WAIT_FOR_EVENT | event;
-	sna->kgem.wait = sna->kgem.nbatch + 4;
 	kgem_advance_batch(&sna->kgem, 5);
 }
 
@@ -2168,7 +2179,6 @@ static void sna_emit_wait_for_scanline_gen2(struct sna *sna,
 		b[4] = MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
 	else
 		b[4] = MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
-	sna->kgem.wait = sna->kgem.nbatch + 4;
 	kgem_advance_batch(&sna->kgem, 5);
 }
 
@@ -2233,19 +2243,6 @@ sna_wait_for_scanline(struct sna *sna,
 	return true;
 }
 
-bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc)
-{
-	struct drm_mode_crtc mode;
-
-	mode.crtc_id = crtc_id(crtc->driver_private);
-	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETCRTC, &mode))
-		return false;
-
-	DBG(("%s: mode valid?=%d, fb attached?=%d\n", __FUNCTION__,
-	     mode.mode_valid, sna->mode.fb_id == mode.fb_id));
-	return mode.mode_valid && sna->mode.fb_id == mode.fb_id;
-}
-
 void sna_mode_hotplug(struct sna *sna)
 {
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 4fa4320..a1f671a 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -493,8 +493,7 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 
 	DBG(("%s: flushing? %d\n", __FUNCTION__, flush));
 	if (flush) { /* STAT! */
-		if (!sna_crtc_is_bound(sna, crtc))
-			sna->kgem.batch[sna->kgem.wait] = 0;
+		assert(sna_crtc_is_bound(sna, ctrc));
 		kgem_submit(&sna->kgem);
 	}
 
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 4975f55..9247e88 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -308,8 +308,7 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
 	 * we can hit the next vsync.
 	 */
 	if (flush) {
-		if (!sna_crtc_is_bound(sna, crtc))
-			sna->kgem.batch[sna->kgem.wait] = 0;
+		assert(sna_crtc_is_bound(sna, ctrc));
 		kgem_submit(&sna->kgem);
 	}
 
commit 8a9a585341e2dd43c649204fcf6d92a867671ba3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 25 08:50:33 2012 +0100

    Only create a single instance of the intel_options array
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/Makefile.am b/src/Makefile.am
index d057e43..a7043d1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -43,6 +43,7 @@ NULL:=#
 intel_drv_la_SOURCES = \
 	intel_list.h \
 	intel_options.h \
+	intel_options.c \
 	intel_module.c \
 	compat-api.h \
 	$(NULL)
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 60f43bb..fadc0a6 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -220,11 +220,9 @@ static Bool I830GetEarlyOptions(ScrnInfoPtr scrn)
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	/* Process the options */
-	xf86CollectOptions(scrn, NULL);
-	if (!(intel->Options = malloc(sizeof(intel_options))))
+	intel->Options = intel_options_get(scrn);
+	if (!intel->Options)
 		return FALSE;
-	memcpy(intel->Options, intel_options, sizeof(intel_options));
-	xf86ProcessOptions(scrn->scrnIndex, scrn->options, intel->Options);
 
 	intel->fallback_debug = xf86ReturnOptValBool(intel->Options,
 						     OPTION_FALLBACKDEBUG,
diff --git a/src/intel_options.c b/src/intel_options.c
new file mode 100644
index 0000000..80572be
--- /dev/null
+++ b/src/intel_options.c
@@ -0,0 +1,47 @@
+#include "intel_options.h"
+
+const OptionInfoRec intel_options[] = {
+	{OPTION_ACCEL_METHOD,	"AccelMethod",	OPTV_STRING,	{0},	0},
+	{OPTION_DRI,		"DRI",		OPTV_BOOLEAN,	{0},	1},
+	{OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	0},
+	{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	0},
+	{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	1},
+	{OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	0},
+	{OPTION_SHADOW,	"Shadow",	OPTV_BOOLEAN,	{0},	0},
+	{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	1},
+	{OPTION_TRIPLE_BUFFER, "TripleBuffer", OPTV_BOOLEAN,	{0},	1},
+#ifdef INTEL_XVMC
+	{OPTION_XVMC,	"XvMC",		OPTV_BOOLEAN,	{0},	1},
+#endif
+	{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},
+	{OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, 0},
+	{OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, 0},
+	{OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, 0},
+	{OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	1},
+	{OPTION_RELAXED_FENCING,	"RelaxedFencing",	OPTV_BOOLEAN,	{0},	1},
+#ifdef USE_SNA
+	{OPTION_THROTTLE,	"Throttle",	OPTV_BOOLEAN,	{0},	1},
+	{OPTION_VMAP,	"UseVmap",	OPTV_BOOLEAN,	{0},	1},
+	{OPTION_ZAPHOD,	"ZaphodHeads",	OPTV_STRING,	{0},	0},
+	{OPTION_DELAYED_FLUSH,	"DelayedFlush",	OPTV_BOOLEAN,	{0},	1},
+#endif
+#ifdef USE_UXA
+	{OPTION_FALLBACKDEBUG, "FallbackDebug", OPTV_BOOLEAN, {0},	0},
+	{OPTION_BUFFER_CACHE,       "BufferCache",  OPTV_BOOLEAN,   {0},    1},
+#endif
+	{-1,			NULL,		OPTV_NONE,	{0},	0}
+};
+
+OptionInfoPtr intel_options_get(ScrnInfoPtr scrn)
+{
+	OptionInfoPtr options;
+
+	xf86CollectOptions(scrn, NULL);
+	if (!(options = malloc(sizeof(intel_options))))
+		return NULL;
+
+	memcpy(options, intel_options, sizeof(intel_options));
+	xf86ProcessOptions(scrn->scrnIndex, scrn->options, options);
+
+	return options;
+}
diff --git a/src/intel_options.h b/src/intel_options.h
index 8863878..42a9e56 100644
--- a/src/intel_options.h
+++ b/src/intel_options.h
@@ -1,6 +1,9 @@
 #ifndef INTEL_OPTIONS_H
 #define INTEL_OPTIONS_H
 
+#include <xf86.h>
+#include <xf86Opt.h>
+
 /*
  * Note: "ColorKey" is provided for compatibility with the i810 driver.
  * However, the correct option name is "VideoKey".  "ColorKey" usually
@@ -40,36 +43,7 @@ enum intel_options {
 	NUM_OPTIONS,
 };
 
-static OptionInfoRec intel_options[] = {
-	{OPTION_ACCEL_METHOD,	"AccelMethod",	OPTV_STRING,	{0},	0},
-	{OPTION_DRI,		"DRI",		OPTV_BOOLEAN,	{0},	TRUE},
-	{OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	FALSE},
-	{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	FALSE},
-	{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	TRUE},
-	{OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	FALSE},
-	{OPTION_SHADOW,	"Shadow",	OPTV_BOOLEAN,	{0},	FALSE},
-	{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	TRUE},
-	{OPTION_TRIPLE_BUFFER, "TripleBuffer", OPTV_BOOLEAN,	{0},	TRUE},
-#ifdef INTEL_XVMC
-	{OPTION_XVMC,	"XvMC",		OPTV_BOOLEAN,	{0},	TRUE},
-#endif
-	{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, FALSE},
-	{OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, FALSE},
-	{OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, FALSE},
-	{OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, FALSE},
-	{OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	TRUE},
-	{OPTION_RELAXED_FENCING,	"RelaxedFencing",	OPTV_BOOLEAN,	{0},	TRUE},
-#ifdef USE_SNA
-	{OPTION_THROTTLE,	"Throttle",	OPTV_BOOLEAN,	{0},	TRUE},
-	{OPTION_VMAP,	"UseVmap",	OPTV_BOOLEAN,	{0},	TRUE},
-	{OPTION_ZAPHOD,	"ZaphodHeads",	OPTV_STRING,	{0},	FALSE},
-	{OPTION_DELAYED_FLUSH,	"DelayedFlush",	OPTV_BOOLEAN,	{0},	TRUE},
-#endif
-#ifdef USE_UXA
-	{OPTION_FALLBACKDEBUG, "FallbackDebug", OPTV_BOOLEAN, {0},	FALSE},
-	{OPTION_BUFFER_CACHE,       "BufferCache",  OPTV_BOOLEAN,   {0},    TRUE},
-#endif
-	{-1,			NULL,		OPTV_NONE,	{0},	FALSE}
-};
+extern const OptionInfoRec intel_options[];
+OptionInfoPtr intel_options_get(ScrnInfoPtr scrn);
 
 #endif /* INTEL_OPTIONS_H */
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index fb54a24..9c6994b 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -259,15 +259,8 @@ static Bool sna_get_early_options(ScrnInfoPtr scrn)
 {
 	struct sna *sna = to_sna(scrn);
 
-	/* Process the options */
-	xf86CollectOptions(scrn, NULL);
-	if (!(sna->Options = malloc(sizeof(intel_options))))
-		return FALSE;
-
-	memcpy(sna->Options, intel_options, sizeof(intel_options));
-	xf86ProcessOptions(scrn->scrnIndex, scrn->options, sna->Options);
-
-	return TRUE;
+	sna->Options = intel_options_get(scrn);
+	return sna->Options != NULL;
 }
 
 struct sna_device {
commit e45629135065d0cc73c285f8df35ab4e1d07c6dc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 24 18:22:45 2012 +0100

    Allow runtime switching of AccelMethod between uxa/sna and even glamor
    
    Section "Device"
      Option "AccelMethod" "uxa/glamor/sna"
    EndSection
    
    The appropriate backend must also be enabled at compile time for the
    runtime option to be available (i.e. --enable-uxa (default) --enable-sna
    --enable-glamor)
    
    Demanded-by: Adam Jackson <ajax at redhat.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50290
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/configure.ac b/configure.ac
index c031a26..a025521 100644
--- a/configure.ac
+++ b/configure.ac
@@ -158,6 +158,43 @@ if test "x$GLAMOR" != "xno"; then
 	AC_DEFINE(USE_GLAMOR, 1, [Enable glamor acceleration])
 fi
 
+AC_ARG_WITH(default-accel,
+	    AS_HELP_STRING([--with-default-accel],
+			   [Select the default acceleration method [default=sna if enabled, otherwise uxa]]),
+			   [accel="$withval"],
+			   [accel=auto])
+
+AC_MSG_CHECKING([which acceleration method to use by default])
+if test "x$accel" = xauto; then
+	if test "x$UXA" != "xno"; then
+		accel=uxa
+	else
+		if test "x$SNA" != "xno"; then
+			accel=sna
+		fi
+	fi
+	if test "x$accel" = xauto; then
+		AC_MSG_ERROR([No default acceleration option])
+	fi
+fi
+
+if test "x$accel" = xsna; then
+	if test "x$SNA" != "xno"; then
+		AC_DEFINE(DEFAULT_ACCEL_METHOD, SNA, [Default acceleration method])
+	else
+		AC_MSG_ERROR([SNA requested as default, but is not enabled])
+	fi
+fi
+
+if test "x$accel" = xuxa; then
+	if test "x$UXA" != "xno"; then
+		AC_DEFINE(DEFAULT_ACCEL_METHOD, UXA, [Default acceleration method])
+	else
+		AC_MSG_ERROR([UXA requested as default, but is not enabled])
+	fi
+fi
+AC_MSG_RESULT($accel)
+
 AC_ARG_ENABLE(vmap,
 	      AS_HELP_STRING([--enable-vmap],
 			     [Enable use of vmap [default=no]]),
@@ -174,7 +211,6 @@ AC_ARG_ENABLE(debug,
 			     [Enables internal debugging [default=no]]),
               [DEBUG="$enableval"],
               [DEBUG=no])
-
 # Store the list of server defined optional extensions in REQUIRED_MODULES
 XORG_DRIVER_CHECK_EXT(RANDR, randrproto)
 XORG_DRIVER_CHECK_EXT(RENDER, renderproto)
diff --git a/src/common.h b/src/common.h
index 06b2192..e3ab1f2 100644
--- a/src/common.h
+++ b/src/common.h
@@ -63,7 +63,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 /* I830 hooks for the I810 driver setup/probe. */
 extern const OptionInfoRec *I830AvailableOptions(int chipid, int busid);
-extern void intel_init_scrn(ScrnInfoPtr scrn);
+extern Bool intel_init_scrn(ScrnInfoPtr scrn);
 
 /* Symbol lists shared by the i810 and i830 parts. */
 extern int I830EntityIndex;
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 6b2ab80..60f43bb 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -1236,7 +1236,7 @@ static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo)
 	return TRUE;
 }
 
-void intel_init_scrn(ScrnInfoPtr scrn)
+Bool intel_init_scrn(ScrnInfoPtr scrn)
 {
 	scrn->PreInit = I830PreInit;
 	scrn->ScreenInit = I830ScreenInit;
@@ -1247,4 +1247,5 @@ void intel_init_scrn(ScrnInfoPtr scrn)
 	scrn->FreeScreen = I830FreeScreen;
 	scrn->ValidMode = I830ValidMode;
 	scrn->PMEvent = I830PMEvent;
+	return TRUE;
 }
diff --git a/src/intel_glamor.c b/src/intel_glamor.c
index 4741d58..5c0186e 100644
--- a/src/intel_glamor.c
+++ b/src/intel_glamor.c
@@ -172,6 +172,18 @@ intel_glamor_finish_access(PixmapPtr pixmap, uxa_access_t access)
 	return;
 }
 
+static Bool
+intel_glamor_enabled(intel_screen_private *intel)
+{
+	const char *s;
+
+	s = xf86GetOptString(intel->Options, ACCEL_METHOD);
+	if (s == NULL)
+		return FALSE;
+
+	return strcasecmp(s, "glamor") == 0;
+}
+
 Bool
 intel_glamor_init(ScreenPtr screen)
 {
@@ -181,6 +193,9 @@ intel_glamor_init(ScreenPtr screen)
 	if ((intel->uxa_flags & UXA_GLAMOR_EGL_INITIALIZED) == 0)
 		goto fail;
 
+	if (!intel_glamor_enabled(intel))
+		goto fail;
+
 	if (!glamor_init(screen, GLAMOR_INVERTED_Y_AXIS | GLAMOR_USE_EGL_SCREEN)) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 			   "Failed to initialize glamor.\n");
diff --git a/src/intel_module.c b/src/intel_module.c
index ac6dae1..4430ac6 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -31,6 +31,7 @@
 #include <xf86.h>
 #include <xf86_OSproc.h>
 #include <xf86cmap.h>
+#include <xf86Parser.h>
 #include <xf86drmMode.h>
 
 #include <xorgVersion.h>
@@ -292,6 +293,43 @@ static Bool has_kernel_mode_setting(struct pci_device *dev)
 	return ret == 0;
 }
 
+extern XF86ConfigPtr xf86configptr;
+
+static XF86ConfDevicePtr
+_xf86findDriver(const char *ident, XF86ConfDevicePtr p)
+{
+	while (p) {
+		if (xf86nameCompare(ident, p->dev_driver) == 0)
+			return p;
+
+		p = p->list.next;
+	}
+	return NULL;
+}
+
+static enum accel_method { UXA, SNA } get_accel_method(void)
+{
+	enum accel_method accel_method = DEFAULT_ACCEL_METHOD;
+	XF86ConfDevicePtr dev;
+
+	dev = _xf86findDriver("intel", xf86configptr->conf_device_lst);
+	if (dev && dev->dev_option_lst) {
+		const char *s;
+
+		s = xf86FindOptionValue(dev->dev_option_lst, "AccelMethod");
+		if (s ) {
+			if (strcasecmp(s, "sna") == 0)
+				accel_method = SNA;
+			else if (strcasecmp(s, "uxa") == 0)
+				accel_method = UXA;
+			else if (strcasecmp(s, "glamor") == 0)
+				accel_method = UXA;
+		}
+	}
+
+	return accel_method;
+}
+
 /*
  * intel_pci_probe --
  *
@@ -338,34 +376,35 @@ static Bool intel_pci_probe(DriverPtr		driver,
 
 	scrn = xf86ConfigPciEntity(NULL, 0, entity_num, intel_pci_chipsets,
 				   NULL, NULL, NULL, NULL, NULL);
-	if (scrn != NULL) {
-		scrn->driverVersion = INTEL_VERSION;
-		scrn->driverName = INTEL_DRIVER_NAME;
-		scrn->name = INTEL_NAME;
-		scrn->Probe = NULL;
+	if (scrn == NULL)
+		return FALSE;
+
+	scrn->driverVersion = INTEL_VERSION;
+	scrn->driverName = INTEL_DRIVER_NAME;
+	scrn->name = INTEL_NAME;
+	scrn->Probe = NULL;
 
-		switch (DEVICE_ID(device)) {
 #if !KMS_ONLY
-		case PCI_CHIP_I810:
-		case PCI_CHIP_I810_DC100:
-		case PCI_CHIP_I810_E:
-		case PCI_CHIP_I815:
-			lg_i810_init(scrn);
-			break;
+	switch (DEVICE_ID(device)) {
+	case PCI_CHIP_I810:
+	case PCI_CHIP_I810_DC100:
+	case PCI_CHIP_I810_E:
+	case PCI_CHIP_I815:
+		return lg_i810_init(scrn);
+	}
 #endif
 
-		default:
+	switch (get_accel_method()) {
 #if USE_SNA
-			sna_init_scrn(scrn, entity_num);
-#elif USE_UXA
-			intel_init_scrn(scrn);
-#else
-			scrn = NULL;
+	case SNA: return sna_init_scrn(scrn, entity_num);
 #endif
-			break;
-		}
+
+#if USE_UXA
+	case UXA: return intel_init_scrn(scrn);
+#endif
+
+	default: return FALSE;
 	}
-	return scrn != NULL;
 }
 
 #ifdef XFree86LOADER
diff --git a/src/intel_options.h b/src/intel_options.h
index 9367751..8863878 100644
--- a/src/intel_options.h
+++ b/src/intel_options.h
@@ -8,6 +8,7 @@
  */
 
 enum intel_options {
+	OPTION_ACCEL_METHOD,
 	OPTION_DRI,
 	OPTION_VIDEO_KEY,
 	OPTION_COLOR_KEY,
@@ -40,6 +41,7 @@ enum intel_options {
 };
 
 static OptionInfoRec intel_options[] = {
+	{OPTION_ACCEL_METHOD,	"AccelMethod",	OPTV_STRING,	{0},	0},
 	{OPTION_DRI,		"DRI",		OPTV_BOOLEAN,	{0},	TRUE},
 	{OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	FALSE},
 	{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	FALSE},
diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c
index 09d52c5..6ead393 100644
--- a/src/legacy/i810/i810_driver.c
+++ b/src/legacy/i810/i810_driver.c
@@ -2102,7 +2102,7 @@ lg_i810_available_options(int chipid, int busid)
 }
 
 
-void lg_i810_init(ScrnInfoPtr scrn)
+Bool lg_i810_init(ScrnInfoPtr scrn)
 {
     scrn->PreInit = I810PreInit;
     scrn->ScreenInit = I810ScreenInit;
@@ -2112,4 +2112,5 @@ void lg_i810_init(ScrnInfoPtr scrn)
     scrn->LeaveVT = I810LeaveVT;
     scrn->FreeScreen = I810FreeScreen;
     scrn->ValidMode = I810ValidMode;
+    return TRUE;
 }
diff --git a/src/legacy/legacy.h b/src/legacy/legacy.h
index 7bdd172..0ff3299 100644
--- a/src/legacy/legacy.h
+++ b/src/legacy/legacy.h
@@ -1,3 +1,3 @@
 /* The old i810 (only) driver. */
 const OptionInfoRec *lg_i810_available_options(int chipid, int busid);
-void lg_i810_init(ScrnInfoPtr scrn);
+Bool lg_i810_init(ScrnInfoPtr scrn);
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 5d42e69..fb54a24 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -1047,7 +1047,7 @@ static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo)
 	return TRUE;
 }
 
-void sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
+Bool sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
 {
 	EntityInfoPtr entity;
 
@@ -1081,8 +1081,13 @@ void sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
 	xf86SetEntitySharable(scrn->entityList[0]);
 
 	entity = xf86GetEntityInfo(entity_num);
+	if (!entity)
+		return FALSE;
+
 	xf86SetEntityInstanceForScreen(scrn,
 				       entity->index,
 				       xf86GetNumEntityInstances(entity->index)-1);
 	free(entity);
+
+	return TRUE;
 }
diff --git a/src/sna/sna_module.h b/src/sna/sna_module.h
index aa1ae0d..1b46cb7 100644
--- a/src/sna/sna_module.h
+++ b/src/sna/sna_module.h
@@ -1 +1 @@
-void sna_init_scrn(ScrnInfoPtr scrn, int entity_num);
+Bool sna_init_scrn(ScrnInfoPtr scrn, int entity_num);
commit df6ab02c3690eea8393ecc8c113e2f2891856cc6
Author: Eugeni Dodonov <eugeni.dodonov at intel.com>
Date:   Mon Oct 31 14:43:22 2011 -0200

    Unify options handling between UXA and SNA
    
    Unifies available options for both UXA and SNA drivers, and
    moves them into a common header file, intel_opts.h.
    
    Signed-off-by: Eugeni Dodonov <eugeni.dodonov at intel.com>

diff --git a/src/Makefile.am b/src/Makefile.am
index fd139ee..d057e43 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -42,6 +42,7 @@ NULL:=#
 
 intel_drv_la_SOURCES = \
 	intel_list.h \
+	intel_options.h \
 	intel_module.c \
 	compat-api.h \
 	$(NULL)
diff --git a/src/intel_display.c b/src/intel_display.c
index 77a1cce..89f7259 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -1702,7 +1702,6 @@ int intel_crtc_to_pipe(xf86CrtcPtr crtc)
 
 Bool intel_crtc_on(xf86CrtcPtr crtc)
 {
-	ScrnInfoPtr scrn = crtc->scrn;
 	struct intel_crtc *intel_crtc = crtc->driver_private;
 	drmModeCrtcPtr drm_crtc;
 	Bool ret;
diff --git a/src/intel_driver.c b/src/intel_driver.c
index b055437..6b2ab80 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -78,59 +78,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <xf86drmMode.h>
 
 #include "intel_glamor.h"
-
-/* *INDENT-OFF* */
-/*
- * Note: "ColorKey" is provided for compatibility with the i810 driver.
- * However, the correct option name is "VideoKey".  "ColorKey" usually
- * refers to the tranparency key for 8+24 overlays, not for video overlays.
- */
-
-typedef enum {
-   OPTION_DRI,
-   OPTION_VIDEO_KEY,
-   OPTION_COLOR_KEY,
-   OPTION_FALLBACKDEBUG,
-   OPTION_TILING_FB,
-   OPTION_TILING_2D,
-   OPTION_SHADOW,
-   OPTION_SWAPBUFFERS_WAIT,
-   OPTION_TRIPLE_BUFFER,
-#ifdef INTEL_XVMC
-   OPTION_XVMC,
-#endif
-   OPTION_PREFER_OVERLAY,
-   OPTION_DEBUG_FLUSH_BATCHES,
-   OPTION_DEBUG_FLUSH_CACHES,
-   OPTION_DEBUG_WAIT,
-   OPTION_HOTPLUG,
-   OPTION_RELAXED_FENCING,
-   OPTION_BUFFER_CACHE,
-} I830Opts;
-
-static OptionInfoRec I830Options[] = {
-   {OPTION_DRI,		"DRI",		OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	FALSE},
-   {OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	FALSE},
-   {OPTION_FALLBACKDEBUG, "FallbackDebug", OPTV_BOOLEAN, {0},	FALSE},
-   {OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	FALSE},
-   {OPTION_SHADOW,	"Shadow",	OPTV_BOOLEAN,	{0},	FALSE},
-   {OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_TRIPLE_BUFFER, "TripleBuffer", OPTV_BOOLEAN,	{0},	TRUE},
-#ifdef INTEL_XVMC
-   {OPTION_XVMC,	"XvMC",		OPTV_BOOLEAN,	{0},	TRUE},
-#endif
-   {OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, FALSE},
-   {OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, FALSE},
-   {OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, FALSE},
-   {OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, FALSE},
-   {OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_RELAXED_FENCING,	"RelaxedFencing",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_BUFFER_CACHE,	"BufferCache",	OPTV_BOOLEAN,	{0},	TRUE},
-   {-1,			NULL,		OPTV_NONE,	{0},	FALSE}
-};
-/* *INDENT-ON* */
+#include "intel_options.h"
 
 static void i830AdjustFrame(int scrnIndex, int x, int y, int flags);
 static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen);
@@ -140,11 +88,6 @@ static Bool I830EnterVT(int scrnIndex, int flags);
 extern void xf86SetCursor(ScreenPtr screen, CursorPtr pCurs, int x, int y);
 
 /* Export I830 options to i830 driver where necessary */
-const OptionInfoRec *intel_uxa_available_options(int chipid, int busid)
-{
-	return I830Options;
-}
-
 static void
 I830LoadPalette(ScrnInfoPtr scrn, int numColors, int *indices,
 		LOCO * colors, VisualPtr pVisual)
@@ -278,9 +221,9 @@ static Bool I830GetEarlyOptions(ScrnInfoPtr scrn)
 
 	/* Process the options */
 	xf86CollectOptions(scrn, NULL);
-	if (!(intel->Options = malloc(sizeof(I830Options))))
+	if (!(intel->Options = malloc(sizeof(intel_options))))
 		return FALSE;
-	memcpy(intel->Options, I830Options, sizeof(I830Options));
+	memcpy(intel->Options, intel_options, sizeof(intel_options));
 	xf86ProcessOptions(scrn->scrnIndex, scrn->options, intel->Options);
 
 	intel->fallback_debug = xf86ReturnOptValBool(intel->Options,
diff --git a/src/intel_driver.h b/src/intel_driver.h
index 98973e5..f33d135 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -247,7 +247,5 @@ void intel_detect_chipset(ScrnInfoPtr scrn,
 			  struct pci_device *pci,
 			  struct intel_chipset *chipset);
 
-const OptionInfoRec *intel_uxa_available_options(int chipid, int busid);
-
 
 #endif /* INTEL_DRIVER_H */
diff --git a/src/intel_module.c b/src/intel_module.c
index c6f94f5..ac6dae1 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -41,6 +41,7 @@
 
 #include "common.h"
 #include "intel_driver.h"
+#include "intel_options.h"
 #include "legacy/legacy.h"
 #include "sna/sna_module.h"
 
@@ -397,13 +398,7 @@ intel_available_options(int chipid, int busid)
 #endif
 
 	default:
-#if USE_SNA
-		return sna_available_options(chipid, busid);
-#elif USE_UXA
-		return intel_uxa_available_options(chipid, busid);
-#else
-		return NULL;
-#endif
+		return intel_options;
 	}
 }
 
diff --git a/src/intel_options.h b/src/intel_options.h
new file mode 100644
index 0000000..9367751
--- /dev/null
+++ b/src/intel_options.h
@@ -0,0 +1,73 @@
+#ifndef INTEL_OPTIONS_H
+#define INTEL_OPTIONS_H
+
+/*
+ * Note: "ColorKey" is provided for compatibility with the i810 driver.
+ * However, the correct option name is "VideoKey".  "ColorKey" usually
+ * refers to the tranparency key for 8+24 overlays, not for video overlays.
+ */
+
+enum intel_options {
+	OPTION_DRI,
+	OPTION_VIDEO_KEY,
+	OPTION_COLOR_KEY,
+	OPTION_TILING_FB,
+	OPTION_TILING_2D,
+	OPTION_SHADOW,
+	OPTION_SWAPBUFFERS_WAIT,
+	OPTION_TRIPLE_BUFFER,
+#ifdef INTEL_XVMC
+	OPTION_XVMC,
+#endif
+	OPTION_PREFER_OVERLAY,
+	OPTION_DEBUG_FLUSH_BATCHES,
+	OPTION_DEBUG_FLUSH_CACHES,
+	OPTION_DEBUG_WAIT,
+	OPTION_HOTPLUG,
+	OPTION_RELAXED_FENCING,
+	OPTION_USE_SNA,
+#ifdef USE_SNA
+	OPTION_THROTTLE,
+	OPTION_VMAP,
+	OPTION_ZAPHOD,
+	OPTION_DELAYED_FLUSH,
+#endif
+#ifdef USE_UXA
+	OPTION_FALLBACKDEBUG,
+	OPTION_BUFFER_CACHE,
+#endif
+	NUM_OPTIONS,
+};
+
+static OptionInfoRec intel_options[] = {
+	{OPTION_DRI,		"DRI",		OPTV_BOOLEAN,	{0},	TRUE},
+	{OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	FALSE},
+	{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	FALSE},
+	{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	TRUE},
+	{OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	FALSE},
+	{OPTION_SHADOW,	"Shadow",	OPTV_BOOLEAN,	{0},	FALSE},
+	{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	TRUE},
+	{OPTION_TRIPLE_BUFFER, "TripleBuffer", OPTV_BOOLEAN,	{0},	TRUE},
+#ifdef INTEL_XVMC
+	{OPTION_XVMC,	"XvMC",		OPTV_BOOLEAN,	{0},	TRUE},
+#endif
+	{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, FALSE},
+	{OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, FALSE},
+	{OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, FALSE},
+	{OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, FALSE},
+	{OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	TRUE},
+	{OPTION_RELAXED_FENCING,	"RelaxedFencing",	OPTV_BOOLEAN,	{0},	TRUE},
+#ifdef USE_SNA
+	{OPTION_THROTTLE,	"Throttle",	OPTV_BOOLEAN,	{0},	TRUE},
+	{OPTION_VMAP,	"UseVmap",	OPTV_BOOLEAN,	{0},	TRUE},
+	{OPTION_ZAPHOD,	"ZaphodHeads",	OPTV_STRING,	{0},	FALSE},
+	{OPTION_DELAYED_FLUSH,	"DelayedFlush",	OPTV_BOOLEAN,	{0},	TRUE},
+#endif
+#ifdef USE_UXA
+	{OPTION_FALLBACKDEBUG, "FallbackDebug", OPTV_BOOLEAN, {0},	FALSE},
+	{OPTION_BUFFER_CACHE,       "BufferCache",  OPTV_BOOLEAN,   {0},    TRUE},
+#endif
+	{-1,			NULL,		OPTV_NONE,	{0},	FALSE}
+};
+
+#endif /* INTEL_OPTIONS_H */
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 879940d..5f7b526 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -194,21 +194,6 @@ static inline struct sna_gc *sna_gc(GCPtr gc)
 }
 
 enum {
-	OPTION_TILING_FB,
-	OPTION_TILING_2D,
-	OPTION_PREFER_OVERLAY,
-	OPTION_COLOR_KEY,
-	OPTION_VIDEO_KEY,
-	OPTION_HOTPLUG,
-	OPTION_THROTTLE,
-	OPTION_RELAXED_FENCING,
-	OPTION_VMAP,
-	OPTION_ZAPHOD,
-	OPTION_DELAYED_FLUSH,
-	NUM_OPTIONS
-};
-
-enum {
 	FLUSH_TIMER = 0,
 	THROTTLE_TIMER,
 	EXPIRE_TIMER,
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index b8cf3cc..f1fcdbc 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -45,6 +45,8 @@
 #include "sna.h"
 #include "sna_reg.h"
 
+#include "intel_options.h"
+
 #if DEBUG_DISPLAY
 #undef DBG
 #define DBG(x) ErrorF x
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index d0b5bde..5d42e69 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -55,6 +55,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "sna_video.h"
 
 #include "intel_driver.h"
+#include "intel_options.h"
 
 #include <sys/ioctl.h>
 #include <sys/fcntl.h>
@@ -76,31 +77,11 @@ DevPrivateKeyRec sna_gc_index;
 DevPrivateKeyRec sna_glyph_key;
 DevPrivateKeyRec sna_glyph_image_key;
 
-static OptionInfoRec sna_options[] = {
-   {OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	FALSE},
-   {OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, FALSE},
-   {OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	FALSE},
-   {OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	FALSE},
-   {OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_THROTTLE,	"Throttle",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_RELAXED_FENCING,	"UseRelaxedFencing",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_VMAP,	"UseVmap",	OPTV_BOOLEAN,	{0},	TRUE},
-   {OPTION_ZAPHOD,	"ZaphodHeads",	OPTV_STRING,	{0},	FALSE},
-   {OPTION_DELAYED_FLUSH,	"DelayedFlush",	OPTV_BOOLEAN,	{0},	TRUE},
-   {-1,			NULL,		OPTV_NONE,	{0},	FALSE}
-};
-
 static Bool sna_enter_vt(int scrnIndex, int flags);
 
 /* temporary */
 extern void xf86SetCursor(ScreenPtr screen, CursorPtr pCurs, int x, int y);
 
-const OptionInfoRec *sna_available_options(int chipid, int busid)
-{
-	return sna_options;
-}
-
 static void
 sna_load_palette(ScrnInfoPtr scrn, int numColors, int *indices,
 		 LOCO * colors, VisualPtr pVisual)
@@ -280,10 +261,10 @@ static Bool sna_get_early_options(ScrnInfoPtr scrn)
 
 	/* Process the options */
 	xf86CollectOptions(scrn, NULL);
-	if (!(sna->Options = malloc(sizeof(sna_options))))
+	if (!(sna->Options = malloc(sizeof(intel_options))))
 		return FALSE;
 
-	memcpy(sna->Options, sna_options, sizeof(sna_options));
+	memcpy(sna->Options, intel_options, sizeof(intel_options));
 	xf86ProcessOptions(scrn->scrnIndex, scrn->options, sna->Options);
 
 	return TRUE;
diff --git a/src/sna/sna_module.h b/src/sna/sna_module.h
index 97d5dd5..aa1ae0d 100644
--- a/src/sna/sna_module.h
+++ b/src/sna/sna_module.h
@@ -1,3 +1 @@
-const OptionInfoRec *sna_available_options(int chipid, int busid);
 void sna_init_scrn(ScrnInfoPtr scrn, int entity_num);
-
diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index c80ccfb..1f6e210 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -57,6 +57,8 @@
 #include "sna_reg.h"
 #include "sna_video.h"
 
+#include "intel_options.h"
+
 #include <xf86xv.h>
 #include <X11/extensions/Xv.h>
 
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index ba6f671..eb39a25 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -36,6 +36,8 @@
 #include <fourcc.h>
 #include <i915_drm.h>
 
+#include "intel_options.h"
+
 #if DEBUG_VIDEO_OVERLAY
 #undef DBG
 #define DBG(x) ErrorF x
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 0e5f3ab..fff31fb 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -31,6 +31,8 @@
 #include "sna.h"
 #include "sna_video.h"
 
+#include "intel_options.h"
+
 #include <xf86xv.h>
 #include <X11/extensions/Xv.h>
 #include <fourcc.h>
commit ae2be7e25bda46551381c19a673b321b4382e1f9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 24 16:33:27 2012 +0100

    sna/trapezoids: Correct rounding for downsampling onto sample grid
    
    Reported-by: S. Christian Collins <s_chriscollins at hotmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=49446
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index c0565fa..e604720 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -3150,7 +3150,7 @@ composite_unaligned_boxes(struct sna *sna,
 
 static inline int pixman_fixed_to_grid (pixman_fixed_t v)
 {
-	return (v + FAST_SAMPLES_mask/2) >> (16 - FAST_SAMPLES_shift);
+	return (v + ((1<<(16-FAST_SAMPLES_shift))-1)/2) >> (16 - FAST_SAMPLES_shift);
 }
 
 static inline bool
@@ -3158,6 +3158,12 @@ project_trapezoid_onto_grid(const xTrapezoid *in,
 			    int dx, int dy,
 			    xTrapezoid *out)
 {
+	__DBG(("%s: in: L:(%d, %d), (%d, %d); R:(%d, %d), (%d, %d), [%d, %d]\n",
+	       __FUNCTION__,
+	       in->left.p1.x, in->left.p1.y, in->left.p2.x, in->left.p2.y,
+	       in->right.p1.x, in->right.p1.y, in->right.p2.x, in->right.p2.y,
+	       in->top, in->bottom));
+
 	out->left.p1.x = dx + pixman_fixed_to_grid(in->left.p1.x);
 	out->left.p1.y = dy + pixman_fixed_to_grid(in->left.p1.y);
 	out->left.p2.x = dx + pixman_fixed_to_grid(in->left.p2.x);
@@ -3171,6 +3177,12 @@ project_trapezoid_onto_grid(const xTrapezoid *in,
 	out->top = dy + pixman_fixed_to_grid(in->top);
 	out->bottom = dy + pixman_fixed_to_grid(in->bottom);
 
+	__DBG(("%s: out: L:(%d, %d), (%d, %d); R:(%d, %d), (%d, %d), [%d, %d]\n",
+	       __FUNCTION__,
+	       out->left.p1.x, out->left.p1.y, out->left.p2.x, out->left.p2.y,
+	       out->right.p1.x, out->right.p1.y, out->right.p2.x, out->right.p2.y,
+	       out->top, out->bottom));
+
 	return xTrapezoidValid(out);
 }
 
commit 0ab226e27e7920bdb9f7eb62c5174cd097ac7f7f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 24 12:51:46 2012 +0100

    sna: Query CRTC states following a hotplug event
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 7a01ee7..879940d 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -310,6 +310,7 @@ struct sna {
 
 Bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna);
 extern void sna_mode_remove_fb(struct sna *sna);
+extern void sna_mode_hotplug(struct sna *sna);
 extern void sna_mode_fini(struct sna *sna);
 
 extern int sna_crtc_id(xf86CrtcPtr crtc);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index c5b96f2..b8cf3cc 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2243,3 +2243,18 @@ bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc)
 	     mode.mode_valid, sna->mode.fb_id == mode.fb_id));
 	return mode.mode_valid && sna->mode.fb_id == mode.fb_id;
 }
+
+void sna_mode_hotplug(struct sna *sna)
+{
+	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+	int i;
+
+	/* Validate CRTC attachments */
+	for (i = 0; i < xf86_config->num_crtc; i++) {
+		xf86CrtcPtr crtc = xf86_config->crtc[i];
+		if (crtc->enabled) {
+			struct sna_crtc *sna_crtc = crtc->driver_private;
+			sna_crtc->active = sna_crtc_is_bound(sna, crtc);
+		}
+	}
+}
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index cab6d03..d0b5bde 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -635,6 +635,7 @@ sna_handle_uevents(int fd, void *closure)
 	if (memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t)) == 0 &&
 	    hotplug && atoi(hotplug) == 1) {
 		DBG(("%s: hotplug event\n", __FUNCTION__));
+		sna_mode_hotplug(sna);
 		RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
 	}
 
commit 3f3bde4f0c72f6f31aae322bcdc20b95eade6631
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 24 11:58:46 2012 +0100

    uxa: Only consider an output valid if the kernel reports it attached
    
    Reported-by: Kyle Hill <kyle.hill at tacomafia.net>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50078
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index abdc372..77a1cce 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -1699,3 +1699,25 @@ int intel_crtc_to_pipe(xf86CrtcPtr crtc)
 	struct intel_crtc *intel_crtc = crtc->driver_private;
 	return intel_crtc->pipe;
 }
+
+Bool intel_crtc_on(xf86CrtcPtr crtc)
+{
+	ScrnInfoPtr scrn = crtc->scrn;
+	struct intel_crtc *intel_crtc = crtc->driver_private;
+	drmModeCrtcPtr drm_crtc;
+	Bool ret;
+
+	if (!crtc->enabled)
+		return FALSE;
+
+	/* Kernel manages CRTC status based on output config */
+	drm_crtc = drmModeGetCrtc(intel_crtc->mode->fd, crtc_id(intel_crtc));
+	if (drm_crtc == NULL)
+		return FALSE;
+
+	ret = (drm_crtc->mode_valid &&
+	       intel_crtc->mode->fb_id == drm_crtc->buffer_id);
+	free(drm_crtc);
+
+	return ret;
+}
diff --git a/src/intel_driver.c b/src/intel_driver.c
index d67d8c8..b055437 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -782,26 +782,6 @@ intel_init_initial_framebuffer(ScrnInfoPtr scrn)
 	return TRUE;
 }
 
-Bool intel_crtc_on(xf86CrtcPtr crtc)
-{
-	ScrnInfoPtr scrn = crtc->scrn;
-	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-	int i;
-
-	if (!crtc->enabled)
-		return FALSE;
-
-	/* Kernel manages CRTC status based out output config */
-	for (i = 0; i < xf86_config->num_output; i++) {
-		xf86OutputPtr output = xf86_config->output[i];
-		if (output->crtc == crtc &&
-		    intel_output_dpms_status(output) == DPMSModeOn)
-			return TRUE;
-	}
-
-	return FALSE;
-}
-
 static void
 intel_flush_callback(CallbackListPtr *list,
 		     pointer user_data, pointer call_data)
commit 11db66fedf96f158cbbac8011a8ba0b29a20ba3a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 24 11:07:19 2012 +0100

    sna: Add some more DBG tracepoints around modesetting
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 990dd2e..c5b96f2 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -213,6 +213,8 @@ sna_output_backlight_set(xf86OutputPtr output, int level)
 	char path[BACKLIGHT_PATH_LEN], val[BACKLIGHT_VALUE_LEN];
 	int fd, len, ret;
 
+	DBG(("%s: level=%d\n", __FUNCTION__, level));
+
 	if (level > sna_output->backlight_max)
 		level = sna_output->backlight_max;
 	if (! sna_output->backlight_iface || level < 0)
@@ -262,9 +264,12 @@ sna_output_backlight_get(xf86OutputPtr output)
 	close(fd);
 
 	level = atoi(val);
+	DBG(("%s: level=%d (max=%d)\n",
+	     __FUNCTION__, level, sna_output->backlight_max));
+
 	if (level > sna_output->backlight_max)
 		level = sna_output->backlight_max;
-	if (level < 0)
+	else if (level < 0)
 		level = -1;
 	return level;
 }
@@ -394,6 +399,8 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 	int fb_id, x, y;
 	int i, ret = FALSE;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	assert(xf86_config->num_output < ARRAY_SIZE(output_ids));
 
 	for (i = 0; i < xf86_config->num_output; i++) {
@@ -466,6 +473,9 @@ sna_crtc_restore(struct sna *sna)
 	struct kgem_bo *bo;
 	int i;
 
+	DBG(("%s (fb_pixmap=%d, front=%d)\n", __FUNCTION__,
+	     sna->mode.fb_pixmap, sna->front->drawable.serialNumber));
+
 	if (sna->mode.fb_pixmap == sna->front->drawable.serialNumber)
 		return;
 
@@ -492,12 +502,8 @@ sna_crtc_restore(struct sna *sna)
 
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[i];
-
-		if (!crtc->enabled)
-			continue;
-
-		if (!sna_crtc_apply(crtc))
-			return;
+		if (crtc->enabled)
+			sna_crtc_apply(crtc);
 	}
 
 	kgem_bo_retire(&sna->kgem, bo);
@@ -560,9 +566,11 @@ void sna_copy_fbcon(struct sna *sna)
 	int dx, dy;
 	int i;
 
-	if (sna->kgem.wedged)
+	if (wedged(sna))
 		return;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	/* Scan the connectors for a framebuffer and assume that is the fbcon */
 	fbcon = NULL;
 	for (i = 0; fbcon == NULL && i < xf86_config->num_crtc; i++) {
@@ -579,8 +587,10 @@ void sna_copy_fbcon(struct sna *sna)
 					     mode_crtc->buffer_id);
 		drmModeFreeCrtc(mode_crtc);
 	}
-	if (fbcon == NULL)
+	if (fbcon == NULL) {
+		DBG(("%s: no fbcon found\n", __FUNCTION__));
 		return;
+	}
 
 	/* Wrap the fbcon in a pixmap so that we select the right formats
 	 * in the render copy in case we need to preserve the fbcon
@@ -601,6 +611,8 @@ void sna_copy_fbcon(struct sna *sna)
 	if (bo == NULL)
 		goto cleanup_scratch;
 
+	DBG(("%s: fbcon handle=%d\n", __FUNCTION__, bo->handle));
+
 	priv = sna_pixmap(sna->front);
 	assert(priv && priv->gpu_bo);
 
@@ -756,6 +768,7 @@ sna_crtc_hide_cursor(xf86CrtcPtr crtc)
 	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = crtc->driver_private;
 
+	DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
 	drmModeSetCursor(sna->kgem.fd, crtc_id(sna_crtc), 0, 64, 64);
 }
 
@@ -765,6 +778,7 @@ sna_crtc_show_cursor(xf86CrtcPtr crtc)
 	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = crtc->driver_private;
 
+	DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
 	drmModeSetCursor(sna->kgem.fd, crtc_id(sna_crtc),
 			 sna_crtc->cursor, 64, 64);
 }
@@ -909,6 +923,8 @@ sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	struct sna_crtc *sna_crtc;
 	struct drm_i915_get_pipe_from_crtc_id get_pipe;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	sna_crtc = calloc(sizeof(struct sna_crtc), 1);
 	if (sna_crtc == NULL)
 		return;
@@ -967,6 +983,8 @@ sna_output_detect(xf86OutputPtr output)
 	struct sna_output *sna_output = output->driver_private;
 	xf86OutputStatus status;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	drmModeFreeConnector(sna_output->mode_output);
 	sna_output->mode_output =
 		drmModeGetConnector(sna->kgem.fd, sna_output->output_id);
@@ -1099,6 +1117,8 @@ sna_output_get_modes(xf86OutputPtr output)
 	DisplayModePtr Modes = NULL;
 	int i;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	sna_output_attach_edid(output);
 
 	/* modes should already be available */
@@ -1190,6 +1210,8 @@ sna_output_dpms(xf86OutputPtr output, int dpms)
 	drmModeConnectorPtr koutput = sna_output->mode_output;
 	int i;
 
+	DBG(("%s: dpms=%d\n", __FUNCTION__, dpms));
+
 	for (i = 0; i < koutput->count_props; i++) {
 		drmModePropertyPtr props;
 
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index d4b7eb0..cab6d03 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -633,8 +633,10 @@ sna_handle_uevents(int fd, void *closure)
 	hotplug = udev_device_get_property_value(dev, "HOTPLUG");
 
 	if (memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t)) == 0 &&
-			hotplug && atoi(hotplug) == 1)
+	    hotplug && atoi(hotplug) == 1) {
+		DBG(("%s: hotplug event\n", __FUNCTION__));
 		RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
+	}
 
 	udev_device_unref(dev);
 }
commit fb9da4cb9e12ca733c31879b8b37906f361a8c35
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 23 13:53:37 2012 +0100

    sna: Only mark an unattached output as inactive
    
    So that a latter attempt to set the DesiredMode may succeed and we do
    not modify the configuration without notifying clients.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 0c73c36..990dd2e 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -448,7 +448,7 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 			   "failed to set mode: %s\n", strerror(-ret));
 		ret = FALSE;
 	} else {
-		crtc->enabled = sna_crtc->active = sna_crtc_is_bound(sna, crtc);
+		sna_crtc->active = sna_crtc_is_bound(sna, crtc);
 		ret = TRUE;
 	}
 
commit 5ae032e22b127c7c95753197e0914a8028a3b22e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 23 13:27:07 2012 +0100

    sna: Suppress modesetting errors on return from VT switch
    
    If we presume that userspace will set the correct mode shortly
    afterwards, we can ignore the failure of the automatic restore.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 2e81640..d4b7eb0 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -571,13 +571,6 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	return sna_accel_pre_init(sna);
 }
 
-/**
- * Intialiazes the hardware for the 3D pipeline use in the 2D driver.
- *
- * Some state caching is performed to avoid redundant state emits.  This
- * function is also responsible for marking the state as clobbered for DRI
- * clients.
- */
 static void
 sna_block_handler(int i, pointer data, pointer timeout, pointer read_mask)
 {
@@ -981,12 +974,17 @@ static Bool sna_enter_vt(int scrnIndex, int flags)
 	DBG(("%s\n", __FUNCTION__));
 
 	if (drmSetMaster(sna->kgem.fd)) {
-		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 			   "drmSetMaster failed: %s\n",
 			   strerror(errno));
+		return FALSE;
 	}
 
-	return xf86SetDesiredModes(scrn);
+	if (!xf86SetDesiredModes(scrn))
+		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+			   "failed to restore desired modes on VT switch\n");
+
+	return TRUE;
 }
 
 static Bool sna_switch_mode(int scrnIndex, DisplayModePtr mode, int flags)
commit 34882a979d9817d33bd6a8ae73a9f7083556578c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 23 10:27:44 2012 +0100

    sna: Keep checking retirement for flushing list
    
    Even after all outstanding requests have been completed we may still
    have buffers on the flushing list that need to become idle.
    Once such consequence would be to prevent the vblank flush from going
    idle, causing spurious wakeups every vrefresh when otherwise idle.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=50078
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 470dd24..9a67c38 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1403,8 +1403,11 @@ bool kgem_retire(struct kgem *kgem)
 	retired |= kgem_retire__requests(kgem);
 	retired |= kgem_retire__partials(kgem);
 
-	DBG(("%s -- need_retire=%d\n", __FUNCTION__, kgem->need_retire));
-	kgem->need_retire = !list_is_empty(&kgem->requests);
+	kgem->need_retire =
+		!list_is_empty(&kgem->requests) ||
+		!list_is_empty(&kgem->flushing);
+	DBG(("%s -- retired=%d, need_retire=%d\n",
+	     __FUNCTION__, retired, kgem->need_retire));
 
 	kgem->retire(kgem);
 
commit 54fde5bf05d43f26e7f1893584af736a138d245f
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed May 16 15:34:08 2012 +0100

    intel: convert sna/uxa to using new glyph picture accessors.
    
    The compat-api.h takes care of old/new servers.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 2af7e80..0a2e042 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -221,7 +221,7 @@ glyph_cache_upload(ScreenPtr screen,
 	DBG(("%s: upload glyph %p to cache (%d, %d)x(%d, %d)\n",
 	     __FUNCTION__, glyph, x, y, glyph->info.width, glyph->info.height));
 	sna_composite(PictOpSrc,
-		      GlyphPicture(glyph)[screen->myNum], 0, cache->picture,
+		      GetGlyphPicture(glyph, screen), 0, cache->picture,
 		      0, 0,
 		      0, 0,
 		      x, y,
@@ -302,7 +302,7 @@ glyph_cache(ScreenPtr screen,
 	    struct sna_render *render,
 	    GlyphPtr glyph)
 {
-	PicturePtr glyph_picture = GlyphPicture(glyph)[screen->myNum];
+	PicturePtr glyph_picture = GetGlyphPicture(glyph, screen);
 	struct sna_glyph_cache *cache = &render->glyph[PICT_FORMAT_RGB(glyph_picture->format) != 0];
 	struct sna_glyph *priv;
 	int size, mask, pos, s;
@@ -460,7 +460,7 @@ glyphs_to_dst(struct sna *sna,
 				}
 				if (!glyph_cache(screen, &sna->render, glyph)) {
 					/* no cache for this glyph */
-					priv.atlas = GlyphPicture(glyph)[index];
+					priv.atlas = GetGlyphPicture(glyph, screen);
 					priv.coordinate.x = priv.coordinate.y = 0;
 				} else
 					priv = *sna_glyph(glyph);
@@ -600,7 +600,7 @@ glyphs_slow(struct sna *sna,
 			if (priv.atlas == NULL) {
 				if (!glyph_cache(screen, &sna->render, glyph)) {
 					/* no cache for this glyph */
-					priv.atlas = GlyphPicture(glyph)[index];
+					priv.atlas = GetGlyphPicture(glyph, screen);
 					priv.coordinate.x = priv.coordinate.y = 0;
 				} else
 					priv = *sna_glyph(glyph);
@@ -813,7 +813,7 @@ upload:
 				if (glyph_image == NULL) {
 					int dx, dy;
 
-					picture = GlyphPicture(g)[s];
+					picture = GetGlyphPicture(g, dst->pDrawable->pScreen);
 					if (picture == NULL)
 						goto next_image;
 
@@ -908,7 +908,7 @@ next_image:
 						r.src = priv->coordinate;
 					} else {
 						/* no cache for this glyph */
-						this_atlas = GlyphPicture(glyph)[index];
+						this_atlas = GetGlyphPicture(glyph, screen);
 						r.src.x = r.src.y = 0;
 					}
 				}
@@ -1046,7 +1046,6 @@ glyphs_fallback(CARD8 op,
 		GlyphListPtr list,
 		GlyphPtr *glyphs)
 {
-	int screen = dst->pDrawable->pScreen->myNum;
 	pixman_image_t *dst_image, *mask_image, *src_image;
 	int dx, dy, x, y;
 	BoxRec box;
@@ -1156,7 +1155,7 @@ glyphs_fallback(CARD8 op,
 				PicturePtr picture;
 				int gx, gy;
 
-				picture = GlyphPicture(g)[screen];
+				picture = GetGlyphPicture(g, dst->pDrawable->pScreen);
 				if (picture == NULL)
 					goto next_glyph;
 
diff --git a/uxa/uxa-glyphs.c b/uxa/uxa-glyphs.c
index 921b99c..7db094b 100644
--- a/uxa/uxa-glyphs.c
+++ b/uxa/uxa-glyphs.c
@@ -235,7 +235,7 @@ uxa_glyph_cache_upload_glyph(ScreenPtr screen,
 			     GlyphPtr glyph,
 			     int x, int y)
 {
-	PicturePtr pGlyphPicture = GlyphPicture(glyph)[screen->myNum];
+	PicturePtr pGlyphPicture = GetGlyphPicture(glyph, screen);
 	PixmapPtr pGlyphPixmap = (PixmapPtr) pGlyphPicture->pDrawable;
 	PixmapPtr pCachePixmap = (PixmapPtr) cache->picture->pDrawable;
 	PixmapPtr scratch;
@@ -449,7 +449,6 @@ uxa_check_glyphs(CARD8 op,
 		 INT16 xSrc,
 		 INT16 ySrc, int nlist, GlyphListPtr list, GlyphPtr * glyphs)
 {
-	int screen = dst->pDrawable->pScreen->myNum;
 	pixman_image_t *image;
 	PixmapPtr scratch;
 	PicturePtr mask;
@@ -513,7 +512,7 @@ uxa_check_glyphs(CARD8 op,
 		n = list->len;
 		while (n--) {
 			GlyphPtr glyph = *glyphs++;
-			PicturePtr g = GlyphPicture(glyph)[screen];
+			PicturePtr g = GetGlyphPicture(glyph, dst->pDrawable->pScreen);
 			if (g) {
 				if (maskFormat) {
 					CompositePicture(PictOpAdd, g, NULL, mask,
@@ -579,7 +578,7 @@ static PicturePtr
 uxa_glyph_cache(ScreenPtr screen, GlyphPtr glyph, int *out_x, int *out_y)
 {
 	uxa_screen_t *uxa_screen = uxa_get_screen(screen);
-	PicturePtr glyph_picture = GlyphPicture(glyph)[screen->myNum];
+	PicturePtr glyph_picture = GetGlyphPicture(glyph, screen);
 	uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[PICT_FORMAT_RGB(glyph_picture->format) != 0];
 	struct uxa_glyph *priv = NULL;
 	int size, mask, pos, s;
@@ -796,7 +795,7 @@ uxa_glyphs_via_mask(CARD8 op,
 				this_atlas = uxa_glyph_cache(screen, glyph, &src_x, &src_y);
 				if (this_atlas == NULL) {
 					/* no cache for this glyph */
-					this_atlas = GlyphPicture(glyph)[screen->myNum];
+					this_atlas = GetGlyphPicture(glyph, screen);
 					src_x = src_y = 0;
 				}
 			}
commit 43a34186d13d29c671431832469ca5301751b3cf
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed May 16 15:26:55 2012 +0100

    intel: convert to new screen conversion APIs
    
    The compat header takes care of the old server vs new server.
    
    this commit was autogenerated from util/modular/x-driver-screen-scrn-conv.sh
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/i830_render.c b/src/i830_render.c
index c12e87b..e169cc1 100644
--- a/src/i830_render.c
+++ b/src/i830_render.c
@@ -164,7 +164,7 @@ static Bool i830_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
 		*dst_format = COLR_BUF_ARGB4444;
 		break;
 	default:
-		scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+		scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 		intel_debug_fallback(scrn, "Unsupported dest format 0x%x\n",
 				     (int)dest_picture->format);
 		return FALSE;
@@ -245,7 +245,7 @@ static uint32_t i8xx_get_card_format(intel_screen_private *intel,
 static void i830_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
 {
 
-	ScrnInfoPtr scrn = xf86Screens[picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(picture->pDrawable->pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	uint32_t format, tiling_bits, pitch, filter;
 	uint32_t wrap_mode;
@@ -346,7 +346,7 @@ i830_check_composite(int op,
 		     PicturePtr dest_picture,
 		     int width, int height)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 	uint32_t tmp1;
 
 	/* Check for unsupported compositing operations. */
@@ -399,7 +399,7 @@ i830_check_composite_target(PixmapPtr pixmap)
 Bool
 i830_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if (picture->repeatType > RepeatReflect) {
@@ -446,7 +446,7 @@ i830_prepare_composite(int op, PicturePtr source_picture,
 		       PicturePtr mask_picture, PicturePtr dest_picture,
 		       PixmapPtr source, PixmapPtr mask, PixmapPtr dest)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	drm_intel_bo *bo_table[] = {
 		NULL,		/* batch_bo */
@@ -665,7 +665,7 @@ i830_emit_composite_primitive(PixmapPtr dest,
 			      int maskX, int maskY,
 			      int dstX, int dstY, int w, int h)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	Bool is_affine_src, is_affine_mask = TRUE;
 	int per_vertex;
@@ -853,7 +853,7 @@ void
 i830_composite(PixmapPtr dest, int srcX, int srcY, int maskX, int maskY,
 	       int dstX, int dstY, int w, int h)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	intel_batch_start_atomic(scrn, 58 +	/* invarient */
diff --git a/src/i915_render.c b/src/i915_render.c
index c6d5ed7..5605edf 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -172,7 +172,7 @@ static Bool i915_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
 		*dst_format = COLR_BUF_ARGB4444;
 		break;
 	default:
-		scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+		scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 		intel_debug_fallback(scrn,
 				     "Unsupported dest format 0x%x\n",
 				     (int)dest_picture->format);
@@ -189,7 +189,7 @@ i915_check_composite(int op,
 		     PicturePtr dest_picture,
 		     int width, int height)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 	uint32_t tmp1;
 
 	/* Check for unsupported compositing operations. */
@@ -243,7 +243,7 @@ Bool
 i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 {
 	if (picture->repeatType > RepeatReflect) {
-		ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 		intel_debug_fallback(scrn, "Unsupported picture repeat %d\n",
 			     picture->repeatType);
 		return FALSE;
@@ -251,7 +251,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 
 	if (picture->filter != PictFilterNearest &&
 	    picture->filter != PictFilterBilinear) {
-		ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 		intel_debug_fallback(scrn, "Unsupported filter 0x%x\n",
 				     picture->filter);
 		return FALSE;
@@ -266,7 +266,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 		w = picture->pDrawable->width;
 		h = picture->pDrawable->height;
 		if ((w > 2048) || (h > 2048)) {
-			ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+			ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 			intel_debug_fallback(scrn,
 					     "Picture w/h too large (%dx%d)\n",
 					     w, h);
@@ -281,7 +281,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 		}
 		if (i == sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]))
 		{
-			ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+			ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 			intel_debug_fallback(scrn, "Unsupported picture format "
 					     "0x%x\n",
 					     (int)picture->format);
@@ -296,7 +296,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 
 static Bool i915_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
 {
-	ScrnInfoPtr scrn = xf86Screens[picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(picture->pDrawable->pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	uint32_t format, pitch, filter;
 	uint32_t wrap_mode, tiling_bits;
@@ -660,7 +660,7 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 		       PicturePtr mask_picture, PicturePtr dest_picture,
 		       PixmapPtr source, PixmapPtr mask, PixmapPtr dest)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	drm_intel_bo *bo_table[] = {
 		NULL,		/* batch_bo */
@@ -951,7 +951,7 @@ void
 i915_composite(PixmapPtr dest, int srcX, int srcY, int maskX, int maskY,
 	       int dstX, int dstY, int w, int h)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	/* 28 + 16 + 10 + 20 + 32 + 16 */
diff --git a/src/i965_render.c b/src/i965_render.c
index b981ecc..98231b8 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -181,7 +181,7 @@ i965_check_composite(int op,
 		     PicturePtr dest_picture,
 		     int width, int height)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 
 	/* Check for unsupported compositing operations. */
 	if (op >= sizeof(i965_blend_op) / sizeof(i965_blend_op[0])) {
@@ -219,7 +219,7 @@ Bool
 i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 {
 	if (picture->repeatType > RepeatReflect) {
-		ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 		intel_debug_fallback(scrn,
 				     "extended repeat (%d) not supported\n",
 				     picture->repeatType);
@@ -228,7 +228,7 @@ i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 
 	if (picture->filter != PictFilterNearest &&
 	    picture->filter != PictFilterBilinear) {
-		ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 		intel_debug_fallback(scrn, "Unsupported filter 0x%x\n",
 				     picture->filter);
 		return FALSE;
@@ -240,7 +240,7 @@ i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 		w = picture->pDrawable->width;
 		h = picture->pDrawable->height;
 		if ((w > 8192) || (h > 8192)) {
-			ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+			ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 			intel_debug_fallback(scrn,
 					     "Picture w/h too large (%dx%d)\n",
 					     w, h);
@@ -255,7 +255,7 @@ i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 		}
 		if (i == sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]))
 		{
-			ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+			ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 			intel_debug_fallback(scrn,
 					     "Unsupported picture format "
 					     "0x%x\n",
@@ -1978,7 +1978,7 @@ i965_prepare_composite(int op, PicturePtr source_picture,
 		       PicturePtr mask_picture, PicturePtr dest_picture,
 		       PixmapPtr source, PixmapPtr mask, PixmapPtr dest)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct gen4_render_state *render_state = intel->gen4_render_state;
 	gen4_composite_op *composite_op = &render_state->composite_op;
@@ -2202,7 +2202,7 @@ void
 i965_composite(PixmapPtr dest, int srcX, int srcY, int maskX, int maskY,
 	       int dstX, int dstY, int w, int h)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	intel_batch_start_atomic(scrn, 200);
diff --git a/src/intel.h b/src/intel.h
index e274db1..253a6bf 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -560,7 +560,7 @@ intel_check_pitch_2d(PixmapPtr pixmap)
 {
 	uint32_t pitch = intel_pixmap_pitch(pixmap);
 	if (pitch > KB(32)) {
-		ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 		intel_debug_fallback(scrn, "pitch exceeds 2d limit 32K\n");
 		return FALSE;
 	}
@@ -573,7 +573,7 @@ intel_check_pitch_3d(PixmapPtr pixmap)
 {
 	uint32_t pitch = intel_pixmap_pitch(pixmap);
 	if (pitch > KB(8)) {
-		ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 		intel_debug_fallback(scrn, "pitch exceeds 3d limit 8K\n");
 		return FALSE;
 	}
diff --git a/src/intel_batchbuffer.c b/src/intel_batchbuffer.c
index 2719c38..46f22bc 100644
--- a/src/intel_batchbuffer.c
+++ b/src/intel_batchbuffer.c
@@ -246,7 +246,7 @@ void intel_batch_submit(ScrnInfoPtr scrn)
 			if (!once) {
 				xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Detected a hung GPU, disabling acceleration.\n");
 				xf86DrvMsg(scrn->scrnIndex, X_ERROR, "When reporting this, please include i915_error_state from debugfs and the full dmesg.\n");
-				uxa_set_force_fallback(screenInfo.screens[scrn->scrnIndex], TRUE);
+				uxa_set_force_fallback(xf86ScrnToScreen(scrn), TRUE);
 				intel->force_fallback = TRUE;
 				once = 1;
 			}
diff --git a/src/intel_dri.c b/src/intel_dri.c
index a5ed545..36e96ff 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -97,7 +97,7 @@ static uint32_t pixmap_flink(PixmapPtr pixmap)
 static PixmapPtr get_front_buffer(DrawablePtr drawable)
 {
 	ScreenPtr screen = drawable->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	PixmapPtr pixmap;
 
@@ -130,7 +130,7 @@ static PixmapPtr get_front_buffer(DrawablePtr drawable)
 static PixmapPtr fixup_glamor(DrawablePtr drawable, PixmapPtr pixmap)
 {
 	ScreenPtr screen = drawable->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	PixmapPtr old = get_drawable_pixmap(drawable);
 	struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
 	GCPtr gc;
@@ -182,7 +182,7 @@ static PixmapPtr fixup_glamor(DrawablePtr drawable, PixmapPtr pixmap)
 				   priv->stride,
 				   NULL);
 
-	intel_get_screen_private(xf86Screens[screen->myNum])->needs_flush = TRUE;
+	intel_get_screen_private(xf86ScreenToScrn(screen))->needs_flush = TRUE;
 	return old;
 }
 
@@ -248,7 +248,7 @@ static PixmapPtr fixup_shadow(DrawablePtr drawable, PixmapPtr pixmap)
 	intel_set_pixmap_private(old, priv);
 	old->refcnt++;
 
-	intel_get_screen_private(xf86Screens[screen->myNum])->needs_flush = TRUE;
+	intel_get_screen_private(xf86ScreenToScrn(screen))->needs_flush = TRUE;
 	return old;
 }
 
@@ -258,7 +258,7 @@ I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments,
 		      int count)
 {
 	ScreenPtr screen = drawable->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	DRI2BufferPtr buffers;
 	I830DRI2BufferPrivatePtr privates;
@@ -385,7 +385,7 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
 		     unsigned int format)
 {
 	ScreenPtr screen = drawable->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	DRI2Buffer2Ptr buffer;
 	I830DRI2BufferPrivatePtr privates;
@@ -534,7 +534,7 @@ I830DRI2CopyRegion(DrawablePtr drawable, RegionPtr pRegion,
 	I830DRI2BufferPrivatePtr srcPrivate = sourceBuffer->driverPrivate;
 	I830DRI2BufferPrivatePtr dstPrivate = destBuffer->driverPrivate;
 	ScreenPtr screen = drawable->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	DrawablePtr src = (sourceBuffer->attachment == DRI2BufferFrontLeft)
 		? drawable : &srcPrivate->pixmap->drawable;
@@ -687,7 +687,7 @@ static int
 I830DRI2DrawablePipe(DrawablePtr pDraw)
 {
 	ScreenPtr pScreen = pDraw->pScreen;
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	BoxRec box, crtcbox;
 	xf86CrtcPtr crtc;
 	int pipe = -1;
@@ -910,7 +910,7 @@ intel_glamor_create_back_pixmap(ScreenPtr screen,
 				   0);
 	intel_set_pixmap_bo(back_pixmap, back_bo);
 	if (!intel_glamor_create_textured_pixmap(back_pixmap)) {
-		ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "Failed to create textured back pixmap.\n");
 		screen->DestroyPixmap(back_pixmap);
@@ -1026,7 +1026,7 @@ I830DRI2ScheduleFlip(struct intel_screen_private *intel,
 static Bool
 can_exchange(DrawablePtr drawable, DRI2BufferPtr front, DRI2BufferPtr back)
 {
-	struct intel_screen_private *intel = intel_get_screen_private(xf86Screens[drawable->pScreen->myNum]);
+	struct intel_screen_private *intel = intel_get_screen_private(xf86ScreenToScrn(drawable->pScreen));
 	I830DRI2BufferPrivatePtr front_priv = front->driverPrivate;
 	I830DRI2BufferPrivatePtr back_priv = back->driverPrivate;
 	PixmapPtr front_pixmap = front_priv->pixmap;
@@ -1244,7 +1244,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		     CARD64 remainder, DRI2SwapEventPtr func, void *data)
 {
 	ScreenPtr screen = draw->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	drmVBlank vbl;
 	int ret, pipe = I830DRI2DrawablePipe(draw), flip = 0;
@@ -1431,7 +1431,7 @@ static int
 I830DRI2GetMSC(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
 {
 	ScreenPtr screen = draw->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	drmVBlank vbl;
 	int ret, pipe = I830DRI2DrawablePipe(draw);
@@ -1478,7 +1478,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
 			CARD64 divisor, CARD64 remainder)
 {
 	ScreenPtr screen = draw->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	DRI2FrameEventPtr wait_info;
 	drmVBlank vbl;
@@ -1616,7 +1616,7 @@ static int dri2_server_generation;
 
 Bool I830DRI2ScreenInit(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	DRI2InfoRec info;
 	int dri2_major = 1;
@@ -1701,7 +1701,7 @@ Bool I830DRI2ScreenInit(ScreenPtr screen)
 
 void I830DRI2CloseScreen(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	DRI2CloseScreen(screen);
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 4265de8..d67d8c8 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -217,7 +217,7 @@ I830LoadPalette(ScrnInfoPtr scrn, int numColors, int *indices,
  */
 static Bool i830CreateScreenResources(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	screen->CreateScreenResources = intel->CreateScreenResources;
@@ -840,7 +840,7 @@ I830HandleUEvents(int fd, void *closure)
 
 	if (memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t)) == 0 &&
 			hotplug && atoi(hotplug) == 1)
-		RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE);
+		RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
 
 	udev_device_unref(dev);
 }
@@ -919,7 +919,7 @@ I830UeventFini(ScrnInfoPtr scrn)
 static Bool
 I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	VisualPtr visual;
 #ifdef INTEL_XVMC
diff --git a/src/intel_glamor.c b/src/intel_glamor.c
index a868157..4741d58 100644
--- a/src/intel_glamor.c
+++ b/src/intel_glamor.c
@@ -53,7 +53,7 @@ intel_glamor_exchange_buffers(struct intel_screen_private *intel,
 Bool
 intel_glamor_create_screen_resources(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if (!(intel->uxa_flags & UXA_USE_GLAMOR))
@@ -104,7 +104,7 @@ PixmapPtr
 intel_glamor_create_pixmap(ScreenPtr screen, int w, int h,
 			   int depth, unsigned int usage)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if (intel->uxa_flags & UXA_USE_GLAMOR)
@@ -116,7 +116,7 @@ intel_glamor_create_pixmap(ScreenPtr screen, int w, int h,
 Bool
 intel_glamor_create_textured_pixmap(PixmapPtr pixmap)
 {
-	ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct intel_pixmap *priv;
 
@@ -136,7 +136,7 @@ intel_glamor_create_textured_pixmap(PixmapPtr pixmap)
 void
 intel_glamor_destroy_pixmap(PixmapPtr pixmap)
 {
-	ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private * intel;
 
 	intel = intel_get_screen_private(scrn);
@@ -147,7 +147,7 @@ intel_glamor_destroy_pixmap(PixmapPtr pixmap)
 static void
 intel_glamor_need_flush(DrawablePtr pDrawable)
 {
-	ScrnInfoPtr scrn = xf86Screens[pDrawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen);
 	intel_screen_private * intel;
 
 	intel = intel_get_screen_private(scrn);
@@ -175,7 +175,7 @@ intel_glamor_finish_access(PixmapPtr pixmap, uxa_access_t access)
 Bool
 intel_glamor_init(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if ((intel->uxa_flags & UXA_GLAMOR_EGL_INITIALIZED) == 0)
@@ -213,7 +213,7 @@ intel_glamor_flush(intel_screen_private * intel)
 {
 	ScreenPtr screen;
 
-	screen = screenInfo.screens[intel->scrn->scrnIndex];
+	screen = xf86ScrnToScreen(intel->scrn);
 	if (intel->uxa_flags & UXA_USE_GLAMOR)
 		glamor_block_handler(screen);
 }
@@ -221,7 +221,7 @@ intel_glamor_flush(intel_screen_private * intel)
 Bool
 intel_glamor_close_screen(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if (intel->uxa_flags & UXA_USE_GLAMOR)
diff --git a/src/intel_hwmc.c b/src/intel_hwmc.c
index d626725..af8bd81 100644
--- a/src/intel_hwmc.c
+++ b/src/intel_hwmc.c
@@ -189,7 +189,7 @@ static XF86MCSurfaceInfoPtr surface_info_vld[] = {
 /* check chip type and load xvmc driver */
 Bool intel_xvmc_adaptor_init(ScreenPtr pScreen)
 {
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	static XF86MCAdaptorRec *pAdapt;
 	char *name;
diff --git a/src/intel_uxa.c b/src/intel_uxa.c
index 0b1a369..383efc5 100644
--- a/src/intel_uxa.c
+++ b/src/intel_uxa.c
@@ -160,7 +160,7 @@ intel_uxa_pixmap_compute_size(PixmapPtr pixmap,
 			      int *stride,
 			      unsigned usage)
 {
-	ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	int pitch, size;
 
@@ -241,7 +241,7 @@ intel_uxa_pixmap_compute_size(PixmapPtr pixmap,
 static Bool
 intel_uxa_check_solid(DrawablePtr drawable, int alu, Pixel planemask)
 {
-	ScrnInfoPtr scrn = xf86Screens[drawable->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(drawable->pScreen);
 
 	if (!UXA_PM_IS_SOLID(drawable, planemask)) {
 		intel_debug_fallback(scrn, "planemask is not solid\n");
@@ -266,7 +266,7 @@ intel_uxa_check_solid(DrawablePtr drawable, int alu, Pixel planemask)
 static Bool
 intel_uxa_prepare_solid(PixmapPtr pixmap, int alu, Pixel planemask, Pixel fg)
 {
-	ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	drm_intel_bo *bo_table[] = {
 		NULL,		/* batch_bo */
@@ -299,7 +299,7 @@ intel_uxa_prepare_solid(PixmapPtr pixmap, int alu, Pixel planemask, Pixel fg)
 
 static void intel_uxa_solid(PixmapPtr pixmap, int x1, int y1, int x2, int y2)
 {
-	ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	unsigned long pitch;
 	uint32_t cmd;
@@ -353,7 +353,7 @@ static Bool
 intel_uxa_check_copy(PixmapPtr source, PixmapPtr dest,
 		    int alu, Pixel planemask)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 
 	if (!UXA_PM_IS_SOLID(&source->drawable, planemask)) {
 		intel_debug_fallback(scrn, "planemask is not solid");
@@ -385,7 +385,7 @@ static Bool
 intel_uxa_prepare_copy(PixmapPtr source, PixmapPtr dest, int xdir,
 		      int ydir, int alu, Pixel planemask)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	drm_intel_bo *bo_table[] = {
 		NULL,		/* batch_bo */
@@ -417,7 +417,7 @@ static void
 intel_uxa_copy(PixmapPtr dest, int src_x1, int src_y1, int dst_x1,
 	      int dst_y1, int w, int h)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	uint32_t cmd;
 	int dst_x2, dst_y2, src_x2, src_y2;
@@ -501,7 +501,7 @@ intel_uxa_copy(PixmapPtr dest, int src_x1, int src_y1, int dst_x1,
 
 static void intel_uxa_done(PixmapPtr pixmap)
 {
-	ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if (IS_GEN6(intel) || IS_GEN7(intel)) {
@@ -523,7 +523,7 @@ static void intel_uxa_done(PixmapPtr pixmap)
  */
 static void i830_done_composite(PixmapPtr dest)
 {
-	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	if (intel->vertex_flush)
@@ -682,7 +682,7 @@ static Bool intel_uxa_pixmap_is_offscreen(PixmapPtr pixmap)
 
 static Bool intel_uxa_prepare_access(PixmapPtr pixmap, uxa_access_t access)
 {
-	ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
 	dri_bo *bo = priv->bo;
@@ -787,7 +787,7 @@ static Bool intel_uxa_put_image(PixmapPtr pixmap,
 		    w == pixmap->drawable.width &&
 		    h == pixmap->drawable.height)
 		{
-			intel_screen_private *intel = intel_get_screen_private(xf86Screens[screen->myNum]);
+			intel_screen_private *intel = intel_get_screen_private(xf86ScreenToScrn(screen));
 			uint32_t tiling = priv->tiling;
 			int size, stride;
 			dri_bo *bo;
@@ -932,7 +932,7 @@ static Bool intel_uxa_get_image(PixmapPtr pixmap,
 
 		FreeScratchGC(gc);
 
-		intel_batch_submit(xf86Screens[screen->myNum]);
+		intel_batch_submit(xf86ScreenToScrn(screen));
 
 		x = y = 0;
 		pixmap = scratch;
@@ -1008,7 +1008,7 @@ static PixmapPtr
 intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
 			unsigned usage)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct intel_pixmap *priv;
 	PixmapPtr pixmap, new_pixmap = NULL;
@@ -1146,7 +1146,7 @@ static Bool intel_uxa_destroy_pixmap(PixmapPtr pixmap)
 
 Bool intel_uxa_create_screen_resources(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	dri_bo *bo = intel->front_buffer;
 
@@ -1230,7 +1230,7 @@ intel_limits_init(intel_screen_private *intel)
 
 Bool intel_uxa_init(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 #if HAS_DIXREGISTERPRIVATEKEY
diff --git a/src/intel_video.c b/src/intel_video.c
index 0834bb2..83d1eab 100644
--- a/src/intel_video.c
+++ b/src/intel_video.c
@@ -327,7 +327,7 @@ intel_overlay_put_image(intel_screen_private *intel,
 
 void I830InitVideo(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
 	XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL;
@@ -407,7 +407,7 @@ void I830InitVideo(ScreenPtr screen)
 
 static XF86VideoAdaptorPtr I830SetupImageVideoOverlay(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	XF86VideoAdaptorPtr adapt;
 	intel_adaptor_private *adaptor_priv;
@@ -516,7 +516,7 @@ static XF86VideoAdaptorPtr I830SetupImageVideoOverlay(ScreenPtr screen)
 
 static XF86VideoAdaptorPtr I830SetupImageVideoTextured(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	XF86VideoAdaptorPtr adapt;
 	intel_adaptor_private *adaptor_privs;
diff --git a/src/legacy/i810/i810_accel.c b/src/legacy/i810/i810_accel.c
index 6b57dbb..7120b4b 100644
--- a/src/legacy/i810/i810_accel.c
+++ b/src/legacy/i810/i810_accel.c
@@ -69,7 +69,7 @@ Bool
 I810AccelInit(ScreenPtr pScreen)
 {
    XAAInfoRecPtr infoPtr;
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
 
    if (I810_DEBUG & DEBUG_VERBOSE_ACCEL)
@@ -215,8 +215,8 @@ I810WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis)
 	 ErrorF("space: %d wanted %d\n", ring->space, n);
 #ifdef HAVE_DRI1
 	 if (pI810->directRenderingEnabled) {
-	    DRIUnlock(screenInfo.screens[pScrn->scrnIndex]);
-	    DRICloseScreen(screenInfo.screens[pScrn->scrnIndex]);
+	    DRIUnlock(xf86ScrnToScreen(pScrn));
+	    DRICloseScreen(xf86ScrnToScreen(pScrn));
 	 }
 #endif
 	 pI810->AccelInfoRec = NULL;	/* Stops recursive behavior */
diff --git a/src/legacy/i810/i810_cursor.c b/src/legacy/i810/i810_cursor.c
index 88829cb..580fe4b 100644
--- a/src/legacy/i810/i810_cursor.c
+++ b/src/legacy/i810/i810_cursor.c
@@ -63,7 +63,7 @@ I810CursorInit(ScreenPtr pScreen)
    I810Ptr pI810;
    xf86CursorInfoPtr infoPtr;
 
-   pScrn = xf86Screens[pScreen->myNum];
+   pScrn = xf86ScreenToScrn(pScreen);
    pI810 = I810PTR(pScrn);
    pI810->CursorInfoRec = infoPtr = xf86CreateCursorInfoRec();
    if (!infoPtr)
@@ -101,7 +101,7 @@ I810CursorInit(ScreenPtr pScreen)
 
 static Bool I810UseHWCursorARGB (ScreenPtr pScreen, CursorPtr pCurs)
 {
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
 
    if (!pI810->CursorARGBPhysical)
@@ -144,7 +144,7 @@ static void I810LoadCursorARGB (ScrnInfoPtr pScrn, CursorPtr pCurs)
 static Bool
 I810UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
 {
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
 
    if (!pI810->CursorPhysical)
diff --git a/src/legacy/i810/i810_dga.c b/src/legacy/i810/i810_dga.c
index 44181c6..baf0011 100644
--- a/src/legacy/i810/i810_dga.c
+++ b/src/legacy/i810/i810_dga.c
@@ -70,7 +70,7 @@ DGAFunctionRec I810DGAFuncs = {
 Bool
 I810DGAInit(ScreenPtr pScreen)
 {
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
    DGAModePtr modes = NULL, newmodes = NULL, currentMode;
    DisplayModePtr pMode, firstMode;
diff --git a/src/legacy/i810/i810_dri.c b/src/legacy/i810/i810_dri.c
index 9129069..2f02dd9 100644
--- a/src/legacy/i810/i810_dri.c
+++ b/src/legacy/i810/i810_dri.c
@@ -155,7 +155,7 @@ mylog2(unsigned int n)
 Bool
 I810DRIScreenInit(ScreenPtr pScreen)
 {
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
    DRIInfoPtr pDRIInfo;
    I810DRIPtr pI810DRI;
@@ -891,7 +891,7 @@ I810DRIScreenInit(ScreenPtr pScreen)
 void
 I810DRICloseScreen(ScreenPtr pScreen)
 {
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
    I810DRIPtr pI810DRI = (I810DRIPtr) pI810->pDRIInfo->devPrivate;
 
@@ -956,7 +956,7 @@ Bool
 I810DRIFinishScreenInit(ScreenPtr pScreen)
 {
    I810SAREARec *sPriv = (I810SAREARec *) DRIGetSAREAPrivate(pScreen);
-   ScrnInfoPtr        pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr        pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr info  = I810PTR(pScrn);
 
    memset(sPriv, 0, sizeof(sPriv));
@@ -976,7 +976,7 @@ I810DRISwapContext(ScreenPtr pScreen, DRISyncType syncType,
 		   DRIContextType oldContextType, void *oldContext,
 		   DRIContextType newContextType, void *newContext)
 {
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
 
    if (syncType == DRI_3D_SYNC &&
@@ -1002,7 +1002,7 @@ static void
 I810DRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index)
 {
    ScreenPtr pScreen = pWin->drawable.pScreen;
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
    BoxPtr pbox = REGION_RECTS(prgn);
    int nbox = REGION_NUM_RECTS(prgn);
@@ -1047,7 +1047,7 @@ I810DRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg,
 		   RegionPtr prgnSrc, CARD32 index)
 {
    ScreenPtr pScreen = pParent->drawable.pScreen;
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    I810Ptr pI810 = I810PTR(pScrn);
    BoxPtr pboxTmp, pboxNext, pboxBase;
    DDXPointPtr pptTmp, pptNew2 = NULL;
@@ -1249,7 +1249,7 @@ static void I810DRIRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
 
 static void I810EnablePageFlip(ScreenPtr pScreen)
 {
-    ScrnInfoPtr         pScrn      = xf86Screens[pScreen->myNum];
+    ScrnInfoPtr         pScrn      = xf86ScreenToScrn(pScreen);
     I810Ptr       pI810       = I810PTR(pScrn);
     I810SAREAPtr  pSAREAPriv = DRIGetSAREAPrivate(pScreen);
     int cpp=2;
@@ -1298,7 +1298,7 @@ static void I810DRITransitionMultiToSingle3d(ScreenPtr pScreen)
 
 static void I810DRITransitionTo3d(ScreenPtr pScreen)
 {
-    ScrnInfoPtr    pScrn = xf86Screens[pScreen->myNum];
+    ScrnInfoPtr    pScrn = xf86ScreenToScrn(pScreen);
     I810Ptr  pI810  = I810PTR(pScrn);
 
     I810EnablePageFlip(pScreen);
@@ -1307,7 +1307,7 @@ static void I810DRITransitionTo3d(ScreenPtr pScreen)
 
 static void I810DRITransitionTo2d(ScreenPtr pScreen)
 {
-    ScrnInfoPtr         pScrn      = xf86Screens[pScreen->myNum];
+    ScrnInfoPtr         pScrn      = xf86ScreenToScrn(pScreen);
     I810Ptr       pI810       = I810PTR(pScrn);
     I810SAREAPtr  pSAREAPriv = DRIGetSAREAPrivate(pScreen);
 
diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c
index 60053d8..09d52c5 100644
--- a/src/legacy/i810/i810_driver.c
+++ b/src/legacy/i810/i810_driver.c
@@ -1353,7 +1353,7 @@ I810ModeInit(ScrnInfoPtr scrn, DisplayModePtr mode)
 
 #ifdef HAVE_DRI1
    if (pI810->directRenderingEnabled) {
-      DRILock(screenInfo.screens[scrn->scrnIndex], 0);
+      DRILock(xf86ScrnToScreen(scrn), 0);
       pI810->LockHeld = 1;
    }
 #endif
@@ -1362,7 +1362,7 @@ I810ModeInit(ScrnInfoPtr scrn, DisplayModePtr mode)
 
 #ifdef HAVE_DRI1
    if (pI810->directRenderingEnabled) {
-      DRIUnlock(screenInfo.screens[scrn->scrnIndex]);
+      DRIUnlock(xf86ScrnToScreen(scrn));
       pI810->LockHeld = 0;
    }
 #endif
@@ -1577,7 +1577,7 @@ I810ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
    I810Ptr pI810;
    VisualPtr visual;
 
-   scrn = xf86Screens[screen->myNum];
+   scrn = xf86ScreenToScrn(screen);
    pI810 = I810PTR(scrn);
    hwp = VGAHWPTR(scrn);
 
diff --git a/src/legacy/i810/i810_hwmc.c b/src/legacy/i810/i810_hwmc.c
index ba50e1e..c7100e0 100644
--- a/src/legacy/i810/i810_hwmc.c
+++ b/src/legacy/i810/i810_hwmc.c
@@ -197,7 +197,7 @@ static XF86MCAdaptorPtr ppAdapt[1] =
  **************************************************************************/
 void I810InitMC(ScreenPtr pScreen)
 {
-  ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+  ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
   I810Ptr pI810 = I810PTR(pScrn);
   int i;
 
diff --git a/src/legacy/i810/i810_video.c b/src/legacy/i810/i810_video.c
index 5a568a6..2999ee0 100644
--- a/src/legacy/i810/i810_video.c
+++ b/src/legacy/i810/i810_video.c
@@ -154,7 +154,7 @@ static Atom xvBrightness, xvContrast, xvColorKey;
 
 void I810InitVideo(ScreenPtr screen)
 {
-    ScrnInfoPtr pScrn = xf86Screens[screen->myNum];
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
     XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
     XF86VideoAdaptorPtr newAdaptor = NULL;
     int num_adaptors;
@@ -377,7 +377,7 @@ static void I810ResetVideo(ScrnInfoPtr pScrn)
 static XF86VideoAdaptorPtr 
 I810SetupImageVideo(ScreenPtr screen)
 {
-    ScrnInfoPtr pScrn = xf86Screens[screen->myNum];
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
     I810Ptr pI810 = I810PTR(pScrn);
     XF86VideoAdaptorPtr adapt;
     I810PortPrivPtr pPriv;
@@ -941,7 +941,7 @@ I810AllocateMemory(
 	xf86FreeOffscreenLinear(linear);
    }
 
-   screen = screenInfo.screens[pScrn->scrnIndex];
+   screen = xf86ScrnToScreen(pScrn);
 
    new_linear = xf86AllocateOffscreenLinear(screen, size, 4,
                                             NULL, NULL, NULL);
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 6c6650b..7a01ee7 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -332,7 +332,7 @@ to_sna(ScrnInfoPtr scrn)
 constant static inline struct sna *
 to_sna_from_screen(ScreenPtr screen)
 {
-	return to_sna(xf86Screens[screen->myNum]);
+	return to_sna(xf86ScreenToScrn(screen));
 }
 
 constant static inline struct sna *
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 517eaad..4fa4320 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -686,7 +686,7 @@ sna_dri_copy_region(DrawablePtr draw,
 static int
 sna_dri_get_pipe(DrawablePtr pDraw)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pDraw->pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pDraw->pScreen);
 	BoxRec box, crtcbox;
 	xf86CrtcPtr crtc;
 	int pipe;
@@ -1496,7 +1496,7 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		       CARD64 remainder, DRI2SwapEventPtr func, void *data)
 {
 	ScreenPtr screen = draw->pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	struct sna *sna = to_sna(scrn);
 	drmVBlank vbl;
 	int pipe;
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 9ec3ecf..2e81640 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -641,7 +641,7 @@ sna_handle_uevents(int fd, void *closure)
 
 	if (memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t)) == 0 &&
 			hotplug && atoi(hotplug) == 1)
-		RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE);
+		RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
 
 	udev_device_unref(dev);
 }
@@ -826,7 +826,7 @@ agp_aperture_size(struct pci_device *dev, int gen)
 static Bool
 sna_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 	struct sna *sna = to_sna(scrn);
 	VisualPtr visual;
 
diff --git a/uxa/uxa.c b/uxa/uxa.c
index b4a1da6..0ba6869 100644
--- a/uxa/uxa.c
+++ b/uxa/uxa.c
@@ -366,7 +366,7 @@ void uxa_set_force_fallback(ScreenPtr screen, Bool value)
 static Bool uxa_close_screen(int i, ScreenPtr pScreen)
 {
 	uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
 #ifdef RENDER
 	PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
 #endif
commit 9aabc04d76fa976abb4a74f4e9676c7556e88df3
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed May 16 15:14:32 2012 +0100

    intel: add compat header file for conversion fns
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/Makefile.am b/src/Makefile.am
index 448a354..fd139ee 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -43,6 +43,7 @@ NULL:=#
 intel_drv_la_SOURCES = \
 	intel_list.h \
 	intel_module.c \
+	compat-api.h \
 	$(NULL)
 
 if UXA
diff --git a/src/compat-api.h b/src/compat-api.h
new file mode 100644
index 0000000..1bb7724
--- /dev/null
+++ b/src/compat-api.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Dave Airlie <airlied at redhat.com>
+ */
+
+/* this file provides API compat between server post 1.13 and pre it,
+   it should be reused inside as many drivers as possible */
+#ifndef COMPAT_API_H
+#define COMPAT_API_H
+
+#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
+#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum]
+#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p
+#endif
+
+#ifndef XF86_HAS_SCRN_CONV
+#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum]
+#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
+#endif
+
+#endif
diff --git a/src/intel.h b/src/intel.h
index f806aea..e274db1 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -69,6 +69,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "intel_driver.h"
 #include "intel_list.h"
+#include "compat-api.h"
 
 #if HAVE_UDEV
 #include <libudev.h>
diff --git a/src/legacy/i810/i810.h b/src/legacy/i810/i810.h
index 2c0b53e..f4caf56 100644
--- a/src/legacy/i810/i810.h
+++ b/src/legacy/i810/i810.h
@@ -51,6 +51,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "xorg-server.h"
 #include <pciaccess.h>
 
+#include "compat-api.h"
 #ifdef HAVE_DRI1
 #include "xf86drm.h"
 #include "sarea.h"
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 790f5ff..6c6650b 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -59,6 +59,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <xf86drm.h>
 #include <xf86drmMode.h>
 
+#include "../compat-api.h"
 #define _XF86DRI_SERVER_
 #include <dri2.h>
 #include <i915_drm.h>
diff --git a/uxa/uxa-priv.h b/uxa/uxa-priv.h
index b24ec4f..b74a625 100644
--- a/uxa/uxa-priv.h
+++ b/uxa/uxa-priv.h
@@ -59,6 +59,8 @@
 #endif
 #include "damage.h"
 
+#include "../src/compat-api.h"
+
 /* Provide substitutes for gcc's __FUNCTION__ on other compilers */
 #if !defined(__GNUC__) && !defined(__FUNCTION__)
 # if defined(__STDC__) && (__STDC_VERSION__>=199901L)	/* C99 */
commit c9ce6ae8a6fc7b1a91aef1e59640c39024d0426d
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed May 23 08:33:20 2012 +0100

    legacy/i810: rename pScreen->screen
    
    For consistency before moving to new APIs.
    
    This just changes the files where the API changes will touch.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c
index 76f36f2..60053d8 100644
--- a/src/legacy/i810/i810_driver.c
+++ b/src/legacy/i810/i810_driver.c
@@ -78,12 +78,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "../legacy.h"
 
 static Bool I810PreInit(ScrnInfoPtr scrn, int flags);
-static Bool I810ScreenInit(int Index, ScreenPtr pScreen, int argc,
+static Bool I810ScreenInit(int Index, ScreenPtr screen, int argc,
 			   char **argv);
 static Bool I810EnterVT(int scrnIndex, int flags);
 static void I810LeaveVT(int scrnIndex, int flags);
-static Bool I810CloseScreen(int scrnIndex, ScreenPtr pScreen);
-static Bool I810SaveScreen(ScreenPtr pScreen, Bool unblank);
+static Bool I810CloseScreen(int scrnIndex, ScreenPtr screen);
+static Bool I810SaveScreen(ScreenPtr screen, Bool unblank);
 static void I810FreeScreen(int scrnIndex, int flags);
 static void I810DisplayPowerManagementSet(ScrnInfoPtr scrn,
 					  int PowerManagermentMode,
@@ -1570,14 +1570,14 @@ I810AllocateFront(ScrnInfoPtr scrn)
 }
 
 static Bool
-I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+I810ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 {
    ScrnInfoPtr scrn;
    vgaHWPtr hwp;
    I810Ptr pI810;
    VisualPtr visual;
 
-   scrn = xf86Screens[pScreen->myNum];
+   scrn = xf86Screens[screen->myNum];
    pI810 = I810PTR(scrn);
    hwp = VGAHWPTR(scrn);
 
@@ -1623,7 +1623,7 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
    pI810->directRenderingEnabled = !pI810->directRenderingDisabled;
    
    if (pI810->directRenderingEnabled==TRUE)
-     pI810->directRenderingEnabled = I810DRIScreenInit(pScreen);
+     pI810->directRenderingEnabled = I810DRIScreenInit(screen);
 
 #else
    pI810->directRenderingEnabled = FALSE;
@@ -1648,10 +1648,10 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
    if (!I810ModeInit(scrn, scrn->currentMode))
       return FALSE;
 
-   I810SaveScreen(pScreen, FALSE);
+   I810SaveScreen(screen, FALSE);
    I810AdjustFrame(scrnIndex, scrn->frameX0, scrn->frameY0, 0);
 
-   if (!fbScreenInit(pScreen, pI810->FbBase + scrn->fbOffset,
+   if (!fbScreenInit(screen, pI810->FbBase + scrn->fbOffset,
 		     scrn->virtualX, scrn->virtualY,
 		     scrn->xDpi, scrn->yDpi,
 		     scrn->displayWidth, scrn->bitsPerPixel))
@@ -1659,8 +1659,8 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 
    if (scrn->bitsPerPixel > 8) {
       /* Fixup RGB ordering */
-      visual = pScreen->visuals + pScreen->numVisuals;
-      while (--visual >= pScreen->visuals) {
+      visual = screen->visuals + screen->numVisuals;
+      while (--visual >= screen->visuals) {
 	 if ((visual->class | DynamicClass) == DirectColor) {
 	    visual->offsetRed = scrn->offset.red;
 	    visual->offsetGreen = scrn->offset.green;
@@ -1672,14 +1672,14 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
       }
    }
 
-   fbPictureInit(pScreen, NULL, 0);
+   fbPictureInit(screen, NULL, 0);
 
-   xf86SetBlackWhitePixels(pScreen);
+   xf86SetBlackWhitePixels(screen);
 
 #ifdef HAVE_DRI1
    if (pI810->LpRing->mem.Start == 0 && pI810->directRenderingEnabled) {
       pI810->directRenderingEnabled = FALSE;
-      I810DRICloseScreen(pScreen);
+      I810DRICloseScreen(screen);
    }
 
    if (!pI810->directRenderingEnabled) {
@@ -1692,10 +1692,10 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 #endif
 
 #ifdef XFreeXDGA
-   I810DGAInit(pScreen);
+   I810DGAInit(screen);
 #endif
 
-   if (!xf86InitFBManager(pScreen, &(pI810->FbMemBox))) {
+   if (!xf86InitFBManager(screen, &(pI810->FbMemBox))) {
       xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		 "Failed to init memory manager\n");
       return FALSE;
@@ -1705,7 +1705,7 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
       if (pI810->LpRing->mem.Size != 0) {
 	 I810SetRingRegs(scrn);
 
-	 if (!I810AccelInit(pScreen)) {
+	 if (!I810AccelInit(screen)) {
 	    xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		       "Hardware acceleration initialization failed\n");
 	 }  else /* PK added 16.02.2004 */
@@ -1713,57 +1713,57 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
       }
    }
 
-   miInitializeBackingStore(pScreen);
-   xf86SetBackingStore(pScreen);
-   xf86SetSilkenMouse(pScreen);
+   miInitializeBackingStore(screen);
+   xf86SetBackingStore(screen);
+   xf86SetSilkenMouse(screen);
 
-   miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
+   miDCInitialize(screen, xf86GetPointerScreenFuncs());
 
    if (!xf86ReturnOptValBool(pI810->Options, OPTION_SW_CURSOR, FALSE)) {
-      if (!I810CursorInit(pScreen)) {
+      if (!I810CursorInit(screen)) {
 	 xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		    "Hardware cursor initialization failed\n");
       }
    }
 
-   if (!miCreateDefColormap(pScreen))
+   if (!miCreateDefColormap(screen))
       return FALSE;
 
    /* Use driver specific palette load routines for Direct Color support. -jens */
    if (scrn->bitsPerPixel == 16) {
       if (scrn->depth == 15) {
-	 if (!xf86HandleColormaps(pScreen, 256, 8, I810LoadPalette15, NULL,
+	 if (!xf86HandleColormaps(screen, 256, 8, I810LoadPalette15, NULL,
 				  CMAP_PALETTED_TRUECOLOR |
 				  CMAP_RELOAD_ON_MODE_SWITCH))
 	    return FALSE;
       } else {
-	 if (!xf86HandleColormaps(pScreen, 256, 8, I810LoadPalette16, NULL,
+	 if (!xf86HandleColormaps(screen, 256, 8, I810LoadPalette16, NULL,
 				  CMAP_PALETTED_TRUECOLOR |
 				  CMAP_RELOAD_ON_MODE_SWITCH))
 	    return FALSE;
       }
    } else {
-      if (!xf86HandleColormaps(pScreen, 256, 8, I810LoadPalette24, NULL,
+      if (!xf86HandleColormaps(screen, 256, 8, I810LoadPalette24, NULL,
 			       CMAP_PALETTED_TRUECOLOR |
 			       CMAP_RELOAD_ON_MODE_SWITCH))
 	 return FALSE;
    }
 
-   xf86DPMSInit(pScreen, I810DisplayPowerManagementSet, 0);
+   xf86DPMSInit(screen, I810DisplayPowerManagementSet, 0);
 
-   I810InitVideo(pScreen);
+   I810InitVideo(screen);
 
 #ifdef HAVE_DRI1
    if (pI810->directRenderingEnabled) {
       /* Now that mi, fb, drm and others have done their thing,
        * complete the DRI setup.
        */
-      pI810->directRenderingEnabled = I810DRIFinishScreenInit(pScreen);
+      pI810->directRenderingEnabled = I810DRIFinishScreenInit(screen);
    }
 #ifdef XvMCExtension
    if ((pI810->directRenderingEnabled) && (pI810->numSurfaces)) {
       /* Initialize the hardware motion compensation code */
-      I810InitMC(pScreen);
+      I810InitMC(screen);
    }
 #endif
 #endif
@@ -1774,9 +1774,9 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
       xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Direct rendering disabled\n");
    }
 
-   pScreen->SaveScreen = I810SaveScreen;
-   pI810->CloseScreen = pScreen->CloseScreen;
-   pScreen->CloseScreen = I810CloseScreen;
+   screen->SaveScreen = I810SaveScreen;
+   pI810->CloseScreen = screen->CloseScreen;
+   screen->CloseScreen = I810CloseScreen;
 
    if (serverGeneration == 1)
       xf86ShowUnusedOptions(scrn->scrnIndex, scrn->options);
@@ -1957,7 +1957,7 @@ I810LeaveVT(int scrnIndex, int flags)
 }
 
 static Bool
-I810CloseScreen(int scrnIndex, ScreenPtr pScreen)
+I810CloseScreen(int scrnIndex, ScreenPtr screen)
 {
    ScrnInfoPtr scrn = xf86Screens[scrnIndex];
    vgaHWPtr hwp = VGAHWPTR(scrn);
@@ -1975,7 +1975,7 @@ I810CloseScreen(int scrnIndex, ScreenPtr pScreen)
    }
 #ifdef HAVE_DRI1
    if (pI810->directRenderingEnabled) {
-      I810DRICloseScreen(pScreen);
+      I810DRICloseScreen(screen);
       pI810->directRenderingEnabled = FALSE;
    }
 #endif
@@ -2021,8 +2021,8 @@ I810CloseScreen(int scrnIndex, ScreenPtr pScreen)
    pI810->LpRing = NULL;
 
    scrn->vtSema = FALSE;
-   pScreen->CloseScreen = pI810->CloseScreen;
-   return (*pScreen->CloseScreen) (scrnIndex, pScreen);
+   screen->CloseScreen = pI810->CloseScreen;
+   return (*screen->CloseScreen) (scrnIndex, screen);
 }
 
 static void
@@ -2047,9 +2047,9 @@ I810ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
 }
 
 static Bool
-I810SaveScreen(ScreenPtr pScreen, Bool unblack)
+I810SaveScreen(ScreenPtr screen, Bool unblack)
 {
-   return vgaHWSaveScreen(pScreen, unblack);
+   return vgaHWSaveScreen(screen, unblack);
 }
 
 static void
diff --git a/src/legacy/i810/i810_video.c b/src/legacy/i810/i810_video.c
index a0e6acd..5a568a6 100644
--- a/src/legacy/i810/i810_video.c
+++ b/src/legacy/i810/i810_video.c
@@ -152,17 +152,17 @@ static Atom xvBrightness, xvContrast, xvColorKey;
 #define RGB15ToColorKey(c) \
         (((c & 0x7c00) << 9) | ((c & 0x03E0) << 6) | ((c & 0x001F) << 3))
 
-void I810InitVideo(ScreenPtr pScreen)
+void I810InitVideo(ScreenPtr screen)
 {
-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    ScrnInfoPtr pScrn = xf86Screens[screen->myNum];
     XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
     XF86VideoAdaptorPtr newAdaptor = NULL;
     int num_adaptors;
 	
     if (pScrn->bitsPerPixel != 8) 
     {
-	newAdaptor = I810SetupImageVideo(pScreen);
-	I810InitOffscreenImages(pScreen);
+	newAdaptor = I810SetupImageVideo(screen);
+	I810InitOffscreenImages(screen);
     }
 
     num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
@@ -185,7 +185,7 @@ void I810InitVideo(ScreenPtr pScreen)
     }
 
     if(num_adaptors)
-        xf86XVScreenInit(pScreen, adaptors, num_adaptors);
+        xf86XVScreenInit(screen, adaptors, num_adaptors);
 
     if(newAdaptors)
 	free(newAdaptors);
@@ -375,9 +375,9 @@ static void I810ResetVideo(ScrnInfoPtr pScrn)
 
 
 static XF86VideoAdaptorPtr 
-I810SetupImageVideo(ScreenPtr pScreen)
+I810SetupImageVideo(ScreenPtr screen)
 {
-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    ScrnInfoPtr pScrn = xf86Screens[screen->myNum];
     I810Ptr pI810 = I810PTR(pScrn);
     XF86VideoAdaptorPtr adapt;
     I810PortPrivPtr pPriv;
@@ -423,12 +423,12 @@ I810SetupImageVideo(ScreenPtr pScreen)
     pPriv->currentBuf = 0;
 
     /* gotta uninit this someplace */
-    REGION_NULL(pScreen, &pPriv->clip);
+    REGION_NULL(screen, &pPriv->clip);
 
     pI810->adaptor = adapt;
 
-    pI810->BlockHandler = pScreen->BlockHandler;
-    pScreen->BlockHandler = I810BlockHandler;
+    pI810->BlockHandler = screen->BlockHandler;
+    screen->BlockHandler = I810BlockHandler;
 
     xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
     xvContrast   = MAKE_ATOM("XV_CONTRAST");
@@ -522,7 +522,7 @@ I810StopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
 
   I810OverlayRegPtr overlay = (I810OverlayRegPtr) (pI810->FbBase + pI810->OverlayStart); 
 
-  REGION_EMPTY(pScrn->pScreen, &pPriv->clip);   
+  REGION_EMPTY(pScrn->screen, &pPriv->clip);   
 
   if(shutdown) {
      if(pPriv->videoStatus & CLIENT_VIDEO_ON) {
@@ -579,7 +579,7 @@ I810SetPortAttribute(
                  break;
 	}
 	OVERLAY_UPDATE(pI810->OverlayPhysical);
-	REGION_EMPTY(pScrn->pScreen, &pPriv->clip);   
+	REGION_EMPTY(pScrn->screen, &pPriv->clip);   
   } else return BadMatch;
 
   return Success;
@@ -928,7 +928,7 @@ I810AllocateMemory(
   FBLinearPtr linear,
   int size
 ){
-   ScreenPtr pScreen;
+   ScreenPtr screen;
    FBLinearPtr new_linear;
 
    if(linear) {
@@ -941,21 +941,21 @@ I810AllocateMemory(
 	xf86FreeOffscreenLinear(linear);
    }
 
-   pScreen = screenInfo.screens[pScrn->scrnIndex];
+   screen = screenInfo.screens[pScrn->scrnIndex];
 
-   new_linear = xf86AllocateOffscreenLinear(pScreen, size, 4,
+   new_linear = xf86AllocateOffscreenLinear(screen, size, 4,
                                             NULL, NULL, NULL);
 
    if(!new_linear) {
         int max_size;
 
-        xf86QueryLargestOffscreenLinear(pScreen, &max_size, 4, 
+        xf86QueryLargestOffscreenLinear(screen, &max_size, 4, 
 				       PRIORITY_EXTREME);
 
         if(max_size < size) return NULL;
 
-        xf86PurgeUnlockedOffscreenAreas(pScreen);
-        new_linear = xf86AllocateOffscreenLinear(pScreen, size, 4, 
+        xf86PurgeUnlockedOffscreenAreas(screen);
+        new_linear = xf86AllocateOffscreenLinear(screen, size, 4, 
                                                  NULL, NULL, NULL);
    } 
 
@@ -995,7 +995,7 @@ I810PutImage(
     dstBox.y2 = drw_y + drw_h;
 
     I810ClipVideo(&dstBox, &x1, &x2, &y1, &y2, 
-		  REGION_EXTENTS(pScrn->pScreen, clipBoxes), width, height);
+		  REGION_EXTENTS(pScrn->screen, clipBoxes), width, height);
     
     if((x1 >= x2) || (y1 >= y2))
        return Success;
@@ -1081,8 +1081,8 @@ I810PutImage(
     }
 
     /* update cliplist */
-    if(!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) {
-	REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
+    if(!REGION_EQUAL(pScrn->screen, &pPriv->clip, clipBoxes)) {
+	REGION_COPY(pScrn->screen, &pPriv->clip, clipBoxes);
 	/* draw these */
 	xf86XVFillKeyHelperDrawable(pDraw, pPriv->colorKey, clipBoxes);
     }
@@ -1151,17 +1151,17 @@ I810BlockHandler (
     pointer     pTimeout,
     pointer     pReadmask
 ){
-    ScreenPtr   pScreen = screenInfo.screens[i];
+    ScreenPtr   screen = screenInfo.screens[i];
     ScrnInfoPtr pScrn = xf86Screens[i];
     I810Ptr      pI810 = I810PTR(pScrn);
     I810PortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn);
     I810OverlayRegPtr overlay = (I810OverlayRegPtr) (pI810->FbBase + pI810->OverlayStart); 
 
-    pScreen->BlockHandler = pI810->BlockHandler;
+    screen->BlockHandler = pI810->BlockHandler;
     
-    (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
+    (*screen->BlockHandler) (i, blockData, pTimeout, pReadmask);
 
-    pScreen->BlockHandler = I810BlockHandler;
+    screen->BlockHandler = I810BlockHandler;
 
     if(pPriv->videoStatus & TIMER_MASK) {
 	UpdateCurrentTime();
@@ -1382,7 +1382,7 @@ I810DisplaySurface(
     pPriv->isOn = TRUE;
     /* we've prempted the XvImage stream so set its free timer */
     if(pI810Priv->videoStatus & CLIENT_VIDEO_ON) {
-      REGION_EMPTY(pScrn->pScreen, & pI810Priv->clip);   
+      REGION_EMPTY(pScrn->screen, & pI810Priv->clip);   
       UpdateCurrentTime();
       pI810Priv->videoStatus = FREE_TIMER;
       pI810Priv->freeTime = currentTime.milliseconds + FREE_DELAY;
@@ -1394,7 +1394,7 @@ I810DisplaySurface(
 
 
 static void 
-I810InitOffscreenImages(ScreenPtr pScreen)
+I810InitOffscreenImages(ScreenPtr screen)
 {
     XF86OffscreenImagePtr offscreenImages;
 
@@ -1417,6 +1417,6 @@ I810InitOffscreenImages(ScreenPtr pScreen)
     offscreenImages[0].num_attributes = 1;
     offscreenImages[0].attributes = Attributes;
 
-    xf86XVRegisterOffscreenImages(pScreen, offscreenImages, 1);
+    xf86XVRegisterOffscreenImages(screen, offscreenImages, 1);
 }
 
commit 70ee0f84f5b9c6c13a0338f8b2757e587c849c14
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed May 23 08:31:52 2012 +0100

    legacy/i810: rename pScrn->scrn
    
    This is need to make the compat api stuff easier to implement.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c
index 02da574..76f36f2 100644
--- a/src/legacy/i810/i810_driver.c
+++ b/src/legacy/i810/i810_driver.c
@@ -77,7 +77,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "../legacy.h"
 
-static Bool I810PreInit(ScrnInfoPtr pScrn, int flags);
+static Bool I810PreInit(ScrnInfoPtr scrn, int flags);
 static Bool I810ScreenInit(int Index, ScreenPtr pScreen, int argc,
 			   char **argv);
 static Bool I810EnterVT(int scrnIndex, int flags);
@@ -85,7 +85,7 @@ static void I810LeaveVT(int scrnIndex, int flags);
 static Bool I810CloseScreen(int scrnIndex, ScreenPtr pScreen);
 static Bool I810SaveScreen(ScreenPtr pScreen, Bool unblank);
 static void I810FreeScreen(int scrnIndex, int flags);
-static void I810DisplayPowerManagementSet(ScrnInfoPtr pScrn,
+static void I810DisplayPowerManagementSet(ScrnInfoPtr scrn,
 					  int PowerManagermentMode,
 					  int flags);
 static ModeStatus I810ValidMode(int scrnIndex, DisplayModePtr mode,
@@ -152,24 +152,24 @@ int I830EntityIndex = -1;
  *
  */
 static Bool
-I810GetRec(ScrnInfoPtr pScrn)
+I810GetRec(ScrnInfoPtr scrn)
 {
-   if (pScrn->driverPrivate)
+   if (scrn->driverPrivate)
       return TRUE;
 
-   pScrn->driverPrivate = xnfcalloc(sizeof(I810Rec), 1);
+   scrn->driverPrivate = xnfcalloc(sizeof(I810Rec), 1);
    return TRUE;
 }
 
 static void
-I810FreeRec(ScrnInfoPtr pScrn)
+I810FreeRec(ScrnInfoPtr scrn)
 {
-   if (!pScrn)
+   if (!scrn)
       return;
-   if (!pScrn->driverPrivate)
+   if (!scrn->driverPrivate)
       return;
-   free(pScrn->driverPrivate);
-   pScrn->driverPrivate = NULL;
+   free(scrn->driverPrivate);
+   scrn->driverPrivate = NULL;
 }
 
 struct pci_device *
@@ -188,11 +188,11 @@ intel_host_bridge (void)
 }
 
 static void
-I810ProbeDDC(ScrnInfoPtr pScrn, int index)
+I810ProbeDDC(ScrnInfoPtr scrn, int index)
 {
    vbeInfoPtr pVbe;
 
-   if (xf86LoadSubModule(pScrn, "vbe")) {
+   if (xf86LoadSubModule(scrn, "vbe")) {
       pVbe = VBEInit(NULL, index);
       ConfiguredMonitor = vbeDoEDID(pVbe, NULL);
       vbeFree(pVbe);
@@ -200,24 +200,24 @@ I810ProbeDDC(ScrnInfoPtr pScrn, int index)
 }
 
 static xf86MonPtr
-I810DoDDC(ScrnInfoPtr pScrn, int index)
+I810DoDDC(ScrnInfoPtr scrn, int index)
 {
    vbeInfoPtr pVbe;
    xf86MonPtr MonInfo = NULL;
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
 
    /* Honour Option "noDDC" */
    if (xf86ReturnOptValBool(pI810->Options, OPTION_NO_DDC, FALSE)) {
       return MonInfo;
    }
 
-   if (xf86LoadSubModule(pScrn, "vbe") && (pVbe = VBEInit(NULL, index))) {
+   if (xf86LoadSubModule(scrn, "vbe") && (pVbe = VBEInit(NULL, index))) {
       MonInfo = vbeDoEDID(pVbe, NULL);
       xf86PrintEDID(MonInfo);
-      xf86SetDDCproperties(pScrn, MonInfo);
+      xf86SetDDCproperties(scrn, MonInfo);
       vbeFree(pVbe);
    } else {
-      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+      xf86DrvMsg(scrn->scrnIndex, X_INFO,
 		 "this driver cannot do DDC without VBE\n");
    }
 
@@ -232,7 +232,7 @@ I810DoDDC(ScrnInfoPtr pScrn, int index)
  *
  */
 static Bool
-I810PreInit(ScrnInfoPtr pScrn, int flags)
+I810PreInit(ScrnInfoPtr scrn, int flags)
 {
    I810Ptr pI810;
    ClockRangePtr clockRanges;
@@ -244,89 +244,89 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
    Bool enable;
    struct intel_chipset chipset;
 
-   if (pScrn->numEntities != 1)
+   if (scrn->numEntities != 1)
       return FALSE;
 
    /* Allocate driverPrivate */
-   if (!I810GetRec(pScrn))
+   if (!I810GetRec(scrn))
       return FALSE;
 
-   pI810 = I810PTR(pScrn);
+   pI810 = I810PTR(scrn);
 
-   pI810->pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
+   pI810->pEnt = xf86GetEntityInfo(scrn->entityList[0]);
    if (pI810->pEnt->location.type != BUS_PCI)
       return FALSE;
 
    if (flags & PROBE_DETECT) {
-      I810ProbeDDC(pScrn, pI810->pEnt->index);
+      I810ProbeDDC(scrn, pI810->pEnt->index);
       return TRUE;
    }
 
    /* The vgahw module should be loaded here when needed */
-   if (!xf86LoadSubModule(pScrn, "vgahw"))
+   if (!xf86LoadSubModule(scrn, "vgahw"))
       return FALSE;
 
    /* Allocate a vgaHWRec */
-   if (!vgaHWGetHWRec(pScrn))
+   if (!vgaHWGetHWRec(scrn))
       return FALSE;
 
    pI810->PciInfo = xf86GetPciInfoForEntity(pI810->pEnt->index);
 
-   /* Set pScrn->monitor */
-   pScrn->monitor = pScrn->confScreen->monitor;
+   /* Set scrn->monitor */
+   scrn->monitor = scrn->confScreen->monitor;
 
    flags24 = Support24bppFb | PreferConvert32to24 | SupportConvert32to24;
-   if (!xf86SetDepthBpp(pScrn, 16, 0, 16, flags24)) {
+   if (!xf86SetDepthBpp(scrn, 16, 0, 16, flags24)) {
       return FALSE;
    } else {
-      switch (pScrn->depth) {
+      switch (scrn->depth) {
       case 8:
       case 15:
       case 16:
       case 24:
 	 break;
       default:
-	 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+	 xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		    "Given depth (%d) is not supported by i810 driver\n",
-		    pScrn->depth);
+		    scrn->depth);
 	 return FALSE;
       }
    }
-   xf86PrintDepthBpp(pScrn);
+   xf86PrintDepthBpp(scrn);
 
-   switch (pScrn->bitsPerPixel) {
+   switch (scrn->bitsPerPixel) {
    case 8:
    case 16:
    case 24:
       break;
    default:
-      xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+      xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		 "Given bpp (%d) is not supported by i810 driver\n",
-		 pScrn->bitsPerPixel);
+		 scrn->bitsPerPixel);
       return FALSE;
    }
 
-   if (!xf86SetWeight(pScrn, defaultWeight, defaultWeight))
+   if (!xf86SetWeight(scrn, defaultWeight, defaultWeight))
       return FALSE;
 
-   if (!xf86SetDefaultVisual(pScrn, -1))
+   if (!xf86SetDefaultVisual(scrn, -1))
       return FALSE;
 
    /* We use a programmable clock */
-   pScrn->progClock = TRUE;
+   scrn->progClock = TRUE;
 
-   pI810->cpp = pScrn->bitsPerPixel / 8;
+   pI810->cpp = scrn->bitsPerPixel / 8;
 
    /* Process the options */
-   xf86CollectOptions(pScrn, NULL);
+   xf86CollectOptions(scrn, NULL);
    if (!(pI810->Options = malloc(sizeof(I810Options))))
       return FALSE;
    memcpy(pI810->Options, I810Options, sizeof(I810Options));
-   xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pI810->Options);
+   xf86ProcessOptions(scrn->scrnIndex, scrn->options, pI810->Options);
 
-   pScrn->rgbBits = 8;
+   scrn->rgbBits = 8;
    if (xf86ReturnOptValBool(pI810->Options, OPTION_DAC_6BIT, FALSE))
-      pScrn->rgbBits = 6;
+      scrn->rgbBits = 6;
 
    if (xf86ReturnOptValBool(pI810->Options, OPTION_SHOW_CACHE, FALSE))
      pI810->showCache = TRUE;
@@ -335,7 +335,7 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
 
    /* 6-BIT dac isn't reasonable for modes with > 8bpp */
    if (xf86ReturnOptValBool(pI810->Options, OPTION_DAC_6BIT, FALSE) &&
-       pScrn->bitsPerPixel > 8) {
+       scrn->bitsPerPixel > 8) {
       OptionInfoPtr ptr;
 
       ptr = xf86TokenToOptinfo(pI810->Options, OPTION_DAC_6BIT);
@@ -346,8 +346,8 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
       pI810->noAccel = TRUE;
 
    if (!pI810->noAccel) {
-      if (!xf86LoadSubModule(pScrn, "xaa")) {
-	 I810FreeRec(pScrn);
+      if (!xf86LoadSubModule(scrn, "xaa")) {
+	 I810FreeRec(scrn);
 	 return FALSE;
       }
    }
@@ -358,11 +358,11 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
 
    if (!pI810->directRenderingDisabled) {
      if (pI810->noAccel) {
-       xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DRI is disabled because it "
+       xf86DrvMsg(scrn->scrnIndex, X_WARNING, "DRI is disabled because it "
 		  "needs 2D acceleration.\n");
        pI810->directRenderingDisabled=TRUE;
-     } else if (pScrn->depth!=16) {
-       xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DRI is disabled because it "
+     } else if (scrn->depth!=16) {
+       xf86DrvMsg(scrn->scrnIndex, X_WARNING, "DRI is disabled because it "
 		  "runs only at 16-bit depth.\n");
        pI810->directRenderingDisabled=TRUE;
      }
@@ -373,49 +373,49 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
    /* after xf86ProcessOptions,
     * because it is controlled by options [no]vbe and [no]ddc
     */
-   I810DoDDC(pScrn, pI810->pEnt->index);
+   I810DoDDC(scrn, pI810->pEnt->index);
 
-   intel_detect_chipset(pScrn, pI810->PciInfo, &chipset);
+   intel_detect_chipset(scrn, pI810->PciInfo, &chipset);
 
    /*
     * Set the Chipset and ChipRev, allowing config file entries to
     * override.
     */
    if (pI810->pEnt->device->chipset && *pI810->pEnt->device->chipset) {
-      pScrn->chipset = pI810->pEnt->device->chipset;
+      scrn->chipset = pI810->pEnt->device->chipset;
       from = X_CONFIG;
    } else if (pI810->pEnt->device->chipID >= 0) {
-      pScrn->chipset = (char *)xf86TokenToString(intel_chipsets,
+      scrn->chipset = (char *)xf86TokenToString(intel_chipsets,
 						 pI810->pEnt->device->chipID);
       from = X_CONFIG;
-      xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n",
+      xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n",
 		 pI810->pEnt->device->chipID);
    } else {
       from = X_PROBED;
-      pScrn->chipset = (char *)xf86TokenToString(intel_chipsets,
+      scrn->chipset = (char *)xf86TokenToString(intel_chipsets,
 						 DEVICE_ID(pI810->PciInfo));
    }
    if (pI810->pEnt->device->chipRev >= 0) {
-      xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n",
+      xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n",
 		 pI810->pEnt->device->chipRev);
    }
 
-   xf86DrvMsg(pScrn->scrnIndex, from, "Chipset: \"%s\"\n",
-	      (pScrn->chipset != NULL) ? pScrn->chipset : "Unknown i810");
+   xf86DrvMsg(scrn->scrnIndex, from, "Chipset: \"%s\"\n",
+	      (scrn->chipset != NULL) ? scrn->chipset : "Unknown i810");
 
    pI810->LinearAddr = pI810->PciInfo->regions[0].base_addr;
-   xf86DrvMsg(pScrn->scrnIndex, from, "Linear framebuffer at 0x%lX\n",
+   xf86DrvMsg(scrn->scrnIndex, from, "Linear framebuffer at 0x%lX\n",
 	      (unsigned long)pI810->LinearAddr);
 
    pI810->MMIOAddr = pI810->PciInfo->regions[1].base_addr;
-   xf86DrvMsg(pScrn->scrnIndex, from, "IO registers at addr 0x%lX\n",
+   xf86DrvMsg(scrn->scrnIndex, from, "IO registers at addr 0x%lX\n",
 	      (unsigned long)pI810->MMIOAddr);
 
    /* AGP GART support is required.  Don't proceed any further if it isn't
     * present.
     */
    if (!xf86AgpGARTSupported()) {
-      xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+      xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		 "AGP GART support is not available.  Make sure your kernel has\n"
 		 "\tagpgart support or that the agpgart kernel module is loaded.\n");
       return FALSE;
@@ -442,40 +442,40 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
     *
     *  Changed to 8 Meg so we can have acceleration by default (Mark).
     */
-   mem = I810CheckAvailableMemory(pScrn);
+   mem = I810CheckAvailableMemory(scrn);
    if (pI810->directRenderingDisabled || mem < 131072)  /* < 128 MB */
-       pScrn->videoRam = 8192;
+       scrn->videoRam = 8192;
    else if (mem < 196608)
-       pScrn->videoRam = 16384;  /* < 192 MB */
+       scrn->videoRam = 16384;  /* < 192 MB */
    else
-       pScrn->videoRam = 24576;
+       scrn->videoRam = 24576;
    
    from = X_DEFAULT;
    
    if (pI810->pEnt->device->videoRam) {
-      pScrn->videoRam = pI810->pEnt->device->videoRam;
+      scrn->videoRam = pI810->pEnt->device->videoRam;
       from = X_CONFIG;
    }
 
-   if (mem > 0 && mem < pScrn->videoRam) {
-      xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%dk of memory was requested,"
+   if (mem > 0 && mem < scrn->videoRam) {
+      xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%dk of memory was requested,"
 		 " but the\n\t maximum AGP memory available is %dk.\n",
-		 pScrn->videoRam, mem);
+		 scrn->videoRam, mem);
       from = X_PROBED;
       if (mem > (6 * 1024)) {
-	 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+	 xf86DrvMsg(scrn->scrnIndex, X_INFO,
 		    "Reducing video memory to 4MB\n");
-	 pScrn->videoRam = 4096;
+	 scrn->videoRam = 4096;
       } else {
-	 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Less than 6MB of AGP memory"
+	 xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Less than 6MB of AGP memory"
 		    " is available. Cannot proceed.\n");
-	 I810FreeRec(pScrn);
+	 I810FreeRec(scrn);
 	 return FALSE;
       }
    }
 
-   xf86DrvMsg(pScrn->scrnIndex, from,
-	      "Will alloc AGP framebuffer: %d kByte\n", pScrn->videoRam);
+   xf86DrvMsg(scrn->scrnIndex, from,
+	      "Will alloc AGP framebuffer: %d kByte\n", scrn->videoRam);
 
    /* Calculate Fixed Offsets depending on graphics aperture size */
    {
@@ -502,14 +502,14 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
    {
       Gamma zeros = { 0.0, 0.0, 0.0 };
 
-      if (!xf86SetGamma(pScrn, zeros)) {
+      if (!xf86SetGamma(scrn, zeros)) {
 	 return FALSE;
       }
    }
 
    pI810->MaxClock = 0;
    if (pI810->pEnt->device->dacSpeeds[0]) {
-      switch (pScrn->bitsPerPixel) {
+      switch (scrn->bitsPerPixel) {
       case 8:
 	 pI810->MaxClock = pI810->pEnt->device->dacSpeeds[DAC_BPP8];
 	 break;
@@ -526,7 +526,7 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
       if (!pI810->MaxClock)
 	 pI810->MaxClock = pI810->pEnt->device->dacSpeeds[0];
    } else {
-      switch (pScrn->bitsPerPixel) {
+      switch (scrn->bitsPerPixel) {
       case 8:
 	 pI810->MaxClock = 203000;
 	 break;
@@ -549,59 +549,59 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
    clockRanges->interlaceAllowed = TRUE;
    clockRanges->doubleScanAllowed = FALSE;
 
-   i = xf86ValidateModes(pScrn, pScrn->monitor->Modes,
-			 pScrn->display->modes, clockRanges,
+   i = xf86ValidateModes(scrn, scrn->monitor->Modes,
+			 scrn->display->modes, clockRanges,
 #ifndef HAVE_DRI1
-			 0, 320, 1600, 64 * pScrn->bitsPerPixel,
+			 0, 320, 1600, 64 * scrn->bitsPerPixel,
 #else
-			 i810_pitches, 0, 0, 64 * pScrn->bitsPerPixel,
+			 i810_pitches, 0, 0, 64 * scrn->bitsPerPixel,
 #endif
 			 200, 1200,
-			 pScrn->display->virtualX, pScrn->display->virtualY,
-			 pScrn->videoRam * 1024, LOOKUP_BEST_REFRESH);
+			 scrn->display->virtualX, scrn->display->virtualY,
+			 scrn->videoRam * 1024, LOOKUP_BEST_REFRESH);
 
    if (i == -1) {
-      I810FreeRec(pScrn);
+      I810FreeRec(scrn);
       return FALSE;
    }
 
-   xf86PruneDriverModes(pScrn);
+   xf86PruneDriverModes(scrn);
 
-   if (!i || !pScrn->modes) {
-      xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n");
-      I810FreeRec(pScrn);
+   if (!i || !scrn->modes) {
+      xf86DrvMsg(scrn->scrnIndex, X_ERROR, "No valid modes found\n");
+      I810FreeRec(scrn);
       return FALSE;
    }
 
-   xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V);
+   xf86SetCrtcForModes(scrn, INTERLACE_HALVE_V);
 
-   pScrn->currentMode = pScrn->modes;
+   scrn->currentMode = scrn->modes;
 
-   xf86PrintModes(pScrn);
+   xf86PrintModes(scrn);
 
-   xf86SetDpi(pScrn, 0, 0);
+   xf86SetDpi(scrn, 0, 0);
 
-   if (!xf86LoadSubModule(pScrn, "fb")) {
-      I810FreeRec(pScrn);
+   if (!xf86LoadSubModule(scrn, "fb")) {
+      I810FreeRec(scrn);
       return FALSE;
    }
 
    if (!xf86ReturnOptValBool(pI810->Options, OPTION_SW_CURSOR, FALSE)) {
-      if (!xf86LoadSubModule(pScrn, "ramdac")) {
-	 I810FreeRec(pScrn);
+      if (!xf86LoadSubModule(scrn, "ramdac")) {
+	 I810FreeRec(scrn);
 	 return FALSE;
       }
    }
 
    if (xf86GetOptValInteger
        (pI810->Options, OPTION_COLOR_KEY, &(pI810->colorKey))) {
-      xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+      xf86DrvMsg(scrn->scrnIndex, X_CONFIG,
 		 "video overlay key set to 0x%x\n", pI810->colorKey);
    } else {
-      pI810->colorKey = (1 << pScrn->offset.red) |
-	    (1 << pScrn->offset.green) |
-	    (((pScrn->mask.blue >> pScrn->offset.blue) -
-	      1) << pScrn->offset.blue);
+      pI810->colorKey = (1 << scrn->offset.red) |
+	    (1 << scrn->offset.green) |
+	    (((scrn->mask.blue >> scrn->offset.blue) -
+	      1) << scrn->offset.blue);
    }
 
    pI810->allowPageFlip=FALSE;
@@ -612,14 +612,14 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
      pI810->allowPageFlip = enable;
      if (pI810->allowPageFlip == TRUE)
      {
-       if (!xf86LoadSubModule(pScrn, "shadowfb")) {
+       if (!xf86LoadSubModule(scrn, "shadowfb")) {
 	 pI810->allowPageFlip = 0;
-	 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 
+	 xf86DrvMsg(scrn->scrnIndex, X_ERROR, 
 		    "Couldn't load shadowfb module:\n");
        }
      }
      
-     xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "page flipping %s\n",
+     xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "page flipping %s\n",
 		enable ? "enabled" : "disabled");
      
    }
@@ -627,20 +627,20 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
 
    if (xf86GetOptValInteger(pI810->Options, OPTION_XVMC_SURFACES,
 			    &(pI810->numSurfaces))) {
-      xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "%d XvMC Surfaces Requested.\n",
+      xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "%d XvMC Surfaces Requested.\n",
 		 pI810->numSurfaces);
       if (pI810->numSurfaces > 7) {
-	 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+	 xf86DrvMsg(scrn->scrnIndex, X_PROBED,
 		    "Using 7 XvMC Surfaces (Maximum Allowed).\n");
 	 pI810->numSurfaces = 7;
       }
       if (pI810->numSurfaces < 6) {
-	 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+	 xf86DrvMsg(scrn->scrnIndex, X_PROBED,
 		    "Using 6 XvMC Surfaces (Minimum Allowed).\n");
 	 pI810->numSurfaces = 6;
       }
    } else {
-      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+      xf86DrvMsg(scrn->scrnIndex, X_INFO,
 		 "XvMC is Disabled: use XvMCSurfaces config option to enable.\n");
       pI810->numSurfaces = 0;
    }
@@ -648,7 +648,7 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
 #ifdef HAVE_DRI1
    /* Load the dri module if requested. */
    if (xf86ReturnOptValBool(pI810->Options, OPTION_DRI, FALSE)) {
-      xf86LoadSubModule(pScrn, "dri");
+      xf86LoadSubModule(scrn, "dri");
    }
 #endif
 
@@ -656,9 +656,9 @@ I810PreInit(ScrnInfoPtr pScrn, int flags)
 }
 
 static Bool
-I810MapMMIO(ScrnInfoPtr pScrn)
+I810MapMMIO(ScrnInfoPtr scrn)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
    struct pci_device *const device = pI810->PciInfo;
    int err;
 
@@ -669,7 +669,7 @@ I810MapMMIO(ScrnInfoPtr pScrn)
 			       (void **) &pI810->MMIOBase);
    if (err) 
    {
-      xf86DrvMsg (pScrn->scrnIndex, X_ERROR,
+      xf86DrvMsg (scrn->scrnIndex, X_ERROR,
 		  "Unable to map mmio BAR. %s (%d)\n",
 		  strerror (err), err);
       return FALSE;
@@ -678,13 +678,13 @@ I810MapMMIO(ScrnInfoPtr pScrn)
 }
 
 static Bool
-I810MapMem(ScrnInfoPtr pScrn)
+I810MapMem(ScrnInfoPtr scrn)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
    struct pci_device *const device = pI810->PciInfo;
    int err;
 
-   if (!I810MapMMIO(pScrn))
+   if (!I810MapMMIO(scrn))
       return FALSE;
 
    err = pci_device_map_range (device,
@@ -694,7 +694,7 @@ I810MapMem(ScrnInfoPtr pScrn)
 			       (void **) &pI810->FbBase);
    if (err) 
    {
-      xf86DrvMsg (pScrn->scrnIndex, X_ERROR,
+      xf86DrvMsg (scrn->scrnIndex, X_ERROR,
 		  "Unable to map frame buffer BAR. %s (%d)\n",
 		  strerror (err), err);
       return FALSE;
@@ -706,31 +706,31 @@ I810MapMem(ScrnInfoPtr pScrn)
 }
 
 static void
-I810UnmapMMIO(ScrnInfoPtr pScrn)
+I810UnmapMMIO(ScrnInfoPtr scrn)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
 
    pci_device_unmap_range (pI810->PciInfo, pI810->MMIOBase, I810_REG_SIZE);
    pI810->MMIOBase = NULL;
 }
 
 static Bool
-I810UnmapMem(ScrnInfoPtr pScrn)
+I810UnmapMem(ScrnInfoPtr scrn)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
 
    pci_device_unmap_range (pI810->PciInfo, pI810->FbBase, pI810->FbMapSize);
    pI810->FbBase = NULL;
-   I810UnmapMMIO(pScrn);
+   I810UnmapMMIO(scrn);
    return TRUE;
 }
 
 /* Famous last words
  */
 void
-I810PrintErrorState(ScrnInfoPtr pScrn)
+I810PrintErrorState(ScrnInfoPtr scrn)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
 
    ErrorF("pgetbl_ctl: 0x%lx pgetbl_err: 0x%lx\n",
 	  (unsigned long) INREG(PGETBL_CTL), (unsigned long) INREG(PGE_ERR));
@@ -764,24 +764,24 @@ I810PrintErrorState(ScrnInfoPtr pScrn)
  * mask out bits here - just read the registers.
  */
 static void
-DoSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
+DoSave(ScrnInfoPtr scrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
        Bool saveFonts)
 {
    I810Ptr pI810;
    vgaHWPtr hwp;
    int i;
 
-   pI810 = I810PTR(pScrn);
-   hwp = VGAHWPTR(pScrn);
+   pI810 = I810PTR(scrn);
+   hwp = VGAHWPTR(scrn);
 
    /*
     * This function will handle creating the data structure and filling
     * in the generic VGA portion.
     */
    if (saveFonts)
-      vgaHWSave(pScrn, vgaReg, VGA_SR_MODE | VGA_SR_FONTS | VGA_SR_CMAP);
+      vgaHWSave(scrn, vgaReg, VGA_SR_MODE | VGA_SR_FONTS | VGA_SR_CMAP);
    else
-      vgaHWSave(pScrn, vgaReg, VGA_SR_MODE | VGA_SR_CMAP);
+      vgaHWSave(scrn, vgaReg, VGA_SR_MODE | VGA_SR_CMAP);
 
    /*
     * The port I/O code necessary to read in the extended registers
@@ -819,21 +819,21 @@ DoSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
 
    if ((i810Reg->LprbTail & TAIL_ADDR) != (i810Reg->LprbHead & HEAD_ADDR) &&
        i810Reg->LprbLen & RING_VALID) {
-      I810PrintErrorState(pScrn);
+      I810PrintErrorState(scrn);
       FatalError("Active ring not flushed\n");
    }
 }
 
 static void
-I810Save(ScrnInfoPtr pScrn)
+I810Save(ScrnInfoPtr scrn)
 {
    vgaHWPtr hwp;
    I810Ptr pI810;
    uint32_t temp;
 
-   hwp = VGAHWPTR(pScrn);
-   pI810 = I810PTR(pScrn);
-   DoSave(pScrn, &hwp->SavedReg, &pI810->SavedReg, TRUE);
+   hwp = VGAHWPTR(scrn);
+   pI810 = I810PTR(scrn);
+   DoSave(scrn, &hwp->SavedReg, &pI810->SavedReg, TRUE);
 
    temp = INREG(MEMMODE);
    temp |= 4;
@@ -905,7 +905,7 @@ i810PrintMode(vgaRegPtr vgaReg, I810RegPtr mode)
 }
 
 static void
-DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
+DoRestore(ScrnInfoPtr scrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
 	  Bool restoreFonts)
 {
    I810Ptr pI810;
@@ -914,15 +914,15 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
    unsigned int itemp;
    int i;
 
-   pI810 = I810PTR(pScrn);
-   hwp = VGAHWPTR(pScrn);
+   pI810 = I810PTR(scrn);
+   hwp = VGAHWPTR(scrn);
 
    if (I810_DEBUG & DEBUG_VERBOSE_VGA) {
       ErrorF("Setting mode in I810Restore:\n");
       i810PrintMode(vgaReg, i810Reg);
    }
 
-   vgaHWProtect(pScrn, TRUE);
+   vgaHWProtect(scrn, TRUE);
 
    usleep(50000);
 
@@ -966,9 +966,9 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
     *           restore clock-select bits.
     */
    if (restoreFonts)
-      vgaHWRestore(pScrn, vgaReg, VGA_SR_FONTS | VGA_SR_MODE | VGA_SR_CMAP);
+      vgaHWRestore(scrn, vgaReg, VGA_SR_FONTS | VGA_SR_MODE | VGA_SR_CMAP);
    else
-      vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE | VGA_SR_CMAP);
+      vgaHWRestore(scrn, vgaReg, VGA_SR_MODE | VGA_SR_CMAP);
 
    hwp->writeCrtc(hwp, EXT_VERT_TOTAL, i810Reg->ExtVertTotal);
    hwp->writeCrtc(hwp, EXT_VERT_DISPLAY, i810Reg->ExtVertDispEnd);
@@ -1081,13 +1081,13 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
    if (!(vgaReg->Attribute[0x10] & 0x1)) {
       usleep(50000);
       if (restoreFonts)
-	 vgaHWRestore(pScrn, vgaReg,
+	 vgaHWRestore(scrn, vgaReg,
 		      VGA_SR_FONTS | VGA_SR_MODE | VGA_SR_CMAP);
       else
-	 vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE | VGA_SR_CMAP);
+	 vgaHWRestore(scrn, vgaReg, VGA_SR_MODE | VGA_SR_CMAP);
    }
 
-   vgaHWProtect(pScrn, FALSE);
+   vgaHWProtect(scrn, FALSE);
 
    temp = hwp->readCrtc(hwp, IO_CTNL);
    temp &= ~(EXTENDED_ATTR_CNTL | EXTENDED_CRTC_CNTL);
@@ -1096,10 +1096,10 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,
 }
 
 static void
-I810SetRingRegs(ScrnInfoPtr pScrn)
+I810SetRingRegs(ScrnInfoPtr scrn)
 {
    unsigned int itemp;
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
 
    OUTREG(LP_RING + RING_TAIL, 0);
    OUTREG(LP_RING + RING_HEAD, 0);
@@ -1116,15 +1116,15 @@ I810SetRingRegs(ScrnInfoPtr pScrn)
 }
 
 static void
-I810Restore(ScrnInfoPtr pScrn)
+I810Restore(ScrnInfoPtr scrn)
 {
    vgaHWPtr hwp;
    I810Ptr pI810;
 
-   hwp = VGAHWPTR(pScrn);
-   pI810 = I810PTR(pScrn);
+   hwp = VGAHWPTR(scrn);
+   pI810 = I810PTR(scrn);
 
-   DoRestore(pScrn, &hwp->SavedReg, &pI810->SavedReg, TRUE);
+   DoRestore(scrn, &hwp->SavedReg, &pI810->SavedReg, TRUE);
 }
 
 /*
@@ -1141,9 +1141,9 @@ I810Restore(ScrnInfoPtr pScrn)
     (double)m / ((double)n * (1 << p)) * 4 * REF_FREQ
 
 static void
-I810CalcVCLK(ScrnInfoPtr pScrn, double freq)
+I810CalcVCLK(ScrnInfoPtr scrn, double freq)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
    I810RegPtr i810Reg = &pI810->ModeReg;
    int m, n, p;
    double f_out;
@@ -1188,7 +1188,7 @@ I810CalcVCLK(ScrnInfoPtr pScrn, double freq)
    i810Reg->VideoClk2_N = (n_best - 2) & 0x3FF;
    i810Reg->VideoClk2_DivisorSel = (p_best << 4);
 
-   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+   xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, 3,
 		  "Setting dot clock to %.1f MHz " "[ 0x%x 0x%x 0x%x ] "
 		  "[ %d %d %d ]\n", CALC_VCLK(m_best, n_best, p_best),
 		  i810Reg->VideoClk2_M, i810Reg->VideoClk2_N,
@@ -1196,36 +1196,36 @@ I810CalcVCLK(ScrnInfoPtr pScrn, double freq)
 }
 
 static Bool
-I810SetMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
+I810SetMode(ScrnInfoPtr scrn, DisplayModePtr mode)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
    I810RegPtr i810Reg = &pI810->ModeReg;
-   vgaRegPtr pVga = &VGAHWPTR(pScrn)->ModeReg;
+   vgaRegPtr pVga = &VGAHWPTR(scrn)->ModeReg;
    double dclk = mode->Clock / 1000.0;
 
-   switch (pScrn->bitsPerPixel) {
+   switch (scrn->bitsPerPixel) {
    case 8:
-      pVga->CRTC[0x13] = pScrn->displayWidth >> 3;
-      i810Reg->ExtOffset = pScrn->displayWidth >> 11;
+      pVga->CRTC[0x13] = scrn->displayWidth >> 3;
+      i810Reg->ExtOffset = scrn->displayWidth >> 11;
       i810Reg->PixelPipeCfg1 = DISPLAY_8BPP_MODE;
       i810Reg->BitBLTControl = COLEXP_8BPP;
       break;
    case 16:
-      if (pScrn->weight.green == 5) {
+      if (scrn->weight.green == 5) {
 	 i810Reg->PixelPipeCfg1 = DISPLAY_15BPP_MODE;
       } else {
 	 i810Reg->PixelPipeCfg1 = DISPLAY_16BPP_MODE;
       }
-      pVga->CRTC[0x13] = pScrn->displayWidth >> 2;
-      i810Reg->ExtOffset = pScrn->displayWidth >> 10;
+      pVga->CRTC[0x13] = scrn->displayWidth >> 2;
+      i810Reg->ExtOffset = scrn->displayWidth >> 10;
       i810Reg->BitBLTControl = COLEXP_16BPP;
 
       /* Enable Palette Programming for Direct Color visuals. -jens */
       i810Reg->PixelPipeCfg2 = DISPLAY_GAMMA_ENABLE;
       break;
    case 24:
-      pVga->CRTC[0x13] = (pScrn->displayWidth * 3) >> 3;
-      i810Reg->ExtOffset = (pScrn->displayWidth * 3) >> 11;
+      pVga->CRTC[0x13] = (scrn->displayWidth * 3) >> 3;
+      i810Reg->ExtOffset = (scrn->displayWidth * 3) >> 11;
 
       i810Reg->PixelPipeCfg1 = DISPLAY_24BPP_MODE;
       i810Reg->BitBLTControl = COLEXP_24BPP;
@@ -1310,13 +1310,13 @@ I810SetMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
     * Calculate the VCLK that most closely matches the requested dot
     * clock.
     */
-   I810CalcVCLK(pScrn, dclk);
+   I810CalcVCLK(scrn, dclk);
 
    /* Since we program the clocks ourselves, always use VCLK2. */
    pVga->MiscOutReg |= 0x0C;
 
    /* Calculate the FIFO Watermark and Burst Length. */
-   i810Reg->LMI_FIFO_Watermark = I810CalcWatermark(pScrn, dclk, FALSE);
+   i810Reg->LMI_FIFO_Watermark = I810CalcWatermark(scrn, dclk, FALSE);
 
    /* Setup the ring buffer */
    i810Reg->LprbTail = 0;
@@ -1333,36 +1333,36 @@ I810SetMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
 }
 
 static Bool
-I810ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
+I810ModeInit(ScrnInfoPtr scrn, DisplayModePtr mode)
 {
    vgaHWPtr hwp;
    I810Ptr pI810;
 
-   hwp = VGAHWPTR(pScrn);
-   pI810 = I810PTR(pScrn);
+   hwp = VGAHWPTR(scrn);
+   pI810 = I810PTR(scrn);
 
    vgaHWUnlock(hwp);
 
-   if (!vgaHWInit(pScrn, mode))
+   if (!vgaHWInit(scrn, mode))
       return FALSE;
 
-   pScrn->vtSema = TRUE;
+   scrn->vtSema = TRUE;
 
-   if (!I810SetMode(pScrn, mode))
+   if (!I810SetMode(scrn, mode))
       return FALSE;
 
 #ifdef HAVE_DRI1
    if (pI810->directRenderingEnabled) {
-      DRILock(screenInfo.screens[pScrn->scrnIndex], 0);
+      DRILock(screenInfo.screens[scrn->scrnIndex], 0);
       pI810->LockHeld = 1;
    }
 #endif
 
-   DoRestore(pScrn, &hwp->ModeReg, &pI810->ModeReg, FALSE);
+   DoRestore(scrn, &hwp->ModeReg, &pI810->ModeReg, FALSE);
 
 #ifdef HAVE_DRI1
    if (pI810->directRenderingEnabled) {
-      DRIUnlock(screenInfo.screens[pScrn->scrnIndex]);
+      DRIUnlock(screenInfo.screens[scrn->scrnIndex]);
       pI810->LockHeld = 0;
    }
 #endif
@@ -1371,14 +1371,14 @@ I810ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
 }
 
 static void
-I810LoadPalette15(ScrnInfoPtr pScrn, int numColors, int *indices,
+I810LoadPalette15(ScrnInfoPtr scrn, int numColors, int *indices,
 		  LOCO * colors, VisualPtr pVisual)
 {
    vgaHWPtr hwp;
    int i, j, index;
    unsigned char r, g, b;
 
-   hwp = VGAHWPTR(pScrn);
+   hwp = VGAHWPTR(scrn);
 
    for (i = 0; i < numColors; i++) {
       index = indices[i];
@@ -1395,14 +1395,14 @@ I810LoadPalette15(ScrnInfoPtr pScrn, int numColors, int *indices,
 }
 
 static void
-I810LoadPalette16(ScrnInfoPtr pScrn, int numColors, int *indices,
+I810LoadPalette16(ScrnInfoPtr scrn, int numColors, int *indices,
 		  LOCO * colors, VisualPtr pVisual)
 {
    vgaHWPtr hwp;
    int i, index;
    unsigned char r, g, b;
 
-   hwp = VGAHWPTR(pScrn);
+   hwp = VGAHWPTR(scrn);
 
    /* Load all four entries in each of the 64 color ranges.  -jens */
    for (i = 0; i < numColors; i++) {
@@ -1459,14 +1459,14 @@ I810LoadPalette16(ScrnInfoPtr pScrn, int numColors, int *indices,
 }
 
 static void
-I810LoadPalette24(ScrnInfoPtr pScrn, int numColors, int *indices,
+I810LoadPalette24(ScrnInfoPtr scrn, int numColors, int *indices,
 		  LOCO * colors, VisualPtr pVisual)
 {
    vgaHWPtr hwp;
    int i, index;
    unsigned char r, g, b;
 
-   hwp = VGAHWPTR(pScrn);
+   hwp = VGAHWPTR(scrn);
 
    for (i = 0; i < numColors; i++) {
       index = indices[i];
@@ -1481,9 +1481,9 @@ I810LoadPalette24(ScrnInfoPtr pScrn, int numColors, int *indices,
 }
 
 Bool
-I810AllocateFront(ScrnInfoPtr pScrn)
+I810AllocateFront(ScrnInfoPtr scrn)
 {
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
    int cache_lines = -1;
 
    if (pI810->DoneFrontAlloc)
@@ -1492,16 +1492,16 @@ I810AllocateFront(ScrnInfoPtr pScrn)
    memset(&(pI810->FbMemBox), 0, sizeof(BoxRec));
    /* Alloc FrontBuffer/Ring/Accel memory */
    pI810->FbMemBox.x1 = 0;
-   pI810->FbMemBox.x2 = pScrn->displayWidth;
+   pI810->FbMemBox.x2 = scrn->displayWidth;
    pI810->FbMemBox.y1 = 0;
-   pI810->FbMemBox.y2 = pScrn->virtualY;
+   pI810->FbMemBox.y2 = scrn->virtualY;
 
    xf86GetOptValInteger(pI810->Options, OPTION_CACHE_LINES, &cache_lines);
 
    if (cache_lines < 0) {
       /* make sure there is enough for two DVD sized YUV buffers */
-      cache_lines = (pScrn->depth == 24) ? 256 : 384;
-      if (pScrn->displayWidth <= 1024)
+      cache_lines = (scrn->depth == 24) ? 256 : 384;
+      if (scrn->displayWidth <= 1024)
 	 cache_lines *= 2;
    }
    /* Make sure there's enough space for cache_lines.
@@ -1517,9 +1517,9 @@ I810AllocateFront(ScrnInfoPtr pScrn)
    {
       int maxCacheLines;
 
-      maxCacheLines = (pScrn->videoRam * 1024 /
-		       (pScrn->bitsPerPixel / 8) /
-		       pScrn->displayWidth) - pScrn->virtualY;
+      maxCacheLines = (scrn->videoRam * 1024 /
+		       (scrn->bitsPerPixel / 8) /
+		       scrn->displayWidth) - scrn->virtualY;
       if (maxCacheLines < 0)
 	 maxCacheLines = 0;
       if (cache_lines > maxCacheLines)
@@ -1527,7 +1527,7 @@ I810AllocateFront(ScrnInfoPtr pScrn)
    }
    pI810->FbMemBox.y2 += cache_lines;
 
-   xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+   xf86DrvMsg(scrn->scrnIndex, X_INFO,
 	      "Adding %i scanlines for pixmap caching\n", cache_lines);
 
    /* Reserve room for the framebuffer and pixcache.  Put at the top
@@ -1538,7 +1538,7 @@ I810AllocateFront(ScrnInfoPtr pScrn)
    if (!I810AllocLow(&(pI810->FrontBuffer),
 		     &(pI810->SysMem),
 		     ALIGN((pI810->FbMemBox.x2 * pI810->FbMemBox.y2 * pI810->cpp), 4096))) {
-      xf86DrvMsg(pScrn->scrnIndex,
+      xf86DrvMsg(scrn->scrnIndex,
 		 X_WARNING, "Framebuffer allocation failed\n");
       return FALSE;
    }
@@ -1551,16 +1551,16 @@ I810AllocateFront(ScrnInfoPtr pScrn)
       pI810->LpRing->tail = 0;
       pI810->LpRing->space = 0;
    } else {
-      xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+      xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		 "Ring buffer allocation failed\n");
       return (FALSE);
    }
 
    if (I810AllocLow(&pI810->Scratch, &(pI810->SysMem), 64 * 1024) ||
        I810AllocLow(&pI810->Scratch, &(pI810->SysMem), 16 * 1024)) {
-      xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocated Scratch Memory\n");
+      xf86DrvMsg(scrn->scrnIndex, X_INFO, "Allocated Scratch Memory\n");
    } else {
-      xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+      xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		 "Scratch memory allocation failed\n");
       return (FALSE);
    }
@@ -1572,18 +1572,18 @@ I810AllocateFront(ScrnInfoPtr pScrn)
 static Bool
 I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 {
-   ScrnInfoPtr pScrn;
+   ScrnInfoPtr scrn;
    vgaHWPtr hwp;
    I810Ptr pI810;
    VisualPtr visual;
 
-   pScrn = xf86Screens[pScreen->myNum];
-   pI810 = I810PTR(pScrn);
-   hwp = VGAHWPTR(pScrn);
+   scrn = xf86Screens[pScreen->myNum];
+   pI810 = I810PTR(scrn);
+   hwp = VGAHWPTR(scrn);
 
    pI810->LpRing = calloc(sizeof(I810RingBuffer),1);
    if (!pI810->LpRing) {
-     xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 
+     xf86DrvMsg(scrn->scrnIndex, X_ERROR, 
 		"Could not allocate lpring data structure.\n");
      return FALSE;
    }
@@ -1591,8 +1591,8 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
    miClearVisualTypes();
 
    /* Re-implemented Direct Color support, -jens */
-   if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth),
-			 pScrn->rgbBits, pScrn->defaultVisual))
+   if (!miSetVisualTypes(scrn->depth, miGetDefaultVisualMask(scrn->depth),
+			 scrn->rgbBits, scrn->defaultVisual))
       return FALSE;
 
    if (!miSetPixmapDepths())
@@ -1627,47 +1627,47 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 
 #else
    pI810->directRenderingEnabled = FALSE;
-   if (!I810AllocateGARTMemory(pScrn))
+   if (!I810AllocateGARTMemory(scrn))
       return FALSE;
-   if (!I810AllocateFront(pScrn))
+   if (!I810AllocateFront(scrn))
       return FALSE;
 #endif
 
-   if (!I810MapMem(pScrn))
+   if (!I810MapMem(scrn))
       return FALSE;
 
-   pScrn->memPhysBase = (unsigned long)pI810->LinearAddr;
-   pScrn->fbOffset = 0;
+   scrn->memPhysBase = (unsigned long)pI810->LinearAddr;
+   scrn->fbOffset = 0;
 
    vgaHWSetMmioFuncs(hwp, pI810->MMIOBase, 0);
    vgaHWGetIOBase(hwp);
-   if (!vgaHWMapMem(pScrn))
+   if (!vgaHWMapMem(scrn))
       return FALSE;
 
-   I810Save(pScrn);
-   if (!I810ModeInit(pScrn, pScrn->currentMode))
+   I810Save(scrn);
+   if (!I810ModeInit(scrn, scrn->currentMode))
       return FALSE;
 
    I810SaveScreen(pScreen, FALSE);
-   I810AdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
+   I810AdjustFrame(scrnIndex, scrn->frameX0, scrn->frameY0, 0);
 
-   if (!fbScreenInit(pScreen, pI810->FbBase + pScrn->fbOffset,
-		     pScrn->virtualX, pScrn->virtualY,
-		     pScrn->xDpi, pScrn->yDpi,
-		     pScrn->displayWidth, pScrn->bitsPerPixel))
+   if (!fbScreenInit(pScreen, pI810->FbBase + scrn->fbOffset,
+		     scrn->virtualX, scrn->virtualY,
+		     scrn->xDpi, scrn->yDpi,
+		     scrn->displayWidth, scrn->bitsPerPixel))
       return FALSE;
 
-   if (pScrn->bitsPerPixel > 8) {
+   if (scrn->bitsPerPixel > 8) {
       /* Fixup RGB ordering */
       visual = pScreen->visuals + pScreen->numVisuals;
       while (--visual >= pScreen->visuals) {
 	 if ((visual->class | DynamicClass) == DirectColor) {
-	    visual->offsetRed = pScrn->offset.red;
-	    visual->offsetGreen = pScrn->offset.green;
-	    visual->offsetBlue = pScrn->offset.blue;
-	    visual->redMask = pScrn->mask.red;
-	    visual->greenMask = pScrn->mask.green;
-	    visual->blueMask = pScrn->mask.blue;
+	    visual->offsetRed = scrn->offset.red;
+	    visual->offsetGreen = scrn->offset.green;
+	    visual->offsetBlue = scrn->offset.blue;
+	    visual->redMask = scrn->mask.red;
+	    visual->greenMask = scrn->mask.green;
+	    visual->blueMask = scrn->mask.blue;
 	 }
       }
    }
@@ -1684,9 +1684,9 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 
    if (!pI810->directRenderingEnabled) {
       pI810->DoneFrontAlloc = FALSE;
-      if (!I810AllocateGARTMemory(pScrn))
+      if (!I810AllocateGARTMemory(scrn))
 	 return FALSE;
-      if (!I810AllocateFront(pScrn))
+      if (!I810AllocateFront(scrn))
 	 return FALSE;
    }
 #endif
@@ -1696,20 +1696,20 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 #endif
 
    if (!xf86InitFBManager(pScreen, &(pI810->FbMemBox))) {
-      xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+      xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		 "Failed to init memory manager\n");
       return FALSE;
    }
 
    if (!xf86ReturnOptValBool(pI810->Options, OPTION_NOACCEL, FALSE)) {
       if (pI810->LpRing->mem.Size != 0) {
-	 I810SetRingRegs(pScrn);
+	 I810SetRingRegs(scrn);
 
 	 if (!I810AccelInit(pScreen)) {
-	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+	    xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		       "Hardware acceleration initialization failed\n");
 	 }  else /* PK added 16.02.2004 */
-	     I810EmitFlush(pScrn);
+	     I810EmitFlush(scrn);
       }
    }
 
@@ -1721,7 +1721,7 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 
    if (!xf86ReturnOptValBool(pI810->Options, OPTION_SW_CURSOR, FALSE)) {
       if (!I810CursorInit(pScreen)) {
-	 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+	 xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 		    "Hardware cursor initialization failed\n");
       }
    }
@@ -1730,8 +1730,8 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
       return FALSE;
 
    /* Use driver specific palette load routines for Direct Color support. -jens */
-   if (pScrn->bitsPerPixel == 16) {
-      if (pScrn->depth == 15) {
+   if (scrn->bitsPerPixel == 16) {
+      if (scrn->depth == 15) {
 	 if (!xf86HandleColormaps(pScreen, 256, 8, I810LoadPalette15, NULL,
 				  CMAP_PALETTED_TRUECOLOR |
 				  CMAP_RELOAD_ON_MODE_SWITCH))
@@ -1769,9 +1769,9 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 #endif
 
    if (pI810->directRenderingEnabled) {
-      xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n");
+      xf86DrvMsg(scrn->scrnIndex, X_INFO, "Direct rendering enabled\n");
    } else {
-      xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Direct rendering disabled\n");
+      xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Direct rendering disabled\n");
    }
 
    pScreen->SaveScreen = I810SaveScreen;
@@ -1779,7 +1779,7 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
    pScreen->CloseScreen = I810CloseScreen;
 
    if (serverGeneration == 1)
-      xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
+      xf86ShowUnusedOptions(scrn->scrnIndex, scrn->options);
 
    return TRUE;
 }
@@ -1787,9 +1787,9 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 Bool
 I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
 {
-   ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 #if 0
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
 #endif
    if (I810_DEBUG & DEBUG_VERBOSE_CURSOR)
       ErrorF("I810SwitchMode %p %x\n", (void *)mode, flags);
@@ -1812,17 +1812,17 @@ I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
    }
 # endif
    if (pI810->AccelInfoRec != NULL) {
-      I810RefreshRing(pScrn);
-      I810Sync(pScrn);
+      I810RefreshRing(scrn);
+      I810Sync(scrn);
       pI810->AccelInfoRec->NeedToSync = FALSE;
    }
-   I810Restore(pScrn);
+   I810Restore(scrn);
 
 # ifdef HAVE_DRI1
    if (pI810->directRenderingEnabled) {
-       if (!I810DRILeave(pScrn))
+       if (!I810DRILeave(scrn))
 	   return FALSE;
-       if (!I810DRIEnter(pScrn))
+       if (!I810DRIEnter(scrn))
 	   return FALSE;
 
        if (I810_DEBUG & DEBUG_VERBOSE_DRI)
@@ -1832,33 +1832,33 @@ I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
    }
 # endif
 #endif
-   return I810ModeInit(pScrn, mode);
+   return I810ModeInit(scrn, mode);
 }
 
 void
 I810AdjustFrame(int scrnIndex, int x, int y, int flags)
 {
-   ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-   I810Ptr pI810 = I810PTR(pScrn);
-   vgaHWPtr hwp = VGAHWPTR(pScrn);
+   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   I810Ptr pI810 = I810PTR(scrn);
+   vgaHWPtr hwp = VGAHWPTR(scrn);
    int Base;
 
 #if 1
    if (pI810->showCache) {
      int lastline = pI810->FbMapSize / 
-       ((pScrn->displayWidth * pScrn->bitsPerPixel) / 8);
-     lastline -= pScrn->currentMode->VDisplay;
+       ((scrn->displayWidth * scrn->bitsPerPixel) / 8);
+     lastline -= scrn->currentMode->VDisplay;
      if (y > 0)
-       y += pScrn->currentMode->VDisplay;
+       y += scrn->currentMode->VDisplay;
      if (y > lastline) y = lastline;
    }
 #endif
-   Base = (y * pScrn->displayWidth + x) >> 2;
+   Base = (y * scrn->displayWidth + x) >> 2;
 
    if (I810_DEBUG & DEBUG_VERBOSE_CURSOR)
       ErrorF("I810AdjustFrame %d,%d %x\n", x, y, flags);
 
-   switch (pScrn->bitsPerPixel) {
+   switch (scrn->bitsPerPixel) {
    case 8:
       break;
    case 16:
@@ -1890,20 +1890,20 @@ I810AdjustFrame(int scrnIndex, int x, int y, int flags)
 static Bool
 I810EnterVT(int scrnIndex, int flags)
 {
-   ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 
 #ifdef HAVE_DRI1
-   I810Ptr pI810 = I810PTR(pScrn);
+   I810Ptr pI810 = I810PTR(scrn);
 #endif
 
    if (I810_DEBUG & DEBUG_VERBOSE_DRI)
       ErrorF("\n\nENTER VT\n");
 
-   if (!I810BindGARTMemory(pScrn)) {
+   if (!I810BindGARTMemory(scrn)) {
       return FALSE;
    }
 #ifdef HAVE_DRI1
-   if (!I810DRIEnter(pScrn)) {
+   if (!I810DRIEnter(scrn)) {
       return FALSE;
    }
    if (pI810->directRenderingEnabled) {
@@ -1914,18 +1914,18 @@ I810EnterVT(int scrnIndex, int flags)
    }
 #endif
 
-   if (!I810ModeInit(pScrn, pScrn->currentMode))
+   if (!I810ModeInit(scrn, scrn->currentMode))
       return FALSE;
-   I810AdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
+   I810AdjustFrame(scrnIndex, scrn->frameX0, scrn->frameY0, 0);
    return TRUE;
 }
 
 static void
 I810LeaveVT(int scrnIndex, int flags)
 {
-   ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-   vgaHWPtr hwp = VGAHWPTR(pScrn);
-   I810Ptr pI810 = I810PTR(pScrn);
+   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   vgaHWPtr hwp = VGAHWPTR(scrn);
+   I810Ptr pI810 = I810PTR(scrn);
 
    if (I810_DEBUG & DEBUG_VERBOSE_DRI)
       ErrorF("\n\n\nLeave VT\n");
@@ -1940,16 +1940,16 @@ I810LeaveVT(int scrnIndex, int flags)
 #endif
 
    if (pI810->AccelInfoRec != NULL) {
-      I810RefreshRing(pScrn);
-      I810Sync(pScrn);
+      I810RefreshRing(scrn);
+      I810Sync(scrn);
       pI810->AccelInfoRec->NeedToSync = FALSE;
    }
-   I810Restore(pScrn);
+   I810Restore(scrn);
 
-   if (!I810UnbindGARTMemory(pScrn))
+   if (!I810UnbindGARTMemory(scrn))
       return;
 #ifdef HAVE_DRI1
-   if (!I810DRILeave(pScrn))
+   if (!I810DRILeave(scrn))
       return;
 #endif
 
@@ -1959,18 +1959,18 @@ I810LeaveVT(int scrnIndex, int flags)
 static Bool
 I810CloseScreen(int scrnIndex, ScreenPtr pScreen)
 {
-   ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-   vgaHWPtr hwp = VGAHWPTR(pScrn);
-   I810Ptr pI810 = I810PTR(pScrn);
+   ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+   vgaHWPtr hwp = VGAHWPTR(scrn);
+   I810Ptr pI810 = I810PTR(scrn);
    XAAInfoRecPtr infoPtr = pI810->AccelInfoRec;
 
-   if (pScrn->vtSema == TRUE) {
+   if (scrn->vtSema == TRUE) {
       if (pI810->AccelInfoRec != NULL) {
-	 I810RefreshRing(pScrn);
-	 I810Sync(pScrn);
+	 I810RefreshRing(scrn);
+	 I810Sync(scrn);
 	 pI810->AccelInfoRec->NeedToSync = FALSE;
       }
-      I810Restore(pScrn);
+      I810Restore(scrn);
       vgaHWLock(hwp);
    }
 #ifdef HAVE_DRI1
@@ -1980,14 +1980,14 @@ I810CloseScreen(int scrnIndex, ScreenPtr pScreen)
    }
 #endif
 
-   if (pScrn->vtSema == TRUE) {
-      I810UnbindGARTMemory(pScrn);
-      I810Restore(pScrn);
+   if (scrn->vtSema == TRUE) {
+      I810UnbindGARTMemory(scrn);
+      I810Restore(scrn);
       vgaHWLock(hwp);
    }
 
-   I810UnmapMem(pScrn);
-   vgaHWUnmapMem(pScrn);
+   I810UnmapMem(scrn);
+   vgaHWUnmapMem(scrn);
 
    if (pI810->ScanlineColorExpandBuffers) {
       free(pI810->ScanlineColorExpandBuffers);
@@ -2020,7 +2020,7 @@ I810CloseScreen(int scrnIndex, ScreenPtr pScreen)
    free(pI810->LpRing);
    pI810->LpRing = NULL;
 
-   pScrn->vtSema = FALSE;
+   scrn->vtSema = FALSE;
    pScreen->CloseScreen = pI810->CloseScreen;
    return (*pScreen->CloseScreen) (scrnIndex, pScreen);
 }
@@ -2053,7 +2053,7 @@ I810SaveScreen(ScreenPtr pScreen, Bool unblack)
 }
 
 static void
-I810DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
+I810DisplayPowerManagementSet(ScrnInfoPtr scrn, int PowerManagementMode,
 			      int flags)
 {
    I810Ptr pI810;
@@ -2061,7 +2061,7 @@ I810DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
    int DPMSSyncSelect = 0;
    vgaHWPtr hwp;
 
-   pI810 = I810PTR(pScrn);
+   pI810 = I810PTR(scrn);
    switch (PowerManagementMode) {
    case DPMSModeOn:
       /* Screen: On; HSync: On, VSync: On */
@@ -2085,7 +2085,7 @@ I810DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
       break;
    }
 
-   hwp = VGAHWPTR(pScrn);
+   hwp = VGAHWPTR(scrn);
 
    /* Turn the screen on/off */
    SEQ01 |= hwp->readSeq(hwp, 0x01) & ~0x20;
commit 3410db008c6c20dc6590a89c05b40a0c6de6744a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 22 15:54:52 2012 +0100

    sna/dri: Avoid confusion of attempting to exchange pixmaps for DPMS-off flips
    
    Not only do we confuse ourselves, but we end up confusing the damage
    tracking on the root window whenever we update the Screen Pixmap. So for
    the time being, don't.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 2b97e68..517eaad 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -937,11 +937,13 @@ can_flip(struct sna * sna,
 	WindowPtr win = (WindowPtr)draw;
 	PixmapPtr pixmap;
 
-	if (!sna->scrn->vtSema)
+	if (draw->type == DRAWABLE_PIXMAP)
 		return FALSE;
 
-	if (draw->type == DRAWABLE_PIXMAP)
+	if (!sna->scrn->vtSema) {
+		DBG(("%s: no, not attached to VT\n", __FUNCTION__));
 		return FALSE;
+	}
 
 	if (front->format != back->format) {
 		DBG(("%s: no, format mismatch, front = %d, back = %d\n",
@@ -1184,23 +1186,25 @@ static void sna_dri_flip_event(struct sna *sna,
 				      serverClient,
 				      M_ANY, DixWriteAccess) == Success) {
 			if (can_flip(sna, drawable, flip->front, flip->back) &&
-			    !sna_dri_flip_continue(sna, drawable, flip)) {
+			    sna_dri_flip_continue(sna, drawable, flip)) {
 				DRI2SwapComplete(flip->client, drawable,
-						 0, 0, 0,
-						 DRI2_BLIT_COMPLETE,
-						 flip->client ? flip->event_complete : NULL,
-						 flip->event_data);
-				sna_dri_frame_event_info_free(flip);
+						0, 0, 0,
+						DRI2_FLIP_COMPLETE,
+						flip->client ? flip->event_complete : NULL,
+						flip->event_data);
 			} else {
+				DBG(("%s: no longer able to flip\n",
+				     __FUNCTION__));
+
 				DRI2SwapComplete(flip->client, drawable,
-						 0, 0, 0,
-						 DRI2_FLIP_COMPLETE,
-						 flip->client ? flip->event_complete : NULL,
-						 flip->event_data);
+						0, 0, 0,
+						DRI2_EXCHANGE_COMPLETE,
+						flip->client ? flip->event_complete : NULL,
+						flip->event_data);
+				sna_dri_frame_event_info_free(flip);
 			}
-		} else {
+		} else
 			sna_dri_frame_event_info_free(flip);
-		}
 		break;
 
 #if DRI2INFOREC_VERSION >= 7
@@ -1296,31 +1300,10 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	     (long long)divisor,
 	     (long long)remainder));
 
-	/* Drawable not displayed... just complete the swap */
+	/* XXX In theory we can just exchange pixmaps.... */
 	pipe = sna_dri_get_pipe(draw);
-	if (pipe == -1) {
-		RegionRec region;
-
-		DBG(("%s: off-screen, immediate update\n", __FUNCTION__));
-
-		sna_dri_exchange_attachment(front, back);
-		get_private(back)->pixmap = get_private(front)->pixmap;
-		get_private(front)->pixmap = NULL;
-		set_bo(get_private(back)->pixmap, get_private(back)->bo);
-
-		/* XXX can we query whether we need to process damage? */
-		region.extents.x1 = draw->x;
-		region.extents.y1 = draw->y;
-		region.extents.x2 = draw->x + draw->width;
-		region.extents.y2 = draw->y + draw->height;
-		region.data = NULL;
-		DamageRegionAppend(draw, &region);
-		DamageRegionProcessPending(draw);
-
-		DRI2SwapComplete(client, draw, 0, 0, 0,
-				 DRI2_EXCHANGE_COMPLETE, func, data);
-		return TRUE;
-	}
+	if (pipe == -1)
+		return FALSE;
 
 	/* Truncate to match kernel interfaces; means occasional overflow
 	 * misses, but that's generally not a big deal */
commit 28c4fb0b70e098972af972d30a660d167a8973ad
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 22 09:49:53 2012 +0100

    sna: Swallow disconnection event upon mode restoration
    
    So that we can VT switch back to X even though the output configuration
    has now changed.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index cacacdf..0c73c36 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -447,8 +447,10 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 		xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
 			   "failed to set mode: %s\n", strerror(-ret));
 		ret = FALSE;
-	} else
-		ret = sna_crtc->active = sna_crtc_is_bound(sna, crtc);
+	} else {
+		crtc->enabled = sna_crtc->active = sna_crtc_is_bound(sna, crtc);
+		ret = TRUE;
+	}
 
 	if (crtc->scrn->pScreen)
 		xf86_reload_cursors(crtc->scrn->pScreen);
commit b17c44c8d234cb2c651e88c7892bcd5b33139c1c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 22 09:43:51 2012 +0100

    sna: Remove incorrect assertion for mode restoration
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index e302d70..cacacdf 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -683,8 +683,7 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 		if (!bo)
 			return FALSE;
 
-		/* recreate the fb in case the size has changed */
-		assert(bo->delta == 0);
+		/* XXX recreate the fb in case the size has changed? */
 		sna_mode->fb_id = get_fb(sna, bo,
 					 scrn->virtualX, scrn->virtualY);
 		if (sna_mode->fb_id == 0)
commit 49b7742999ee11b0c36754ea10bc5609ebe8c609
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue May 22 09:40:25 2012 +0100

    sna: Force config restoration after VT switch
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index c213ff4..9ec3ecf 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -728,8 +728,8 @@ static void sna_leave_vt(int scrnIndex, int flags)
 	DBG(("%s\n", __FUNCTION__));
 
 	xf86RotateFreeShadow(scrn);
-
 	xf86_hide_cursors(scrn);
+	sna_mode_remove_fb(sna);
 
 	ret = drmDropMaster(sna->kgem.fd);
 	if (ret)
commit 952e3dcba3a651d22d44dbb039ad97e111d9bc63
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 21 19:48:52 2012 +0100

    sna: Only override active on DPMSModeOff
    
    Along the enable path we then only want to change the value if we
    actually call sna_crtc_apply.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 002eba3..e302d70 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -511,9 +511,10 @@ sna_crtc_dpms(xf86CrtcPtr crtc, int mode)
 	DBG(("%s(pipe %d, dpms mode -> %d):= active=%d\n",
 	     __FUNCTION__, sna_crtc->pipe, mode, mode == DPMSModeOn));
 
-	sna_crtc->active = false;
 	if (mode != DPMSModeOff)
 		sna_crtc_restore(sna_crtc->sna);
+	else
+		sna_crtc->active = false;
 }
 
 static struct kgem_bo *sna_create_bo_for_fbcon(struct sna *sna,
commit afdaf184594bfe3633305969eb1166c28e1006bf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 21 14:32:39 2012 +0100

    sna: Add a log message for the change of CRTC mode
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index d850025..002eba3 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -385,11 +385,10 @@ mode_to_kmode(drmModeModeInfoPtr kmode, DisplayModePtr mode)
 static Bool
 sna_crtc_apply(xf86CrtcPtr crtc)
 {
-	ScrnInfoPtr scrn = crtc->scrn;
-	struct sna *sna = to_sna(scrn);
+	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = crtc->driver_private;
-	struct sna_mode *mode = &sna->mode;
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
+	struct sna_mode *mode = &sna->mode;
 	uint32_t output_ids[16];
 	int output_count = 0;
 	int fb_id, x, y;
@@ -427,6 +426,12 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 		y = 0;
 	}
 
+	xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO,
+		   "switch to mode %dx%d on crtc %d (pipe %d)\n",
+		   sna_crtc->kmode.hdisplay,
+		   sna_crtc->kmode.vdisplay,
+		   crtc_id(sna_crtc), sna_crtc->pipe);
+
 	DBG(("%s: applying crtc [%d] mode=%dx%d@%d, fb=%d%s update to %d outputs\n",
 	     __FUNCTION__, crtc_id(sna_crtc),
 	     sna_crtc->kmode.hdisplay,
@@ -445,8 +450,8 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 	} else
 		ret = sna_crtc->active = sna_crtc_is_bound(sna, crtc);
 
-	if (scrn->pScreen)
-		xf86_reload_cursors(scrn->pScreen);
+	if (crtc->scrn->pScreen)
+		xf86_reload_cursors(crtc->scrn->pScreen);
 
 	return ret;
 }
@@ -2210,5 +2215,7 @@ bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc)
 	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETCRTC, &mode))
 		return false;
 
+	DBG(("%s: mode valid?=%d, fb attached?=%d\n", __FUNCTION__,
+	     mode.mode_valid, sna->mode.fb_id == mode.fb_id));
 	return mode.mode_valid && sna->mode.fb_id == mode.fb_id;
 }
commit 9fb18462ec1428a486f998585e7b4caf4dd08f53
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 21 14:12:23 2012 +0100

    sna: Confirm that the modeset takes
    
    If we attempt to change to a mode with a disabled connector the kernel
    will silently switch off that connector (and crtc) and report that the
    modeswitch is successful.
    
    Reported-by: Kyle Hill <kyle.hill at tacomafia.net>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=50078
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 3f8beea..d850025 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -442,10 +442,8 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 		xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
 			   "failed to set mode: %s\n", strerror(-ret));
 		ret = FALSE;
-	} else {
-		sna_crtc->active = 1;
-		ret = TRUE;
-	}
+	} else
+		ret = sna_crtc->active = sna_crtc_is_bound(sna, crtc);
 
 	if (scrn->pScreen)
 		xf86_reload_cursors(scrn->pScreen);
@@ -508,8 +506,8 @@ sna_crtc_dpms(xf86CrtcPtr crtc, int mode)
 	DBG(("%s(pipe %d, dpms mode -> %d):= active=%d\n",
 	     __FUNCTION__, sna_crtc->pipe, mode, mode == DPMSModeOn));
 
-	sna_crtc->active = mode == DPMSModeOn;
-	if (mode == DPMSModeOn)
+	sna_crtc->active = false;
+	if (mode != DPMSModeOff)
 		sna_crtc_restore(sna_crtc->sna);
 }
 
commit cd3b48854403ee63723ef570c1a7f9f8447e7105
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat May 19 12:56:45 2012 +0100

    sna/gen7: Trim a dead assignment
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 362ddff..9eed660 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1663,7 +1663,7 @@ inline static int gen7_get_rectangles(struct sna *sna,
 				      int want,
 				      void (*emit_state)(struct sna *sna, const struct sna_composite_op *op))
 {
-	int rem = vertex_space(sna);
+	int rem;
 
 start:
 	rem = vertex_space(sna);
commit cf79cd3e27b7077f67f202b16ed39eb1cc70ac65
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat May 19 12:44:11 2012 +0100

    sna: Emit a new batch if we need to clip after PolyText without space
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 8b1ab65..02c11cf 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -11266,7 +11266,7 @@ skip:
 		if (++extents == last_extents)
 			break;
 
-		if (kgem_check_batch(&sna->kgem, 3)) {
+		if (kgem_check_batch(&sna->kgem, 3 + 5)) {
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			sna->kgem.nbatch += 3;
 
commit f91dcc44dcc15850f82666b1bcdd27182400e7dc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 18 20:09:41 2012 +0100

    sna: Give the proxy a unique name
    
    So that if we cache the current destination bo (for example, gen3) then
    a new proxy (or even just a new batchbuffer) will indeed cause the
    destination buffer to be updated.
    
    Reported-and-tested-by: Clemens Eisserer <linuxhippy at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48636
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index df69b90..470dd24 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -3499,7 +3499,8 @@ void kgem_clear_dirty(struct kgem *kgem)
 	}
 }
 
-struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,
+struct kgem_bo *kgem_create_proxy(struct kgem *kgem,
+				  struct kgem_bo *target,
 				  int offset, int length)
 {
 	struct kgem_bo *bo;
@@ -3512,6 +3513,7 @@ struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,
 	if (bo == NULL)
 		return NULL;
 
+	bo->unique_id = kgem_get_unique_id(kgem);
 	bo->reusable = false;
 	bo->size.bytes = length;
 
@@ -3903,7 +3905,7 @@ done:
 	bo->used = ALIGN(bo->used, 64);
 	assert(bo->mem);
 	*ret = (char *)bo->mem + offset;
-	return kgem_create_proxy(&bo->base, offset, size);
+	return kgem_create_proxy(kgem, &bo->base, offset, size);
 }
 
 bool kgem_buffer_is_inplace(struct kgem_bo *_bo)
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 0c26630..0a95da7 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -195,7 +195,8 @@ struct kgem_bo *kgem_create_map(struct kgem *kgem,
 struct kgem_bo *kgem_create_for_name(struct kgem *kgem, uint32_t name);
 
 struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size, unsigned flags);
-struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,
+struct kgem_bo *kgem_create_proxy(struct kgem *kgem,
+				  struct kgem_bo *target,
 				  int offset, int length);
 
 struct kgem_bo *kgem_upload_source_image(struct kgem *kgem,
diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index 32d26c8..a52cfb5 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -258,7 +258,8 @@ sna_render_finish_solid(struct sna *sna, bool force)
 	DBG(("sna_render_finish_solid reset\n"));
 
 	cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(cache->color), 0);
-	cache->bo[0] = kgem_create_proxy(cache->cache_bo, 0, sizeof(uint32_t));
+	cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
+					 0, sizeof(uint32_t));
 	cache->bo[0]->pitch = 4;
 	if (force)
 		cache->size = 1;
@@ -308,7 +309,7 @@ sna_render_get_solid(struct sna *sna, uint32_t color)
 	DBG(("sna_render_get_solid(%d) = %x (new)\n", i, color));
 
 create:
-	cache->bo[i] = kgem_create_proxy(cache->cache_bo,
+	cache->bo[i] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
 					 i*sizeof(uint32_t), sizeof(uint32_t));
 	cache->bo[i]->pitch = 4;
 
@@ -331,7 +332,8 @@ static Bool sna_alpha_cache_init(struct sna *sna)
 
 	for (i = 0; i < 256; i++) {
 		color[i] = i << 24;
-		cache->bo[i] = kgem_create_proxy(cache->cache_bo,
+		cache->bo[i] = kgem_create_proxy(&sna->kgem,
+						 cache->cache_bo,
 						 sizeof(uint32_t)*i,
 						 sizeof(uint32_t));
 		cache->bo[i]->pitch = 4;
@@ -356,7 +358,8 @@ static Bool sna_solid_cache_init(struct sna *sna)
 	 * zeroth slot simplifies some of the checks.
 	 */
 	cache->color[0] = 0xffffffff;
-	cache->bo[0] = kgem_create_proxy(cache->cache_bo, 0, sizeof(uint32_t));
+	cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
+					 0, sizeof(uint32_t));
 	cache->bo[0]->pitch = 4;
 	cache->dirty = 1;
 	cache->size = 1;
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 880e173..7feaa24 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -870,7 +870,7 @@ sna_render_pixmap_partial(struct sna *sna,
 	}
 
 	/* How many tiles across are we? */
-	channel->bo = kgem_create_proxy(bo,
+	channel->bo = kgem_create_proxy(&sna->kgem, bo,
 					box.y1 * bo->pitch + offset,
 					h * bo->pitch);
 	if (channel->bo == NULL)
@@ -989,7 +989,7 @@ sna_render_picture_partial(struct sna *sna,
 		return 0;
 
 	/* How many tiles across are we? */
-	channel->bo = kgem_create_proxy(bo,
+	channel->bo = kgem_create_proxy(&sna->kgem, bo,
 					box.y1 * bo->pitch + offset,
 					h * bo->pitch);
 	if (channel->bo == NULL)
@@ -1821,7 +1821,7 @@ sna_render_composite_redirect(struct sna *sna,
 			}
 
 			/* How many tiles across are we? */
-			op->dst.bo = kgem_create_proxy(op->dst.bo,
+			op->dst.bo = kgem_create_proxy(&sna->kgem, op->dst.bo,
 						       box.y1 * op->dst.bo->pitch + offset,
 						       h * op->dst.bo->pitch);
 			if (!op->dst.bo) {
commit ee073d613bba38f90951405d5ecddfcf3ac5e043
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 18 15:19:00 2012 +0100

    sna/traps: Fix processing of full-steps
    
    A missing factor of Y-height caused the computation of coverage for the
    spans to be completely wrong. This affects the vertical segments of
    rounded rectangles, for instance.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 357c4c4..c0565fa 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -607,14 +607,14 @@ cell_list_add_span(struct cell_list *cells,
 
 	cell = cell_list_find(cells, ix1);
 	if (ix1 != ix2) {
-		cell->uncovered_area += 2*fx1;
+		cell->uncovered_area += 2*fx1*FAST_SAMPLES_Y;
 		cell->covered_height += FAST_SAMPLES_Y;
 
 		cell = cell_list_find(cells, ix2);
-		cell->uncovered_area -= 2*fx2;
+		cell->uncovered_area -= 2*fx2*FAST_SAMPLES_Y;
 		cell->covered_height -= FAST_SAMPLES_Y;
 	} else
-		cell->uncovered_area += 2*(fx1-fx2);
+		cell->uncovered_area += 2*(fx1-fx2)*FAST_SAMPLES_Y;
 }
 
 static void
@@ -1025,6 +1025,7 @@ nonzero_subrow(struct active_list *active, struct cell_list *coverages)
 		} else {
 			edge->prev->next = next;
 			next->prev = edge->prev;
+			active->min_height = -1;
 		}
 
 		edge = next;
@@ -1718,7 +1719,7 @@ tor_inplace(struct tor *converter, PixmapPtr scratch, int mono, uint8_t *buf)
 	int stride = scratch->devKind;
 	int width = scratch->drawable.width;
 
-	__DBG(("%s: mono=%d, buf=%d\n", __FUNCTION__, mono, buf));
+	__DBG(("%s: mono=%d, buf?=%d\n", __FUNCTION__, mono, buf != NULL));
 	assert(!mono);
 	assert(converter->ymin == 0);
 	assert(converter->xmin == 0);
@@ -1750,9 +1751,9 @@ tor_inplace(struct tor *converter, PixmapPtr scratch, int mono, uint8_t *buf)
 			do_full_step = can_full_step(active);
 		}
 
-		__DBG(("%s: y=%d [%d], do_full_step=%d, new edges=%d, min_height=%d, vertical=%d\n",
+		__DBG(("%s: y=%d, do_full_step=%d, new edges=%d, min_height=%d, vertical=%d\n",
 		       __FUNCTION__,
-		       i, i+ymin, do_full_step,
+		       i, do_full_step,
 		       polygon->y_buckets[i] != NULL,
 		       active->min_height,
 		       active->is_vertical));
commit 8ba800c63906fb29d34f40b9437092a665bffb14
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 17 22:46:18 2012 +0100

    sna: Don't consider uploading inplace if the dst bo is unmappable
    
    Handle (and take advantage of) the fallback at the high level rather
    than masquerading an inplace write.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 1b671b0..8b1ab65 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2726,6 +2726,9 @@ static bool upload_inplace(struct sna *sna,
 	if (priv->gpu_bo) {
 		assert(priv->gpu_bo->proxy == NULL);
 
+		if (!kgem_bo_can_map(&sna->kgem, priv->gpu_bo))
+			return false;
+
 		if (!kgem_bo_is_busy(priv->gpu_bo))
 			return true;
 
commit dad24721a13ce3a357e8ddae3c2dea61045f6fc2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 17 21:44:22 2012 +0100

    Revert "sna: Always try to operate inplace if we an LLC gpu bo"
    
    This reverts commit 10b4a9bb5f46ab9d9c8b165084ce4174b54a8d39 as it
    causes a regression for pixel data uploads to active buffers.

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 8915724..1b671b0 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -904,9 +904,6 @@ static inline bool pixmap_inplace(struct sna *sna,
 	if (priv->mapped)
 		return true;
 
-	if (sna->kgem.has_llc && pixmap != sna->front)
-		return !priv->cpu_bo;
-
 	return (pixmap->devKind * pixmap->drawable.height >> 12) >
 		sna->kgem.half_cpu_cache_pages;
 }
@@ -1266,9 +1263,6 @@ static inline bool region_inplace(struct sna *sna,
 		return false;
 	}
 
-	if (sna->kgem.has_llc && pixmap != sna->front)
-		return !priv->cpu_bo;
-
 	DBG(("%s: (%dx%d), inplace? %d\n",
 	     __FUNCTION__,
 	     region->extents.x2 - region->extents.x1,
commit 681c6e72412fff96b203a09be6ac8d393f3489a5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 17 19:43:02 2012 +0100

    sna: Track flushing status of live bo
    
    Currently we only move a bo with an outstanding kernel flush onto the
    flushing list if it is no longer in use. This leaves us potentially
    stalling on a flush if we try then to write to the object believing it
    to be retired and idle.
    
    Reported-by: Jiri Slaby <jirislaby at gmail.com>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=47597
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 759860c..df69b90 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -303,9 +303,9 @@ void kgem_bo_retire(struct kgem *kgem, struct kgem_bo *bo)
 		assert(list_is_empty(&bo->vma));
 		bo->rq = NULL;
 		list_del(&bo->request);
-		bo->needs_flush = bo->flush;
 	}
 
+	bo->needs_flush = false;
 	bo->domain = DOMAIN_NONE;
 }
 
@@ -1280,7 +1280,6 @@ static bool kgem_retire__flushing(struct kgem *kgem)
 	bool retired = false;
 
 	list_for_each_entry_safe(bo, next, &kgem->flushing, request) {
-		assert(bo->refcnt == 0);
 		assert(bo->rq == &_kgem_static_request);
 		assert(bo->exec == NULL);
 
@@ -1289,16 +1288,19 @@ static bool kgem_retire__flushing(struct kgem *kgem)
 
 		DBG(("%s: moving %d from flush to inactive\n",
 		     __FUNCTION__, bo->handle));
-		if (bo->reusable && kgem_bo_set_purgeable(kgem, bo)) {
-			bo->needs_flush = false;
-			bo->domain = DOMAIN_NONE;
-			bo->rq = NULL;
-			list_del(&bo->request);
-			kgem_bo_move_to_inactive(kgem, bo);
-		} else
-			kgem_bo_free(kgem, bo);
+		bo->needs_flush = false;
+		bo->domain = DOMAIN_NONE;
+		bo->rq = NULL;
+		list_del(&bo->request);
 
-		retired = true;
+		if (!bo->refcnt) {
+			assert(bo->reusable);
+			if (kgem_bo_set_purgeable(kgem, bo)) {
+				kgem_bo_move_to_inactive(kgem, bo);
+				retired = true;
+			} else
+				kgem_bo_free(kgem, bo);
+		}
 	}
 
 	return retired;
@@ -1331,12 +1333,18 @@ static bool kgem_retire__requests(struct kgem *kgem)
 			assert(bo->domain == DOMAIN_GPU);
 
 			list_del(&bo->request);
-			bo->rq = NULL;
 
 			if (bo->needs_flush)
 				bo->needs_flush = kgem_busy(kgem, bo->handle);
-			if (!bo->needs_flush)
+			if (bo->needs_flush) {
+				DBG(("%s: moving %d to flushing\n",
+				     __FUNCTION__, bo->handle));
+				list_add(&bo->request, &kgem->flushing);
+				bo->rq = &_kgem_static_request;
+			} else {
 				bo->domain = DOMAIN_NONE;
+				bo->rq = NULL;
+			}
 
 			if (bo->refcnt)
 				continue;
@@ -1348,20 +1356,17 @@ static bool kgem_retire__requests(struct kgem *kgem)
 				continue;
 			}
 
-			if (bo->needs_flush) {
-				DBG(("%s: moving %d to flushing\n",
-				     __FUNCTION__, bo->handle));
-				list_add(&bo->request, &kgem->flushing);
-				bo->rq = &_kgem_static_request;
-			} else if (kgem_bo_set_purgeable(kgem, bo)) {
-				DBG(("%s: moving %d to inactive\n",
-				     __FUNCTION__, bo->handle));
-				kgem_bo_move_to_inactive(kgem, bo);
-				retired = true;
-			} else {
-				DBG(("%s: closing %d\n",
-				     __FUNCTION__, bo->handle));
-				kgem_bo_free(kgem, bo);
+			if (!bo->needs_flush) {
+				if (kgem_bo_set_purgeable(kgem, bo)) {
+					DBG(("%s: moving %d to inactive\n",
+					     __FUNCTION__, bo->handle));
+					kgem_bo_move_to_inactive(kgem, bo);
+					retired = true;
+				} else {
+					DBG(("%s: closing %d\n",
+					     __FUNCTION__, bo->handle));
+					kgem_bo_free(kgem, bo);
+				}
 			}
 		}
 
commit d99502a33d5bdbad010b7a036c1aee989fe29947
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 17 17:56:43 2012 +0100

    sna/glyphs: Pass the extents to the backend for preparing to composite glyphs
    
    This information should not be required, but it might come in handy, so
    pass it along.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 07b2a94..2af7e80 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -920,7 +920,7 @@ next_image:
 					if (!sna->render.composite(sna, PictOpAdd,
 								   this_atlas, NULL, mask,
 								   0, 0, 0, 0, 0, 0,
-								   0, 0,
+								   width, height,
 								   &tmp)) {
 						FreePicture(mask, 0);
 						return FALSE;
commit fb21c2df1a10d66f115a5978b0db508058fdc412
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 17 16:30:31 2012 +0100

    sna/io: Assert that we do not replace a bo->flush object
    
    These should be pinned by the higher layers and so we should never be
    attempting to replace them. If we do replace a bo->flush, then we will
    end up miscounting outstanding flush bo.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index b4e59d9..3f39de5 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -1147,6 +1147,7 @@ bool sna_replace(struct sna *sna,
 	     pixmap->drawable.height,
 	     pixmap->drawable.bitsPerPixel,
 	     bo->tiling));
+	assert(!bo->flush);
 
 	if ((!kgem_bo_can_map(kgem, bo) || kgem_bo_is_busy(bo)) &&
 	    indirect_replace(sna, pixmap, bo, src, stride))
@@ -1222,6 +1223,7 @@ struct kgem_bo *sna_replace__xor(struct sna *sna,
 	     pixmap->drawable.height,
 	     pixmap->drawable.bitsPerPixel,
 	     bo->tiling));
+	assert(!bo->flush);
 
 	if (kgem_bo_is_busy(bo)) {
 		struct kgem_bo *new_bo;


More information about the xorg-commit mailing list