diff options
-rw-r--r-- | src/glx/glxext.c | 28 | ||||
-rw-r--r-- | src/mesa/drivers/x11/fakeglx.c | 7 |
2 files changed, 30 insertions, 5 deletions
diff --git a/src/glx/glxext.c b/src/glx/glxext.c index ef1e7ad2c8b..bea1ccb10a2 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -337,6 +337,7 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, Bool fbconfig_style_tags) { int i; + GLint renderType = 0; if (!tagged_only) { /* Copy in the first set of properties */ @@ -471,8 +472,8 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, config->drawableType |= GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; #endif break; - case GLX_RENDER_TYPE: - config->renderType = *bp++; + case GLX_RENDER_TYPE: /* fbconfig render type bits */ + renderType = *bp++; break; case GLX_X_RENDERABLE: config->xRenderable = *bp++; @@ -555,8 +556,27 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, } } - config->renderType = - (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT; + 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) + config->drawableType &= ~(GLX_WINDOW_BIT|GLX_PIXMAP_BIT); } static struct glx_config * diff --git a/src/mesa/drivers/x11/fakeglx.c b/src/mesa/drivers/x11/fakeglx.c index 969ee7d2998..7a2cfbeda7c 100644 --- a/src/mesa/drivers/x11/fakeglx.c +++ b/src/mesa/drivers/x11/fakeglx.c @@ -1090,6 +1090,9 @@ choose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig ) else if (*parselist & GLX_COLOR_INDEX_BIT) { rgb_flag = GL_FALSE; } + else if (*parselist & (GLX_RGBA_FLOAT_BIT_ARB|GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT)) { + rgb_flag = GL_TRUE; + } else if (*parselist == 0) { rgb_flag = GL_TRUE; } @@ -1761,7 +1764,9 @@ get_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig ) case GLX_RENDER_TYPE_SGIX: if (!fbconfig) return GLX_BAD_ATTRIBUTE; - if (xmvis->mesa_visual.rgbMode) + if (xmvis->mesa_visual.floatMode) + *value = GLX_RGBA_FLOAT_BIT_ARB; + else if (xmvis->mesa_visual.rgbMode) *value = GLX_RGBA_BIT; else *value = GLX_COLOR_INDEX_BIT; |