xserver: Branch 'mpx' - 7 commits

Peter Hutterer whot at kemper.freedesktop.org
Wed May 21 04:59:48 PDT 2008


 hw/xfree86/ramdac/xf86Cursor.c |  135 +++++++++++++++--------------------------
 mi/mipointer.c                 |    6 +
 2 files changed, 55 insertions(+), 86 deletions(-)

New commits:
commit 7509fb498c02fe1cebe4139612b8871ec877c130
Merge: 2ae3bed... dfb7de6...
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed May 21 16:25:35 2008 +0930

    Merge branch 'hwcursor' into mpx

commit dfb7de6571345061d1cd88ab915064fc376529fd
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri May 16 20:56:04 2008 +0930

    mi: don't call from miPointerMoved into the spriteFuncs for anything but VCP.
    
    Calling ->MoveCursor for anything but the HW-rendered VCP causes the
    SW-rendered cursor routines to be started, including mallocs, etc. Since
    miPointerMoved is called during SIGIO, this is a bad idea.

diff --git a/mi/mipointer.c b/mi/mipointer.c
index 484947d..6f39bcb 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -530,7 +530,11 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
 
     pPointer = MIPOINTER(pDev);
 
-    if (pDev && pDev->coreEvents 
+    /* Hack: We mustn't call into ->MoveCursor for anything but the
+     * VCP, as this may cause a non-HW rendered cursor to be rendered during
+     * SIGIO. This again leads to allocs during SIGIO which leads to SIGABRT.
+     */
+    if ((pDev == inputInfo.pointer || (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
         && !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
     {
 	pPointer->devx = x;
commit f611719edce2ae51dca8e53947a3938b53c20b00
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri May 16 19:49:29 2008 +0930

    xfree86: always render first cursor in HW, all others in SW.

diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index 50f8fb7..7695962 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -20,8 +20,6 @@ extern InputInfo inputInfo;
 
 DevPrivateKey xf86CursorScreenKey = &xf86CursorScreenKey;
 
-#define XF86_FORCE_SW_CURSOR (1 << 7)
-
 /* sprite functions */
 
 static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
@@ -304,14 +302,14 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 
 
     if (pCurs == NullCursor) {	/* means we're supposed to remove the cursor */
-        if (ScreenPriv->SWCursor)
+        if (ScreenPriv->SWCursor || pDev != inputInfo.pointer)
             (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
                                                   x, y);
         else if (ScreenPriv->isUp) {
             xf86SetCursor(pScreen, NullCursor, x, y);
             ScreenPriv->isUp = FALSE;
-	    }
-	    return;
+        }
+        return;
     }
 
     /* only update for VCP, otherwise we get cursor jumps when removing a
@@ -324,13 +322,10 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 	ScreenPriv->CursorToRestore = NULL;
 	ScreenPriv->HotX = pCurs->bits->xhot;
 	ScreenPriv->HotY = pCurs->bits->yhot;
-    }
 
-    if (!infoPtr->pScrn->vtSema)
-	 ScreenPriv->SavedCursor = pCurs;
+        if (!infoPtr->pScrn->vtSema)
+            ScreenPriv->SavedCursor = pCurs;
 
-    if (!(ScreenPriv->SWCursor & XF86_FORCE_SW_CURSOR))
-    {
 	if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
 #ifdef ARGB_CURSOR
 			    pCurs->bits->argb && infoPtr->UseHWCursorARGB &&
@@ -352,22 +347,22 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 	    return;
 	}
 
-    }
+        PointPriv->waitForUpdate = TRUE;
 
-    PointPriv->waitForUpdate = TRUE;
+        if (ScreenPriv->isUp) {
+            /* Remove the HW cursor, or make it transparent */
+            if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT) {
+                xf86SetTransparentCursor(pScreen);
+            } else {
+                xf86SetCursor(pScreen, NullCursor, x, y);
+                ScreenPriv->isUp = FALSE;
+            }
+        }
 
-    if (ScreenPriv->isUp) {
-	/* Remove the HW cursor, or make it transparent */
-	if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT) {
-	    xf86SetTransparentCursor(pScreen);
-	} else {
-	    xf86SetCursor(pScreen, NullCursor, x, y);
-	    ScreenPriv->isUp = FALSE;
-	}
-    }
+        if (!ScreenPriv->SWCursor)
+            ScreenPriv->SWCursor = TRUE;
 
-    if (!ScreenPriv->SWCursor)
-        ScreenPriv->SWCursor = TRUE;
+    }
 
     if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
 	pCurs = NullCursor;
