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;