[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