[PATCH] RFC: refactor out dri2 proto code into libdri2

Rob Clark rob.clark at linaro.org
Thu Sep 22 13:36:07 PDT 2011


Since I was working on some extensions to DRI2 protocol for handling
video, it occurred to me that it might be easier to extend the
protocol if there weren't N different copies of dri2.c floating around
in various different src trees..  also, for video, with one or two
other small extensions (ie. standard way to mmap() GEM buffers), I
think it should eventually be possible for DRI2 to be directly used
by end applications (ie. for sw video decoders, etc).  So refactoring
this out into a shared library pretty much seemed like the right-
thing-to-do.

This patch updates mesa to remove two nearly identical copies of DRI2
protocol code.  The error, wire->event, and event->wire stuff is split
out into some callbacks, as this was really the only differences
between the two copies of dri2.c (and also, other than name changes,
the main difference between what is in mesa and vaapi).  Also, from
looking at the git history, it appears that these callbacks are the
main place where there have been any changes to this code in the last
couple years.

Temporary home for libdri2 tree is here:

  git://people.freedesktop.org/~robclark/libdri2

Eventually I can make patches for libva and libvdpau.. but I started
with mesa because that was something I actually had a way to test.
---
 bin/mklib                                       |    4 +-
 configure.ac                                    |    4 +-
 src/gallium/state_trackers/egl/x11/x11_screen.c |    3 +-
 src/gallium/winsys/g3dvl/dri/dri2.c             |  555 +----------------------
 src/glx/Makefile                                |    2 +-
 src/glx/dri2.c                                  |  562 +----------------------
 src/glx/dri2_glx.c                              |    3 +
 7 files changed, 29 insertions(+), 1104 deletions(-)

diff --git a/bin/mklib b/bin/mklib
index fd87aad..2ac4df9 100755
--- a/bin/mklib
+++ b/bin/mklib
@@ -344,7 +344,7 @@ case $ARCH in
 
             rm -f ${LIBNAME}
             # make lib
-            ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+            ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS} ${LDFLAGS}
             # finish up
             FINAL_LIBS="${LIBNAME}"
         elif [ $STATIC = 1 ] ; then
@@ -412,7 +412,7 @@ case $ARCH in
             rm -f ${LIBNAME}.so
 
             # make lib
-            ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
+            ${LINK} ${OPTS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS} ${LDFLAGS}
             # make usual symlinks
             ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
             ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
diff --git a/configure.ac b/configure.ac
index b2606bf..ab1aea0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -958,7 +958,7 @@ xyesno)
         if test "x$have_libdrm" != xyes; then
             AC_MSG_ERROR([Direct rendering requires libdrm >= $LIBDRM_REQUIRED])
         fi
-        PKG_CHECK_MODULES([DRI2PROTO], [dri2proto >= $DRI2PROTO_REQUIRED])
+        PKG_CHECK_MODULES([DRI2PROTO], [dri2proto >= $DRI2PROTO_REQUIRED dri2])
         GL_PC_REQ_PRIV="$GL_PC_REQ_PRIV libdrm >= $LIBDRM_REQUIRED dri2proto >= $DRI2PROTO_REQUIRED"
     fi
 
@@ -1227,7 +1227,7 @@ if test "x$enable_dri" = xyes; then
     fi
 
     # put all the necessary libs together, including possibly libdricore
-    DRI_LIB_DEPS="$DRI_LIB_DEPS $SELINUX_LIBS $LIBDRM_LIBS $EXPAT_LIB -lm -lpthread $DLOPEN_LIBS"
+    DRI_LIB_DEPS="$DRI_LIB_DEPS $DRI2PROTO_LIBS $SELINUX_LIBS $LIBDRM_LIBS $EXPAT_LIB -lm -lpthread $DLOPEN_LIBS"
 fi
 AC_SUBST([DRI_DIRS])
 AC_SUBST([EXPAT_INCLUDES])
