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