The change is to correctly handle the value of renderType and drawableType in fbconfig. This part modifies glXInitializeVisualConfigFromTags to read the parameter value, or detect it if it's not there. --- src/glx/glxext.c | 35 +++++++++++++++++++++++++++++++---- src/mesa/drivers/x11/fakeglx.c | 7 ++++++- 2 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/src/glx/glxext.c b/src/glx/glxext.c index ef1e7ad..83580d4 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,34 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, } } - config->renderType = - (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT; + if (renderType) { + config->renderType = renderType; + config->floatMode = (renderType & + (GLX_RGBA_FLOAT_BIT_ARB|GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT)) ? + GL_TRUE : GL_FALSE; + } else if (!tagged_only) { + /* If there wasn't GLX_RENDER_TYPE property, set it based on config->*Mode + * It is not always explicit, but we have no other choice. We will not know + * if the float mode should be signed or unsigned, and we won't know if + * the mode supports both integer and float RGBA. */ + config->renderType = + ((config->floatMode==GL_TRUE) ? GLX_RGBA_FLOAT_BIT_ARB : 0) | + ((config->rgbMode==GL_TRUE && config->floatMode!=GL_TRUE) ? GLX_RGBA_BIT : 0) | + ((config->rgbMode!=GL_TRUE) ? GLX_COLOR_INDEX_BIT : 0); + } else { + /* If there wasn't such property and we should return fbconfig with only part of + * properties set, then don't change (allow zero) renderType. This will allow matching + * the generated fbconfig with fbconfigs_compatible(), no matter which flags are set + * in the fbconfig being compared. */ + } + /* cannot create window out of float fbconfigs, these are offscreen only */ + if (config->floatMode == GL_TRUE) { + /* GLX_ARB_fbconfig_float specs: + * Note that floating point rendering is only supported for + * GLXPbuffer drawables. + */ + 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 969ee7d..7a2cfbe 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; -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev