i810 driver vblank bug
Alan Hourihane
alanh at fairlite.demon.co.uk
Mon Aug 28 03:56:36 PDT 2006
On Mon, 2006-08-28 at 18:35 +0800, Yuan Austin wrote:
> Hi,
>
> i915 drm version 1.5 adds two ioctls to enable/disable vblank
> interrupt of pipe A&B, and it is disabled by default. There are
> several lines of initialization code in i810 2D driver to enable
> vblank interrupt to make sure DRI applications can get vblank
> interrupt on time. The issue is that 2D driver will bypass the
> initialization code due to one conditional expression in
> i830_driver.c:I830BIOSEnterVT:
>
> #ifdef XF86DRI
> if (pI830->directRenderingEnabled) {
> if (!pI830->starting) {
> ScreenPtr pScreen = pScrn->pScreen;
> drmI830Sarea *sarea = (drmI830Sarea *) DRIGetSAREAPrivate(pScreen);
> int i;
>
> I830DRIResume(screenInfo.screens[scrnIndex]);
> I830DRISetVBlankInterrupt (pScrn, TRUE);
> ........
> #endif
>
> Because pI830->starting is true when I830BIOSEnterVT is called by
> I830BIOSScreenInit, the I830DRISetVBlankInterrupt will be skipped,
> then vblank will be disabled until one VT switch occurs. The disabled
> vblank interrupt will cause DRI applications vblank waiting timeout
> before copying back buffer to frontbuffer, and an error message will
> pop up(Mesa i915 driver:
> intelCopyBuffer->driWaitForVBlank->do_wait->drmWaitVBlank):
> do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
> Try running with LIBGL_THROTTLE_REFRESH and LIBL_SYNC_REFRESH unset.
>
> A small patch can fix this issue:
>
> --- ./i830_driver.old.c 2006-08-27 15:46:53.000000000 -0400
> +++ ./i830_driver.c 2006-08-27 21:12:09.000000000 -0400
> @@ -8097,7 +8097,9 @@
>
> DPRINTF(PFX, "calling dri unlock\n");
> DRIUnlock(screenInfo.screens[pScrn->scrnIndex]);
> - }
> + } else
> + I830DRISetVBlankInterrupt (pScrn, TRUE);
> +
> pI830->LockHeld = 0;
> }
> #endif
I've fixed this in the git repo now, but the "else" shouldn't be there.
Alan.
More information about the xorg
mailing list