On Fri, 06 May 2011 09:25:35 +0200 Michel Dänzer <mic...@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 <jbar...@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 <jbar...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev