xserver: Branch 'master' - 3 commits

Keith Packard keithp at kemper.freedesktop.org
Wed Aug 10 08:25:50 PDT 2011


 dix/events.c    |  105 ++++++++++++++++++++++++++++++++++----------------------
 exa/exa_mixed.c |   23 ++++++------
 2 files changed, 77 insertions(+), 51 deletions(-)

New commits:
commit 99eeb211c73d28a60f9024f42cf9f9e45b8b0c3d
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Aug 10 11:36:16 2011 +0200

    EXA/mixed: Update sys_pitch in MPH even when there's no system memory copy.
    
    Otherwise sys_pitch will be stale when a system memory copy is allocated.
    
    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=38322 and a crash when
    unlocking the screen with xscreensaver, reported by Janne Huttunen.
    
    Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
    Tested-by: Janne Huttunen <jahuttun at gmail.com>
    Tested-by: Jan Kriho <Erbureth at gmail.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
index 58645ae..0b1a4a4 100644
--- a/exa/exa_mixed.c
+++ b/exa/exa_mixed.c
@@ -186,17 +186,20 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
         }
 
 	/* Need to re-create system copy if there's also a GPU copy */
-	if (has_gpu_copy && pExaPixmap->sys_ptr) {
-	    free(pExaPixmap->sys_ptr);
-	    pExaPixmap->sys_ptr = NULL;
-	    pExaPixmap->sys_pitch = PixmapBytePad(width, depth);
-	    DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
-	    DamageDestroy(pExaPixmap->pDamage);
-	    pExaPixmap->pDamage = NULL;
-	    RegionEmpty(&pExaPixmap->validSys);
+	if (has_gpu_copy) {
+	    if (pExaPixmap->sys_ptr) {
+		free(pExaPixmap->sys_ptr);
+		pExaPixmap->sys_ptr = NULL;
+		DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
+		DamageDestroy(pExaPixmap->pDamage);
+		pExaPixmap->pDamage = NULL;
+		RegionEmpty(&pExaPixmap->validSys);
 
-	    if (pExaScr->deferred_mixed_pixmap == pPixmap)
-		pExaScr->deferred_mixed_pixmap = NULL;
+		if (pExaScr->deferred_mixed_pixmap == pPixmap)
+		    pExaScr->deferred_mixed_pixmap = NULL;
+	    }
+
+	    pExaPixmap->sys_pitch = PixmapBytePad(width, depth);
 	}
     }
 
commit 74793f4c6d4ceb5675f5de18c9774ecc5f5a32b7
Author: Keith Packard <keithp at keithp.com>
Date:   Tue Aug 9 20:45:52 2011 -0700

    dix: Eliminate event conversions in EventIsDeliverable
    
    The only need for the event was to compute the filter, and that can be
    computed directly from the event type instead of converting the event
    into the wire format and passing it to GetEventFilter.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/dix/events.c b/dix/events.c
index a9913a7..43f0cfb 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -408,6 +408,24 @@ static const Mask default_filter[128] =
 	CantBeFiltered		       /* MappingNotify */
 };
 
+static inline Mask
+GetEventFilterMask(DeviceIntPtr dev, int evtype)
+{
+    return filters[dev ? dev->id : 0][evtype];
+}
+
+static inline Mask
+GetXI2EventFilterMask(int evtype)
+{
+    return (1 << (evtype % 8));
+}
+
+static inline int
+GetXI2EventFilterOffset(int evtype)
+{
+    return (evtype / 8);
+}
+
 /**
  * For the given event, return the matching event filter. This filter may then
  * be AND'ed with the selected event mask.
@@ -429,9 +447,9 @@ GetEventFilter(DeviceIntPtr dev, xEvent *event)
     int evtype = 0;
 
     if (event->u.u.type != GenericEvent)
-        return filters[dev ? dev->id : 0][event->u.u.type];
+        return GetEventFilterMask(dev, event->u.u.type);
     else if ((evtype = xi2_get_type(event)))
-        return (1 << (evtype % 8));
+        return GetXI2EventFilterMask(evtype);
     ErrorF("[dix] Unknown event type %d. No filter\n", event->u.u.type);
     return 0;
 }
@@ -465,7 +483,7 @@ GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
     /* XI2 filters are only ever 8 bit, so let's return a 8 bit mask */
     if ((evtype = xi2_get_type(event)))
     {
-        int byte = evtype / 8;
+        int byte = GetXI2EventFilterOffset(evtype);
         return (other->xi2mask[dev->id][byte] |
                 other->xi2mask[XIAllDevices][byte] |
                 (IsMaster(dev)? other->xi2mask[XIAllMasterDevices][byte] : 0));
@@ -2478,26 +2496,22 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     int filter = 0;
     int type;
     OtherInputMasks *inputMasks = wOtherInputMasks(win);
-    xEvent *ev = NULL;
-    int count;
 
-    if (EventToXI2(event, &ev) == Success)
+    if ((type = GetXI2Type(event)) != 0)
     {
-        type = GetXI2Type(event);
-        filter = GetEventFilter(dev, ev);
+	int byte = GetXI2EventFilterOffset(type);
+        filter = GetXI2EventFilterMask(type);
+
         if (type && inputMasks &&
-            ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
-            ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && IsMaster(dev)) ||
-            (inputMasks->xi2mask[dev->id][type/8] & filter)))
+            ((inputMasks->xi2mask[XIAllDevices][byte] & filter) ||
+            ((inputMasks->xi2mask[XIAllMasterDevices][byte] & filter) && IsMaster(dev)) ||
+            (inputMasks->xi2mask[dev->id][byte] & filter)))
             rc |= EVENT_XI2_MASK;
