On Son, 2003-02-16 at 21:59, Sean E. Russell wrote: > > I've been talking with Felix Kühling about a problem I've been observing WRT > DRI, my Radeon, and KDE 3.1, and he suggested that it might be time to submit > a bug report to the devel list, so here I am. > > The summary of the problem is that, with accellerated GL enabled, I get a lag > of 2 seconds each time the mouse pointer changed "modes." > > First, I'm using KDE 3.1, which provides a shaded, transluescent mouse pointer > for the I-bar and the arrow; the other pointers (the hourglass, the hand, the > resize shapes) are the regular X shapes.
Actually, I think they aren't, that's why they're not ARGB as well. This isn't a feature of KDE but the new Xlib. The problem has been discussed on the XFree86 lists; the radeon 2D driver function to wait for a vertical blank interfered with the DRM handling vertical blank interrupts. This has been fixed in XFree86 CVS after RC1. DRI CVS doesn't even have the affected code yet. > 4) The option SWCursor fixes the problem, but then of course causes X to crash > when trying to access any of the OpenGL functions. 'Of course'? A crash is a bug. Does this patch help? -- Earthling Michel Dänzer (MrCooper)/ Debian GNU/Linux (powerpc) developer XFree86 and DRI project member / CS student, Free Software enthusiast
Index: programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c,v retrieving revision 1.30 diff -p -u -r1.30 radeon_dri.c --- programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c 2003/02/08 23:27:36 1.30 +++ programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c 2003/02/16 22:46:20 @@ -1829,7 +1829,9 @@ static void RADEONDRITransitionTo3d(Scre RADEONEnablePageFlip(pScreen); info->have3DWindows = 1; - xf86ForceHWCursor (pScreen, TRUE); + + if (info->cursor_start) + xf86ForceHWCursor (pScreen, TRUE); } static void RADEONDRITransitionTo2d(ScreenPtr pScreen) @@ -1852,5 +1854,7 @@ static void RADEONDRITransitionTo2d(Scre xf86FreeOffscreenArea(info->depthTexArea); info->have3DWindows = 0; - xf86ForceHWCursor (pScreen, FALSE); + + if (info->cursor_start) + xf86ForceHWCursor (pScreen, FALSE); } Index: programs/Xserver/hw/xfree86/drivers/ati/radeon_video.c =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_video.c,v retrieving revision 1.23 diff -p -u -r1.23 radeon_video.c --- programs/Xserver/hw/xfree86/drivers/ati/radeon_video.c 2003/01/29 18:06:07 1.23 +++ programs/Xserver/hw/xfree86/drivers/ati/radeon_video.c 2003/02/16 22:46:20 @@ -680,7 +680,8 @@ RADEONStopVideo(ScrnInfoPtr pScrn, point if(pPriv->videoStatus & CLIENT_VIDEO_ON) { RADEONWaitForFifo(pScrn, 2); OUTREG(RADEON_OV0_SCALE_CNTL, 0); - xf86ForceHWCursor (pScrn->pScreen, FALSE); + if (info->cursor_start) + xf86ForceHWCursor (pScrn->pScreen, FALSE); } if(info->videoLinear) { xf86FreeOffscreenLinear(info->videoLinear); @@ -1282,7 +1283,7 @@ RADEONPutImage( REGION_RECTS(clipBoxes)); } - if (!(pPriv->videoStatus & CLIENT_VIDEO_ON)) + if (info->cursor_start && !(pPriv->videoStatus & CLIENT_VIDEO_ON)) xf86ForceHWCursor (pScrn->pScreen, TRUE); RADEONDisplayVideo(pScrn, id, offset, offset, width, height, dstPitch, @@ -1349,7 +1350,7 @@ RADEONVideoTimerCallback(ScrnInfoPtr pSc if(pPriv->offTime < now) { unsigned char *RADEONMMIO = info->MMIO; OUTREG(RADEON_OV0_SCALE_CNTL, 0); - if (pPriv->videoStatus & CLIENT_VIDEO_ON) + if (info->cursor_start && pPriv->videoStatus & CLIENT_VIDEO_ON) xf86ForceHWCursor (pScrn->pScreen, FALSE); pPriv->videoStatus = FREE_TIMER; pPriv->freeTime = now + FREE_DELAY; @@ -1360,7 +1361,7 @@ RADEONVideoTimerCallback(ScrnInfoPtr pSc xf86FreeOffscreenLinear(info->videoLinear); info->videoLinear = NULL; } - if (pPriv->videoStatus & CLIENT_VIDEO_ON) + if (info->cursor_start && pPriv->videoStatus & CLIENT_VIDEO_ON) xf86ForceHWCursor (pScrn->pScreen, FALSE); pPriv->videoStatus = 0; info->VideoTimerCallback = NULL; @@ -1543,7 +1544,8 @@ RADEONDisplaySurface( if (portPriv->videoStatus & CLIENT_VIDEO_ON) { REGION_EMPTY(pScrn->pScreen, &portPriv->clip); UpdateCurrentTime(); - xf86ForceHWCursor (pScrn->pScreen, FALSE); + if (info->cursor_start) + xf86ForceHWCursor (pScrn->pScreen, FALSE); portPriv->videoStatus = FREE_TIMER; portPriv->freeTime = currentTime.milliseconds + FREE_DELAY; info->VideoTimerCallback = RADEONVideoTimerCallback;