[PATCH] xserver/glx/dri2: use new GLX/DRI2 swap event types

Jesse Barnes jbarnes at virtuousgeek.org
Fri May 6 10:39:39 PDT 2011


On Fri, 06 May 2011 09:25:35 +0200
Michel Dänzer <michel at daenzer.net> wrote:

> On Don, 2011-05-05 at 14:02 -0700, Jesse Barnes wrote: 
> > > >    if (swap_complete) {
> > > >        if (pPriv->swap_count > 0xffffffff)
> > > >            ErrorF("something appropriate");
> > > >        swap_complete(client, swap_data, type, ust, frame, (CARD32)pPriv->swap_count);
> > > >    }
> > > 
> > > Yeah, it's annoying.  How about I leave out the error message and handle
> > > wrapping on the client side instead?  That way at least the client code
> > > won't notice that the server is only transmitting 32 bits...
> > 
> > Nevermind, that can't work generally since clients are free to
> > mask/unmask the events, so we could miss a 0 count and thus a wrap.
> 
> Missing 0 isn't a problem, you can assume there's been a wraparound
> whenever the current value is smaller than the previous one. This would
> only fail if the client misses several wraparounds, in which case
> apparently it doesn't care all that much in the first place. :)
> 
> Please do this.

How does this look for the direct case?  The indirect case is a little
more complicated since I need to add a new glx_drawable type and track
it (Kristian says this should help clean up some of the Apple mess as
well).  This patch handles at least one wrap correctly (I set the
server's starting swap_count at 0xfffffff0 and then ran the
glx-swap-event test in piglit; wrapping worked ok).

-- 
Jesse Barnes, Intel Open Source Technology Center

From f1e288f61e10b71018600a24ca0bdda93f8481db Mon Sep 17 00:00:00 2001
From: Jesse Barnes <jbarnes at virtuousgeek.org>
Date: Fri, 6 May 2011 10:31:24 -0700
Subject: [PATCH] DRI2: handle swap event swap count wrapping

Add a wrap counter to the DRI drawable and track it as we receive events.
This allows us to support the full 64 bits of the event structure we
pass to the client even though the server only gives us a 32 bit count.

Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
---
 src/glx/dri2.c      |   12 +++++++++++-
 src/glx/dri2_glx.c  |    2 ++
 src/glx/glxclient.h |    2 ++
 3 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/src/glx/dri2.c b/src/glx/dri2.c
index 8654a37..08ceec0 100644
--- a/src/glx/dri2.c
+++ b/src/glx/dri2.c
@@ -88,6 +88,7 @@ static Bool
 DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
 {
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   __GLXDRIdrawable *pdraw;
 
    XextCheckExtension(dpy, info, dri2ExtensionName, False);
 
@@ -124,7 +125,16 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
       }
       aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo;
       aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo;
-      aevent->sbc = awire->sbc;
+
+      pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, awire->drawable);
+      if (!pdraw)
+	 return False;
+
+      if (awire->sbc < pdraw->lastEventSbc)
+	 pdraw->eventSbcWrap += 0x100000000;
+      pdraw->lastEventSbc = awire->sbc;
+      aevent->sbc = awire->sbc + pdraw->eventSbcWrap;
+
       return True;
    }
 #endif
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index fc0237a..421f543 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -258,6 +258,8 @@ dri2CreateDrawable(struct glx_screen *base, XID xDrawable,
    pdraw->base.xDrawable = xDrawable;
    pdraw->base.drawable = drawable;
    pdraw->base.psc = &psc->base;
+   pdraw->base.lastEventSbc = 0;
+   pdraw->base.eventSbcWrap = 0;
    pdraw->bufferCount = 0;
    pdraw->swap_interval = 1; /* default may be overridden below */
    pdraw->have_back = 0;
diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index 2b6966f..1eb2483 100644
--- a/src/glx/glxclient.h
+++ b/src/glx/glxclient.h
@@ -138,6 +138,8 @@ struct __GLXDRIdrawableRec
    GLenum textureTarget;
    GLenum textureFormat;        /* EXT_texture_from_pixmap support */
    unsigned long eventMask;
+   uint32_t lastEventSbc;
+   int64_t eventSbcWrap;
 };
 
 /*
-- 
1.7.4.1



More information about the xorg-devel mailing list