-        free(ev);
-        ev = NULL;
     }
 
-    if (EventToXI(event, &ev, &count) == Success)
+    if ((type = GetXIType(event)) != 0)
     {
-        type = GetXIType(event);
-        filter = GetEventFilter(dev, ev);
+        filter = GetEventFilterMask(dev, type);
 
         /* Check for XI mask */
         if (type && inputMasks &&
@@ -2510,14 +2524,11 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
                 (inputMasks->dontPropagateMask[dev->id] & filter))
             rc |= EVENT_DONT_PROPAGATE_MASK;
 
-        free(ev);
-        ev = NULL;
     }
 
-    if (EventToCore(event, &ev, &count) == Success)
+    if ((type = GetCoreType(event)) != 0)
     {
-        type = GetCoreType(event);
-        filter = GetEventFilter(dev, ev);
+        filter = GetEventFilterMask(dev, type);
 
         /* Check for core mask */
         if (type && (win->deliverableEvents & filter) &&
@@ -2527,8 +2538,6 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
         /* Check for core DontPropagate mask */
         if (type && (filter & wDontPropagateMask(win)))
             rc |= EVENT_DONT_PROPAGATE_MASK;
-        free(ev);
-        ev = NULL;
     }
 
     return rc;
commit 0276b29cb06bc6ca54198f78e55dc4c0361da89e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Aug 10 12:56:32 2011 +1000

    dix: Use event conversion routines in EventIsDeliverable
    
    Proximity events don't have an XI2 type and caused error messages in the
    log when trying to get the event filter. Use this opportunity to clean up
    the code, instead of manually setting the fields that GetEventFilter
    requires use EventTo(XI2|XI|Core) instead.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/dix/events.c b/dix/events.c
index 8a4c6b9..a9913a7 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2478,44 +2478,58 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     int filter = 0;
     int type;
     OtherInputMasks *inputMasks = wOtherInputMasks(win);
-    xEvent ev;
-
-    /* XXX: this makes me gag */
-    type = GetXI2Type(event);
-    ev.u.u.type = GenericEvent; /* GetEventFilter only cares about type and evtype*/
-    ((xGenericEvent*)&ev)->extension = IReqCode;
-    ((xGenericEvent*)&ev)->evtype = type;
-    filter = GetEventFilter(dev, &ev);
-    if (type && inputMasks &&
-        ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
-         ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && IsMaster(dev)) ||
-         (inputMasks->xi2mask[dev->id][type/8] & filter)))
-        rc |= EVENT_XI2_MASK;
-
-    type = GetXIType(event);
-    ev.u.u.type = type;
-    filter = GetEventFilter(dev, &ev);
-
-    /* Check for XI mask */
-    if (type && inputMasks &&
-        (inputMasks->deliverableEvents[dev->id] & filter) &&
-        (inputMasks->inputEvents[dev->id] & filter))
-        rc |= EVENT_XI1_MASK;
-
-    /* Check for XI DontPropagate mask */
-    if (type && inputMasks &&
-        (inputMasks->dontPropagateMask[dev->id] & filter))
-        rc |= EVENT_DONT_PROPAGATE_MASK;
-
-    /* Check for core mask */
-    type = GetCoreType(event);
-    if (type && (win->deliverableEvents & filter) &&
-        ((wOtherEventMasks(win) | win->eventMask) & filter))
-        rc |= EVENT_CORE_MASK;
-
-    /* Check for core DontPropagate mask */
-    if (type && (filter & wDontPropagateMask(win)))
-        rc |= EVENT_DONT_PROPAGATE_MASK;
+    xEvent *ev = NULL;
+    int count;
+
+    if (EventToXI2(event, &ev) == Success)
+    {
+        type = GetXI2Type(event);
+        filter = GetEventFilter(dev, ev);
+        if (type && inputMasks &&
+            ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
+            ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && IsMaster(dev)) ||
+            (inputMasks->xi2mask[dev->id][type/8] & filter)))
+            rc |= EVENT_XI2_MASK;
+        free(ev);
+        ev = NULL;
+    }
+
+    if (EventToXI(event, &ev, &count) == Success)
+    {
+        type = GetXIType(event);
+        filter = GetEventFilter(dev, ev);
+
+        /* Check for XI mask */
+        if (type && inputMasks &&
+                (inputMasks->deliverableEvents[dev->id] & filter) &&
+                (inputMasks->inputEvents[dev->id] & filter))
+            rc |= EVENT_XI1_MASK;
+
+        /* Check for XI DontPropagate mask */
+        if (type && inputMasks &&
+                (inputMasks->dontPropagateMask[dev->id] & filter))
+            rc |= EVENT_DONT_PROPAGATE_MASK;
+
+        free(ev);
+        ev = NULL;
+    }
+
+    if (EventToCore(event, &ev, &count) == Success)
+    {
+        type = GetCoreType(event);
+        filter = GetEventFilter(dev, ev);
+
+        /* Check for core mask */
+        if (type && (win->deliverableEvents & filter) &&
+                ((wOtherEventMasks(win) | win->eventMask) & filter))
+            rc |= EVENT_CORE_MASK;
+
+        /* Check for core DontPropagate mask */
+        if (type && (filter & wDontPropagateMask(win)))
+            rc |= EVENT_DONT_PROPAGATE_MASK;
+        free(ev);
+        ev = NULL;
+    }
 
     return rc;
 }


More information about the xorg-commit mailing list