Hi,

these patches are against mesa/master.

The code paths were compile and run tested. Running glxgears with Mesa
built with --enable-xcb yields some 5% speedup when indirect rendering
(~10000FPS -> ~10500FPS), however this is mostly meaningless.

Comments are welcome!

Thanks,
Kristóf
From 11457b144eea0464ed60702ec20ebe3d05fa82fb Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Sat, 18 Oct 2008 16:53:08 +0200
Subject: [PATCH] glx: implement __glXQueryServerString using XCB

---
 src/glx/x11/glx_query.c |   31 +++++++++++++++++++++++++++++++
 src/glx/x11/glxclient.h |    4 ++++
 2 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/src/glx/x11/glx_query.c b/src/glx/x11/glx_query.c
index 9664243..9e52990 100644
--- a/src/glx/x11/glx_query.c
+++ b/src/glx/x11/glx_query.c
@@ -32,6 +32,12 @@
 
 #include "glxclient.h"
 
+#if defined(USE_XCB)
+# include <X11/Xlib-xcb.h>
+# include <xcb/xcb.h>
+# include <xcb/glx.h>
+#endif
+
 /**
  * GLX protocol structure for the ficticious "GXLGenericGetString" request.
  * 
@@ -102,3 +108,28 @@ __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode,
 
    return buf;
 }
+
+#ifdef USE_XCB
+char *
+__glXQueryServerString(Display* dpy,
+                       CARD32 screen,
+                       CARD32 name)
+{
+   xcb_connection_t *c = XGetXCBConnection(dpy);
+   xcb_glx_query_server_string_reply_t* reply =
+      xcb_glx_query_server_string_reply(c,
+                                        xcb_glx_query_server_string(c,
+                                                                    screen,
+                                                                    name),
+                                        NULL);
+
+   /* The spec doesn't mention this, but the Xorg server replies with
+    * a string already terminated with '\0'. */
+   uint32_t len = xcb_glx_query_server_string_string_length(reply);
+   char* buf = Xmalloc(len);
+   memcpy(buf, xcb_glx_query_server_string_string(reply), len);
+   free(reply);
+
+   return buf;
+}
+#endif /* USE_XCB */
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index fe2f540..4daab0e 100644
--- a/src/glx/x11/glxclient.h
+++ b/src/glx/x11/glxclient.h
@@ -743,6 +743,10 @@ extern void __glXInitializeVisualConfigFromTags( __GLcontextModes *config,
 extern char * __glXGetStringFromServer( Display * dpy, int opcode,
     CARD32 glxCode, CARD32 for_whom, CARD32 name );
 
+#ifdef USE_XCB
+extern char * __glXQueryServerString(Display* dpy, CARD32 screen, CARD32 name);
+#endif
+
 extern char *__glXstrdup(const char *str);
 
 
-- 
1.6.0.2

From 3dcbed2b224b8ba0b2fccf1e4a5dabdd5fde77ed Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Sat, 18 Oct 2008 17:00:13 +0200
Subject: [PATCH] glx: implement QueryVersion using XCB

---
 src/glx/x11/glxext.c |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index 0b7a7af..9efb7b3 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -140,7 +140,8 @@ XEXT_GENERATE_FIND_DISPLAY(__glXFindDisplay, __glXExtensionInfo,
 ** Free the per screen configs data as well as the array of
 ** __glXScreenConfigs.
 */
-     static void FreeScreenConfigs(__GLXdisplayPrivate * priv)
+static void
+FreeScreenConfigs(__GLXdisplayPrivate * priv)
 {
    __GLXscreenConfigs *psc;
    GLint i, screens;
@@ -222,6 +223,25 @@ __glXFreeDisplayPrivate(XExtData * extension)
 static Bool
 QueryVersion(Display * dpy, int opcode, int *major, int *minor)
 {
+#ifdef USE_XCB
+   xcb_connection_t *c = XGetXCBConnection(dpy);
+   xcb_glx_query_version_reply_t* reply =
+      xcb_glx_query_version_reply(c,
+                                  xcb_glx_query_version(c,
+                                                        GLX_MAJOR_VERSION,
+                                                        GLX_MINOR_VERSION),
+                                  NULL);
+
+   if(reply->major_version != GLX_MAJOR_VERSION)
+   {
+      free(reply);
+      return GL_FALSE;
+   }
+   *major = reply->major_version;
+   *minor = min(reply->minor_version, GLX_MINOR_VERSION);
+   free(reply);
+   return GL_TRUE;
+#else
    xGLXQueryVersionReq *req;
    xGLXQueryVersionReply reply;
 
@@ -246,6 +266,7 @@ QueryVersion(Display * dpy, int opcode, int *major, int *minor)
    *major = reply.majorVersion;
    *minor = min(reply.minorVersion, GLX_MINOR_VERSION);
    return GL_TRUE;
+#endif /* USE_XCB */
 }
 
 
-- 
1.6.0.2

From 63deec0cfbd62fcddb993312d9de0c3ac87d9f39 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Mon, 3 Nov 2008 18:31:22 +0100
Subject: [PATCH] glx: implement __glXGetString, hide __glXGetStringFromServer

---
 src/glx/x11/glx_query.c |   87 ++++++++++++++++++++++++++++++++++++++---------
 src/glx/x11/glxclient.h |    6 +---
 2 files changed, 72 insertions(+), 21 deletions(-)

diff --git a/src/glx/x11/glx_query.c b/src/glx/x11/glx_query.c
index 9e52990..c0d8e1c 100644
--- a/src/glx/x11/glx_query.c
+++ b/src/glx/x11/glx_query.c
@@ -38,6 +38,62 @@
 # include <xcb/glx.h>
 #endif
 
+#ifdef USE_XCB
+
+/**
+ * Exchange a protocol request for glXQueryServerString.
+ */
+char *
+__glXQueryServerString(Display* dpy,
+                       CARD32 screen,
+                       CARD32 name)
+{
+   xcb_connection_t *c = XGetXCBConnection(dpy);
+   xcb_glx_query_server_string_reply_t* reply =
+      xcb_glx_query_server_string_reply(c,
+                                        xcb_glx_query_server_string(c,
+                                                                    screen,
+                                                                    name),
+                                        NULL);
+
+   /* The spec doesn't mention this, but the Xorg server replies with
+    * a string already terminated with '\0'. */
+   uint32_t len = xcb_glx_query_server_string_string_length(reply);
+   char* buf = Xmalloc(len);
+   memcpy(buf, xcb_glx_query_server_string_string(reply), len);
+   free(reply);
+
+   return buf;
+}
+
+/**
+ * Exchange a protocol request for glGetString.
+ */
+char *
+__glXGetString(Display* dpy,
+               CARD32 contextTag,
+               CARD32 name)
+{
+   xcb_connection_t *c = XGetXCBConnection(dpy);
+   xcb_glx_get_string_reply_t* reply =
+      xcb_glx_get_string_reply(c,
+                               xcb_glx_get_string(c,
+                                                  contextTag,
+                                                  name),
+                               NULL);
+
+   /* The spec doesn't mention this, but the Xorg server replies with
+    * a string already terminated with '\0'. */
+   uint32_t len = xcb_glx_get_string_string_length(reply);
+   char* buf = Xmalloc(len);
+   memcpy(buf, xcb_glx_get_string_string(reply), len);
+   free(reply);
+
+   return buf;
+}
+
+#else
+
 /**
  * GLX protocol structure for the ficticious "GXLGenericGetString" request.
  * 
@@ -109,27 +165,26 @@ __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode,
    return buf;
 }
 
-#ifdef USE_XCB
 char *
 __glXQueryServerString(Display* dpy,
                        CARD32 screen,
                        CARD32 name)
 {
-   xcb_connection_t *c = XGetXCBConnection(dpy);
-   xcb_glx_query_server_string_reply_t* reply =
-      xcb_glx_query_server_string_reply(c,
-                                        xcb_glx_query_server_string(c,
-                                                                    screen,
-                                                                    name),
-                                        NULL);
-
-   /* The spec doesn't mention this, but the Xorg server replies with
-    * a string already terminated with '\0'. */
-   uint32_t len = xcb_glx_query_server_string_string_length(reply);
-   char* buf = Xmalloc(len);
-   memcpy(buf, xcb_glx_query_server_string_string(reply), len);
-   free(reply);
+   GLXContext gc = __glXGetCurrentContext();
+   return __glXGetStringFromServer(dpy, gc->majorOpcode,
+                                   X_GLXQueryServerString,
+                                   screen, name);
+}
 
-   return buf;
+char *
+__glXGetString(Display* dpy,
+               CARD32 contextTag,
+               CARD32 name)
+{
+   GLXContext gc = __glXGetCurrentContext();
+   return __glXGetStringFromServer(dpy, gc->majorOpcode, X_GLsop_GetString,
+                                   contextTag, name);
 }
+
 #endif /* USE_XCB */
+
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index 4daab0e..caa351b 100644
--- a/src/glx/x11/glxclient.h
+++ b/src/glx/x11/glxclient.h
@@ -740,12 +740,8 @@ extern void _XSend(Display*, const void*, long);
 extern void __glXInitializeVisualConfigFromTags( __GLcontextModes *config,
     int count, const INT32 *bp, Bool tagged_only, Bool fbconfig_style_tags );
 
-extern char * __glXGetStringFromServer( Display * dpy, int opcode,
-    CARD32 glxCode, CARD32 for_whom, CARD32 name );
-
-#ifdef USE_XCB
 extern char * __glXQueryServerString(Display* dpy, CARD32 screen, CARD32 name);
-#endif
+extern char * __glXGetString(Display* dpy, CARD32 screen, CARD32 name);
 
 extern char *__glXstrdup(const char *str);
 
-- 
1.6.0.2

From 47e41c40707879797ee10ae7c5884971c5f41dbc Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Mon, 3 Nov 2008 18:32:20 +0100
Subject: [PATCH] glx: use __glXQueryServerString

---
 src/glx/x11/glxcmds.c |    8 +++-----
 src/glx/x11/glxext.c  |    8 ++------
 2 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
index ff04853..1222625 100644
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -1315,9 +1315,8 @@ PUBLIC const char *glXQueryExtensionsString( Display *dpy, int screen )
 
     if (!psc->effectiveGLXexts) {
         if (!psc->serverGLXexts) {
-	    psc->serverGLXexts = __glXGetStringFromServer(dpy, priv->majorOpcode,
-					  	   X_GLXQueryServerString,
-					  	   screen, GLX_EXTENSIONS);
+           psc->serverGLXexts =
+              __glXQueryServerString(dpy, screen, GLX_EXTENSIONS);
 	}
 
 	__glXCalculateUsableExtensions(psc,
@@ -1372,8 +1371,7 @@ PUBLIC const char *glXQueryServerString( Display *dpy, int screen, int name )
     }
 
     if ( *str == NULL ) {
-	*str = __glXGetStringFromServer(dpy, priv->majorOpcode,
-					X_GLXQueryServerString, screen, name);
+       *str = __glXQueryServerString(dpy, screen, name);
     }
     
     return *str;
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index 9efb7b3..c5fada9 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -551,9 +551,7 @@ getFBConfigs(Display * dpy, __GLXdisplayPrivate * priv, int screen)
    __GLXscreenConfigs *psc;
 
    psc = priv->screenConfigs + screen;
-   psc->serverGLXexts = __glXGetStringFromServer(dpy, priv->majorOpcode,
-                                                 X_GLXQueryServerString,
-                                                 screen, GLX_EXTENSIONS);
+   psc->serverGLXexts = __glXQueryServerString(dpy, screen, GLX_EXTENSIONS);
 
    LockDisplay(dpy);
 
@@ -611,9 +609,7 @@ AllocAndFetchScreenConfigs(Display * dpy, __GLXdisplayPrivate * priv)
    memset(psc, 0, screens * sizeof(__GLXscreenConfigs));
    priv->screenConfigs = psc;
 
-   priv->serverGLXversion = __glXGetStringFromServer(dpy, priv->majorOpcode,
-                                                     X_GLXQueryServerString,
-                                                     0, GLX_VERSION);
+   priv->serverGLXversion = __glXQueryServerString(dpy, 0, GLX_VERSION);
    if (priv->serverGLXversion == NULL) {
       FreeScreenConfigs(priv);
       return GL_FALSE;
-- 
1.6.0.2

From df2c818a8ba2bef16a2bb2ad3f937a4d4eac79bf Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Mon, 3 Nov 2008 18:32:35 +0100
Subject: [PATCH] glx: use __glXGetString

---
 src/glx/x11/single2.c |    4 +---
 1 files changed, 1 insertions(+), 3 deletions(-)

diff --git a/src/glx/x11/single2.c b/src/glx/x11/single2.c
index 9732b6e..9d05859 100644
--- a/src/glx/x11/single2.c
+++ b/src/glx/x11/single2.c
@@ -672,9 +672,7 @@ __indirect_glGetString(GLenum name)
     */
 
    (void) __glXFlushRenderBuffer(gc, gc->pc);
-   s = (GLubyte *) __glXGetStringFromServer(dpy, gc->majorOpcode,
-                                            X_GLsop_GetString,
-                                            gc->currentContextTag, name);
+   s = (GLubyte *) __glXGetString(dpy, gc->currentContextTag, name);
    if (!s) {
       /* Throw data on the floor */
       __glXSetError(gc, GL_OUT_OF_MEMORY);
-- 
1.6.0.2

From 7cf086638251ffb52e1f8db80d11938be68b8af0 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 10:43:06 +0100
Subject: [PATCH] glx: missing static on local function

---
 src/glx/x11/glx_query.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/src/glx/x11/glx_query.c b/src/glx/x11/glx_query.c
index c0d8e1c..4197bb1 100644
--- a/src/glx/x11/glx_query.c
+++ b/src/glx/x11/glx_query.c
@@ -120,6 +120,7 @@ typedef struct GLXGenericGetString
  * Query the Server GLX string and cache it in the display private.
  * This routine will allocate the necessay space for the string.
  */
+static
 char *
 __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode,
                          CARD32 for_whom, CARD32 name)
-- 
1.6.0.2

From abce839a4eb15fe8edda1d5c80f47b4ee488916d Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 10:59:39 +0100
Subject: [PATCH] glx: xcbified __glXIsDirect

---
 src/glx/x11/glxcmds.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
index 1222625..565015e 100644
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -45,6 +45,12 @@
 #include "xf86dri.h"
 #endif
 
+#if defined(USE_XCB)
+#include <X11/Xlib-xcb.h>
+#include <xcb/xcb.h>
+#include <xcb/glx.h>
+#endif
+
 static const char __glXGLXClientVendorName[] = "SGI";
 static const char __glXGLXClientVersion[] = "1.4";
 
@@ -750,8 +756,10 @@ PUBLIC void glXCopyContext(Display *dpy, GLXContext source,
  */
 static Bool __glXIsDirect(Display *dpy, GLXContextID contextID)
 {
+#if !defined(USE_XCB)
     xGLXIsDirectReq *req;
     xGLXIsDirectReply reply;
+#endif
     CARD8 opcode;
 
     opcode = __glXSetupForCommand(dpy);
@@ -759,6 +767,18 @@ static Bool __glXIsDirect(Display *dpy, GLXContextID contextID)
 	return GL_FALSE;
     }
 
+#ifdef USE_XCB
+   xcb_connection_t* c = XGetXCBConnection(dpy);
+   xcb_glx_is_direct_reply_t* reply =
+      xcb_glx_is_direct_reply(c,
+                              xcb_glx_is_direct(c, contextID),
+                              NULL);
+
+   const Bool is_direct = reply->is_direct ? True : False;
+   free(reply);
+
+   return is_direct;
+#else
     /* Send the glXIsDirect request */
     LockDisplay(dpy);
     GetReq(GLXIsDirect,req);
@@ -770,6 +790,7 @@ static Bool __glXIsDirect(Display *dpy, GLXContextID contextID)
     SyncHandle();
 
     return reply.isDirect;
+#endif /* USE_XCB */
 }
 
 /**
-- 
1.6.0.2

From b6faba142d8442d6bb56bbf47943f0a264aaed49 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 11:31:53 +0100
Subject: [PATCH] glx: no graphics context during initialization

---
 src/glx/x11/glx_query.c |   10 ++++++----
 src/glx/x11/glxclient.h |    6 ++++--
 src/glx/x11/glxcmds.c   |    4 ++--
 src/glx/x11/glxext.c    |    4 ++--
 src/glx/x11/single2.c   |    2 +-
 5 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/glx/x11/glx_query.c b/src/glx/x11/glx_query.c
index 4197bb1..9e9b6fd 100644
--- a/src/glx/x11/glx_query.c
+++ b/src/glx/x11/glx_query.c
@@ -45,6 +45,7 @@
  */
 char *
 __glXQueryServerString(Display* dpy,
+                       int opcode,
                        CARD32 screen,
                        CARD32 name)
 {
@@ -71,6 +72,7 @@ __glXQueryServerString(Display* dpy,
  */
 char *
 __glXGetString(Display* dpy,
+               int opcode,
                CARD32 contextTag,
                CARD32 name)
 {
@@ -168,22 +170,22 @@ __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode,
 
 char *
 __glXQueryServerString(Display* dpy,
+                       int opcode,
                        CARD32 screen,
                        CARD32 name)
 {
-   GLXContext gc = __glXGetCurrentContext();
-   return __glXGetStringFromServer(dpy, gc->majorOpcode,
+   return __glXGetStringFromServer(dpy, opcode,
                                    X_GLXQueryServerString,
                                    screen, name);
 }
 
 char *
 __glXGetString(Display* dpy,
+               int opcode,
                CARD32 contextTag,
                CARD32 name)
 {
-   GLXContext gc = __glXGetCurrentContext();
-   return __glXGetStringFromServer(dpy, gc->majorOpcode, X_GLsop_GetString,
+   return __glXGetStringFromServer(dpy, opcode, X_GLsop_GetString,
                                    contextTag, name);
 }
 
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index caa351b..7fc1a6f 100644
--- a/src/glx/x11/glxclient.h
+++ b/src/glx/x11/glxclient.h
@@ -740,8 +740,10 @@ extern void _XSend(Display*, const void*, long);
 extern void __glXInitializeVisualConfigFromTags( __GLcontextModes *config,
     int count, const INT32 *bp, Bool tagged_only, Bool fbconfig_style_tags );
 
-extern char * __glXQueryServerString(Display* dpy, CARD32 screen, CARD32 name);
-extern char * __glXGetString(Display* dpy, CARD32 screen, CARD32 name);
+extern char * __glXQueryServerString(Display* dpy, int opcode,
+                                     CARD32 screen, CARD32 name);
+extern char * __glXGetString(Display* dpy, int opcode,
+                             CARD32 screen, CARD32 name);
 
 extern char *__glXstrdup(const char *str);
 
diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
index 565015e..bd39a87 100644
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -1337,7 +1337,7 @@ PUBLIC const char *glXQueryExtensionsString( Display *dpy, int screen )
     if (!psc->effectiveGLXexts) {
         if (!psc->serverGLXexts) {
            psc->serverGLXexts =
-              __glXQueryServerString(dpy, screen, GLX_EXTENSIONS);
+              __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS);
 	}
 
 	__glXCalculateUsableExtensions(psc,
@@ -1392,7 +1392,7 @@ PUBLIC const char *glXQueryServerString( Display *dpy, int screen, int name )
     }
 
     if ( *str == NULL ) {
-       *str = __glXQueryServerString(dpy, screen, name);
+       *str = __glXQueryServerString(dpy, priv->majorOpcode, screen, name);
     }
     
     return *str;
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index c5fada9..02b611f 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -551,7 +551,7 @@ getFBConfigs(Display * dpy, __GLXdisplayPrivate * priv, int screen)
    __GLXscreenConfigs *psc;
 
    psc = priv->screenConfigs + screen;
-   psc->serverGLXexts = __glXQueryServerString(dpy, screen, GLX_EXTENSIONS);
+   psc->serverGLXexts = __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS);
 
    LockDisplay(dpy);
 
@@ -609,7 +609,7 @@ AllocAndFetchScreenConfigs(Display * dpy, __GLXdisplayPrivate * priv)
    memset(psc, 0, screens * sizeof(__GLXscreenConfigs));
    priv->screenConfigs = psc;
 
-   priv->serverGLXversion = __glXQueryServerString(dpy, 0, GLX_VERSION);
+   priv->serverGLXversion = __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION);
    if (priv->serverGLXversion == NULL) {
       FreeScreenConfigs(priv);
       return GL_FALSE;
diff --git a/src/glx/x11/single2.c b/src/glx/x11/single2.c
index 9d05859..afbe986 100644
--- a/src/glx/x11/single2.c
+++ b/src/glx/x11/single2.c
@@ -672,7 +672,7 @@ __indirect_glGetString(GLenum name)
     */
 
    (void) __glXFlushRenderBuffer(gc, gc->pc);
-   s = (GLubyte *) __glXGetString(dpy, gc->currentContextTag, name);
+   s = (GLubyte *) __glXGetString(dpy, gc->majorOpcode, gc->currentContextTag, name);
    if (!s) {
       /* Throw data on the floor */
       __glXSetError(gc, GL_OUT_OF_MEMORY);
-- 
1.6.0.2

From 38705c59fc05bca23624290f050329ac1a76910e Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 11:53:32 +0100
Subject: [PATCH] configure.ac: advertise XCB

---
 configure.ac |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/configure.ac b/configure.ac
index 463821b..d0aa2bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1033,6 +1033,7 @@ else
 fi
     echo "        DRI driver dir:  $DRI_DRIVER_INSTALL_DIR"
 fi
+echo "        Use XCB:         $enable_xcb"
 
 dnl Libraries
 echo ""
-- 
1.6.0.2

From 7582ba56dab82f8a27f4d15b1b780e728fcd19b8 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 12:41:55 +0100
Subject: [PATCH] glx: xcbified __glXClientInfo

---
 src/glx/x11/glxcmds.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
index bd39a87..726ffed 100644
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -255,6 +255,10 @@ GLXContext AllocateGLXContext( Display *dpy )
      CARD8 opcode;
     __GLXattribute *state;
 
+#ifdef USE_XCB
+    printf("USE_XCB\n");
+#endif
+
     if (!dpy)
         return NULL;
 
@@ -1400,9 +1404,18 @@ PUBLIC const char *glXQueryServerString( Display *dpy, int screen, int name )
 
 void __glXClientInfo (  Display *dpy, int opcode  )
 {
-    xGLXClientInfoReq *req;
-    int size;
     char * ext_str = __glXGetClientGLExtensionString();
+    int size = strlen( ext_str ) + 1;
+
+#ifdef USE_XCB
+   xcb_connection_t *c = XGetXCBConnection(dpy);
+   xcb_glx_client_info(c,
+                       GLX_MAJOR_VERSION,
+                       GLX_MINOR_VERSION,
+                       size,
+                       (const uint8_t *)ext_str);
+#else
+    xGLXClientInfoReq *req;
 
     /* Send the glXClientInfo request */
     LockDisplay(dpy);
@@ -1412,14 +1425,14 @@ void __glXClientInfo (  Display *dpy, int opcode  )
     req->major = GLX_MAJOR_VERSION;
     req->minor = GLX_MINOR_VERSION;
 
-    size = strlen( ext_str ) + 1;
     req->length += (size + 3) >> 2;
     req->numbytes = size;
     Data(dpy, ext_str, size);
 
     UnlockDisplay(dpy);
     SyncHandle();
-    
+#endif /* USE_XCB */
+
     Xfree( ext_str );
 }
 
-- 
1.6.0.2

From f1b69d6796c8740357c8731145aebb8c8fe6a0da Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 17:17:18 +0100
Subject: [PATCH] glx: xcbified visual and FBConfig choosing

---
 src/glx/x11/glxext.c |  109 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 103 insertions(+), 6 deletions(-)

diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index 02b611f..76c8322 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -466,8 +466,14 @@ __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
 }
 
 static __GLcontextModes *
-createConfigsFromProperties(Display * dpy, int nvisuals, int nprops,
-                            int screen, GLboolean tagged_only)
+createConfigsFromProperties(
+#ifdef USE_XCB
+   uint32_t* properties,
+#else
+   Display *dpy,
+#endif
+   int nvisuals, int nprops,
+   int screen, GLboolean tagged_only)
 {
    INT32 buf[__GLX_TOTAL_CONFIG], *props;
    unsigned prop_size;
@@ -497,7 +503,11 @@ createConfigsFromProperties(Display * dpy, int nvisuals, int nprops,
    /* Read each config structure and convert it into our format */
    m = modes;
    for (i = 0; i < nvisuals; i++) {
+#ifdef USE_XCB
+      memcpy(props, &properties[i*nprops], prop_size);
+#else
       _XRead(dpy, (char *) props, prop_size);
+#endif
       /* Older X servers don't send this so we default it here. */
       m->drawableType = GLX_WINDOW_BIT;
       __glXInitializeVisualConfigFromTags(m, nprops, props,
@@ -515,8 +525,34 @@ createConfigsFromProperties(Display * dpy, int nvisuals, int nprops,
 static GLboolean
 getVisualConfigs(Display * dpy, __GLXdisplayPrivate * priv, int screen)
 {
-   xGLXGetVisualConfigsReq *req;
    __GLXscreenConfigs *psc;
+#ifdef USE_XCB
+   xcb_connection_t* c = XGetXCBConnection(dpy);
+   xcb_glx_get_visual_configs_reply_t* reply = NULL;
+   uint32_t* props;
+
+   psc = priv->screenConfigs + screen;
+   psc->visuals = NULL;
+
+   reply = xcb_glx_get_visual_configs_reply(c,
+                                            xcb_glx_get_visual_configs(c,
+                                                                       screen),
+                                            NULL);
+   if(!reply)
+      goto out;
+
+   props = xcb_glx_get_visual_configs_property_list(reply);
+   psc->visuals = createConfigsFromProperties(props,
+                                              reply->num_visuals,
+                                              reply->num_properties,
+                                              screen,
+                                              GL_FALSE);
+   free(reply);
+
+out:
+   return psc->visuals != NULL;
+#else /* USE_XCB */
+   xGLXGetVisualConfigsReq *req;
    xGLXGetVisualConfigsReply reply;
 
    LockDisplay(dpy);
@@ -539,19 +575,78 @@ getVisualConfigs(Display * dpy, __GLXdisplayPrivate * priv, int screen)
  out:
    UnlockDisplay(dpy);
    return psc->visuals != NULL;
+#endif /* USE_XCB */
 }
 
 static GLboolean
 getFBConfigs(Display * dpy, __GLXdisplayPrivate * priv, int screen)
 {
+   __GLXscreenConfigs *psc;
+#ifdef USE_XCB
+   xcb_connection_t* c = XGetXCBConnection(dpy);
+   xcb_glx_get_fb_configs_reply_t* reply_fb = NULL;
+   xcb_glx_get_fb_configs_sgix_reply_t* reply_sgix = NULL;
+   uint32_t num_fb_configs;
+   uint32_t num_properties;
+   uint32_t* props;
+
+   psc = priv->screenConfigs + screen;
+   psc->serverGLXexts = __glXQueryServerString(dpy, priv->majorOpcode,
+                                               screen, GLX_EXTENSIONS);
+   psc->configs = NULL;
+
+   if (atof(priv->serverGLXversion) >= 1.3) {
+      reply_fb = xcb_glx_get_fb_configs_reply(c,
+                                              xcb_glx_get_fb_configs(c,
+                                                                     screen),
+                                              NULL);
+      if (!reply_fb)
+         goto out;
+
+      num_fb_configs = reply_fb->num_fb_configs;
+      num_properties = reply_fb->num_properties * 2;
+      props = xcb_glx_get_fb_configs_property_list(reply_fb);
+   } else if (strstr(psc->serverGLXexts, "GLX_SGIX_fbconfig") != NULL) {
+      reply_sgix = xcb_glx_get_fb_configs_sgix_reply(
+         c,
+         xcb_glx_get_fb_configs_sgix(c,
+                                     65540, /* X_GLXvop_GetFBConfigsSGIX */
+                                     0,
+                                     screen),
+         NULL);
+
+      if (!reply_sgix)
+         goto out;
+
+      num_fb_configs = reply_sgix->num_fb_configs;
+      num_properties = reply_sgix->num_properties * 2;
+      props = xcb_glx_get_fb_configs_sgix_property_list(reply_sgix);
+   } else
+      goto out;
+
+   psc->configs = createConfigsFromProperties(props,
+                                              num_fb_configs,
+                                              num_properties,
+                                              screen,
+                                              GL_TRUE);
+
+   if (reply_fb)
+      free(reply_fb);
+
+   if (reply_sgix)
+      free(reply_sgix);
+
+out:
+   return psc->configs != NULL;
+#else /* USE_XCB */
    xGLXGetFBConfigsReq *fb_req;
    xGLXGetFBConfigsSGIXReq *sgi_req;
    xGLXVendorPrivateWithReplyReq *vpreq;
    xGLXGetFBConfigsReply reply;
-   __GLXscreenConfigs *psc;
 
    psc = priv->screenConfigs + screen;
-   psc->serverGLXexts = __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS);
+   psc->serverGLXexts = __glXQueryServerString(dpy, priv->majorOpcode,
+                                               screen, GLX_EXTENSIONS);
 
    LockDisplay(dpy);
 
@@ -586,6 +681,7 @@ getFBConfigs(Display * dpy, __GLXdisplayPrivate * priv, int screen)
  out:
    UnlockDisplay(dpy);
    return psc->configs != NULL;
+#endif /* USE_XCB */
 }
 
 /*
@@ -609,7 +705,8 @@ AllocAndFetchScreenConfigs(Display * dpy, __GLXdisplayPrivate * priv)
    memset(psc, 0, screens * sizeof(__GLXscreenConfigs));
    priv->screenConfigs = psc;
 
-   priv->serverGLXversion = __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION);
+   priv->serverGLXversion = __glXQueryServerString(dpy, priv->majorOpcode,
+                                                   0, GLX_VERSION);
    if (priv->serverGLXversion == NULL) {
       FreeScreenConfigs(priv);
       return GL_FALSE;
-- 
1.6.0.2

From 9724b8945f6796268c6c11d0ce2cddbe56329d18 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?RALOVICH,=20Krist=C3=B3f?= <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 17:30:21 +0100
Subject: [PATCH] glx: xcbified glXSwapBuffers

---
 src/glx/x11/glxcmds.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
index 726ffed..0daa1ef 100644
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -866,7 +866,6 @@ PUBLIC void glXDestroyGLXPixmap(Display *dpy, GLXPixmap glxpixmap)
 
 PUBLIC void glXSwapBuffers(Display *dpy, GLXDrawable drawable)
 {
-    xGLXSwapBuffersReq *req;
     GLXContext gc;
     GLXContextTag tag;
     CARD8 opcode;
@@ -897,6 +896,13 @@ PUBLIC void glXSwapBuffers(Display *dpy, GLXDrawable drawable)
 	tag = 0;
     }
 
+#ifdef USE_XCB
+    xcb_connection_t* c = XGetXCBConnection(dpy);
+    xcb_glx_swap_buffers(c, tag, drawable);
+    xcb_flush(c);
+#else
+    xGLXSwapBuffersReq *req;
+
     /* Send the glXSwapBuffers request */
     LockDisplay(dpy);
     GetReq(GLXSwapBuffers,req);
@@ -907,6 +913,7 @@ PUBLIC void glXSwapBuffers(Display *dpy, GLXDrawable drawable)
     UnlockDisplay(dpy);
     SyncHandle();
     XFlush(dpy);
+#endif /* USE_XCB */
 }
 
 
-- 
1.6.0.2

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to