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

Ian Romanick idr at freedesktop.org
Wed Jan 4 10:37: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.

v2: Move the AM_CONDIATION outside the case-statement so that it is
invoked even for non-GLX builds.  This prevents build failures with
osmesa, for example.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 configure.ac             |   22 ++++++++++++++++++++++
 src/glx/clientinfo.c     |    5 ++++-
 src/glx/create_context.c |    2 +-
 src/glx/glxextensions.c  |    4 ++--
 tests/glx/Makefile.am    |    4 +++-
 5 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index 2d31273..dfffdf9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1030,12 +1030,34 @@ 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])
+    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"
     ;;
 esac
 
+# This is outside the case (above) so that it is invoked even for non-GLX
+# builds.
+AM_CONDITIONAL(HAVE_XCB_GLX_CREATE_CONTEXT,
+    test x$HAVE_XCB_GLX_CREATE_CONTEXT = xyes)
+
 GLESv1_CM_LIB_DEPS="$LIBDRM_LIBS -lm -lpthread $DLOPEN_LIBS"
 GLESv1_CM_PC_LIB_PRIV="-lm -lpthread $DLOPEN_LIBS"
 GLESv2_LIB_DEPS="$LIBDRM_LIBS -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