@@ -384,18 +379,19 @@ xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
     /* only update coordinate state for first sprite, otherwise we get jumps
        when removing a sprite. The second sprite is never HW rendered anyway */
     if (pDev == inputInfo.pointer ||
-            (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
+            !pDev->isMaster && pDev->u.master == inputInfo.pointer)
     {
 	ScreenPriv->x = x;
 	ScreenPriv->y = y;
-    }
 
-    if (ScreenPriv->CursorToRestore)
-	xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x, y);
-    else if (ScreenPriv->SWCursor)
-	(*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
-    else if (ScreenPriv->isUp)
-	xf86MoveCursor(pScreen, x, y);
+        if (ScreenPriv->CursorToRestore)
+            xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x, y);
+        else if (ScreenPriv->SWCursor)
+            (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
+        else if (ScreenPriv->isUp)
+            xf86MoveCursor(pScreen, x, y);
+    } else
+        (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
 }
 
 void
@@ -455,13 +451,6 @@ xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
     /* Init SW cursor */
     ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen);
 
-    if (pDev != inputInfo.pointer)
-    {
-	    ScreenPriv->spriteFuncs->SetCursor(inputInfo.pointer, pScreen,
-		    ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
-        ScreenPriv->SWCursor = TRUE | XF86_FORCE_SW_CURSOR;
-    }
-
     return ret;
 }
 
@@ -475,21 +464,7 @@ xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
     xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
             &pScreen->devPrivates, xf86CursorScreenKey);
 
-    for (it = inputInfo.devices; it; it = it->next)
-    {
-        if (it->isMaster && it != inputInfo.pointer && it !=
-                inputInfo.keyboard)
-            break;
-    }
-
-    if (!it) /* no other sprites except VCP. restore HW rendering */
-    {
-	ScreenPriv->SWCursor = TRUE;
-	xf86CursorSetCursor(inputInfo.pointer, pScreen,
-		ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
-    }
-
-    /* Clean up SW cursor */
+   /* Clean up SW cursor */
     (*ScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
 }
 
commit 48ba58feacedf9781db81c82adbb37197d9a5cd1
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri May 16 19:22:32 2008 +0930

    mi: remove miPointerUpdate() -> replaced by miPointerUpdateSprite().
    
    In the xnest and vfb DDX we don't need the call anyway, it's performed by
    mieqProcessInputEvent.

diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index 393698f..3b001ee 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -52,7 +52,6 @@ void
 ProcessInputEvents()
 {
     mieqProcessInputEvents();
-    miPointerUpdate();
 }
 
 void DDXRingBell(int volume, int pitch, int duration)
diff --git a/hw/xnest/Events.c b/hw/xnest/Events.c
index 02ff27b..f7a551c 100644
--- a/hw/xnest/Events.c
+++ b/hw/xnest/Events.c
@@ -49,7 +49,6 @@ void
 ProcessInputEvents()
 {
   mieqProcessInputEvents();
-  miPointerUpdate();
 }
 
 int
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 2c226dc..484947d 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -374,18 +374,12 @@ miPointerWarpCursor (pDev, pScreen, x, y)
  */
 
 /*
- * miPointerUpdate
+ * miPointerUpdateSprite
  *
  * Syncronize the sprite with the cursor - called from ProcessInputEvents
  */
 
 void
-miPointerUpdate ()
-{
-    miPointerUpdateSprite(inputInfo.pointer);
-}
-
-void
 miPointerUpdateSprite (DeviceIntPtr pDev)
 {
     ScreenPtr		pScreen;
diff --git a/mi/mipointer.h b/mi/mipointer.h
index 5cbf527..fccbfa0 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -122,11 +122,6 @@ extern int miPointerGetMotionEvents(
     ScreenPtr /*pScreen*/
 );
 
-/* Deprecated in favour of miPointerUpdateSprite. */
-extern void miPointerUpdate(
-    void
-) _X_DEPRECATED;
-
 /* Deprecated in favour of miSetPointerPosition. */
 extern void miPointerDeltaCursor(
     int /*dx*/,
commit 622d7c1d899a6146773a2ebd1d632a805f24025e
Author: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Date:   Wed May 14 14:49:09 2008 -0300

    Restructure and organize the code.
    
    It was removed and simplified some conditionals. We don't need test for
    pDev->isMaster inside xf86CursorSetCursor() because only MD enters there.
    
    In the last chunk, ScreenPriv fields were being assigned without need, so
    that code was wrapped inside the conditional to avoid it.
    
    I also tried to make the identation more sane in some parts that I touched.
    
    Signed-off-by: Tiago Vignatti <vignatti at c3sl.ufpr.br>
    
    Minor modification, part of the original patch led to cursors not being
    updated properly when controlled through XTest.
    
    Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>

diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index 2d69074..50f8fb7 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -299,43 +299,36 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
     xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
 	&pScreen->devPrivates, xf86CursorScreenKey);
     xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
-    miPointerScreenPtr PointPriv;
+    miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
+    &pScreen->devPrivates, miPointerScreenKey);
+
+
+    if (pCurs == NullCursor) {	/* means we're supposed to remove the cursor */
+        if (ScreenPriv->SWCursor)
+            (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
+                                                  x, y);
+        else if (ScreenPriv->isUp) {
+            xf86SetCursor(pScreen, NullCursor, x, y);
+            ScreenPriv->isUp = FALSE;
+	    }
+	    return;
+    }
 
     /* only update for VCP, otherwise we get cursor jumps when removing a
        sprite. The second cursor is never HW rendered anyway. */
-    if (pDev == inputInfo.pointer ||
-	    (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
+    if (pDev == inputInfo.pointer)
     {
 	ScreenPriv->CurrentCursor = pCurs;
 	ScreenPriv->x = x;
 	ScreenPriv->y = y;
 	ScreenPriv->CursorToRestore = NULL;
+	ScreenPriv->HotX = pCurs->bits->xhot;
+	ScreenPriv->HotY = pCurs->bits->yhot;
     }
 
     if (!infoPtr->pScrn->vtSema)
 	 ScreenPriv->SavedCursor = pCurs;
 
-    if (pCurs == NullCursor) {	/* means we're supposed to remove the cursor */
-	if (ScreenPriv->SWCursor)
-            (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
-                                                  x, y); 
-        else if
-                (ScreenPriv->isUp) {
-	    xf86SetCursor(pScreen, NullCursor, x, y);
-	    ScreenPriv->isUp = FALSE;
-	}
-	return;
-    }
-
-    if (pDev == inputInfo.pointer ||
-	    (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
-    {
-	ScreenPriv->HotX = pCurs->bits->xhot;
-	ScreenPriv->HotY = pCurs->bits->yhot;
-    }
-
-    PointPriv = (miPointerScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
-						     miPointerScreenKey);
     if (!(ScreenPriv->SWCursor & XF86_FORCE_SW_CURSOR))
     {
 	if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
@@ -346,18 +339,18 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 #endif
 			    (pCurs->bits->height <= infoPtr->MaxHeight) &&
 			    (pCurs->bits->width <= infoPtr->MaxWidth) &&
-			    (!infoPtr->UseHWCursor || (*infoPtr->UseHWCursor)(pScreen, pCurs))))))
+                            (!infoPtr->UseHWCursor || (*infoPtr->UseHWCursor)(pScreen, pCurs))))))
 	{
 
-	if (ScreenPriv->SWCursor)	/* remove the SW cursor */
-	  (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
+	    if (ScreenPriv->SWCursor)	/* remove the SW cursor */
+		(*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
 
-	xf86SetCursor(pScreen, pCurs, x, y);
-	ScreenPriv->SWCursor = FALSE;
-	ScreenPriv->isUp = TRUE;
-	PointPriv->waitForUpdate = !infoPtr->pScrn->silkenMouse;
-	return;
-  }
+	    xf86SetCursor(pScreen, pCurs, x, y);
+	    ScreenPriv->SWCursor = FALSE;
+	    ScreenPriv->isUp = TRUE;
+	    PointPriv->waitForUpdate = !infoPtr->pScrn->silkenMouse;
+	    return;
+	}
 
     }
 
commit 5af90025fee6a92e7d94642978feed21f902d0cb
Author: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Date:   Wed May 14 02:45:49 2008 -0300

    Remove redundancy.
    
    The only function that cat set SWCursor before xf86DeviceCursorInitialize()
    is xf86InitCursor() when VCP and is created.
    
    Signed-off-by: Tiago Vignatti <vignatti at c3sl.ufpr.br>
    Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>

diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index 4d64f62..2d69074 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -464,11 +464,8 @@ xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
 
     if (pDev != inputInfo.pointer)
     {
-	if (!ScreenPriv->SWCursor)
-	{
 	    ScreenPriv->spriteFuncs->SetCursor(inputInfo.pointer, pScreen,
 		    ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
-	}
         ScreenPriv->SWCursor = TRUE | XF86_FORCE_SW_CURSOR;
     }
 
commit 9fc94edfe3df4c4a84ad70714c0a4ef8bbf57fc9
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri May 16 16:59:34 2008 +0930

    Xext: fix typo in condition.
    
    Fall-out from dc3aba8a559d4304844ee1cc306c577a63b82762.
    We must free the event if it is NOT an extension event.

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 791f6a2..a42faa7 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -500,7 +500,7 @@ ProcXTestFakeInput(client)
         xfree(master_event);
     } else
         (*dev->public.processInputProc)(ev, dev, nev);
-    if (extension)
+    if (!extension)
         xfree(ev);
     return client->noClientException;
 }


More information about the xorg-commit mailing list