From: Tomasz Lis <tomasz....@intel.com> Support of GLX_RGBA*_FLOAT_BIT*, and correct setting of the flags. Also commented each renderType use with information which (fbconfig or context) RENDER_TYPE it is.
Signed-off-by: Tomasz Lis <tomasz....@intel.com> --- glx/createcontext.c | 2 ++ glx/glxext.h | 15 ++++++++++++++ hw/dmx/dmx_glxvisuals.c | 9 ++++++--- hw/dmx/glxProxy/glxcmds.c | 42 +++++++++++++++++++++++++++++++++------- hw/xquartz/GL/glcontextmodes.c | 12 +++++++++--- 5 files changed, 67 insertions(+), 13 deletions(-) diff --git a/glx/createcontext.c b/glx/createcontext.c index 13d21cc..41ecd11 100644 --- a/glx/createcontext.c +++ b/glx/createcontext.c @@ -68,6 +68,8 @@ validate_render_type(uint32_t render_type) switch (render_type) { case GLX_RGBA_TYPE: case GLX_COLOR_INDEX_TYPE: + case GLX_RGBA_FLOAT_TYPE_ARB: + case GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT: return True; default: return False; diff --git a/glx/glxext.h b/glx/glxext.h index 9b0978b..2d67af3 100644 --- a/glx/glxext.h +++ b/glx/glxext.h @@ -35,6 +35,21 @@ * Silicon Graphics, Inc. */ +// doing #include <GL/glx.h> & #include <GL/glxext.h> could cause problems with +// overlapping definitions, so let's use the easy way +#ifndef GLX_RGBA_FLOAT_BIT_ARB +#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 +#endif +#ifndef GLX_RGBA_FLOAT_TYPE_ARB +#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 +#endif +#ifndef GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#endif +#ifndef GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 +#endif + extern GLboolean __glXFreeContext(__GLXcontext * glxc); extern void __glXFlushContextCache(void); diff --git a/hw/dmx/dmx_glxvisuals.c b/hw/dmx/dmx_glxvisuals.c index f903b74..be7f3f2 100644 --- a/hw/dmx/dmx_glxvisuals.c +++ b/hw/dmx/dmx_glxvisuals.c @@ -367,7 +367,7 @@ GetGLXFBConfigs(Display * dpy, int glxMajorOpcode, int *nconfigs) config->accumAlphaBits = value; break; case GLX_RENDER_TYPE: - config->renderType = value; + config->renderType = value; /* fbconfig render type are bit fields */ break; case GLX_DRAWABLE_TYPE: config->drawableType = value; @@ -439,8 +439,11 @@ GetGLXFBConfigs(Display * dpy, int glxMajorOpcode, int *nconfigs) /* Fill in derived values */ config->screen = screen; - config->rgbMode = config->renderType & GLX_RGBA_BIT; - config->colorIndexMode = !config->rgbMode; + /* The rgbMode should be true for any mode which has distinguishible R, G and B components */ + config->rgbMode = (config->renderType & (GLX_RGBA_BIT | + GLX_RGBA_FLOAT_BIT_ARB | GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT)) != 0; + /* The colorIndexMode isn't really needed, as all non-RGB modes are CI modes */ + config->colorIndexMode = (config->renderType & GLX_COLOR_INDEX_BIT) != 0; config->haveAccumBuffer = config->accumRedBits > 0 || diff --git a/hw/dmx/glxProxy/glxcmds.c b/hw/dmx/glxProxy/glxcmds.c index 4538274..31724cb 100644 --- a/hw/dmx/glxProxy/glxcmds.c +++ b/hw/dmx/glxProxy/glxcmds.c @@ -308,12 +308,12 @@ CreateContext(__GLXclientState * cl, /* send the create context request to the back-end server */ dpy = GetBackEndDisplay(cl, screen); if (glxc->pFBConfig) { - /*Since for a certain visual both RGB and COLOR INDEX - *can be on then the only parmeter to choose the renderType - * should be the class of the colormap since all 4 first - * classes does not support RGB mode only COLOR INDEX , - * and so TrueColor and DirectColor does not support COLOR INDEX*/ - int renderType = glxc->pFBConfig->renderType; + /* For a specific visual, multiple render types (ie. both RGB and COLOR INDEX) + * can be accessible. The only parameter to choose the renderType + * should be the class of the colormap, since all 4 first classes + * does not support RGB mode only COLOR INDEX, + * and so TrueColor and DirectColor does not support COLOR INDEX. */ + int renderType = GLX_RGBA_TYPE; if (pVisual) { switch (pVisual->class) { @@ -329,7 +329,21 @@ CreateContext(__GLXclientState * cl, renderType = GLX_RGBA_TYPE; break; } + } else { + /* Convert the render type bits from fbconfig into context render type. */ + if (glxc->pFBConfig->renderType & GLX_RGBA_BIT) + renderType = GLX_RGBA_TYPE; + else if (glxc->pFBConfig->renderType & GLX_COLOR_INDEX_BIT) + renderType = GLX_COLOR_INDEX_TYPE; + else if (glxc->pFBConfig->renderType & GLX_RGBA_FLOAT_BIT_ARB) + renderType = GLX_RGBA_FLOAT_TYPE_ARB; + else if (glxc->pFBConfig->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) + renderType = GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT; + else { /* There's no recognized renderType in the config */ + renderType = GLX_RGBA_TYPE; + } } + if (__GLX_IS_VERSION_SUPPORTED(1, 3)) { LockDisplay(dpy); GetReq(GLXCreateNewContext, be_new_req); @@ -3193,6 +3207,7 @@ __glXQueryContext(__GLXclientState * cl, GLbyte * pc) __GLXcontext *ctx; xGLXQueryContextReq *req; xGLXQueryContextReply reply; + int renderType; int nProps; int *sendBuf, *pSendBuf; int nReplyBytes; @@ -3205,6 +3220,19 @@ __glXQueryContext(__GLXclientState * cl, GLbyte * pc) return __glXBadContext; } + /* Convert the render type bits from fbconfig into context render type. */ + if (ctx->pFBConfig->renderType & GLX_RGBA_BIT) + renderType = GLX_RGBA_TYPE; + else if (ctx->pFBConfig->renderType & GLX_COLOR_INDEX_BIT) + renderType = GLX_COLOR_INDEX_TYPE; + else if (ctx->pFBConfig->renderType & GLX_RGBA_FLOAT_BIT_ARB) + renderType = GLX_RGBA_FLOAT_TYPE_ARB; + else if (ctx->pFBConfig->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) + renderType = GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT; + else { /* There's no recognized renderType in the config */ + renderType = GLX_RGBA_TYPE; + } + nProps = 3; reply = (xGLXQueryContextReply) { @@ -3220,7 +3248,7 @@ __glXQueryContext(__GLXclientState * cl, GLbyte * pc) *pSendBuf++ = GLX_FBCONFIG_ID; *pSendBuf++ = (int) (ctx->pFBConfig->id); *pSendBuf++ = GLX_RENDER_TYPE; - *pSendBuf++ = (int) (ctx->pFBConfig->renderType); + *pSendBuf++ = (int)(renderType); /* context render type (one of GLX_*_TYPE values) */ *pSendBuf++ = GLX_SCREEN; *pSendBuf++ = (int) (ctx->pScreen->myNum); diff --git a/hw/xquartz/GL/glcontextmodes.c b/hw/xquartz/GL/glcontextmodes.c index dc97f89..666599c 100644 --- a/hw/xquartz/GL/glcontextmodes.c +++ b/hw/xquartz/GL/glcontextmodes.c @@ -141,9 +141,15 @@ _gl_copy_visual_to_context_mode(__GLcontextModes * mode, mode->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT; mode->rgbMode = (config->rgba != 0); - mode->renderType = (mode->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT; - mode->colorIndexMode = !(mode->rgbMode); + /* It's impossible to create float config from visual. */ + mode->floatMode = GL_FALSE; + /* The fact that we can't have float mode makes the code below unequivocal. + * The rgbMode is true for both float or integer modes, but this time we're sure it's integer. + * We could even skip checking colorIndexMode as all non-RGB modes are CI. */ + mode->renderType = (mode->rgbMode) ? GLX_RGBA_BIT : 0 | + (mode->colorIndexMode) ? GLX_COLOR_INDEX_BIT : 0; + mode->doubleBufferMode = (config->doubleBuffer != 0); mode->stereoMode = (config->stereo != 0); @@ -321,7 +327,7 @@ _gl_get_context_mode_data(const __GLcontextModes *mode, int attribute, *value_return = mode->drawableType; return 0; - case GLX_RENDER_TYPE: + case GLX_RENDER_TYPE: /* fbconfig render type */ *value_return = mode->renderType; return 0; -- 1.7.9.5 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel