/* Extension required boiler plate */
static const char __glXExtensionName[] = GLX_EXTENSION_NAME;
- static struct glx_display *glx_displays;
+static struct glx_display *glx_displays;
static /* const */ char *error_list[] = {
"GLXBadContext",
screens = ScreenCount(priv->dpy);
for (i = 0; i < screens; i++) {
psc = priv->screens[i];
+ if (!psc)
+ continue;
glx_screen_cleanup(psc);
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
convert_from_x_visual_type(int visualType)
{
static const int glx_visual_types[] = {
- GLX_STATIC_GRAY, GLX_GRAY_SCALE,
- GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
- GLX_TRUE_COLOR, GLX_DIRECT_COLOR
+ [StaticGray] = GLX_STATIC_GRAY,
+ [GrayScale] = GLX_GRAY_SCALE,
+ [StaticColor] = GLX_STATIC_COLOR,
+ [PseudoColor] = GLX_PSEUDO_COLOR,
+ [TrueColor] = GLX_TRUE_COLOR,
+ [DirectColor] = GLX_DIRECT_COLOR,
};
if (visualType < ARRAY_SIZE(glx_visual_types))
Bool fbconfig_style_tags)
{
int i;
- GLint renderType = 0;
if (!tagged_only) {
/* Copy in the first set of properties */
config->visualType = convert_from_x_visual_type(*bp++);
- config->rgbMode = *bp++;
+ config->renderType = *bp++ ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
config->redBits = *bp++;
config->greenBits = *bp++;
#endif
}
- config->sRGBCapable = GL_FALSE;
-
/*
** Additional properties may be in a list at the end
** of the reply. They are in pairs of property type
switch (tag) {
case GLX_RGBA:
- FETCH_OR_SET(rgbMode);
+ if (fbconfig_style_tags)
+ config->renderType = *bp++ ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
+ else
+ config->renderType = GLX_RGBA_BIT;
break;
case GLX_BUFFER_SIZE:
config->rgbBits = *bp++;
#endif
break;
case GLX_RENDER_TYPE: /* fbconfig render type bits */
- renderType = *bp++;
+ config->renderType = *bp++;
break;
case GLX_X_RENDERABLE:
config->xRenderable = *bp++;
}
}
- if (renderType != 0 && renderType != GLX_DONT_CARE) {
- config->renderType = renderType;
- config->floatMode = (renderType &
- (GLX_RGBA_FLOAT_BIT_ARB|GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT)) != 0;
- } else {
- /* If there wasn't GLX_RENDER_TYPE property, set it based on
- * config->rgbMode. The only way to communicate that the config is
- * floating-point is via GLX_RENDER_TYPE, so this cannot be a float
- * config.
- */
- config->renderType =
- (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
- }
-
/* The GLX_ARB_fbconfig_float spec says:
*
* "Note that floating point rendering is only supported for
* GLXPbuffer drawables."
*/
- if (config->floatMode)
+ if (config->renderType &
+ (GLX_RGBA_FLOAT_BIT_ARB|GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT))
config->drawableType &= GLX_PBUFFER_BIT;
}
*/
m->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
#endif
+ /* Older X servers don't send this so we default it here. */
+ m->sRGBCapable = GL_FALSE;
__glXInitializeVisualConfigFromTags(m, nprops, props,
tagged_only, GL_TRUE);
m->screen = screen;
LockDisplay(dpy);
psc->configs = NULL;
- if (atof(priv->serverGLXversion) >= 1.3) {
+ if (priv->majorVersion > 1 ||
+ (priv->majorVersion == 1 && priv->minorVersion >= 3)) {
GetReq(GLXGetFBConfigs, fb_req);
fb_req->reqType = priv->majorOpcode;
fb_req->glxCode = X_GLXGetFBConfigs;
** First allocate memory for the array of per screen configs.
*/
screens = ScreenCount(dpy);
- priv->screens = malloc(screens * sizeof *priv->screens);
+ priv->screens = calloc(screens, sizeof *priv->screens);
if (!priv->screens)
return GL_FALSE;
}
XESetCloseDisplay(dpy, dpyPriv->codes->extension, __glXCloseDisplay);
- XESetErrorString (dpy, dpyPriv->codes->extension,__glXErrorString);
+ XESetErrorString (dpy, dpyPriv->codes->extension, __glXErrorString);
dpyPriv->glXDrawHash = __glxHashCreate();
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
- glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL);
- glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL);
+ glx_direct = !env_var_as_boolean("LIBGL_ALWAYS_INDIRECT", false);
+ glx_accel = !env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false);
dpyPriv->drawHash = __glxHashCreate();
#if defined(GLX_USE_DRM)
if (glx_direct && glx_accel) {
#if defined(HAVE_DRI3)
- if (!getenv("LIBGL_DRI3_DISABLE"))
+ if (!env_var_as_boolean("LIBGL_DRI3_DISABLE", false))
dpyPriv->dri3Display = dri3_create_display(dpy);
#endif /* HAVE_DRI3 */
dpyPriv->dri2Display = dri2CreateDisplay(dpy);