[PATCH 1/3] Float fbconfigs exchange patch [1/3] Improved handling of renderType attribute in GLX structures.
Tomasz Lis
listom at gmail.com
Wed Jul 24 04:39:43 PDT 2013
2013/7/15 walter harms <wharms at bfs.de>
>
>
> Am 15.07.2013 17:06, schrieb Tomasz Lis:
> > From: Tomasz Lis <tomasz.lis at 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 <listom at gmail.com>
> > ---
> > glx/createcontext.c | 2 ++
> > glx/glxext.h | 15 ++++++++++++++
> > hw/dmx/dmx_glxvisuals.c | 7 +++++--
> > hw/dmx/glxProxy/glxcmds.c | 42
> +++++++++++++++++++++++++++++++++-------
> > hw/xquartz/GL/glcontextmodes.c | 10 ++++++++--
> > 5 files changed, 65 insertions(+), 11 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
>
>
> I am not an expert but this should be fixed in openGL with priority.
> So i would move them in a glxfixes.h so it can be removed if fixed in
> openGL.
>
>
Thank you, Walter.
The comment isn't clear, sorry for that. It's not a problem with GL/glx.h &
GL/glxext.h having bad definitions, but with XServer code containing some
defines which won't compile with these headers included.
> > +#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..ba051a4 100644
> > --- a/hw/dmx/dmx_glxvisuals.c
> > +++ b/hw/dmx/dmx_glxvisuals.c
> > @@ -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..b325f4d 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..1fffaa8 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);
> >
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
Thank you for your feedback and awaiting more comments!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20130724/bdceb9ea/attachment-0001.html>
More information about the xorg-devel
mailing list