---
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
-------------------------------------------------------------------------
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