Merge remote-tracking branch 'idr/glx-float-fbconfig'
This commit is contained in:
commit
b32a4c91cc
|
@ -809,7 +809,7 @@ LIBAPPLEWM="applewm >= 1.4"
|
||||||
LIBDMX="dmx >= 1.0.99.1"
|
LIBDMX="dmx >= 1.0.99.1"
|
||||||
LIBDRI="dri >= 7.8.0"
|
LIBDRI="dri >= 7.8.0"
|
||||||
LIBDRM="libdrm >= 2.3.0"
|
LIBDRM="libdrm >= 2.3.0"
|
||||||
LIBGL="gl >= 7.1.0"
|
LIBGL="gl >= 9.2.0"
|
||||||
LIBXEXT="xext >= 1.0.99.4"
|
LIBXEXT="xext >= 1.0.99.4"
|
||||||
LIBXFONT="xfont >= 1.4.2"
|
LIBXFONT="xfont >= 1.4.2"
|
||||||
LIBXI="xi >= 1.2.99.1"
|
LIBXI="xi >= 1.2.99.1"
|
||||||
|
|
|
@ -68,6 +68,8 @@ validate_render_type(uint32_t render_type)
|
||||||
switch (render_type) {
|
switch (render_type) {
|
||||||
case GLX_RGBA_TYPE:
|
case GLX_RGBA_TYPE:
|
||||||
case GLX_COLOR_INDEX_TYPE:
|
case GLX_COLOR_INDEX_TYPE:
|
||||||
|
case GLX_RGBA_FLOAT_TYPE_ARB:
|
||||||
|
case GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT:
|
||||||
return True;
|
return True;
|
||||||
default:
|
default:
|
||||||
return False;
|
return False;
|
||||||
|
|
|
@ -65,12 +65,17 @@ struct extension_info {
|
||||||
unsigned char driver_support;
|
unsigned char driver_support;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of known GLX Extensions.
|
||||||
|
* The last Y/N switch informs whether the support of this extension is always enabled.
|
||||||
|
*/
|
||||||
static const struct extension_info known_glx_extensions[] = {
|
static const struct extension_info known_glx_extensions[] = {
|
||||||
/* GLX_ARB_get_proc_address is implemented on the client. */
|
/* GLX_ARB_get_proc_address is implemented on the client. */
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
{ GLX(ARB_create_context), VER(0,0), N, },
|
{ GLX(ARB_create_context), VER(0,0), N, },
|
||||||
{ GLX(ARB_create_context_profile), VER(0,0), N, },
|
{ GLX(ARB_create_context_profile), VER(0,0), N, },
|
||||||
{ GLX(ARB_create_context_robustness), VER(0,0), N, },
|
{ GLX(ARB_create_context_robustness), VER(0,0), N, },
|
||||||
|
{ GLX(ARB_fbconfig_float), VER(0,0), N, },
|
||||||
{ GLX(ARB_framebuffer_sRGB), VER(0,0), N, },
|
{ GLX(ARB_framebuffer_sRGB), VER(0,0), N, },
|
||||||
{ GLX(ARB_multisample), VER(1,4), Y, },
|
{ GLX(ARB_multisample), VER(1,4), Y, },
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ enum {
|
||||||
ARB_create_context_bit = 0,
|
ARB_create_context_bit = 0,
|
||||||
ARB_create_context_profile_bit,
|
ARB_create_context_profile_bit,
|
||||||
ARB_create_context_robustness_bit,
|
ARB_create_context_robustness_bit,
|
||||||
|
ARB_fbconfig_float_bit,
|
||||||
ARB_framebuffer_sRGB_bit,
|
ARB_framebuffer_sRGB_bit,
|
||||||
ARB_multisample_bit,
|
ARB_multisample_bit,
|
||||||
EXT_create_context_es2_profile_bit,
|
EXT_create_context_es2_profile_bit,
|
||||||
|
|
|
@ -841,6 +841,11 @@ glxDRILeaveVT(ScrnInfoPtr scrn)
|
||||||
scrn->LeaveVT = glxDRILeaveVT;
|
scrn->LeaveVT = glxDRILeaveVT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize extension flags in glx_enable_bits when a new screen is created
|
||||||
|
*
|
||||||
|
* @param screen The screen where glx_enable_bits are to be set.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
initializeExtensions(__GLXDRIscreen * screen)
|
initializeExtensions(__GLXDRIscreen * screen)
|
||||||
{
|
{
|
||||||
|
@ -885,6 +890,12 @@ initializeExtensions(__GLXDRIscreen * screen)
|
||||||
LogMessage(X_INFO, "AIGLX: enabled GLX_EXT_framebuffer_sRGB\n");
|
LogMessage(X_INFO, "AIGLX: enabled GLX_EXT_framebuffer_sRGB\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* enable ARB_fbconfig_float extension (even if there are no float fbconfigs) */
|
||||||
|
{
|
||||||
|
__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_fbconfig_float");
|
||||||
|
LogMessage(X_INFO, "AIGLX: enabled GLX_ARB_fbconfig_float\n");
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; extensions[i]; i++) {
|
for (i = 0; extensions[i]; i++) {
|
||||||
#ifdef __DRI_READ_DRAWABLE
|
#ifdef __DRI_READ_DRAWABLE
|
||||||
if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
|
if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <GL/internal/dri_interface.h>
|
#include <GL/internal/dri_interface.h>
|
||||||
#include <os.h>
|
#include <os.h>
|
||||||
#include "glxserver.h"
|
#include "glxserver.h"
|
||||||
|
#include "glxext.h"
|
||||||
#include "glxcontext.h"
|
#include "glxcontext.h"
|
||||||
#include "glxscreens.h"
|
#include "glxscreens.h"
|
||||||
#include "glxdricommon.h"
|
#include "glxdricommon.h"
|
||||||
|
@ -127,6 +128,7 @@ createModeFromConfig(const __DRIcoreExtension * core,
|
||||||
unsigned int visualType, unsigned int drawableType)
|
unsigned int visualType, unsigned int drawableType)
|
||||||
{
|
{
|
||||||
__GLXDRIconfig *config;
|
__GLXDRIconfig *config;
|
||||||
|
GLint renderType = 0;
|
||||||
unsigned int attrib, value;
|
unsigned int attrib, value;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -138,11 +140,14 @@ createModeFromConfig(const __DRIcoreExtension * core,
|
||||||
while (core->indexConfigAttrib(driConfig, i++, &attrib, &value)) {
|
while (core->indexConfigAttrib(driConfig, i++, &attrib, &value)) {
|
||||||
switch (attrib) {
|
switch (attrib) {
|
||||||
case __DRI_ATTRIB_RENDER_TYPE:
|
case __DRI_ATTRIB_RENDER_TYPE:
|
||||||
config->config.renderType = 0;
|
|
||||||
if (value & __DRI_ATTRIB_RGBA_BIT)
|
if (value & __DRI_ATTRIB_RGBA_BIT)
|
||||||
config->config.renderType |= GLX_RGBA_BIT;
|
renderType |= GLX_RGBA_BIT;
|
||||||
if (value & __DRI_ATTRIB_COLOR_INDEX_BIT)
|
if (value & __DRI_ATTRIB_COLOR_INDEX_BIT)
|
||||||
config->config.renderType |= GLX_COLOR_INDEX_BIT;
|
renderType |= GLX_COLOR_INDEX_BIT;
|
||||||
|
if (value & __DRI_ATTRIB_FLOAT_BIT)
|
||||||
|
renderType |= GLX_RGBA_FLOAT_BIT_ARB;
|
||||||
|
if (value & __DRI_ATTRIB_UNSIGNED_FLOAT_BIT)
|
||||||
|
renderType |= GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT;
|
||||||
break;
|
break;
|
||||||
case __DRI_ATTRIB_CONFIG_CAVEAT:
|
case __DRI_ATTRIB_CONFIG_CAVEAT:
|
||||||
if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
|
if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
|
||||||
|
@ -171,11 +176,26 @@ createModeFromConfig(const __DRIcoreExtension * core,
|
||||||
config->config.next = NULL;
|
config->config.next = NULL;
|
||||||
config->config.xRenderable = GL_TRUE;
|
config->config.xRenderable = GL_TRUE;
|
||||||
config->config.visualType = visualType;
|
config->config.visualType = visualType;
|
||||||
|
config->config.renderType = renderType;
|
||||||
config->config.drawableType = drawableType;
|
config->config.drawableType = drawableType;
|
||||||
|
|
||||||
return &config->config;
|
return &config->config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
render_type_is_pbuffer_only(unsigned renderType)
|
||||||
|
{
|
||||||
|
/* The GL_ARB_color_buffer_float spec says:
|
||||||
|
*
|
||||||
|
* "Note that floating point rendering is only supported for
|
||||||
|
* GLXPbuffer drawables. The GLX_DRAWABLE_TYPE attribute of the
|
||||||
|
* GLXFBConfig must have the GLX_PBUFFER_BIT bit set and the
|
||||||
|
* GLX_RENDER_TYPE attribute must have the GLX_RGBA_FLOAT_BIT set."
|
||||||
|
*/
|
||||||
|
return !!(renderType & (__DRI_ATTRIB_UNSIGNED_FLOAT_BIT
|
||||||
|
| __DRI_ATTRIB_FLOAT_BIT));
|
||||||
|
}
|
||||||
|
|
||||||
__GLXconfig *
|
__GLXconfig *
|
||||||
glxConvertConfigs(const __DRIcoreExtension * core,
|
glxConvertConfigs(const __DRIcoreExtension * core,
|
||||||
const __DRIconfig ** configs, unsigned int drawableType)
|
const __DRIconfig ** configs, unsigned int drawableType)
|
||||||
|
@ -187,6 +207,14 @@ glxConvertConfigs(const __DRIcoreExtension * core,
|
||||||
head.next = NULL;
|
head.next = NULL;
|
||||||
|
|
||||||
for (i = 0; configs[i]; i++) {
|
for (i = 0; configs[i]; i++) {
|
||||||
|
unsigned renderType = 0;
|
||||||
|
if (core->getConfigAttrib(configs[i], __DRI_ATTRIB_RENDER_TYPE,
|
||||||
|
&renderType)) {
|
||||||
|
if (render_type_is_pbuffer_only(renderType) &&
|
||||||
|
!(drawableType & GLX_PBUFFER_BIT))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* Add all the others */
|
||||||
tail->next = createModeFromConfig(core,
|
tail->next = createModeFromConfig(core,
|
||||||
configs[i], GLX_TRUE_COLOR,
|
configs[i], GLX_TRUE_COLOR,
|
||||||
drawableType);
|
drawableType);
|
||||||
|
@ -197,6 +225,14 @@ glxConvertConfigs(const __DRIcoreExtension * core,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; configs[i]; i++) {
|
for (i = 0; configs[i]; i++) {
|
||||||
|
int renderType = 0;
|
||||||
|
if (core->getConfigAttrib(configs[i], __DRI_ATTRIB_RENDER_TYPE,
|
||||||
|
&renderType)) {
|
||||||
|
if (render_type_is_pbuffer_only(renderType) &&
|
||||||
|
!(drawableType & GLX_PBUFFER_BIT))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* Add all the others */
|
||||||
tail->next = createModeFromConfig(core,
|
tail->next = createModeFromConfig(core,
|
||||||
configs[i], GLX_DIRECT_COLOR,
|
configs[i], GLX_DIRECT_COLOR,
|
||||||
drawableType);
|
drawableType);
|
||||||
|
|
16
glx/glxext.h
16
glx/glxext.h
|
@ -35,6 +35,22 @@
|
||||||
* Silicon Graphics, Inc.
|
* 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 GLboolean __glXFreeContext(__GLXcontext * glxc);
|
||||||
extern void __glXFlushContextCache(void);
|
extern void __glXFlushContextCache(void);
|
||||||
|
|
||||||
|
|
|
@ -448,7 +448,12 @@ GetGLXFBConfigs(Display * dpy, int glxMajorOpcode, int *nconfigs)
|
||||||
/* Fill in derived values */
|
/* Fill in derived values */
|
||||||
config->screen = screen;
|
config->screen = screen;
|
||||||
|
|
||||||
config->rgbMode = config->renderType & GLX_RGBA_BIT;
|
/* 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;
|
||||||
config->colorIndexMode = !config->rgbMode;
|
config->colorIndexMode = !config->rgbMode;
|
||||||
|
|
||||||
config->haveAccumBuffer =
|
config->haveAccumBuffer =
|
||||||
|
|
|
@ -123,6 +123,28 @@ GetBackEndDisplay(__GLXclientState * cl, int s)
|
||||||
return cl->be_displays[s];
|
return cl->be_displays[s];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the render type bits from fbconfig into context render type.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
renderTypeBitsToRenderTypeEnum(int fbRenderType)
|
||||||
|
{
|
||||||
|
if (fbRenderType & GLX_RGBA_BIT)
|
||||||
|
return GLX_RGBA_TYPE;
|
||||||
|
|
||||||
|
if (fbRenderType & GLX_COLOR_INDEX_BIT)
|
||||||
|
return GLX_COLOR_INDEX_TYPE;
|
||||||
|
|
||||||
|
if (fbRenderType & GLX_RGBA_FLOAT_BIT_ARB)
|
||||||
|
return GLX_RGBA_FLOAT_TYPE_ARB;
|
||||||
|
|
||||||
|
if (fbRenderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT)
|
||||||
|
return GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT;
|
||||||
|
|
||||||
|
/* There's no recognized renderType in the config */
|
||||||
|
return GLX_RGBA_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Create a GL context with the given properties.
|
** Create a GL context with the given properties.
|
||||||
*/
|
*/
|
||||||
|
@ -308,12 +330,14 @@ CreateContext(__GLXclientState * cl,
|
||||||
/* send the create context request to the back-end server */
|
/* send the create context request to the back-end server */
|
||||||
dpy = GetBackEndDisplay(cl, screen);
|
dpy = GetBackEndDisplay(cl, screen);
|
||||||
if (glxc->pFBConfig) {
|
if (glxc->pFBConfig) {
|
||||||
/*Since for a certain visual both RGB and COLOR INDEX
|
/* For a specific visual, multiple render types (i.e., both RGB
|
||||||
*can be on then the only parmeter to choose the renderType
|
* and COLOR INDEX) can be accessible. The only parameter to
|
||||||
* should be the class of the colormap since all 4 first
|
* choose the renderType should be the class of the colormap,
|
||||||
* classes does not support RGB mode only COLOR INDEX ,
|
* since the first classes do not support RGB mode (only COLOR
|
||||||
* and so TrueColor and DirectColor does not support COLOR INDEX*/
|
* INDEX), and TrueColor and DirectColor do not support COLOR
|
||||||
int renderType = glxc->pFBConfig->renderType;
|
* INDEX.
|
||||||
|
*/
|
||||||
|
int renderType = GLX_RGBA_TYPE;
|
||||||
|
|
||||||
if (pVisual) {
|
if (pVisual) {
|
||||||
switch (pVisual->class) {
|
switch (pVisual->class) {
|
||||||
|
@ -329,7 +353,11 @@ CreateContext(__GLXclientState * cl,
|
||||||
renderType = GLX_RGBA_TYPE;
|
renderType = GLX_RGBA_TYPE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
renderType =
|
||||||
|
renderTypeBitsToRenderTypeEnum(glxc->pFBConfig->renderType);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__GLX_IS_VERSION_SUPPORTED(1, 3)) {
|
if (__GLX_IS_VERSION_SUPPORTED(1, 3)) {
|
||||||
LockDisplay(dpy);
|
LockDisplay(dpy);
|
||||||
GetReq(GLXCreateNewContext, be_new_req);
|
GetReq(GLXCreateNewContext, be_new_req);
|
||||||
|
@ -3210,7 +3238,7 @@ __glXQueryContext(__GLXclientState * cl, GLbyte * pc)
|
||||||
*pSendBuf++ = GLX_FBCONFIG_ID;
|
*pSendBuf++ = GLX_FBCONFIG_ID;
|
||||||
*pSendBuf++ = (int) (ctx->pFBConfig->id);
|
*pSendBuf++ = (int) (ctx->pFBConfig->id);
|
||||||
*pSendBuf++ = GLX_RENDER_TYPE;
|
*pSendBuf++ = GLX_RENDER_TYPE;
|
||||||
*pSendBuf++ = (int) (ctx->pFBConfig->renderType);
|
*pSendBuf++ = renderTypeBitsToRenderTypeEnum(ctx->pFBConfig->renderType);
|
||||||
*pSendBuf++ = GLX_SCREEN;
|
*pSendBuf++ = GLX_SCREEN;
|
||||||
*pSendBuf++ = (int) (ctx->pScreen->myNum);
|
*pSendBuf++ = (int) (ctx->pScreen->myNum);
|
||||||
|
|
||||||
|
|
|
@ -386,7 +386,9 @@ fbConfigsDump(unsigned int n, __GLXconfig * c)
|
||||||
c->accumAlphaBits, c->sampleBuffers, c->samples,
|
c->accumAlphaBits, c->sampleBuffers, c->samples,
|
||||||
(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 |
|
||||||
|
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) ? "*" : " ");
|
||||||
|
|
Loading…
Reference in New Issue