diff options
-rw-r--r-- | src/glx/dri2.c | 44 | ||||
-rw-r--r-- | src/glx/dri2.h | 4 | ||||
-rw-r--r-- | src/glx/dri2_glx.c | 35 |
3 files changed, 31 insertions, 52 deletions
diff --git a/src/glx/dri2.c b/src/glx/dri2.c index c77ef7b7142..bcd1f9c9011 100644 --- a/src/glx/dri2.c +++ b/src/glx/dri2.c @@ -541,48 +541,4 @@ DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region, SyncHandle(); } -#ifdef X_DRI2SwapBuffers -static void -load_swap_req(xDRI2SwapBuffersReq *req, CARD64 target, CARD64 divisor, - CARD64 remainder) -{ - req->target_msc_hi = target >> 32; - req->target_msc_lo = target & 0xffffffff; - req->divisor_hi = divisor >> 32; - req->divisor_lo = divisor & 0xffffffff; - req->remainder_hi = remainder >> 32; - req->remainder_lo = remainder & 0xffffffff; -} - -static CARD64 -vals_to_card64(CARD32 lo, CARD32 hi) -{ - return (CARD64)hi << 32 | lo; -} - -void DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc, - CARD64 divisor, CARD64 remainder, CARD64 *count) -{ - XExtDisplayInfo *info = DRI2FindDisplay(dpy); - xDRI2SwapBuffersReq *req; - xDRI2SwapBuffersReply rep; - - XextSimpleCheckExtension (dpy, info, dri2ExtensionName); - - LockDisplay(dpy); - GetReq(DRI2SwapBuffers, req); - req->reqType = info->codes->major_opcode; - req->dri2ReqType = X_DRI2SwapBuffers; - req->drawable = drawable; - load_swap_req(req, target_msc, divisor, remainder); - - _XReply(dpy, (xReply *)&rep, 0, xFalse); - - *count = vals_to_card64(rep.swap_lo, rep.swap_hi); - - UnlockDisplay(dpy); - SyncHandle(); -} -#endif - #endif /* GLX_DIRECT_RENDERING */ diff --git a/src/glx/dri2.h b/src/glx/dri2.h index 179e8f91cc6..a6fe66e136d 100644 --- a/src/glx/dri2.h +++ b/src/glx/dri2.h @@ -85,8 +85,4 @@ DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region, CARD32 dest, CARD32 src); -extern void -DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc, CARD64 divisor, - CARD64 remainder, CARD64 *count); - #endif diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 49a2179bbf0..ee07e606010 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -737,7 +737,13 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, __dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height, __DRI2_THROTTLE_SWAPBUFFER); } else { -#ifdef X_DRI2SwapBuffers + xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); + xcb_dri2_swap_buffers_cookie_t swap_buffers_cookie; + xcb_dri2_swap_buffers_reply_t *swap_buffers_reply; + uint32_t target_msc_hi, target_msc_lo; + uint32_t divisor_hi, divisor_lo; + uint32_t remainder_hi, remainder_lo; + if (psc->f) { struct glx_context *gc = __glXGetCurrentContext(); @@ -748,9 +754,30 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, dri2Throttle(psc, priv, __DRI2_THROTTLE_SWAPBUFFER); - DRI2SwapBuffers(psc->base.dpy, pdraw->xDrawable, - target_msc, divisor, remainder, &ret); -#endif + split_counter(target_msc, &target_msc_hi, &target_msc_lo); + split_counter(divisor, &divisor_hi, &divisor_lo); + split_counter(remainder, &remainder_hi, &remainder_lo); + + swap_buffers_cookie = + xcb_dri2_swap_buffers_unchecked(c, pdraw->xDrawable, + target_msc_hi, target_msc_lo, + divisor_hi, divisor_lo, + remainder_hi, remainder_lo); + /* Immediately wait on the swapbuffers reply. If we didn't, we'd have + * to do so some time before reusing a (non-pageflipped) backbuffer. + * Otherwise, the new rendering could get ahead of the X Server's + * dispatch of the swapbuffer and you'd display garbage. + * + * We use XSync() first to reap the invalidate events through the event + * filter, to ensure that the next drawing doesn't use an invalidated + * buffer. + */ + XSync(pdraw->psc->dpy, False); + swap_buffers_reply = + xcb_dri2_swap_buffers_reply(c, swap_buffers_cookie, NULL); + ret = merge_counter(swap_buffers_reply->swap_hi, + swap_buffers_reply->swap_lo); + free(swap_buffers_reply); } if (psc->show_fps) { |