hw/xwin/glx: Add support for float format fbconfig GLX extensions
v2: Set renderType more correctly Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk> Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
parent
6be9681eb9
commit
67b47d50df
|
@ -302,6 +302,10 @@ fbConfigsDump(unsigned int n, __GLXconfig * c)
|
||||||
while (c != NULL) {
|
while (c != NULL) {
|
||||||
unsigned int i = ((GLXWinConfig *) c)->pixelFormatIndex;
|
unsigned int i = ((GLXWinConfig *) c)->pixelFormatIndex;
|
||||||
|
|
||||||
|
const char *float_col = ".";
|
||||||
|
if (c->renderType & GLX_RGBA_FLOAT_BIT_ARB) float_col = "s";
|
||||||
|
if (c->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) float_col = "u";
|
||||||
|
|
||||||
ErrorF("%3d %3x %3x "
|
ErrorF("%3d %3x %3x "
|
||||||
"%-11s"
|
"%-11s"
|
||||||
" %3d %3d %s %s %s %s %s "
|
" %3d %3d %s %s %s %s %s "
|
||||||
|
@ -332,8 +336,7 @@ fbConfigsDump(unsigned int n, __GLXconfig * c)
|
||||||
(c->drawableType & GLX_WINDOW_BIT) ? "y" : ".",
|
(c->drawableType & GLX_WINDOW_BIT) ? "y" : ".",
|
||||||
(c->drawableType & GLX_PIXMAP_BIT) ? "y" : ".",
|
(c->drawableType & GLX_PIXMAP_BIT) ? "y" : ".",
|
||||||
(c->drawableType & GLX_PBUFFER_BIT) ? "y" : ".",
|
(c->drawableType & GLX_PBUFFER_BIT) ? "y" : ".",
|
||||||
(c->renderType & (GLX_RGBA_FLOAT_BIT_ARB |
|
float_col,
|
||||||
GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT)) ? "y" : ".",
|
|
||||||
(c->transparentPixel != GLX_NONE_EXT) ? "y" : ".",
|
(c->transparentPixel != GLX_NONE_EXT) ? "y" : ".",
|
||||||
c->visualSelectGroup,
|
c->visualSelectGroup,
|
||||||
(c->visualRating == GLX_SLOW_VISUAL_EXT) ? "*" : " ");
|
(c->visualRating == GLX_SLOW_VISUAL_EXT) ? "*" : " ");
|
||||||
|
@ -590,6 +593,8 @@ glxWinScreenProbe(ScreenPtr pScreen)
|
||||||
{ "WGL_ARB_pbuffer", "GLX_SGIX_pbuffer", 1 },
|
{ "WGL_ARB_pbuffer", "GLX_SGIX_pbuffer", 1 },
|
||||||
{ "WGL_ARB_multisample", "GLX_ARB_multisample", 1 },
|
{ "WGL_ARB_multisample", "GLX_ARB_multisample", 1 },
|
||||||
{ "WGL_ARB_multisample", "GLX_SGIS_multisample", 0 },
|
{ "WGL_ARB_multisample", "GLX_SGIS_multisample", 0 },
|
||||||
|
{ "WGL_ARB_pixel_format_float", "GLX_ARB_fbconfig_float", 0 },
|
||||||
|
{ "WGL_EXT_pixel_format_packed_float", "GLX_EXT_fbconfig_packed_float", 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1664,13 +1669,34 @@ fbConfigToPixelFormatIndex(HDC hdc, __GLXconfig * mode,
|
||||||
int attribList[60];
|
int attribList[60];
|
||||||
|
|
||||||
SET_ATTR_VALUE(WGL_SUPPORT_OPENGL_ARB, TRUE);
|
SET_ATTR_VALUE(WGL_SUPPORT_OPENGL_ARB, TRUE);
|
||||||
SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB,
|
|
||||||
(mode->visualType ==
|
switch (mode->renderType)
|
||||||
GLX_TRUE_COLOR) ? WGL_TYPE_RGBA_ARB :
|
{
|
||||||
WGL_TYPE_COLORINDEX_ARB);
|
case GLX_COLOR_INDEX_BIT:
|
||||||
SET_ATTR_VALUE(WGL_COLOR_BITS_ARB,
|
case GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT:
|
||||||
(mode->visualType ==
|
SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_COLORINDEX_ARB);
|
||||||
GLX_TRUE_COLOR) ? mode->rgbBits : mode->indexBits);
|
SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->indexBits);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ErrorF("unexpected renderType %x\n", mode->renderType);
|
||||||
|
/* fall-through */
|
||||||
|
case GLX_RGBA_BIT:
|
||||||
|
SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB);
|
||||||
|
SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->rgbBits);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GLX_RGBA_FLOAT_BIT_ARB:
|
||||||
|
SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_FLOAT_ARB);
|
||||||
|
SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->rgbBits);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT:
|
||||||
|
SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT);
|
||||||
|
SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->rgbBits);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
SET_ATTR_VALUE(WGL_RED_BITS_ARB, mode->redBits);
|
SET_ATTR_VALUE(WGL_RED_BITS_ARB, mode->redBits);
|
||||||
SET_ATTR_VALUE(WGL_GREEN_BITS_ARB, mode->greenBits);
|
SET_ATTR_VALUE(WGL_GREEN_BITS_ARB, mode->greenBits);
|
||||||
SET_ATTR_VALUE(WGL_BLUE_BITS_ARB, mode->blueBits);
|
SET_ATTR_VALUE(WGL_BLUE_BITS_ARB, mode->blueBits);
|
||||||
|
@ -2138,23 +2164,42 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
||||||
c->base.indexBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0);
|
c->base.indexBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0);
|
||||||
c->base.rgbBits = 0;
|
c->base.rgbBits = 0;
|
||||||
c->base.visualType = GLX_STATIC_COLOR;
|
c->base.visualType = GLX_STATIC_COLOR;
|
||||||
|
c->base.renderType = GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Assume RGBA rendering is available on all single-channel visuals
|
||||||
|
(it is specified to render to red component in single-channel
|
||||||
|
visuals, if supported, but there doesn't seem to be any mechanism
|
||||||
|
to check if it is supported)
|
||||||
|
|
||||||
|
Color index rendering is only supported on single-channel visuals
|
||||||
|
*/
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WGL_TYPE_RGBA_FLOAT_ARB:
|
|
||||||
GLWIN_DEBUG_MSG
|
|
||||||
("pixelFormat %d is WGL_TYPE_RGBA_FLOAT_ARB, skipping", i + 1);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT:
|
|
||||||
GLWIN_DEBUG_MSG
|
|
||||||
("pixelFormat %d is WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT, skipping",
|
|
||||||
i + 1);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case WGL_TYPE_RGBA_ARB:
|
case WGL_TYPE_RGBA_ARB:
|
||||||
c->base.indexBits = 0;
|
c->base.indexBits = 0;
|
||||||
c->base.rgbBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0);
|
c->base.rgbBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0);
|
||||||
c->base.visualType = GLX_TRUE_COLOR;
|
c->base.visualType = GLX_TRUE_COLOR;
|
||||||
|
c->base.renderType = GLX_RGBA_BIT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WGL_TYPE_RGBA_FLOAT_ARB:
|
||||||
|
c->base.indexBits = 0;
|
||||||
|
c->base.rgbBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0);
|
||||||
|
c->base.visualType = GLX_TRUE_COLOR;
|
||||||
|
c->base.renderType = GLX_RGBA_FLOAT_BIT_ARB;
|
||||||
|
// assert pbuffer drawable
|
||||||
|
// assert WGL_ARB_pixel_format_float
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT:
|
||||||
|
c->base.indexBits = 0;
|
||||||
|
c->base.rgbBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0);
|
||||||
|
c->base.visualType = GLX_TRUE_COLOR;
|
||||||
|
c->base.renderType = GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT;
|
||||||
|
// assert pbuffer drawable
|
||||||
|
// assert WGL_EXT_pixel_format_packed_float
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2252,21 +2297,6 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
||||||
| (ATTR_VALUE(WGL_DRAW_TO_BITMAP_ARB, 0) ? GLX_PIXMAP_BIT : 0)
|
| (ATTR_VALUE(WGL_DRAW_TO_BITMAP_ARB, 0) ? GLX_PIXMAP_BIT : 0)
|
||||||
| (ATTR_VALUE(WGL_DRAW_TO_PBUFFER_ARB, 0) ? GLX_PBUFFER_BIT : 0));
|
| (ATTR_VALUE(WGL_DRAW_TO_PBUFFER_ARB, 0) ? GLX_PBUFFER_BIT : 0));
|
||||||
|
|
||||||
/*
|
|
||||||
Assume OpenGL RGBA rendering is available on all visuals
|
|
||||||
(it is specified to render to red component in single-channel visuals,
|
|
||||||
if supported, but there doesn't seem to be any mechanism to check if it
|
|
||||||
is supported)
|
|
||||||
|
|
||||||
Color index rendering is only supported on single-channel visuals
|
|
||||||
*/
|
|
||||||
if (c->base.visualType == GLX_STATIC_COLOR) {
|
|
||||||
c->base.renderType = GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
c->base.renderType = GLX_RGBA_BIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
c->base.fbconfigID = -1; // will be set by __glXScreenInit()
|
c->base.fbconfigID = -1; // will be set by __glXScreenInit()
|
||||||
|
|
||||||
/* SGIX_pbuffer / GLX 1.3 */
|
/* SGIX_pbuffer / GLX 1.3 */
|
||||||
|
|
Loading…
Reference in New Issue