diff options
author | Carl Worth <cworth@cworth.org> | 2009-04-06 11:16:40 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2009-04-06 11:16:53 -0700 |
commit | bc3312fd7c03d09a231dfebfe390fe668ad15d1e (patch) | |
tree | 3414e7a30924df53de509c8734e03783e6599ca3 /src/i830_video.c | |
parent | 6cd914ef315036ce8e91c7b6492994353e8ed2d8 (diff) |
Use WAIT_FOR_SCAN_LINE instead of WAIT_FOR_VBLANK
Either way, the goal is tear-free video playing. But waiting for
a scan-line window not only has the advantage of being cheaper
for small windows, but also avoids hanging the GPU in the case
of the pipe getting turned off, (by screensaver, for example),
while a batch is waiting for a VBLANK that will never occur.
This fixes that GPU hang.
Diffstat (limited to 'src/i830_video.c')
-rw-r--r-- | src/i830_video.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/src/i830_video.c b/src/i830_video.c index 3f3aaacf..3dde5b4d 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -2533,24 +2533,28 @@ I830PutImage(ScrnInfoPtr pScrn, } if (sync) { - I830CrtcPrivatePtr intel_crtc = crtc->driver_private; - int event; - - if (IS_I965G(pI830)) { - if (intel_crtc->pipe == 0) - event = MI_WAIT_FOR_PIPEA_SVBLANK; - else - event = MI_WAIT_FOR_PIPEB_SVBLANK; - } else { - if (intel_crtc->pipe == 0) - event = MI_WAIT_FOR_PIPEA_VBLANK; - else - event = MI_WAIT_FOR_PIPEB_VBLANK; - } + BoxPtr box; + int event, pipe; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + + if (intel_crtc->pipe == 0) { + event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW; + pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEA; + } else { + event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW; + pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEB; + } + + box = REGION_EXTENTS(unused, clipBoxes); - BEGIN_BATCH(2); + BEGIN_BATCH(5); + /* The documentation says that the LOAD_SCAN_LINES command + * always comes in pairs. Don't ask me why. */ + OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | pipe); + OUT_BATCH((box->y1 << 16) | box->y2); + OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | pipe); + OUT_BATCH((box->y1 << 16) | box->y2); OUT_BATCH(MI_WAIT_FOR_EVENT | event); - OUT_BATCH(MI_NOOP); ADVANCE_BATCH(); } |