[Intel-gfx] [PATCH] DRI2 CopyRegion scanline wait fixes

Jesse Barnes jbarnes at virtuousgeek.org
Sat Dec 5 07:52:34 CET 2009


On Thu, 03 Dec 2009 11:36:49 -0800
Eric Anholt <eric at anholt.net> wrote:

> On Wed, 2 Dec 2009 12:29:28 -0800, Jesse Barnes
> <jbarnes at virtuousgeek.org> wrote:
> > In the case of full height blits, we were getting tearing on the
> > first line. This could be due to batch buffer startup time or late
> > vblank events.  On 965 and above we have a "start of vblank" event
> > (as opposed to the one that comes in after various in-chip
> > housekeeping is done on pre-965), so we can use that for full
> > screen copies.  For pre-965, we just have to set a scanline wait
> > for somewhere near the bottom of the screen to give us time to set
> > up the copy.
> > 
> > Fixes bug #22475.
> > 
> > Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> > 
> > 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;
> 
> Don't you mean y1 here?  And won't this blow up for y < 2?

It'll only happen for full height blits, so I expect y2 to be greater
than 2.  But theoretically it could be I suppose.

And no, I mean y2, since we want to submit the batch just before the
beam reaches the bottom of the screen, not slightly after it leaves the
top.

> > +
> >  			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;
> 
> If we're doing an SVBLANK wait, shouldn't we bail on the scan lines
> loading?

Yeah, probably.  Seems to be harmless though.


-- 
Jesse Barnes, Intel Open Source Technology Center



More information about the Intel-gfx mailing list