diff --git a/src/gallium/state_trackers/egl/x11/x11_screen.c b/src/gallium/state_trackers/egl/x11/x11_screen.c
index 6155b4d..6579bb0 100644
--- a/src/gallium/state_trackers/egl/x11/x11_screen.c
+++ b/src/gallium/state_trackers/egl/x11/x11_screen.c
@@ -119,7 +119,8 @@ x11_screen_init_dri2(struct x11_screen *xscr)
    if (xscr->dri_major < 0) {
       int eventBase, errorBase;
 
-      if (!DRI2QueryExtension(xscr->dpy, &eventBase, &errorBase) ||
+      if (!DRI2Init(xscr->dpy) ||
+          !DRI2QueryExtension(xscr->dpy, &eventBase, &errorBase) ||
           !DRI2QueryVersion(xscr->dpy, &xscr->dri_major, &xscr->dri_minor))
          xscr->dri_major = -1;
    }
diff --git a/src/gallium/winsys/g3dvl/dri/dri2.c b/src/gallium/winsys/g3dvl/dri/dri2.c
index 12ed6d0..1822408 100644
--- a/src/gallium/winsys/g3dvl/dri/dri2.c
+++ b/src/gallium/winsys/g3dvl/dri/dri2.c
@@ -37,6 +37,7 @@
 #include <X11/extensions/Xext.h>
 #include <X11/extensions/extutil.h>
 #include <X11/extensions/dri2proto.h>
+#include <X11/extensions/dri2.h>
 #include "xf86drm.h"
 #include "dri2.h"
 #if 0
@@ -44,54 +45,12 @@
 #include "GL/glxext.h"
 #endif
 
-/* Allow the build to work with an older versions of dri2proto.h and
- * dri2tokens.h.
- */
-#if DRI2_MINOR < 1
-#undef DRI2_MINOR
-#define DRI2_MINOR 1
-#define X_DRI2GetBuffersWithFormat 7
-#endif
-
-
-static char dri2ExtensionName[] = DRI2_NAME;
-static XExtensionInfo *dri2Info;
-static XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
-
-static Bool
-DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire);
-static Status
-DRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire);
-
-static /* const */ XExtensionHooks dri2ExtensionHooks = {
-  NULL,                   /* create_gc */
-  NULL,                   /* copy_gc */
-  NULL,                   /* flush_gc */
-  NULL,                   /* free_gc */
-  NULL,                   /* create_font */
-  NULL,                   /* free_font */
-  DRI2CloseDisplay,       /* close_display */
-  DRI2WireToEvent,        /* wire_to_event */
-  DRI2EventToWire,        /* event_to_wire */
-  NULL,                   /* error */
-  NULL,                   /* error_string */
-};
-
-static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
-                                   dri2Info,
-                                   dri2ExtensionName,
-                                   &dri2ExtensionHooks,
-                                   0, NULL)
-
 static Bool
-DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
+DRI2WireToEvent(Display *dpy, XExtDisplayInfo *info, XEvent *event, xEvent *wire)
 {
 #if 0
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
    XExtDisplayInfo *glx_info = __glXFindDisplay(dpy);
 
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
    switch ((wire->u.u.type & 0x7f) - info->codes->first_event) {
 
 #ifdef X_DRI2SwapBuffers
@@ -146,12 +105,8 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
  * send each other DRI2 events.
  */
 static Status
-DRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire)
+DRI2EventToWire(Display *dpy, XExtDisplayInfo *info, XEvent *event, xEvent *wire)
 {
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
    switch (event->type) {
    default:
       /* client doesn't support server event */
@@ -161,506 +116,14 @@ DRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire)
    return Success;
 }
 
-Bool
-DRI2QueryExtension(Display * dpy, int *eventBase, int *errorBase)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-
-   if (XextHasExtension(info)) {
-      *eventBase = info->codes->first_event;
-      *errorBase = info->codes->first_error;
-      return True;
-   }
-
-   return False;
-}
-
-Bool
-DRI2QueryVersion(Display * dpy, int *major, int *minor)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2QueryVersionReply rep;
-   xDRI2QueryVersionReq *req;
-   int i, nevents;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2QueryVersion, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2QueryVersion;
-   req->majorVersion = DRI2_MAJOR;
-   req->minorVersion = DRI2_MINOR;
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-   *major = rep.majorVersion;
-   *minor = rep.minorVersion;
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   switch (rep.minorVersion) {
-   case 1:
-	   nevents = 0;
-	   break;
-   case 2:
-	   nevents = 1;
-	   break;
-   case 3:
-   default:
-	   nevents = 2;
-	   break;
-   }
-
-   for (i = 0; i < nevents; i++) {
-       XESetWireToEvent (dpy, info->codes->first_event + i, DRI2WireToEvent);
-       XESetEventToWire (dpy, info->codes->first_event + i, DRI2EventToWire);
-   }
-
-   return True;
-}
-
-Bool
-DRI2Connect(Display * dpy, XID window, char **driverName, char **deviceName)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2ConnectReply rep;
-   xDRI2ConnectReq *req;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2Connect, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2Connect;
-   req->window = window;
-   req->driverType = DRI2DriverDRI;
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-
-   if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-
-   *driverName = Xmalloc(rep.driverNameLength + 1);
-   if (*driverName == NULL) {
-      _XEatData(dpy,
-                ((rep.driverNameLength + 3) & ~3) +
-                ((rep.deviceNameLength + 3) & ~3));
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-   _XReadPad(dpy, *driverName, rep.driverNameLength);
-   (*driverName)[rep.driverNameLength] = '\0';
-
-   *deviceName = Xmalloc(rep.deviceNameLength + 1);
-   if (*deviceName == NULL) {
-      Xfree(*driverName);
-      _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-   _XReadPad(dpy, *deviceName, rep.deviceNameLength);
-   (*deviceName)[rep.deviceNameLength] = '\0';
-
-   UnlockDisplay(dpy);
-   SyncHandle();
 
-   return True;
-}
+static const DRI2EventOps ops = {
+		.WireToEvent = DRI2WireToEvent,
+		.EventToWire = DRI2EventToWire,
+};
 
 Bool
-DRI2Authenticate(Display * dpy, XID window, drm_magic_t magic)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2AuthenticateReq *req;
-   xDRI2AuthenticateReply rep;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2Authenticate, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2Authenticate;
-   req->window = window;
-   req->magic = magic;
-
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   return rep.authenticated;
-}
-
-void
-DRI2CreateDrawable(Display * dpy, XID drawable)
+DRI2Init(Display * dpy)
 {
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2CreateDrawableReq *req;
-
-   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
-   LockDisplay(dpy);
-   GetReq(DRI2CreateDrawable, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2CreateDrawable;
-   req->drawable = drawable;
-   UnlockDisplay(dpy);
-   SyncHandle();
+	return DRI2InitDisplay(dpy, &ops);
 }
-
-void
-DRI2DestroyDrawable(Display * dpy, XID drawable)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2DestroyDrawableReq *req;
-
-   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
-   XSync(dpy, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2DestroyDrawable, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2DestroyDrawable;
-   req->drawable = drawable;
-   UnlockDisplay(dpy);
-   SyncHandle();
-}
-
-DRI2Buffer *
-DRI2GetBuffers(Display * dpy, XID drawable,
-               int *width, int *height,
-               unsigned int *attachments, int count, int *outCount)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2GetBuffersReply rep;
-   xDRI2GetBuffersReq *req;
-   DRI2Buffer *buffers;
-   xDRI2Buffer repBuffer;
-   CARD32 *p;
-   int i;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReqExtra(DRI2GetBuffers, count * 4, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2GetBuffers;
-   req->drawable = drawable;
-   req->count = count;
-   p = (CARD32 *) & req[1];
-   for (i = 0; i < count; i++)
-      p[i] = attachments[i];
-
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   *width = rep.width;
-   *height = rep.height;
-   *outCount = rep.count;
-
-   buffers = Xmalloc(rep.count * sizeof buffers[0]);
-   if (buffers == NULL) {
-      _XEatData(dpy, rep.count * sizeof repBuffer);
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   for (i = 0; i < rep.count; i++) {
-      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
-      buffers[i].attachment = repBuffer.attachment;
-      buffers[i].name = repBuffer.name;
-      buffers[i].pitch = repBuffer.pitch;
-      buffers[i].cpp = repBuffer.cpp;
-      buffers[i].flags = repBuffer.flags;
-   }
-
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   return buffers;
-}
-
-
-DRI2Buffer *
-DRI2GetBuffersWithFormat(Display * dpy, XID drawable,
-                         int *width, int *height,
-                         unsigned int *attachments, int count, int *outCount)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2GetBuffersReply rep;
-   xDRI2GetBuffersReq *req;
-   DRI2Buffer *buffers;
-   xDRI2Buffer repBuffer;
-   CARD32 *p;
-   int i;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReqExtra(DRI2GetBuffers, count * (4 * 2), req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2GetBuffersWithFormat;
-   req->drawable = drawable;
-   req->count = count;
-   p = (CARD32 *) & req[1];
-   for (i = 0; i < (count * 2); i++)
-      p[i] = attachments[i];
-
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   *width = rep.width;
-   *height = rep.height;
-   *outCount = rep.count;
-
-   buffers = Xmalloc(rep.count * sizeof buffers[0]);
-   if (buffers == NULL) {
-      _XEatData(dpy, rep.count * sizeof repBuffer);
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   for (i = 0; i < rep.count; i++) {
-      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
-      buffers[i].attachment = repBuffer.attachment;
-      buffers[i].name = repBuffer.name;
-      buffers[i].pitch = repBuffer.pitch;
-      buffers[i].cpp = repBuffer.cpp;
-      buffers[i].flags = repBuffer.flags;
-   }
-
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   return buffers;
-}
-
-
-void
-DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
-               CARD32 dest, CARD32 src)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2CopyRegionReq *req;
-
-   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
-   LockDisplay(dpy);
-   GetReq(DRI2CopyRegion, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2CopyRegion;
-   req->drawable = drawable;
-   req->region = region;
-   req->dest = dest;
-   req->src = src;
-
-   UnlockDisplay(dpy);
-   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
-
-#ifdef X_DRI2GetMSC
-Bool DRI2GetMSC(Display *dpy, XID drawable, CARD64 *ust, CARD64 *msc,
-		CARD64 *sbc)
-{
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2GetMSCReq *req;
-    xDRI2MSCReply rep;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReq(DRI2GetMSC, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2GetMSC;
-    req->drawable = drawable;
-
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-	UnlockDisplay(dpy);
-	SyncHandle();
-	return False;
-    }
-
-    *ust = vals_to_card64(rep.ust_lo, rep.ust_hi);
-    *msc = vals_to_card64(rep.msc_lo, rep.msc_hi);
-    *sbc = vals_to_card64(rep.sbc_lo, rep.sbc_hi);
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return True;
-}
-#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_DRI2WaitSBC
-static void
-load_sbc_req(xDRI2WaitSBCReq *req, CARD64 target)
-{
-    req->target_sbc_hi = target >> 32;
-    req->target_sbc_lo = target & 0xffffffff;
-}
-
-Bool DRI2WaitSBC(Display *dpy, XID drawable, CARD64 target_sbc, CARD64 *ust,
-		 CARD64 *msc, CARD64 *sbc)
-{
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2WaitSBCReq *req;
-    xDRI2MSCReply rep;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReq(DRI2WaitSBC, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2WaitSBC;
-    req->drawable = drawable;
-    load_sbc_req(req, target_sbc);
-
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-	UnlockDisplay(dpy);
-	SyncHandle();
-	return False;
-    }
-
-    *ust = ((CARD64)rep.ust_hi << 32) | rep.ust_lo;
-    *msc = ((CARD64)rep.msc_hi << 32) | rep.msc_lo;
-    *sbc = ((CARD64)rep.sbc_hi << 32) | rep.sbc_lo;
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return True;
-}
-#endif
-
-#ifdef X_DRI2SwapInterval
-void DRI2SwapInterval(Display *dpy, XID drawable, int interval)
-{
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2SwapIntervalReq *req;
-
-    XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
-
-    LockDisplay(dpy);
-    GetReq(DRI2SwapInterval, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2SwapInterval;
-    req->drawable = drawable;
-    req->interval = interval;
-    UnlockDisplay(dpy);
-    SyncHandle();
-}
-#endif
diff --git a/src/glx/Makefile b/src/glx/Makefile
index dd96973..30022ec 100644
--- a/src/glx/Makefile
+++ b/src/glx/Makefile
@@ -82,7 +82,7 @@ default: depend $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)
 
 # Make libGL
 $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) $(GLAPI_LIB) Makefile
-	$(MKLIB) -o $(GL_LIB) -linker '$(CXX)' -ldflags '$(LDFLAGS)' \
+	$(MKLIB) -o $(GL_LIB) -linker '$(CXX)' -ldflags '$(LDFLAGS) $(DRI_LIB_DEPS)' \
 		-major 1 -minor 2 \
 		-cplusplus $(MKLIB_OPTIONS) \
 		-install $(TOP)/$(LIB_DIR) -id $(INSTALL_LIB_DIR)/lib$(GL_LIB).1.dylib \
diff --git a/src/glx/dri2.c b/src/glx/dri2.c
index b1b5013..3c713be 100644
--- a/src/glx/dri2.c
+++ b/src/glx/dri2.c
@@ -38,60 +38,17 @@
 #include <X11/extensions/Xext.h>
 #include <X11/extensions/extutil.h>
 #include <X11/extensions/dri2proto.h>
+#include <X11/extensions/dri2.h>
 #include "xf86drm.h"
 #include "dri2.h"
 #include "glxclient.h"
 #include "GL/glxext.h"
 
-/* Allow the build to work with an older versions of dri2proto.h and
- * dri2tokens.h.
- */
-#if DRI2_MINOR < 1
-#undef DRI2_MINOR
-#define DRI2_MINOR 1
-#define X_DRI2GetBuffersWithFormat 7
-#endif
-
-
-static char dri2ExtensionName[] = DRI2_NAME;
-static XExtensionInfo *dri2Info;
-static XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
-
-static Bool
-DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire);
-static Status
-DRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire);
-static int
-DRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code);
-
-static /* const */ XExtensionHooks dri2ExtensionHooks = {
-  NULL,                   /* create_gc */
-  NULL,                   /* copy_gc */
-  NULL,                   /* flush_gc */
-  NULL,                   /* free_gc */
-  NULL,                   /* create_font */
-  NULL,                   /* free_font */
-  DRI2CloseDisplay,       /* close_display */
-  DRI2WireToEvent,        /* wire_to_event */
-  DRI2EventToWire,        /* event_to_wire */
-  DRI2Error,              /* error */
-  NULL,                   /* error_string */
-};
-
-static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
-                                   dri2Info,
-                                   dri2ExtensionName,
-                                   &dri2ExtensionHooks,
-                                   0, NULL)
-
 static Bool
-DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
+DRI2WireToEvent(Display *dpy, XExtDisplayInfo *info, XEvent *event, xEvent *wire)
 {
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
    struct glx_drawable *glxDraw;
 
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
    switch ((wire->u.u.type & 0x7f) - info->codes->first_event) {
 
 #ifdef X_DRI2SwapBuffers
@@ -159,12 +116,8 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
  * send each other DRI2 events.
  */
 static Status
-DRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire)
+DRI2EventToWire(Display *dpy, XExtDisplayInfo *info, XEvent *event, xEvent *wire)
 {
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
    switch (event->type) {
    default:
       /* client doesn't support server event */
@@ -202,511 +155,16 @@ DRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code)
     return False;
 }
 
-Bool
-DRI2QueryExtension(Display * dpy, int *eventBase, int *errorBase)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-
-   if (XextHasExtension(info)) {
-      *eventBase = info->codes->first_event;
-      *errorBase = info->codes->first_error;
-      return True;
-   }
-
-   return False;
-}
-
-Bool
-DRI2QueryVersion(Display * dpy, int *major, int *minor)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2QueryVersionReply rep;
-   xDRI2QueryVersionReq *req;
-   int i, nevents;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2QueryVersion, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2QueryVersion;
-   req->majorVersion = DRI2_MAJOR;
-   req->minorVersion = DRI2_MINOR;
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-   *major = rep.majorVersion;
-   *minor = rep.minorVersion;
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   switch (rep.minorVersion) {
-   case 1:
-	   nevents = 0;
-	   break;
-   case 2:
-	   nevents = 1;
-	   break;
-   case 3:
-   default:
-	   nevents = 2;
-	   break;
-   }
-	
-   for (i = 0; i < nevents; i++) {
-       XESetWireToEvent (dpy, info->codes->first_event + i, DRI2WireToEvent);
-       XESetEventToWire (dpy, info->codes->first_event + i, DRI2EventToWire);
-   }
-
-   return True;
-}
-
-Bool
-DRI2Connect(Display * dpy, XID window, char **driverName, char **deviceName)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2ConnectReply rep;
-   xDRI2ConnectReq *req;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2Connect, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2Connect;
-   req->window = window;
-   req->driverType = DRI2DriverDRI;
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-
-   if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-
-   *driverName = Xmalloc(rep.driverNameLength + 1);
-   if (*driverName == NULL) {
-      _XEatData(dpy,
-                ((rep.driverNameLength + 3) & ~3) +
-                ((rep.deviceNameLength + 3) & ~3));
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-   _XReadPad(dpy, *driverName, rep.driverNameLength);
-   (*driverName)[rep.driverNameLength] = '\0';
-
-   *deviceName = Xmalloc(rep.deviceNameLength + 1);
-   if (*deviceName == NULL) {
-      Xfree(*driverName);
-      _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-   _XReadPad(dpy, *deviceName, rep.deviceNameLength);
-   (*deviceName)[rep.deviceNameLength] = '\0';
-
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   return True;
-}
+static const DRI2EventOps ops = {
+		.WireToEvent = DRI2WireToEvent,
+		.EventToWire = DRI2EventToWire,
+		.Error = DRI2Error,
+};
 
 Bool
-DRI2Authenticate(Display * dpy, XID window, drm_magic_t magic)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2AuthenticateReq *req;
-   xDRI2AuthenticateReply rep;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2Authenticate, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2Authenticate;
-   req->window = window;
-   req->magic = magic;
-
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return False;
-   }
-
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   return rep.authenticated;
-}
-
-void
-DRI2CreateDrawable(Display * dpy, XID drawable)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2CreateDrawableReq *req;
-
-   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
-   LockDisplay(dpy);
-   GetReq(DRI2CreateDrawable, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2CreateDrawable;
-   req->drawable = drawable;
-   UnlockDisplay(dpy);
-   SyncHandle();
-}
-
-void
-DRI2DestroyDrawable(Display * dpy, XID drawable)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2DestroyDrawableReq *req;
-
-   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
-   XSync(dpy, False);
-
-   LockDisplay(dpy);
-   GetReq(DRI2DestroyDrawable, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2DestroyDrawable;
-   req->drawable = drawable;
-   UnlockDisplay(dpy);
-   SyncHandle();
-}
-
-DRI2Buffer *
-DRI2GetBuffers(Display * dpy, XID drawable,
-               int *width, int *height,
-               unsigned int *attachments, int count, int *outCount)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2GetBuffersReply rep;
-   xDRI2GetBuffersReq *req;
-   DRI2Buffer *buffers;
-   xDRI2Buffer repBuffer;
-   CARD32 *p;
-   int i;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReqExtra(DRI2GetBuffers, count * 4, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2GetBuffers;
-   req->drawable = drawable;
-   req->count = count;
-   p = (CARD32 *) & req[1];
-   for (i = 0; i < count; i++)
-      p[i] = attachments[i];
-
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   *width = rep.width;
-   *height = rep.height;
-   *outCount = rep.count;
-
-   buffers = Xmalloc(rep.count * sizeof buffers[0]);
-   if (buffers == NULL) {
-      _XEatData(dpy, rep.count * sizeof repBuffer);
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   for (i = 0; i < rep.count; i++) {
-      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
-      buffers[i].attachment = repBuffer.attachment;
-      buffers[i].name = repBuffer.name;
-      buffers[i].pitch = repBuffer.pitch;
-      buffers[i].cpp = repBuffer.cpp;
-      buffers[i].flags = repBuffer.flags;
-   }
-
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   return buffers;
-}
-
-
-DRI2Buffer *
-DRI2GetBuffersWithFormat(Display * dpy, XID drawable,
-                         int *width, int *height,
-                         unsigned int *attachments, int count, int *outCount)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2GetBuffersReply rep;
-   xDRI2GetBuffersReq *req;
-   DRI2Buffer *buffers;
-   xDRI2Buffer repBuffer;
-   CARD32 *p;
-   int i;
-
-   XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
-   LockDisplay(dpy);
-   GetReqExtra(DRI2GetBuffers, count * (4 * 2), req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2GetBuffersWithFormat;
-   req->drawable = drawable;
-   req->count = count;
-   p = (CARD32 *) & req[1];
-   for (i = 0; i < (count * 2); i++)
-      p[i] = attachments[i];
-
-   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   *width = rep.width;
-   *height = rep.height;
-   *outCount = rep.count;
-
-   buffers = Xmalloc(rep.count * sizeof buffers[0]);
-   if (buffers == NULL) {
-      _XEatData(dpy, rep.count * sizeof repBuffer);
-      UnlockDisplay(dpy);
-      SyncHandle();
-      return NULL;
-   }
-
-   for (i = 0; i < rep.count; i++) {
-      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
-      buffers[i].attachment = repBuffer.attachment;
-      buffers[i].name = repBuffer.name;
-      buffers[i].pitch = repBuffer.pitch;
-      buffers[i].cpp = repBuffer.cpp;
-      buffers[i].flags = repBuffer.flags;
-   }
-
-   UnlockDisplay(dpy);
-   SyncHandle();
-
-   return buffers;
-}
-
-
-void
-DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
-               CARD32 dest, CARD32 src)
-{
-   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-   xDRI2CopyRegionReq *req;
-   xDRI2CopyRegionReply rep;
-
-   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
-   LockDisplay(dpy);
-   GetReq(DRI2CopyRegion, req);
-   req->reqType = info->codes->major_opcode;
-   req->dri2ReqType = X_DRI2CopyRegion;
-   req->drawable = drawable;
-   req->region = region;
-   req->dest = dest;
-   req->src = src;
-
-   _XReply(dpy, (xReply *) & rep, 0, xFalse);
-
-   UnlockDisplay(dpy);
-   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
-
-#ifdef X_DRI2GetMSC
-Bool DRI2GetMSC(Display *dpy, XID drawable, CARD64 *ust, CARD64 *msc,
-		CARD64 *sbc)
-{
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2GetMSCReq *req;
-    xDRI2MSCReply rep;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReq(DRI2GetMSC, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2GetMSC;
-    req->drawable = drawable;
-
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-	UnlockDisplay(dpy);
-	SyncHandle();
-	return False;
-    }
-
-    *ust = vals_to_card64(rep.ust_lo, rep.ust_hi);
-    *msc = vals_to_card64(rep.msc_lo, rep.msc_hi);
-    *sbc = vals_to_card64(rep.sbc_lo, rep.sbc_hi);
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return True;
-}
-#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)
+DRI2Init(Display * dpy)
 {
-    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;
+	return DRI2InitDisplay(dpy, &ops);
 }
-#endif
-
-#ifdef X_DRI2WaitSBC
-static void
-load_sbc_req(xDRI2WaitSBCReq *req, CARD64 target)
-{
-    req->target_sbc_hi = target >> 32;
-    req->target_sbc_lo = target & 0xffffffff;
-}
-
-Bool DRI2WaitSBC(Display *dpy, XID drawable, CARD64 target_sbc, CARD64 *ust,
-		 CARD64 *msc, CARD64 *sbc)
-{
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2WaitSBCReq *req;
-    xDRI2MSCReply rep;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReq(DRI2WaitSBC, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2WaitSBC;
-    req->drawable = drawable;
-    load_sbc_req(req, target_sbc);
-
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-	UnlockDisplay(dpy);
-	SyncHandle();
-	return False;
-    }
-
-    *ust = ((CARD64)rep.ust_hi << 32) | rep.ust_lo;
-    *msc = ((CARD64)rep.msc_hi << 32) | rep.msc_lo;
-    *sbc = ((CARD64)rep.sbc_hi << 32) | rep.sbc_lo;
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return True;
-}
-#endif
-
-#ifdef X_DRI2SwapInterval
-void DRI2SwapInterval(Display *dpy, XID drawable, int interval)
-{
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2SwapIntervalReq *req;
-
-    XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
-
-    LockDisplay(dpy);
-    GetReq(DRI2SwapInterval, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2SwapInterval;
-    req->drawable = drawable;
-    req->interval = interval;
-    UnlockDisplay(dpy);
-    SyncHandle();
-}
-#endif
 
 #endif /* GLX_DIRECT_RENDERING */
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index 01e3fd6..9c50081 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -994,6 +994,9 @@ dri2CreateDisplay(Display * dpy)
    struct dri2_display *pdp;
    int eventBase, errorBase, i;
 
+   if (!DRI2Init(dpy))
+	   return NULL;
+
    if (!DRI2QueryExtension(dpy, &eventBase, &errorBase))
       return NULL;
 
-- 
1.7.5.4



More information about the xorg-devel mailing list