On 07/15/2013 08:24 AM, walter harms wrote:
Am 15.07.2013 17:06, schrieb Tomasz Lis:
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 <lis...@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.
The problem is these defines either come from glx.h (controlled by Mesa)
or from glxext.h (controlled by Khronos, distributed by Mesa). The
usual ways to handle this in application code to either import glxext.h
into your project or use ifndef/define/endif like this.
That said, I think this comment should be improved. I'll have a full
review of these patches a little later (hopefully this week).
+#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@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel
_______________________________________________
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