dri2: Track event mask in client code.
authorNick Bowler <nbowler@draconx.ca>
Wed, 14 Jul 2010 16:01:49 +0000 (12:01 -0400)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Wed, 14 Jul 2010 17:23:09 +0000 (10:23 -0700)
When direct rendering is being used, DRI2 BufferSwapComplete events are
sent unconditionally to clients, even if they haven't been requested.
This causes error messages to be printed by every freeglut application
of the form

  freeglut (./gears): Unknown X event type: 104

and might confuse other clients.

This is a fixed up version of the patch by Jesse Barnes, which drops
BufferSwapComplete events if they are not requested by clients.

Fixes fdo bug 27962.

Signed-off-by: Nick Bowler <nbowler@draconx.ca>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
src/glx/dri2.c
src/glx/glx_pbuffer.c
src/glx/glxclient.h

index e4ff53801a9c1b4aad3361866b9123da81f36ae7..dbf3420892b61c9cbf5d4c28df4053b691897848 100644 (file)
@@ -99,6 +99,12 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
    {
       GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event;
       xDRI2BufferSwapComplete *awire = (xDRI2BufferSwapComplete *)wire;
+      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, awire->drawable, NULL);
+
+      /* Ignore swap events if we're not looking for them */
+      if (!(pdraw->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK))
+        return False;
+
       aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire);
       aevent->type = glx_info->codes->first_event + GLX_BufferSwapComplete;
       aevent->send_event = (awire->type & 0x80) != 0;
index b8d0f21bf0620a9387d1dfe13944251744319c1f..c081836376dc57bc5e4c3c97bb01482ca5e692de 100644 (file)
@@ -86,8 +86,10 @@ ChangeDrawableAttribute(Display * dpy, GLXDrawable drawable,
                         const CARD32 * attribs, size_t num_attribs)
 {
    __GLXdisplayPrivate *priv = __glXInitialize(dpy);
+   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
    CARD32 *output;
    CARD8 opcode;
+   int i;
 
    if ((dpy == NULL) || (drawable == 0)) {
       return;
@@ -129,6 +131,15 @@ ChangeDrawableAttribute(Display * dpy, GLXDrawable drawable,
    UnlockDisplay(dpy);
    SyncHandle();
 
+   for (i = 0; i < num_attribs; i++) {
+      switch(attribs[i * 2]) {
+      case GLX_EVENT_MASK:
+        /* Keep a local copy for masking out DRI2 proto events as needed */
+        pdraw->eventMask = attribs[i * 2 + 1];
+        break;
+      }
+   }
+
    return;
 }
 
index b41073fb5dfad2f14697ac3aae08c24e8fd1a58d..49f31a16fecfd101ad1383583afc84f6b2fb9dd2 100644 (file)
@@ -176,6 +176,7 @@ struct __GLXDRIdrawableRec
    GLenum textureTarget;
    __DRIdrawable *driDrawable;
    GLenum textureFormat;        /* EXT_texture_from_pixmap support */
+   unsigned long eventMask;
 };
 
 /*