Yeah, that looks about right. This in combination with the latest version of "xserver/glx/dri2: use new GLX/DRI2 swap event types"
Reviewed-by: Jeremy Huddleston <jerem...@apple.com> On May 6, 2011, at 10:39, Jesse Barnes wrote: > 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 > > _______________________________________________ > xorg-de...@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev