From 278a5c814387e64cb5b32fd0f16e3b89ffee9d69 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 24 Dec 2013 07:18:05 +0000 Subject: [PATCH] Revert "glx: Replace DRI2WaitForMSC custom protocol with XCB." This reverts commit 8e61b9028ad4f68c9d68fd781b6f44e1f6a266bd. Conflicts: src/glx/dri2_glx.c --- src/glx/dri2.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/glx/dri2.h | 4 ++++ src/glx/dri2_glx.c | 36 +++++++++++++++--------------------- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/src/glx/dri2.c b/src/glx/dri2.c index 277338d8628..616e6956f34 100644 --- a/src/glx/dri2.c +++ b/src/glx/dri2.c @@ -624,6 +624,52 @@ Bool DRI2GetMSC(Display *dpy, XID drawable, CARD64 *ust, CARD64 *msc, } #endif +#ifdef X_DRI2WaitMSC +static void +load_msc_req(xDRI2WaitMSCReq *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; +} + +Bool DRI2WaitMSC(Display *dpy, XID drawable, CARD64 target_msc, CARD64 divisor, + CARD64 remainder, CARD64 *ust, CARD64 *msc, CARD64 *sbc) +{ + XExtDisplayInfo *info = DRI2FindDisplay(dpy); + xDRI2WaitMSCReq *req; + xDRI2MSCReply rep; + + XextCheckExtension (dpy, info, dri2ExtensionName, False); + + LockDisplay(dpy); + GetReq(DRI2WaitMSC, req); + req->reqType = info->codes->major_opcode; + req->dri2ReqType = X_DRI2WaitMSC; + req->drawable = drawable; + load_msc_req(req, target_msc, divisor, remainder); + + if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { + UnlockDisplay(dpy); + SyncHandle(); + return False; + } + + *ust = ((CARD64)rep.ust_hi << 32) | (CARD64)rep.ust_lo; + *msc = ((CARD64)rep.msc_hi << 32) | (CARD64)rep.msc_lo; + *sbc = ((CARD64)rep.sbc_hi << 32) | (CARD64)rep.sbc_lo; + + UnlockDisplay(dpy); + SyncHandle(); + + return True; +} +#endif + #ifdef X_DRI2SwapInterval void DRI2SwapInterval(Display *dpy, XID drawable, int interval) { diff --git a/src/glx/dri2.h b/src/glx/dri2.h index dc5048364ae..e759cf15d9c 100644 --- a/src/glx/dri2.h +++ b/src/glx/dri2.h @@ -108,6 +108,10 @@ dri3_query_renderer_string(struct glx_screen *base, int attribute, extern Bool DRI2GetMSC(Display *dpy, XID drawable, CARD64 *ust, CARD64 *msc, CARD64 *sbc); +extern Bool +DRI2WaitMSC(Display *dpy, XID drawable, CARD64 target_msc, CARD64 divisor, + CARD64 remainder, CARD64 *ust, CARD64 *msc, CARD64 *sbc); + extern void DRI2SwapInterval(Display *dpy, XID drawable, int interval); diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 32a01344a62..aa1355a7998 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -456,32 +456,23 @@ dri2DrawableGetMSC(struct glx_screen *psc, __GLXDRIdrawable *pdraw, #endif + +#ifdef X_DRI2WaitMSC + static int dri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) { - xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); - xcb_dri2_wait_msc_cookie_t wait_msc_cookie; - xcb_dri2_wait_msc_reply_t *wait_msc_reply; - uint32_t target_msc_hi, target_msc_lo; - uint32_t divisor_hi, divisor_lo; - uint32_t remainder_hi, remainder_lo; - - split_counter(target_msc, &target_msc_hi, &target_msc_lo); - split_counter(divisor, &divisor_hi, &divisor_lo); - split_counter(remainder, &remainder_hi, &remainder_lo); - - wait_msc_cookie = xcb_dri2_wait_msc_unchecked(c, pdraw->xDrawable, - target_msc_hi, target_msc_lo, - divisor_hi, divisor_lo, - remainder_hi, remainder_lo); - wait_msc_reply = xcb_dri2_wait_msc_reply(c, wait_msc_cookie, NULL); - *ust = merge_counter(wait_msc_reply->ust_hi, wait_msc_reply->ust_lo); - *msc = merge_counter(wait_msc_reply->msc_hi, wait_msc_reply->msc_lo); - *sbc = merge_counter(wait_msc_reply->sbc_hi, wait_msc_reply->sbc_lo); - free(wait_msc_reply); + CARD64 dri2_ust, dri2_msc, dri2_sbc; + int ret; - return 0; + ret = DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, + remainder, &dri2_ust, &dri2_msc, &dri2_sbc); + *ust = dri2_ust; + *msc = dri2_msc; + *sbc = dri2_sbc; + + return ret; } static int @@ -505,6 +496,7 @@ dri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, return 0; } +#endif /* X_DRI2WaitMSC */ static __DRIcontext * dri2GetCurrentContext() @@ -1242,7 +1234,9 @@ dri2CreateScreen(int screen, struct glx_display * priv) #ifdef X_DRI2GetMSC psp->getDrawableMSC = dri2DrawableGetMSC; #endif +#ifdef X_DRI2WaitMSC psp->waitForMSC = dri2WaitForMSC; +#endif psp->waitForSBC = dri2WaitForSBC; #ifdef X_DRI2SwapInterval psp->setSwapInterval = dri2SetSwapInterval;