diff mbox

DRI2 CopyRegion scanline wait fixes

Message ID 20091202122928.2653387a@jbarnes-piketon (mailing list archive)
State Accepted
Headers show

Commit Message

Jesse Barnes Dec. 2, 2009, 8:29 p.m. UTC
None
diff mbox

Patch

diff --git a/src/i830_dri.c b/src/i830_dri.c
index 98c1a15..313cc96 100644
--- a/src/i830_dri.c
+++ b/src/i830_dri.c
@@ -302,6 +302,7 @@  I830DRI2CopyRegion(DrawablePtr drawable, RegionPtr pRegion,
 		int y1, y2;
 		int pipe = -1, event, load_scan_lines_pipe;
 		xf86CrtcPtr crtc;
+		Bool full_height = FALSE;
 
 		box = REGION_EXTENTS(unused, gc->pCompositeClip);
 		crtc = i830_covering_crtc(scrn, box, NULL, &crtcbox);
@@ -310,21 +311,34 @@  I830DRI2CopyRegion(DrawablePtr drawable, RegionPtr pRegion,
 		if (crtc != NULL && !crtc->rotatedData) {
 			pipe = i830_crtc_to_pipe(crtc);
 
+			/* Make sure we don't wait for a scanline that will never occur */
+			y1 = (crtcbox.y1 <= box->y1) ? box->y1 - crtcbox.y1 : 0;
+			y2 = (box->y2 <= crtcbox.y2) ?
+			    box->y2 - crtcbox.y1 : crtcbox.y2 - crtcbox.y1;
+
+			if (y1 == 0 && y2 == crtcbox.y2)
+			    full_height = TRUE;
+
+			/* Pre-965 doesn't have SVBLANK, so we need a bit
+			 * of extra time for the blitter to start up and
+			 * do its job for a full height blit */
+			if (full_height && !IS_I965G(intel))
+			    y2 -= 2;
+
 			if (pipe == 0) {
 				event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
 				load_scan_lines_pipe =
 				    MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
+				if (full_height && IS_I965G(intel))
+				    event = MI_WAIT_FOR_PIPEA_SVBLANK;
 			} else {
 				event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
 				load_scan_lines_pipe =
 				    MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
+				if (full_height && IS_I965G(intel))
+				    event = MI_WAIT_FOR_PIPEB_SVBLANK;
 			}
 
-			/* Make sure we don't wait for a scanline that will never occur */
-			y1 = (crtcbox.y1 <= box->y1) ? box->y1 - crtcbox.y1 : 0;
-			y2 = (box->y2 <= crtcbox.y2) ?
-			    box->y2 - crtcbox.y1 : crtcbox.y2 - crtcbox.y1;
-
 			BEGIN_BATCH(5);
 			/* The documentation says that the LOAD_SCAN_LINES command
 			 * always comes in pairs. Don't ask me why. */