[Mesa-dev] [PATCH] glx: More hacking around versions of XCB that lack GLX_ARB_create_context support

Ian Romanick idr at freedesktop.org
Tue Jan 3 12:32:34 PST 2012


From: Ian Romanick <ian.d.romanick at intel.com>

Detect whether a new enough version of XCB is installed at configure
time.  If it is not, don't enable the extension and don't build the
unit tests.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
Using this patch, I was able to successfully build and run both with
and without updated XCB bits installed.  I think the lesson learned
here is that it's nonsense for the GLX part of XCB to live in the XCB
library.  There's only one user, so it should live there.  Seriously.

 configure.ac             |   19 +++++++++++++++++++
 src/glx/clientinfo.c     |    5 ++++-
 src/glx/create_context.c |    2 +-
 src/glx/glxextensions.c  |    4 ++--
 tests/glx/Makefile.am    |    4 +++-
 5 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index e526d17..7517697 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1030,6 +1030,25 @@ xyesno)
         GL_LIB_DEPS="$GL_LIB_DEPS $XCB_LIBS"
     fi
 
+    # Check to see if the xcb-glx library is new enough to support
+    # GLX_ARB_create_context.  This bit of hackery is necessary until XCB 1.8
+    # is released.
+    save_CPPFLAGS="$CPPFLAGS"
+    save_LDFLAGS="$LDFLAGS"
+    CPPFLAGS="$CPPFLAGS $X11_INCLUDES"
+    LDFLAGS="$LDFLAGS $GL_LIB_DEPS"
+    AC_CHECK_LIB(xcb-glx, xcb_glx_create_context_attribs_arb_checked,
+        [HAVE_XCB_GLX_CREATE_CONTEXT=yes],
+        [HAVE_XCB_GLX_CREATE_CONTEXT=no])
+    AM_CONDITIONAL(HAVE_XCB_GLX_CREATE_CONTEXT,
+        test x$HAVE_XCB_GLX_CREATE_CONTEXT = xyes)
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+
+    if test x$HAVE_XCB_GLX_CREATE_CONTEXT = xyes; then
+        X11_INCLUDES="$X11_INCLUDES -DHAVE_XCB_GLX_CREATE_CONTEXT"
+    fi
+
     # need DRM libs, -lpthread, etc.
     GL_LIB_DEPS="$GL_LIB_DEPS $LIBDRM_LIBS -lm -lpthread $DLOPEN_LIBS"
     GL_PC_LIB_PRIV="-lm -lpthread $DLOPEN_LIBS"
diff --git a/src/glx/clientinfo.c b/src/glx/clientinfo.c
index 429e9a3..461030f 100644
--- a/src/glx/clientinfo.c
+++ b/src/glx/clientinfo.c
@@ -123,6 +123,7 @@ __glX_send_client_info(struct glx_display *glx_dpy)
     * THE ORDER IS IMPORTANT.  We want to send the most recent version of the
     * protocol that the server can support.
     */
+#ifdef HAVE_XCB_GLX_CREATE_CONTEXT
    if (glx_dpy->majorVersion == 1 && glx_dpy->minorVersion == 4
        && any_screen_has_ARB_create_context_profile) {
       xcb_glx_set_client_info_2arb(c,
@@ -145,7 +146,9 @@ __glX_send_client_info(struct glx_display *glx_dpy)
 				  gl_versions,
 				  gl_extension_string,
 				  glx_extensions);
-   } else {
+   } else
+#endif
+   {
       xcb_glx_client_info(c,
 			  GLX_MAJOR_VERSION, GLX_MINOR_VERSION,
 			  gl_extension_length,
diff --git a/src/glx/create_context.c b/src/glx/create_context.c
index 11f9340..714f0e5 100644
--- a/src/glx/create_context.c
+++ b/src/glx/create_context.c
@@ -94,7 +94,7 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config,
     * the protocol error and handle it.  Part of handling the error is freeing
     * the possibly non-NULL value returned by this function.
     */
-#ifdef XCB_GLX_CREATE_CONTEXT_ATTRIBS_ARB
+#ifdef HAVE_XCB_GLX_CREATE_CONTEXT
    cookie =
       xcb_glx_create_context_attribs_arb_checked(c,
 						 gc->xid,
diff --git a/src/glx/glxextensions.c b/src/glx/glxextensions.c
index 0fcd8a9..86dc7d0 100644
--- a/src/glx/glxextensions.c
+++ b/src/glx/glxextensions.c
@@ -71,7 +71,7 @@ struct extension_info
 
 /* *INDENT-OFF* */
 static const struct extension_info known_glx_extensions[] = {
-#ifdef XCB_GLX_CREATE_CONTEXT_ATTRIBS_ARB
+#ifdef HAVE_XCB_GLX_CREATE_CONTEXT
    { GLX(ARB_create_context),          VER(0,0), Y, N, N, N },
    { GLX(ARB_create_context_profile),  VER(0,0), Y, N, N, N },
 #else
@@ -85,7 +85,7 @@ static const struct extension_info known_glx_extensions[] = {
    { GLX(EXT_visual_info),             VER(0,0), Y, Y, N, N },
    { GLX(EXT_visual_rating),           VER(0,0), Y, Y, N, N },
    { GLX(EXT_framebuffer_sRGB),        VER(0,0), Y, Y, N, N },
-#ifdef XCB_GLX_CREATE_CONTEXT_ATTRIBS_ARB
+#ifdef HAVE_XCB_GLX_CREATE_CONTEXT
    { GLX(EXT_create_context_es2_profile), VER(0,0), Y, N, N, Y },
 #else
    { GLX(EXT_create_context_es2_profile), VER(0,0), N, N, N, N },
diff --git a/tests/glx/Makefile.am b/tests/glx/Makefile.am
index 0b06117..cdebf5d 100644
--- a/tests/glx/Makefile.am
+++ b/tests/glx/Makefile.am
@@ -4,6 +4,7 @@ AM_CXXFLAGS = -I$(top_builddir)/src/glx -I$(top_builddir)/src/mapi \
 	$(X11_CFLAGS) $(GTEST_CFLAGS)
 
 if HAVE_GTEST
+if HAVE_XCB_GLX_CREATE_CONTEXT
 TESTS = glx_unittest
 check_PROGRAMS = glx_unittest
 
@@ -13,4 +14,5 @@ glx_unittest_SOURCES =			\
         fake_glx_screen.cpp
 
 glx_unittest_LDADD = $(top_builddir)/src/glx/libglx.a $(GTEST_LIBS) -lgtest_main
-endif
\ No newline at end of file
+endif
+endif
-- 
1.7.6.4



More information about the mesa-dev mailing list